Sensor de tensão AC com Arduino

Sensor de tensão
Sensor de tensão

Tudo o que você precisa é de um divisor de tensão, mas esse sensor da GBK Robotics tem adicionalmente um optocoupler para fazer o isolamento da rede AC, protegendo assim o lado digital do seu circuito.

O sensor de tensão se baseia simplesmente no divisor de tensão. Esse sensor da GBK Robotics utiliza um resistor de 220K e um resistor de 10K. R1 é o resistor mais alto, de modo que R2 = 10k. Depois, tudo que precisa ser feito é calcular a saída assim:

val = \frac{(\frac{analogRead*5.0}{1024.0})}{(\frac{R2}{R1+R2})}

Vou conectar esse módulo a um Arduino Nano do nosso parceiro Fulltronic (esse Nano da foto). O dock do Nano também pode ser adquirido com eles e garanto, é bem melhor utilizar jumpers femea-femea do que a protoboard, ficam menos fios e mais rápido de prototipar.



Antes de seguirmos, gostaria de dizer que da data dessa publicação à mais 48 dias a GBK Robotics está no Catarse com uma campanha para construir um espaço maker. Me parece um projeto bastante interessante e caso tenha interesse em participar, siga o link.

Wiring

O wiring é muito simples, basta conectar Out da board ao A0 do Arduino (o código serve para qualquer Arduino). O 5V vai ao 5V do Arduino e o GND vai ao GND do Arduino.

Agora basta ler e aplicar a fórmula descrita anteriormente. Você pode querer um pouco de precisão na leitura. Nesse caso, coletar algumas amostras e tirar a média pode ser uma boa opção. O código para tal pode ficar assim:

#define R1 220000.0
#define R2 10000.0
#define SAMPLES 5
float acum  = 0;
int analog0 = 0;
int loops   = 0;
float v1    = 0;

void calc(){
  analog0 = analogRead(0);
  v1 = (5.0 * analog0)/1024.0;
  Serial.print("Valor da amostragem ");
  Serial.print(loops);
  Serial.print(": ");
  Serial.println(v1);
  
  if (v1 < 1){
    return;
  }
  acum += v1/(R2/(R2+R1));
  
  loops++;
  
  if (loops >4){
    loops = 0;
    float result = acum/SAMPLES;
    Serial.print("V=");
    Serial.println(result);
  }
  delay(200);
}
void setup() {
  pinMode(0,INPUT);
  Serial.begin(9600);
  Serial.println("Iniciando");
}

void loop() {
  calc();

}

A serial ficará imprimindo muito rápido devido ao delay curto, mas esse delay de 200ms aproxima a media a 1 segundo, considerando que a amostragem tirada é de 5 samples.




Apenas para exclarecer, o valor 1024.0 se trata da resolução do pino analógico, que é de 10 bits. Se você utilizar uma MCU com mais resolução, basta subir esse valor. Por exemplo, se for 12 bits, troque para 4096.0. Se for utilizar o ESP8266, você precisará utilizar um divisor de tensão extra para derrubar a tensão para 1V, que é o máximo permitido na porta analógica dele. Escreverei um artigo a respeito.

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

 

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta