Advertisement
RuiViana

fm_projeto_9

Mar 24th, 2018
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.08 KB | None | 0 0
  1. #include <TimerOne.h>
  2. #include <LiquidCrystal_I2C.h>                          // Biblioteca LCD I2C
  3. //LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address     // LCD FM
  4. LiquidCrystal_I2C lcd(0x38,  2, 1, 0, 7, 6, 5, 4, 3, POSITIVE);                                 // LCD RV
  5.  
  6. #define sensor 2                                        // Porta 2 sensor de agua
  7. #define  pinA 3                                         // Porta 3 CLK / KY-040
  8. #define  pinB 4                                         // Porta 4 DT / KY-040
  9. #define bomba 5                                         // Porta 5 para bomba
  10. #define LED 6                                           // Porta 6 LED falta de agua
  11. #define buzzer 9                                        // Porta 9 buzzer
  12. #define luzLED 10                                       // Porta 10 para iluminação
  13. #define push 7                                          // Porta 7 para confirmar menu
  14.  
  15. unsigned long contador = 0;                             // Contador de segundos
  16. unsigned long alarme = 0;                               // Tempo de alarme de falta de agua
  17. unsigned long interGer;                                 // Intervalo de aguacao em geminacao
  18. unsigned long aguaGer;                                  // Tempo de aguacao em geminacao
  19. unsigned long interPro;                                 // Intervalo de aguacao em geminacao
  20. unsigned long aguaPro;                                  // Tempo de aguacao em geminacao
  21. unsigned long interLED_On;                              // Tempo de LED ligado em producao
  22. unsigned long interLED_Off;                             // Tempo de LED desligado em producao
  23.  
  24. int selecao = 0;                                        // Selecao de atividade
  25. int pinALast = 0;                                       // Ultima posicao do encoder
  26. int aVal = 0;                                           // Movimento do encoder
  27. int mostrei = 0;                                        // Flag para evitar pisca do display
  28. int flag = 0;                                           // Indicador de sequencia
  29. int fase = 0;                                           // Indicador de fase
  30. int ative = 0;
  31. //----------------------------------------------------
  32. void setup()
  33. {
  34.   lcd.begin(20, 4);                                     // Inicialisa o LCD 20 x 4
  35.   pinMode(sensor, INPUT_PULLUP);                        // Sensor de agua como entrada
  36.   pinMode(LED, OUTPUT);                                 // LED alarme agua como saida
  37.   digitalWrite(LED, HIGH);                              // Inicia LED desligado
  38.   pinMode(bomba, OUTPUT);                               // Bomba como saida
  39.   digitalWrite(bomba, HIGH);                            // Inicia bomba desligada
  40.   pinMode(buzzer, OUTPUT);                              // Buzzer como saida
  41.   pinMode(luzLED, OUTPUT);                              // Alimentacao como saida
  42.   digitalWrite(luzLED, HIGH);                           // Inicia LuzLED desligada
  43.   pinMode(push, INPUT_PULLUP);                          // Push como entrada pullup
  44.   Serial.begin(9600);                                   // Inicialisa a serial
  45.   lcd.setCursor(0, 0);
  46.   lcd.print(" Sistema Aeroponico ");
  47.   lcd.setCursor(0, 1);
  48.   lcd.print (" Portatil - SAP 2.0 ");
  49.   //  lcd.setCursor(0, 3);                                // FM
  50.   lcd.setCursor(0, 1);                                  // RV
  51.   lcd.print ("***SEJA BEM VINDO***");
  52.   delay(5000);
  53.   lcd.clear();
  54.   Timer1.initialize(100000);                            // Define interrupt de Timer1 a cada segundo
  55.   Timer1.attachInterrupt(segundos);                     // OverFlow de Timer1
  56.   pinMode (pinA, INPUT);                                // Pino de CLOCK do encoder como entrada
  57.   pinMode (pinB, INPUT);                                // Pino de DATA do encoder como entrada
  58.   pinALast = digitalRead(pinA);                         // Estabelece posicao inicial edo encoder
  59. }
  60. //----------------------------------------------------
  61. void loop()
  62. {
  63.   if (digitalRead(push) == LOW)                         // Se sensor de agua estiver desligado
  64.   {
  65.     delay(30);                                          // Debouncing
  66.     if (digitalRead(push) == LOW)                       // Se sensor de agua estiver desligado
  67.     {
  68.       fase = flag;                                      // Seleciona a fase do processo
  69.     }
  70.   }
  71.   if (digitalRead(sensor) == LOW)                       // Se sensor de agua estiver desligado
  72.   {
  73.     lcd.clear();                                        // Limpa LCD
  74.     lcd.setCursor(0, 0);                                // Linha 0 pos 0
  75.     lcd.print("    TANQUE VAZIO    ");                  // Print
  76.     lcd.setCursor(0, 2);                                // Linha 2 pos 0
  77.     lcd.print("    FAVOR ENCHA O   ");                  // Print
  78.     lcd.setCursor(0, 3);                                // Linha 3 pos 0
  79.     lcd.print("    RESERVATORIO    ");                  // Print
  80.     alarme = contador;                                  // Inicialisa tempo de alarme
  81.     while (digitalRead(sensor) == LOW)                  // Enquanto sensor de agua estiver desligado
  82.     {
  83.       //Serial.println(contador - alarme) ;             // Debuf
  84.       if ((contador - alarme) > 100)                    // A cada 15 minutos dispara buzzer
  85.       {
  86.         //Serial.println("buzzer ON"      ) ;             // Debuf
  87.         digitalWrite(buzzer, HIGH);                     // Liga o buzzer
  88.         digitalWrite(LED, HIGH);                        // Liga o buzzer
  89.         alarme = contador;                              // Restaura tempo alarme
  90.         delay(200);                                     // Toca durante 1 segundo
  91.         //Serial.println("buzzer OFF"      ) ;            // Debuf
  92.         digitalWrite(buzzer, LOW) ;                     // Desliga o buzzer
  93.         digitalWrite(LED, LOW);                         // Liga o buzzer
  94.       }
  95.       mostrei = 0;                                      // Libera dados para LCD
  96.     }
  97.   }
  98.   encoder();                                            // Le posicao do encode
  99.   //  Serial.println(selecao);
  100.   if (selecao == 0)                                     // Se nenhma atividade foi selecfionada
  101.   {
  102.     if (mostrei == 0)                                   // Se ainda nao mostrou no LCD
  103.     {
  104.       lcd.clear();                                      // Limpa LCD
  105.       lcd.setCursor(0, 0);                              // Linha 0 posicao 0
  106.       //      lcd.print("        MENU        ");                // FM print
  107.       //      lcd.setCursor(0, 1);                              // FM Linha 0 posicao 0
  108.       //      lcd.print("--------------------");                // FM print
  109.       //      lcd.setCursor(0, 2);                              // FM Linha 0 posicao 0
  110.       lcd.print("  Germinar");                          // print
  111.       //      lcd.setCursor(0, 3);                              // FM Linha 1 posicao 0
  112.       lcd.setCursor(0, 1);                              // RV
  113.       lcd.print("  Produzir");                          // print
  114.       mostrei = 1;                                      // Mostra no LCD uma vez somente
  115.       ative = 0;
  116.       flag = 0;                                         // fase 0 selecionada
  117.     }
  118.   }
  119.   if (selecao == 1)                                     // Se selecionou germinacao
  120.   {
  121.     if (mostrei == 0)                                   // Mostra no LCD uma vez somente
  122.     {
  123.       lcd.clear();                                      // Limpa LCD
  124.       lcd.setCursor(0, 0);                              // Linha 0 posicao 0
  125.       //      lcd.print("        MENU        ");                // FM print
  126.       //      lcd.setCursor(0, 1);                              // FM Linha 0 posicao 0
  127.       //      lcd.print("--------------------");                // FM print
  128.       //      lcd.setCursor(0, 2);                              // FM Linha 0 posicao 0
  129.       lcd.print("> Germinar");                          // print
  130.       //      lcd.setCursor(0, 3);                              // FM Linha 1 posicao 0
  131.       lcd.setCursor(0, 1);                              // RV
  132.       lcd.print("  Produzir");                          // print
  133.       interGer = contador;                              // Inicializa contador de aguar durante geminacao
  134.       mostrei = 1;                                      // Mostra no LCD uma vez somente
  135.       ative = 0;
  136.       flag = 1;                                         // fase 1 selecionada
  137.     }
  138.   }
  139.  
  140.   if (selecao == 2)                                     // Se selecionou producao
  141.   {
  142.     if (mostrei == 0)                                   // Mostra no LCD uma vez somente
  143.     {
  144.       lcd.clear();                                      // Limpa LCD
  145.       lcd.setCursor(0, 0);                              // Linha 0 posicao 0
  146.       //      lcd.print("        MENU        ");                  // FM print
  147.       //      lcd.setCursor(0, 1);                                // FM Linha 0 posicao 0
  148.       //      lcd.print("--------------------");                  // FM print
  149.       //      lcd.setCursor(0, 2);                                // FM Linha 0 posicao 0
  150.       lcd.print("  Germinar");                          // print
  151.       //      lcd.setCursor(0, 3);                                // FM Linha 1 posicao 0
  152.       lcd.setCursor(0, 1);                              // RV
  153.       lcd.print("> Produzir");                          // print
  154.       interPro = contador;                              // Inicializa contador de aguar durante producao
  155.       interLED_On = contador;                           // Inicializa tempo de luz durante producao
  156.       digitalWrite(luzLED, LOW);                        // Acende iluminacao
  157.       mostrei = 1;                                      // Mostra no LCD uma vez somente
  158.       ative = 0;
  159.       flag = 2;                                         // fase 2 selecionada
  160.     }
  161.   }
  162.   if (fase == 0)                                        // Se fase 0 foi selecionada
  163.   {
  164.     digitalWrite(bomba, HIGH);                          // Desliga bomba
  165.     digitalWrite(luzLED, HIGH);                         // Apaga iluminacao
  166.     mostrei = 1;                                        // Mostra no LCD uma vez somente
  167.   }
  168.   if (fase == 1)
  169.   {
  170.     if ((ative == 0) && (selecao == 1))                 // Se nao estiver ativo e selecao for 1
  171.     {
  172.       lcd.clear();                                      // Limpa LCD
  173.       lcd.setCursor(0, 0);                              // Linha 0 posicao 0
  174.       lcd.print("1 - Germinar");                        // print
  175.       lcd.setCursor(13, 0);                             // Linha 0 posicao 15
  176.       lcd.print("B");                                   // print
  177.       lcd.setCursor(15, 0);                             // Linha 0 posicao 15
  178.       lcd.print(!digitalRead(bomba));                   // print
  179.       lcd.setCursor(0, 1);                              // Linha 1 posicao 0
  180.       lcd.print(" Selecionado");                        // print
  181.       ative = 1 ;
  182.     }
  183.     // Serial.println(contador - interGer);             // Debug
  184.  
  185.     if (digitalRead(bomba) == HIGH)                     // Se a bomba esta' desligada
  186.     {
  187.       // if (contador - interGer >= 43200)              // 12 horas
  188.       if (contador - interGer >= 100)                   // 100 Seg teste
  189.       {
  190.         if (selecao == 1)
  191.         {
  192.           lcd.setCursor(13, 0);                         // Linha 0 posicao 15
  193.           lcd.print("B");                               // print
  194.           lcd.setCursor(15, 0);                         // Linha 0 posicao 15
  195.           lcd.print(!digitalRead(bomba));               // print
  196.         }
  197.         //Serial.println("Bomba ligada");               // Debug
  198.         digitalWrite(bomba, LOW);                       // Liga bomba
  199.         aguaGer = contador;                             // Inicialisa tempo de agua acionada
  200.       }
  201.     }
  202.     if (digitalRead(bomba) == LOW)                      // Se a bomba esta' ligada
  203.     {
  204.       if (contador - aguaGer >= 30)                     // 30 segundos
  205.       {
  206.         if (selecao == 1)
  207.         {
  208.           lcd.setCursor(13, 0);                         // Linha 0 posicao 15
  209.           lcd.print("B");                               // print
  210.           lcd.setCursor(15, 0);                         // Linha 0 posicao 15
  211.           lcd.print(!digitalRead(bomba));               // print
  212.         }
  213.         //Serial.println("Bomba desligada");            // Debug
  214.         interGer = contador;                            // Inicializa contador de aguar durante geminacao
  215.         digitalWrite(bomba, HIGH);                      // Desliga bomba
  216.       }
  217.     }
  218.   }
  219.   if (fase == 2)                                        // Se fase 2 estiver selecionada
  220.   {
  221.     if ((ative == 0) && (selecao == 2))                 // Se nao estiver ativo e selecao for 2
  222.     {
  223.       lcd.clear();
  224.       lcd.setCursor(0, 0);                              // Linha 0 posicao 0
  225.       lcd.print("2 - Produzir");                        // print
  226.       lcd.setCursor(13, 0);                             // Linha 0 posicao 15
  227.       lcd.print("B");                                   // print
  228.       lcd.setCursor(15, 0);                             // Linha 0 posicao 15
  229.       lcd.print(!digitalRead(bomba));                   // print
  230.       lcd.setCursor(0, 1);                              // Linha 1 posicao 0
  231.       lcd.print(" Selecionado");                        // print
  232.       lcd.setCursor(13, 1);                             // Linha 0 posicao 15
  233.       lcd.print("L");                                   // print
  234.       lcd.setCursor(15, 1);                             // Linha 0 posicao 15
  235.       lcd.print(!digitalRead(luzLED));                  // print
  236.       ative = 1 ;                                       // informa que já mostrou
  237.     }
  238.     if (digitalRead(bomba) == HIGH)                     // Se a bomba esta' desligada
  239.     {
  240.       // if (contador -interPro >= 3600)                // 1 hora
  241.       if (contador - interPro >= 100)                   // 100 seg teste
  242.       {
  243.         if (selecao == 2)
  244.         {
  245.           lcd.setCursor(13, 0);                         // Linha 0 posicao 15
  246.           lcd.print("B");                               // print
  247.           lcd.setCursor(15, 0);                         // Linha 0 posicao 15
  248.           lcd.print(!digitalRead(bomba));               // print
  249.         }
  250.         //Serial.println("Bomba ligada");               // Debug
  251.         aguaPro = contador;                             // Inicialisa tempo de agua acionada
  252.         digitalWrite(bomba, LOW);                       // Liga bomba
  253.       }
  254.     }
  255.     if (digitalRead(bomba) == LOW)                      // Se a bomba esta' ligada
  256.     {
  257.       if (contador - aguaPro == 100)                    // 30 segundos
  258.       {
  259.         if (selecao == 2)
  260.         {
  261.           lcd.setCursor(13, 0);                         // Linha 0 posicao 15
  262.           lcd.print("B");                               // print
  263.           lcd.setCursor(15, 0);                         // Linha 0 posicao 15
  264.           lcd.print(!digitalRead(bomba));               // print
  265.         }
  266.         //Serial.println("Bomba desligada");            // Debug
  267.         interPro = contador;                            // Inicializa contador de aguar durante producao
  268.         digitalWrite(bomba, HIGH);                      // Desliga bomba
  269.       }
  270.     }
  271.     if (digitalRead(luzLED) == LOW)                     // Se a Led esta' ligado
  272.     {
  273.       // if (contador - interLED_On >= 64800)           // 18 horas
  274.       if (contador - interLED_On >= 100)                // 10 seg teste
  275.       {
  276.         if (selecao == 2)
  277.         {
  278.           lcd.setCursor(13, 1);                         // Linha 0 posicao 15
  279.           lcd.print("L");                               // print
  280.           lcd.setCursor(15, 1);                         // Linha 0 posicao 15
  281.           lcd.print(!digitalRead(luzLED));              // print
  282.         }
  283.         digitalWrite(luzLED, HIGH);                     // Apaga iluminacao
  284.         interLED_Off = contador;                        // Inicializa tempo de iluminacao off
  285.       }
  286.     }
  287.     if (digitalRead(luzLED) == HIGH)                    // Se a Led esta' desligado
  288.     {
  289.       // if (contador - interLED_Off >= 21600)          // 6 horas
  290.       if (contador - interLED_Off >= 60)                // 10 seg  teste
  291.       {
  292.         if (selecao == 2)
  293.         {
  294.           lcd.setCursor(13, 1);                         // Linha 0 posicao 15
  295.           lcd.print("L");                               // print
  296.           lcd.setCursor(15, 1);                         // Linha 0 posicao 15
  297.           lcd.print(!digitalRead(luzLED));              // print
  298.         }
  299.         digitalWrite(luzLED, LOW);                      // Acende iluminacao
  300.         interLED_On = contador;                         // Inicializa tempo de luz durante producao
  301.       }
  302.     }
  303.   }
  304. }
  305. //--------------------------------
  306. void segundos()                                         // Rotina chamada pelo Interrupt de Zero do Timer1
  307. {
  308.   contador++;                                           // Incrementa contador para contar 1 Segundo
  309. }
  310. //--------------------------------
  311. void encoder()                                          // Rotina de movimento do encoder
  312. {
  313.   aVal = digitalRead(pinA);                             // Leia port do encoder
  314.   if (aVal != pinALast)                                 // Encode moveu
  315.   {
  316.     if (digitalRead(pinB) != aVal)                      // Moveu CW
  317.     {
  318.       selecao ++;                                       // Incrementa contador de posicao
  319.       if (selecao > 2)                                  // Se posicao > que 2
  320.       {
  321.         selecao = 0;                                    // Vai pra zero
  322.       }
  323.     }
  324.     else                                                // Moveu CCW
  325.     {
  326.       selecao--;
  327.       if (selecao < 0 )                                 // Se posicao < que 0
  328.       {
  329.         selecao = 2;                                    // Vai pra 2
  330.       }
  331.     }
  332.     mostrei = 0;
  333.   }
  334.   pinALast = aVal;                                      // Salva ultima posicao do encoder
  335. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement