Olá, comunidade Lab de Garagem.
Bom... vou tentar explicar a problemática pela qual estou passando com o desenvolvimento do meu projeto e espero que vocês possam me ajudar.
Desenvolvi uma placa controladora para um sistema de captação e reaproveitamento de aguá de chuva para fins não potáveis em residências. A confecção do hardware está ok, tudo conferido e funcionando corretamente.
Estou trabalhando com dois sensores ultrassônicos HC-SR04, usados para medir o nível de água nos reservatório, variando entre 0 e 100%. e de acordo com os níveis lidos irei acionar uma bomba ou então uma válvula solenoide. O microcontrolador utilizado na placa é um ATmega328P ( o mesmo da plataforma Arduino UNO).
A lógica de programação foi desenvolvida e um êxito na rodagem de testes, no entanto os dados enviados ao display ficam sempre piscando. Eu gostaria de saber o porquê.
Logo abaixo vou deixar algumas fotos para que todos possam ter uma noção mais clara ao que estou me referindo.
Abraço e conto com a colaboração de todos.
CÓDIGO:
#include <LiquidCrystal.h> //Biblioteca do display.
#include <LinkedList.h> //
#include <Gaussian.h> //Bibliotecas para cálculo da média móvel.
#include <GaussianAverage.h> //
#include <Ultrasonic.h> //Biblioteca dos sensores ultrassônicos.
#define trigger1 6 //Trigger do US1 no pino 6.
#define echo1 5 //Trigger do US1 no pino 5.
#define trigger2 4 //Trigger do US2 no pino 4.
#define echo2 3 //Trigger do US2 no pino 3.
#define pulsoSOLENOIDE A4 //Botão da solenóde no pino A4.
#define pulsoBOMBA A5 //Botão da bomba no pino A5.
#define AUTO_MANU 0 //Bot. para sel. do modo de trabalho no pino 0.
#define SOLENOIDE 1 //Saída para acionamento da solenóide no pino 1.
#define BOMBA 2 //Saída para acionamento da bomba no pino 2.
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //Pinos de comu com o display.
GaussianAverage myMovingAverage1(10);
GaussianAverage myMovingAverage2(10);
Ultrasonic ultrasonic1(trigger1, echo1); //Pinos trigger e echo do US1.
Ultrasonic ultrasonic2(trigger2, echo2); //Pinos trigger e echo do US2.
float caixadagua = 28.5; //Caixa d'água com 28,5cm.
float reservatorio = 28.5; //Reservatório com 28,5cm.
int porcentagem1, nivel1, US1; //Variáveis do tipo inteira.
int porcentagem2, nivel2, US2, estadoNivel, setLCD, estadoSolen;
//=========================================================================
void setup(){ //Inícialização do programa.
lcd.begin(20,4); //Define o display com 20 colunas e quatro linhas.
pinMode(pulsoBOMBA,INPUT_PULLUP) //Entrada com pullup interno.
pinMode(pulsoSOLENOIDE,INPUT_PULLUP); //Entrada com pullup interno.
pinMode(AUTO_MANU,INPUT_PULLUP); //Entrada com pullup interno.
pinMode(SOLENOIDE,OUTPUT); //Saída digital.
pinMode(BOMBA,OUTPUT); //Saída digital.
digitalWrite(SOLENOIDE,LOW); //Inicia com a solenóide desligada.
digitalWrite(BOMBA,LOW); //Inicia com a bomba desligada.
estadoNivel = 0; //Atribui valor zero a variável estadoNivel.
estadoSolen = 0; //Atribui valor zero a variável estadoSolen.
} //Fim setup.
//=========================================================================
void loop(){ //Loop do programa.
if(digitalRead(AUTO_MANU) == LOW){ //Cond. que habilita o modo manual.
float cmMsec1;
long microsec1 = ultrasonic1.timing();
cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);
porcentagem1 = (((cmMsec1-6.5)*100)/reservatorio);
nivel1 = (100-porcentagem1);
myMovingAverage1 += nivel1;
myMovingAverage1.process();
US1 = myMovingAverage1.mean; //Lógica responsável pela leitura do US1.
if(US1 > 100){
US1 = 100;
}
if(US1 < 0){
US1 = 0;
}
float cmMsec2;
long microsec2 = ultrasonic2.timing();
cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);
porcentagem2 = ((cmMsec2-12)*100)/caixadagua;
nivel2 = (100-porcentagem2);
myMovingAverage2 += nivel2;
myMovingAverage2.process();
US2 = myMovingAverage2.mean; //Lógica responsável pela leitura do US2.
if(US2 > 100){
US2 = 100;
}
if(US2 < 0){
US2 = 0;
}
lcd.clear(); //limpa a tela do display.
lcd.setCursor(4,0);
lcd.print("MODO MANUAL"); //Imprime na coluna quatro, linha zero.
lcd.setCursor(0,1);
lcd.print("RESERVATORIO = "); //Imprime na coluna zero linha um.
lcd.setCursor(15,1);
lcd.print(US1); //Impr. US1 na coluna quinze, linha um.
lcd.setCursor(18,1);
lcd.print("%"); //Impr. % na coluna dezoito, linha um.
lcd.setCursor(0,2);
lcd.print("CAIXA D'AGUA = "); //Imprime na coluna zero, linha dois.
lcd.setCursor(15,2);
lcd.print(US2); //Impr. US2 na coluna , linha dois.
lcd.setCursor(18,2);
lcd.print("%"); //Impr. % na coluna dezoito,linha dois.
if(digitalRead(pulsoSOLENOIDE) == LOW){
digitalWrite(SOLENOIDE, HIGH); //Aciona a solenóide.
lcd.setCursor(0,3);
lcd.print("SOLEN=ON"); //Imprime ON na coluna zero, linha 3.
}
else{
digitalWrite(SOLENOIDE, LOW); //Desaciona a solenóide.
lcd.setCursor(0,3);
lcd.print("SOLEN=OFF"); //Impr OFF na coluna zero, linha três.
}
if(digitalRead(pulsoBOMBA) == LOW){
digitalWrite(BOMBA, HIGH); //Aciona a bomba.
lcd.setCursor(10,3);
lcd.print("BOMBA=ON"); //Imprime ON na coluna dez, linha três.
}
else{
digitalWrite(BOMBA, LOW); //Desaciona a bomba.
lcd.setCursor(10,3);
lcd.print("BOMBA=OFF"); //Imprime OFF na coluna dez, linha três.
}
} //Fim manual.
//========================================================================
if(digitalRead(AUTO_MANU) == HIGH){ //Cond. que habilita o modo automát.
float cmMsec1;
long microsec1 = ultrasonic1.timing();
cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);
porcentagem1 = (((cmMsec1-6.5)*100)/reservatorio);
nivel1 = (100-porcentagem1);
myMovingAverage1 += nivel1;
myMovingAverage1.process();
US1 = myMovingAverage1.mean; //Lógica responsável pela leitura do US1.
if(US1 > 100){
US1 = 100;
}
if(US1 < 0){
US1 = 0;
}
float cmMsec2;
long microsec2 = ultrasonic2.timing();
cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);
porcentagem2 = ((cmMsec2-12)*100)/caixadagua;
nivel2 = (100-porcentagem2);
myMovingAverage2 += nivel2;
myMovingAverage2.process();
US2 = myMovingAverage2.mean; //Lógica responsável pela leitura do US2.
if(US2 > 100){
US2 = 100;
}
if(US2 < 0){
US2 = 0;
}
lcd.clear(); //limpa a tela do display
lcd.setCursor(2,0);
lcd.print("MODO AUTOMATICO"); //Imprimme na coluna dois, linha zero.
lcd.setCursor(0,1);
lcd.print("RESERVATORIO = "); //Imprime na coluna zero, linha um.
lcd.setCursor(15,1);
lcd.print(US1); //Imp. US1 na coluna quinze, linha um.
lcd.setCursor(18,1);
lcd.print("%"); //Impr. % na coluna dezoito, linha um.
lcd.setCursor(0,2);
lcd.print("CAIXA D'AGUA = "); //Imprime na coluna zero, linha dois.
lcd.setCursor(15,2);
lcd.print(US2); //Imp. US2 coluna quinze, linha dois.
lcd.setCursor(18,2);
lcd.print("%"); //Impri. % coluna dezoito, linha dois.
switch(estadoNivel){ //Switch responsável pelo controle da bomba.
case 0:
estadoNivel = 1; //Atribui valor um à variável estadoNivel.
if((US2 < 20) && (US1 >10)){ //Se US2>20% e US1>10%.
digitalWrite(BOMBA, HIGH); //Aciona a bomba.
}
break;
case 1:
estadoNivel = 2; //Atribui valor dois a var. estadoNivel.
if(US2 > 90){ //Habilita se US2>90%.
digitalWrite(BOMBA, LOW); //Desaciona a bomba.
setLCD = 0;
}
break;
case 2:
estadoNivel = 0; //Atribui valor zero à var. estadoNivel.
if(US1 < 10){ //Habilita se US1<10%.
digitalWrite(BOMBA, LOW); //Desaciona a bomba.
setLCD = 0;
}
break;
}
if (digitalRead(BOMBA) == LOW){ //Se a bomba estiver desligada.
lcd.setCursor(10,3);
lcd.print("BOMBA=OFF"); //Imprime na coluna zero, linha três.
}
else{
lcd.setCursor(10,3);
lcd.print("BOMBA=ON"); //Imprime na coluna dez, linha três.
}
switch(estadoSolen){ //Switch responsável pelo controle da solenóide.
case 0:
//Atribui valor um a var. estadoSolen.
if((US2 <20) && (US1 < 10)){ //Se US2> 20% e US1<20%.
digitalWrite(SOLENOIDE, HIGH); //Aciona solenóide.
}
break;
case 1:
estadoSolen = 0; //Atribui valor zero a var. estadoSolen.
if(US2 > 90){ //Se US2>90%.
digitalWrite(SOLENOIDE, LOW); //Desaciona a solenóide.
}
break;
}
if (digitalRead(SOLENOIDE) == LOW){ //Se a sol. estiver desligada.
lcd.setCursor(0,3);
lcd.print("SOLEN=OFF"); //Imprime na coluna zero, linha três.
}
else{
lcd.setCursor(0,3);
lcd.print("SOLEN=ON"); //Imprime na coluna zero, linha três.
}
}
delay(500);
} //Fim loop.
Tags:
As respostas para este tópico estão encerradas.
Oi JCS, boa tarde.
PFNCCNADTDT
Se quiser saber o que significa, vá em :
http://labdegaragem.com/forum/topics/por-favor-n-o-cole-code-na-are...
Rui
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por