Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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ão para seleção 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); //Define os pinos para a comunicação com o display.
- GaussianAverage myMovingAverage1(10); //Quantidade de leituras no sensor para média do sensor US1.
- GaussianAverage myMovingAverage2(10); //Quantidade de leituras no sensor para média do sensor US2.
- Ultrasonic ultrasonic1(trigger1, echo1); //Chamada dos pinos trigger e echo do sesnor US1.
- Ultrasonic ultrasonic2(trigger2, echo2); //Chamada dos pinos trigger e echo do sesnor 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; //Variáveis do tipo inteira.
- //==========================================================================================================
- void setup(){ //Inícialização do programa.
- lcd.begin(20,4); //Define o display com 20 colunas e quatro linhas.
- pinMode(pulsoBOMBA,INPUT_PULLUP); //Define pulsoBOMBBA como entrada digital com pullup interno ativado.
- pinMode(pulsoSOLENOIDE,INPUT_PULLUP); //Define pulsoSOLENOIDE como entrada digital com pullup interno ativado.
- pinMode(AUTO_MANU,INPUT_PULLUP); //Define AUTO_MANU como entrada digital com pullup interno ativado.
- pinMode(SOLENOIDE,OUTPUT); //Define SOLENOIDE como saída digital.
- pinMode(BOMBA,OUTPUT); //DEfine BOMBA como 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){ //Condição 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 modo manual na coluna quatro, linha zero.
- lcd.setCursor(0,1);
- lcd.print("RESERVATORIO = "); //Imprime reservatório na coluna zero linha um.
- lcd.setCursor(15,1);
- lcd.print(US1); //Imprime a leitura do US1 na coluna quinze, linha um.
- lcd.setCursor(18,1);
- lcd.print("%"); //Imprime o símbolo da porcentagem na coluna dezoito, linha um.
- lcd.setCursor(0,2);
- lcd.print("CAIXA D'AGUA = "); //Imprime caixa d'água na coluna zero, linha dois.
- lcd.setCursor(15,2);
- lcd.print(US2); //Imprime a leitura do US2 na coluna , linha dois.
- lcd.setCursor(18,2);
- lcd.print("%"); //Imprime o símbolo da porcentagem na coluna dezoito, linha dois.
- if(digitalRead(pulsoSOLENOIDE) == LOW){ //Condição que aciona a solenóide quando pressionado o botão.
- digitalWrite(SOLENOIDE, HIGH); //Aciona a solenóide.
- lcd.setCursor(0,3);
- lcd.print("SOLEN=ON"); //Imprime ON na coluna zero, linha 3.
- }
- else{ //Condição que desaciona a solenóide quando não pressionado o botão.
- digitalWrite(SOLENOIDE, LOW); //Desaciona a solenóide.
- lcd.setCursor(0,3);
- lcd.print("SOLEN=OFF"); //Imprime OFF na coluna zero, linha três.
- }
- if(digitalRead(pulsoBOMBA) == LOW){ //Condição que aciona a bomba quando pressionado o botão.
- digitalWrite(BOMBA, HIGH); //Aciona a bomba.
- lcd.setCursor(10,3);
- lcd.print("BOMBA=ON"); //Imprime ON na coluna dez, linha três.
- }
- else{ //Condição que desaciona a bomba quando não pressionado o botão.
- 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){ //Condição que habilita o modo automático.
- 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 modo automático na coluna dois, linha zero.
- lcd.setCursor(0,1);
- lcd.print("RESERVATORIO = "); //Imprime reservatório na coluna zero, linha um.
- lcd.setCursor(15,1);
- lcd.print(US1); //Imprime a leitura do US1 na coluna quinze, linha um.
- lcd.setCursor(18,1);
- lcd.print("%"); //Imprime o símbolo da porcentagem na coluna dezoito, linha um.
- lcd.setCursor(0,2);
- lcd.print("CAIXA D'AGUA = "); //Imprime caixa d'água na coluna zero, linha dois.
- lcd.setCursor(15,2);
- lcd.print(US2); //Imprime a leitura do US2 na coluna quinze, linha dois.
- lcd.setCursor(18,2);
- lcd.print("%"); //Imprime o símbolo da porcentagem na 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)){ //Habilita a condição se US2 ler menos que 20% e US1 maior que 20%.
- digitalWrite(BOMBA, HIGH); //Aciona a bomba.
- }
- break;
- case 1:
- estadoNivel = 2; //Atribui valor dois a variável estadoNivel.
- if(US2 > 90){ //Habilita a condição se US2 for maior que 90%.
- digitalWrite(BOMBA, LOW); //Desaciiona a bomba.
- setLCD = 0;
- }
- break;
- case 2:
- estadoNivel = 0; //Atribui valor zero à variável estadoNivel.
- if(US1 < 10){ //Habilita a condição se US1 for menor que 10%.
- digitalWrite(BOMBA, LOW); //Desaciona a bomba.
- setLCD = 0;
- }
- break;
- }
- if (digitalRead(BOMBA) == LOW){ //Habilita a condição se a bomba estiver desligada.
- lcd.setCursor(10,3);
- lcd.print("BOMBA=OFF"); //Imprime BOMBA=OFF na coluna zero, linha três.
- }
- else{
- lcd.setCursor(10,3);
- lcd.print("BOMBA=ON"); //Imprime BOMBA=ON na coluna dez, linha três.
- }
- switch(estadoSolen){ //Switch responsável pelo controle da solenóide.
- case 0:
- estadoSolen = 1; //Atribui valor um a variável estadoSolen.
- if((US2 <20) && (US1 < 10)){ //Habilita a condição se US2 for manor que 20% e US1 menor que 20%.
- digitalWrite(SOLENOIDE, HIGH); //Aciona solenóide.
- }
- break;
- case 1:
- estadoSolen = 0; //Atribui valor zero a variável estadoSolen.
- if(US2 > 90){ //Habilita a condição se US2 for maior que 90%.
- digitalWrite(SOLENOIDE, LOW); //Desaciona a solenóide.
- }
- break;
- }
- if (digitalRead(SOLENOIDE) == LOW){ //Habilita a condição quando se a solenoide estiver desligada.
- lcd.setCursor(0,3);
- lcd.print("SOLEN=OFF"); //Imprime SOLEN=OFF na coluna zero, linha três.
- }
- else{
- lcd.setCursor(0,3);
- lcd.print("SOLEN=ON"); //Imprime SOLEN=ON na coluna zero, linha três.
- }
- }
- delay(500);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement