Ajuda, please!

Galera,

Estou montando um circuito para alarme de tensão.

  • Se a tensão A0 < 105V e A0 > 140V: dispara a buzina 1
  • Se a tensão A0 = 0V: dispara a buzina 2

Só que estou com um problema: a buzina 1 funciona perfeitamente…
Quando chego em 0V, a buzina 1 pára (está correto) e teria que disparar a buzina 2, só que não funciona…

Errei aonde??

Obrigado!

void setup() {
Serial.begin(9600);

pinMode(A0, INPUT); // entrada da tensão de referencia 127Vac > 5Vdc
pinMode(A2, OUTPUT); //gnd para a buzina 2
pinMode(A3, OUTPUT); //5V para a buzina 2
pinMode(A4, OUTPUT); //gnd para a buzina 1
pinMode(A5, OUTPUT); //5V para a buzina 1
}

void loop() {
int TensaoDeEntrada = analogRead(A0); // faz a leitura analogica do pino 0:
float voltagem = TensaoDeEntrada / 8.05511811023622; // Leitura analógica (0 - 1023) para tensão (0 - 127V):

if (voltagem >= 105 && voltagem <= 139 && voltagem != 0) // tensão entre 105 e 140 não alarma nada
{
digitalWrite(A5,LOW);
digitalWrite(A4,LOW);
digitalWrite(A3,LOW);
digitalWrite(A2,LOW);
}
else if (voltagem == 0) // tensão igual a 0V toca buzina 2 (conectado pino A3)
{
digitalWrite(A5,LOW);
digitalWrite(A4,LOW);
digitalWrite(A3,HIGH);
digitalWrite(A2,LOW);
}
else // tensão menor que 105 e maior que 140 toca buzina 1 (conectado pino A5)
digitalWrite(A5,HIGH);
digitalWrite(A4,LOW);
digitalWrite(A3,LOW);
digitalWrite(A2,LOW);

Serial.println(voltagem); // escreve o valor de tensão via comunicação serial:

}

Colega primeiro de tudo que seguranças tens no teu circuito para trabalhares com esta gama de tensoes?
Como estas a ligar o tua entrada analogica para monitorizar a tensao de acima de 100V?
Olhando para o teu codigo estou com algumas interrugaçoes

pinMode(A0, INPUT); // entrada da tensão de referencia 127Vac > 5Vdc
pinMode(A2, OUTPUT); //gnd para a buzina 2
pinMode(A3, OUTPUT); //5V para a buzina 2
pinMode(A4, OUTPUT); //gnd para a buzina 1
pinMode(A5, OUTPUT); //5V para a buzina 1

Pelo que descreves aqui dás a entender que estas a criar gnds virtuais no pino A2 e A5.Porque isto?
Sabes que o pino tambem tem um limite de sinking .Nao sei qual é a tua buzina nem o que consome mas isto é anormal em termos de circuito.

float voltagem = TensaoDeEntrada / 8.05511811023622; // Leitura analógica (0 - 1023) para tensão (0 - 127V):

if (voltagem >= 105 && voltagem <= 139 && voltagem != 0) // tensão entre 105 e 140 não alarma nada

else if (voltagem == 0) // tensão igual a 0V toca buzina 2 (conectado pino A3)

Primeiro convertes o valor para um float e depois no if comparas com valores inteiros?
Comparar floats pode te dar comportamentos imprevisiveis.
Se queres converter de uma escala para outra (escala do ADC para a tua tensao) usa uma funçao map
http://arduino.cc/en/Reference/map
Para que converter isso para float?
O teu erro certamente será porque o valor nunca é 0 logo o if voltagem == 0 nunca ira ser corrido
O que te imprime o Serial.println(voltagem);?

Respostas:

1) Como estas a ligar o tua entrada analogica para monitorizar a tensao de acima de 100V? ESTOU USANDO UMA FONTE COM TRANSFORMADOR (INPUT: 127 Vac / OUTPUT: 5 Vdc)

LOGO, SE TEMOS: 5 Vdc = 127 Vac 4 Vdc = 101,6 Vac .... e dai por diante

ISTO ESTÁ OK...JÁ TESTEI COM O MULTIMETRO E A FASE ENCONTRA-SE ESTABILIZADA!!!

==========================================================================================

2) Pelo que descreves aqui dás a entender que estas a criar gnds virtuais no pino A2 e A5.Porque isto? ESTOU JOGANDO NÍVEL LOW NESTES PINOS, PARA QUE POSSA ALIMENTAR A BUZINA COM 5V (BUZINA TEM DOIS PINOS: + e -) A2(LOW) COM A3(HIGH) = BUZINA 2 (5V) A4(LOW) COM A5(HIGH) = BUZINA 1 (5V)

==========================================================================================

3) Sabes que o pino tambem tem um limite de sinking .Nao sei qual é a tua buzina nem o que consome mas isto é anormal em termos de circuito. MINHA BUZINA (ALARME SONORO) É 5V COM BAIXA CORRENTE...MENOS QUE 20mA.

==========================================================================================

4) Primeiro convertes o valor para um float e depois no if comparas com valores inteiros? CONVERTI SOMENTE PARA FACILITAR NA HORA DE FAZER O if, POIS ASSIM FICA MAIS FÁCIL DE PENSAR NOS LIMITES.

==========================================================================================

5) O que te imprime o Serial.println(voltagem);? PARA MONITORAR O NÍVEL DE TENSÃO, POIS ESTOU USANDO UM POTENCIOMETRO PARA TESTE, VARIANDO A TENSÃO E MOSTRANDO NA TELA.

==========================================================================================

6) O teu erro certamente será porque o valor nunca é 0 logo o if voltagem == 0 nunca ira ser corrido O VALOR CHEGA A ZERO SIM. ESTOU USANDO UM POTENCIOMETRO E IMPRIMINDO OS RESULTADOS PARA AVERIGUAÇÃO.

==========================================================================================

SE PUDEREM AJUDAR, AGRADEÇO! ESTOU COM PROBLEMA SOMENTE NA BUZINA 2, POIS QUANDO TENHO "0", A SAÍDA NÃO FICA HIGH.

OBRIGADO

Que luxo... alimentar uma buzina com dois pinos. Estás a usar um Mega? Nota que utilizar dois pinos dessa forma não te dá mais corrente de saída do chip... Porque não usas apenas um pino para activar a buzina?

Eu acho que devias ler um pouco mais sobre tipos de dados e comparacões entre eles. Não podes comparar float a um inteiro... esse é, provavelmente, o teu problema.

Blz..vou ler mais sobre float..

como posso fazer? qual variável utilizo?

int…

Ao transformares int para float, não aumentas a tua precisão. A precisão fica apenas disfarcada pela virgula. Repara:

 int TensaoDeEntrada = analogRead(A0); // faz a leitura analogica do pino 0:
  float voltagem = TensaoDeEntrada / 8.05511811023622;  // Leitura analógica (0 - 1023) para tensão (0 - 127V):

Se a tensão de entrada for 510 a variável voltagem vai ser 63,313
Se a tensão de entrada for 511 a variável voltagem vai ser 63,437
Se a tensão de entrada for 512 a variável voltagem vai ser 63,562

Portanto, como podes ver lá porque o teu numero está em float, não ficou mais preciso… na realidade tu nunca poderás atingir uma medicão de, por exemplo 63,400000 com esta escala. Então converter para float é apenas útil para comodidade de quem vai ver o código…

Sendo assim, podes admitir o erro que o teu AD tem, esquecer o float e fazer tudo em int.
Se queres fazer tudo em float… indicas ao compilador que deve usar float… e deves evitar comparacões de igualdade. Ou seja, podes compara se é maior que ou menor que, mas nunca se é precisamente igual a algo.

No teu caso…

 if  (voltagem >= 105.0 && voltagem <= 139.0)

Ainda acerca deste pedaco de código… tu estás a testar se a voltagem está acima de 105… e abaixo de 139… porque raio precisas de testar se é diferente de zero???
O zero na tua terra fica entre 105 e 139???

Se quiseres comparar algo igual a 0 compara a ser menor que… ou seja:

if (voltagem < 0.13) ...

0,13 é mais ou menos o valor de um bit…
O mesmo se aplica a outros valores.

Galera!

Já consegui. Pedi ajuda para um programador que me mostrou o erro no código! Era somente a } de entrada e saida do último bloco, que estava faltando.

Está funcionando perfeitamente!!!

Obrigado pela ajuda!