Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <TimerOne.h>
- #include <LiquidCrystal_I2C.h> // Biblioteca LCD I2C
- //LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address // LCD FM
- LiquidCrystal_I2C lcd(0x38, 2, 1, 0, 7, 6, 5, 4, 3, POSITIVE); // LCD RV
- #define sensor 2 // Porta 2 sensor de agua
- #define pinA 3 // Porta 3 CLK / KY-040
- #define pinB 4 // Porta 4 DT / KY-040
- #define bomba 5 // Porta 5 para bomba
- #define LED 6 // Porta 6 LED falta de agua
- #define buzzer 9 // Porta 9 buzzer
- #define luzLED 10 // Porta 10 para iluminação
- #define push 7 // Porta 7 para confirmar menu
- unsigned long contador = 0; // Contador de segundos
- unsigned long alarme = 0; // Tempo de alarme de falta de agua
- unsigned long interGer; // Intervalo de aguacao em geminacao
- unsigned long aguaGer; // Tempo de aguacao em geminacao
- unsigned long interPro; // Intervalo de aguacao em geminacao
- unsigned long aguaPro; // Tempo de aguacao em geminacao
- unsigned long interLED_On; // Tempo de LED ligado em producao
- unsigned long interLED_Off; // Tempo de LED desligado em producao
- int selecao = 0; // Selecao de atividade
- int pinALast = 0; // Ultima posicao do encoder
- int aVal = 0; // Movimento do encoder
- int mostrei = 0; // Flag para evitar pisca do display
- int flag = 0; // Indicador de sequencia
- int fase = 0; // Indicador de fase
- int ative = 0;
- //----------------------------------------------------
- void setup()
- {
- lcd.begin(20, 4); // Inicialisa o LCD 20 x 4
- pinMode(sensor, INPUT_PULLUP); // Sensor de agua como entrada
- pinMode(LED, OUTPUT); // LED alarme agua como saida
- digitalWrite(LED, HIGH); // Inicia LED desligado
- pinMode(bomba, OUTPUT); // Bomba como saida
- digitalWrite(bomba, HIGH); // Inicia bomba desligada
- pinMode(buzzer, OUTPUT); // Buzzer como saida
- pinMode(luzLED, OUTPUT); // Alimentacao como saida
- digitalWrite(luzLED, HIGH); // Inicia LuzLED desligada
- pinMode(push, INPUT_PULLUP); // Push como entrada pullup
- Serial.begin(9600); // Inicialisa a serial
- lcd.setCursor(0, 0);
- lcd.print(" Sistema Aeroponico ");
- lcd.setCursor(0, 1);
- lcd.print (" Portatil - SAP 2.0 ");
- // lcd.setCursor(0, 3); // FM
- lcd.setCursor(0, 1); // RV
- lcd.print ("***SEJA BEM VINDO***");
- delay(5000);
- lcd.clear();
- Timer1.initialize(100000); // Define interrupt de Timer1 a cada segundo
- Timer1.attachInterrupt(segundos); // OverFlow de Timer1
- pinMode (pinA, INPUT); // Pino de CLOCK do encoder como entrada
- pinMode (pinB, INPUT); // Pino de DATA do encoder como entrada
- pinALast = digitalRead(pinA); // Estabelece posicao inicial edo encoder
- }
- //----------------------------------------------------
- void loop()
- {
- if (digitalRead(push) == LOW) // Se sensor de agua estiver desligado
- {
- delay(30); // Debouncing
- if (digitalRead(push) == LOW) // Se sensor de agua estiver desligado
- {
- fase = flag; // Seleciona a fase do processo
- }
- }
- if (digitalRead(sensor) == LOW) // Se sensor de agua estiver desligado
- {
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Linha 0 pos 0
- lcd.print(" TANQUE VAZIO "); // Print
- lcd.setCursor(0, 2); // Linha 2 pos 0
- lcd.print(" FAVOR ENCHA O "); // Print
- lcd.setCursor(0, 3); // Linha 3 pos 0
- lcd.print(" RESERVATORIO "); // Print
- alarme = contador; // Inicialisa tempo de alarme
- while (digitalRead(sensor) == LOW) // Enquanto sensor de agua estiver desligado
- {
- //Serial.println(contador - alarme) ; // Debuf
- if ((contador - alarme) > 100) // A cada 15 minutos dispara buzzer
- {
- //Serial.println("buzzer ON" ) ; // Debuf
- digitalWrite(buzzer, HIGH); // Liga o buzzer
- digitalWrite(LED, HIGH); // Liga o buzzer
- alarme = contador; // Restaura tempo alarme
- delay(200); // Toca durante 1 segundo
- //Serial.println("buzzer OFF" ) ; // Debuf
- digitalWrite(buzzer, LOW) ; // Desliga o buzzer
- digitalWrite(LED, LOW); // Liga o buzzer
- }
- mostrei = 0; // Libera dados para LCD
- }
- }
- encoder(); // Le posicao do encode
- // Serial.println(selecao);
- if (selecao == 0) // Se nenhma atividade foi selecfionada
- {
- if (mostrei == 0) // Se ainda nao mostrou no LCD
- {
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Linha 0 posicao 0
- // lcd.print(" MENU "); // FM print
- // lcd.setCursor(0, 1); // FM Linha 0 posicao 0
- // lcd.print("--------------------"); // FM print
- // lcd.setCursor(0, 2); // FM Linha 0 posicao 0
- lcd.print(" Germinar"); // print
- // lcd.setCursor(0, 3); // FM Linha 1 posicao 0
- lcd.setCursor(0, 1); // RV
- lcd.print(" Produzir"); // print
- mostrei = 1; // Mostra no LCD uma vez somente
- ative = 0;
- flag = 0; // fase 0 selecionada
- }
- }
- if (selecao == 1) // Se selecionou germinacao
- {
- if (mostrei == 0) // Mostra no LCD uma vez somente
- {
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Linha 0 posicao 0
- // lcd.print(" MENU "); // FM print
- // lcd.setCursor(0, 1); // FM Linha 0 posicao 0
- // lcd.print("--------------------"); // FM print
- // lcd.setCursor(0, 2); // FM Linha 0 posicao 0
- lcd.print("> Germinar"); // print
- // lcd.setCursor(0, 3); // FM Linha 1 posicao 0
- lcd.setCursor(0, 1); // RV
- lcd.print(" Produzir"); // print
- interGer = contador; // Inicializa contador de aguar durante geminacao
- mostrei = 1; // Mostra no LCD uma vez somente
- ative = 0;
- flag = 1; // fase 1 selecionada
- }
- }
- if (selecao == 2) // Se selecionou producao
- {
- if (mostrei == 0) // Mostra no LCD uma vez somente
- {
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Linha 0 posicao 0
- // lcd.print(" MENU "); // FM print
- // lcd.setCursor(0, 1); // FM Linha 0 posicao 0
- // lcd.print("--------------------"); // FM print
- // lcd.setCursor(0, 2); // FM Linha 0 posicao 0
- lcd.print(" Germinar"); // print
- // lcd.setCursor(0, 3); // FM Linha 1 posicao 0
- lcd.setCursor(0, 1); // RV
- lcd.print("> Produzir"); // print
- interPro = contador; // Inicializa contador de aguar durante producao
- interLED_On = contador; // Inicializa tempo de luz durante producao
- digitalWrite(luzLED, LOW); // Acende iluminacao
- mostrei = 1; // Mostra no LCD uma vez somente
- ative = 0;
- flag = 2; // fase 2 selecionada
- }
- }
- if (fase == 0) // Se fase 0 foi selecionada
- {
- digitalWrite(bomba, HIGH); // Desliga bomba
- digitalWrite(luzLED, HIGH); // Apaga iluminacao
- mostrei = 1; // Mostra no LCD uma vez somente
- }
- if (fase == 1)
- {
- if ((ative == 0) && (selecao == 1)) // Se nao estiver ativo e selecao for 1
- {
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Linha 0 posicao 0
- lcd.print("1 - Germinar"); // print
- lcd.setCursor(13, 0); // Linha 0 posicao 15
- lcd.print("B"); // print
- lcd.setCursor(15, 0); // Linha 0 posicao 15
- lcd.print(!digitalRead(bomba)); // print
- lcd.setCursor(0, 1); // Linha 1 posicao 0
- lcd.print(" Selecionado"); // print
- ative = 1 ;
- }
- // Serial.println(contador - interGer); // Debug
- if (digitalRead(bomba) == HIGH) // Se a bomba esta' desligada
- {
- // if (contador - interGer >= 43200) // 12 horas
- if (contador - interGer >= 100) // 100 Seg teste
- {
- if (selecao == 1)
- {
- lcd.setCursor(13, 0); // Linha 0 posicao 15
- lcd.print("B"); // print
- lcd.setCursor(15, 0); // Linha 0 posicao 15
- lcd.print(!digitalRead(bomba)); // print
- }
- //Serial.println("Bomba ligada"); // Debug
- digitalWrite(bomba, LOW); // Liga bomba
- aguaGer = contador; // Inicialisa tempo de agua acionada
- }
- }
- if (digitalRead(bomba) == LOW) // Se a bomba esta' ligada
- {
- if (contador - aguaGer >= 30) // 30 segundos
- {
- if (selecao == 1)
- {
- lcd.setCursor(13, 0); // Linha 0 posicao 15
- lcd.print("B"); // print
- lcd.setCursor(15, 0); // Linha 0 posicao 15
- lcd.print(!digitalRead(bomba)); // print
- }
- //Serial.println("Bomba desligada"); // Debug
- interGer = contador; // Inicializa contador de aguar durante geminacao
- digitalWrite(bomba, HIGH); // Desliga bomba
- }
- }
- }
- if (fase == 2) // Se fase 2 estiver selecionada
- {
- if ((ative == 0) && (selecao == 2)) // Se nao estiver ativo e selecao for 2
- {
- lcd.clear();
- lcd.setCursor(0, 0); // Linha 0 posicao 0
- lcd.print("2 - Produzir"); // print
- lcd.setCursor(13, 0); // Linha 0 posicao 15
- lcd.print("B"); // print
- lcd.setCursor(15, 0); // Linha 0 posicao 15
- lcd.print(!digitalRead(bomba)); // print
- lcd.setCursor(0, 1); // Linha 1 posicao 0
- lcd.print(" Selecionado"); // print
- lcd.setCursor(13, 1); // Linha 0 posicao 15
- lcd.print("L"); // print
- lcd.setCursor(15, 1); // Linha 0 posicao 15
- lcd.print(!digitalRead(luzLED)); // print
- ative = 1 ; // informa que já mostrou
- }
- if (digitalRead(bomba) == HIGH) // Se a bomba esta' desligada
- {
- // if (contador -interPro >= 3600) // 1 hora
- if (contador - interPro >= 100) // 100 seg teste
- {
- if (selecao == 2)
- {
- lcd.setCursor(13, 0); // Linha 0 posicao 15
- lcd.print("B"); // print
- lcd.setCursor(15, 0); // Linha 0 posicao 15
- lcd.print(!digitalRead(bomba)); // print
- }
- //Serial.println("Bomba ligada"); // Debug
- aguaPro = contador; // Inicialisa tempo de agua acionada
- digitalWrite(bomba, LOW); // Liga bomba
- }
- }
- if (digitalRead(bomba) == LOW) // Se a bomba esta' ligada
- {
- if (contador - aguaPro == 100) // 30 segundos
- {
- if (selecao == 2)
- {
- lcd.setCursor(13, 0); // Linha 0 posicao 15
- lcd.print("B"); // print
- lcd.setCursor(15, 0); // Linha 0 posicao 15
- lcd.print(!digitalRead(bomba)); // print
- }
- //Serial.println("Bomba desligada"); // Debug
- interPro = contador; // Inicializa contador de aguar durante producao
- digitalWrite(bomba, HIGH); // Desliga bomba
- }
- }
- if (digitalRead(luzLED) == LOW) // Se a Led esta' ligado
- {
- // if (contador - interLED_On >= 64800) // 18 horas
- if (contador - interLED_On >= 100) // 10 seg teste
- {
- if (selecao == 2)
- {
- lcd.setCursor(13, 1); // Linha 0 posicao 15
- lcd.print("L"); // print
- lcd.setCursor(15, 1); // Linha 0 posicao 15
- lcd.print(!digitalRead(luzLED)); // print
- }
- digitalWrite(luzLED, HIGH); // Apaga iluminacao
- interLED_Off = contador; // Inicializa tempo de iluminacao off
- }
- }
- if (digitalRead(luzLED) == HIGH) // Se a Led esta' desligado
- {
- // if (contador - interLED_Off >= 21600) // 6 horas
- if (contador - interLED_Off >= 60) // 10 seg teste
- {
- if (selecao == 2)
- {
- lcd.setCursor(13, 1); // Linha 0 posicao 15
- lcd.print("L"); // print
- lcd.setCursor(15, 1); // Linha 0 posicao 15
- lcd.print(!digitalRead(luzLED)); // print
- }
- digitalWrite(luzLED, LOW); // Acende iluminacao
- interLED_On = contador; // Inicializa tempo de luz durante producao
- }
- }
- }
- }
- //--------------------------------
- void segundos() // Rotina chamada pelo Interrupt de Zero do Timer1
- {
- contador++; // Incrementa contador para contar 1 Segundo
- }
- //--------------------------------
- void encoder() // Rotina de movimento do encoder
- {
- aVal = digitalRead(pinA); // Leia port do encoder
- if (aVal != pinALast) // Encode moveu
- {
- if (digitalRead(pinB) != aVal) // Moveu CW
- {
- selecao ++; // Incrementa contador de posicao
- if (selecao > 2) // Se posicao > que 2
- {
- selecao = 0; // Vai pra zero
- }
- }
- else // Moveu CCW
- {
- selecao--;
- if (selecao < 0 ) // Se posicao < que 0
- {
- selecao = 2; // Vai pra 2
- }
- }
- mostrei = 0;
- }
- pinALast = aVal; // Salva ultima posicao do encoder
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement