Problemas com sensor de água

Bom dia pessoal, tudo bem.

Estou trabalhando em um tcc e nele temos 3 sensores de nível de água que são lidos por suas respectivas portas analógicas, esses sensores são classificados do 1 ao 3 para indicar o nível da água em um reservatório e de acordo com o nível um LED RGB será acionado com a cor correta.

Bom criamos uma classe que faz o controle e leitura dos sensores do sistema, pois temos outros além desses, e no programa principal chamamos o método para checar o nível da água, até ai sem problemas, realizando os testes de cada nível, percebemos que quando o nível está no 3 e acionamos a cor vermelha do LED RGB, por algum motivo os outros níveis estão dando medição, fazendo com que as outras corres do LED sejam acionadas também, ou seja, mudando de cor constantemente, parece engraçado, mas quando comentamos o SWITCH CASE do programa principal, que usamos para verificar qual o nível atual da água, a medição é precisa só mostra que o nível 3 está ativo, isso estamos vendo no Serial monitor, mas quando usamos o SWITCH CASE ou até mesmo o IF para acionar um cor no LED RGB, os outros níveis dão medição, alternando para nós no serial monitor o nível atual a todo instante.

Sabem me dizer o que pode está ocasionando isso? será algo na porta Analógica?

Muito obrigado.

Achas sinceramente que alguém te pode prestar alguma ajuda com o que colocaste aqui??

Falas em sensor de nível de água... eu conheço milhentos sensores de nível de água. Qual é o que estás a usar e qual o princípio de medição?

Não vimos como estás a ligar ao Arduino os ditos sensores e se tens alguma coisa que possa estar mal ou até um condicionamento de sinal.

Não fazemos ideia se o teu código está bom ou não... o facto de teres criado uma classe e no final notares este problema, diz-me que deve ter começado o projecto pelo software em vez de testares tudo direitinho e só depois meteres o código dentro da classe para ficar bonito.

Logo, sem código, esquemas ou tipos de sensores, como ajuda apenas te posso dizer boa sorte com a resolução do teu problema.

Entendo amigo, claro que fica difícil sem os esquemas e peço desculpas pela minha falha.

Sobre as classes, antes de conectar tudo, foram realizados os testes separados para garantir que estavam funcionando, então acredito que não seja a codificação.

Irei analisar melhor as conexões no arduino, pois acredito que lá pode ser o problema.

o Sensor que estamos usando é esse aqui: http://www.webtronico.com/image/cache/data/produtos/sensor_nivel__1-500x500.jpg

E o programa que faz o controle do sensor é esse aqui:

#include <Led.h>
#include <Sensores.h>
#include <Buzzer.h>

Led vermelho(6), verde(5), azul(4);
Sensores SensorNivelAgua(A0,A1,A2);
String Msg1, Msg2;

void setup() {
// put your setup code here, to run once:

}

void checaNivelAgua(){

int nivel = SensorNivelAgua.getNivelagua();
switch(nivel){

case 1:
buzzer.Desligar();
azul.Desligar();
vermelho.Desligar();
delay(1000);
verde.Ligar();
break;

case 2:
buzzer.Desligar();
verde.Desligar();
vermelho.Desligar();
delay(1000);
azul.Ligar();
break;

case 3:
azul.Desligar();
verde.Desligar();
delay(1000);
vermelho.Ligar();
buzzer.Ligar();
break;

default:
buzzer.Desligar();
vermelho.Desligar();
azul.Desligar();
verde.Desligar();
delay(1000);
break;
};
}

void loop() {
checaNivelAgua();
}

#Class sensores

#include “Sensores.h”

//construtor da sensor do nivel de agua
Sensores::Sensores(int PinoSensorAgua1, int PinoSensorAgua2, int PinoSensorAgua3)
{
//Inicio o pino de entrada
pinMode(PinoSensorAgua1, INPUT);
pinMode(PinoSensorAgua2, INPUT);
pinMode(PinoSensorAgua3, INPUT);

//armazeno o pino de entrada em uma variaveis globais
_PinoSensorAgua1 = PinoSensorAgua1;
_PinoSensorAgua2 = PinoSensorAgua2;
_PinoSensorAgua3 = PinoSensorAgua3;
}

//Contrustor sensor temperatura_umidade
Sensores::Sensores(int PinoTemperatura_Umidade, int PinoLDR)
{
pinMode(PinoTemperatura_Umidade, INPUT);
pinMode(PinoLDR, INPUT);

_PinoTemperatura_Umidade = PinoTemperatura_Umidade;
_PinoLDR = PinoLDR;

}

//checa nível de água
int Sensores::getNivelagua()
{
double nivel1, nivel2, nivel3;
int Nivel_Atual;

nivel1 = analogRead(_PinoSensorAgua1);
nivel2 = analogRead(_PinoSensorAgua2);
nivel3 = analogRead(_PinoSensorAgua3);

if(nivel1 > 0){

Nivel_Atual = 1;
}
else if(nivel2 > 0){

Nivel_Atual = 2;
}
else if(nivel3 > 0){

Nivel_Atual = 3;
}else{
Nivel_Atual = 0;
}

return Nivel_Atual;
}

//verifica a energia primaria
float Sensores::getEnergiaprimaria()
{
float LDR = analogRead(_PinoLDR);
return LDR;
}

Novamente amigo, me desculpe.

Essa imagem não me diz nada... qual é o tipo???

Não achas que tentar ler algo menor que zero dum conversor analógico-digital é um pouco estranho? Mais uma vez, não sei que sensor tens... mas é provável que haja uma espécie de ruído que previne que um valor seja exactamente zero.

Gostava de saber porque usas double para armazenar variáveis que só vão até 1024...

Como disse atrás, isto é algo extremamente simples que foi "overengineered" até à exaustão... uma classe para ligar e desligar LEDs???? A sério??? Quantas linhas de código tens para fazer algo que uma linha de código faz??

E depois olhando ao código , nota-se que o algoritmo principal (pelo menos o que mostras) foi feito ao acaso... ou seja, fizeste imensas linhas de código inúteis e uma coisa simples de fazer para detectar erro dos sensores deixaste de fora.

Chegaste a experimentar todo o sistema com o código inicial que funcionou montado no tanque?? Ou o código que funcionou apenas foi testado num laboratório/oficina??

Não leves a mal as critícas mas a realidade é que o programa é mais complexo do que precisa ser e sem motivo algum...

Por isso, manda o datasheet do sensor de água (há algo que não faz sentido em usares uma entrada analógica para o que me parece ser um contacto) e se quiseres enviar as leituras que os sensores dão com e sem água e imediatamente quando passam de submergidos para o ar livre será fácil de perceber um pouco mais acerca do que se passa.

P.S.: Se o detector do topo detectar água e o detector de baixo não detectar, que situação é que está a acontecer?

P.S. 1 : Os delays podem ter a ver com o que estás a ver... usar delays é má política.

Resolvido amigo,

reconectei os conectores na arduino e agora os sensores estão lendo corretamente. Referente ao código, é muito mais complexo do isso, isso que passei é apenas um pedaço, pois o processo é complexo mesmo, estou trabalhando para melhorar o código e deixa-lo mais limpo.

Obrigado pelas dicas e críticas sempre são bem vindas. vlw

O facto de ser complexo não é desculpa para criar mil e uma classes...