Advertisement
Guest User

SKETCH V.3

a guest
Jan 31st, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.25 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3.  
  4. // INICIALIZA O DISPLAY NO ENDEREÇO 0X27
  5. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  6.  
  7. // DEFINIÇÃO DE ENTRADAS E SÁIDAS DIGITAIS
  8. #define SinalPressostato 4           // ENTRADA DE SINAL DO CONTATO AUXILIAR DO PRESSOSTATO
  9. #define SinalBombaPress1 5           // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 1
  10. #define SinalBombaPress2 6           // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 2
  11. #define SinalBombaOR 7               // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA OR
  12. #define SinalModoOperacao 8          // ENTRADA DE SINAL DO CONTATO DA CHAVE DO MODO DE OPERAÇÃO
  13. #define SinalFiltroAreia 9           // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO DE AREIA
  14. #define SinalFiltroAbrandador 10     // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO ABRANDADOR
  15. #define RelePress1 11                // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 1
  16. #define RelePress2 12                // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 2
  17. #define ReleBombaOR A0               // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA OR
  18. #define ReleValvulaAgua A1           // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE ENTRADA D'AGUA
  19. #define ReleAutoFlush A2             // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE AUTO FLUSH
  20. #define ReleStandBy A3              // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE STANDBY
  21.  
  22. // VARIAVÉIS GLOBAIS PARA USO NO FLUXO DE ÁGUA
  23. float valor_vazao = 0;        // VARIÁVEL PARA ARMAZENAR O VALOR EM L/MIN
  24. float media = 0;              // VARIÁVEL PARA FAZER A MEDIA DA VAZAO
  25. float Litros = 0;             // VARIÁVEL PARA A QUANTIDADE DE ÁGUA
  26. float MiliLitros = 0;         // VARIÁVEL PARA CONVERSÃO
  27. int contaPulso;               // VARIÁVEL PARA A QUANTIDADE DE PULSOS
  28. int Min = 0;                  // VARIÁVEL PARA MINUTOS
  29. int i = 0;                    // VARIÁVEL PARA SEGUNDOS
  30. bool mostra = false;          // LIBERA TELA DE FLUXO
  31. bool flag = false;            // CONTROLE PARA EVITAR REPETIÇÃO DO DISPLAY
  32. unsigned long tempo = 0;      // TEMPO DE millis()
  33. unsigned long ciclo  = 500;   // TEMPO DE LIBERAÇÃO DO DISPLAY
  34.  
  35. // VARIAVÉIS PARA MODO DE OPERAÇÃO
  36. int ModoOperacao = 0;       // VARIÁVEL PARA ARMAZENAR O MODO DE OPERAÇÃO AUTOMATICO
  37. int ContatoPressostato = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO PRESSOSTATO
  38. int ContatoAreia = 0;       // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO DE AREIA
  39. int ContatoAbrandador = 0;  // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO ABRANDADOR
  40.  
  41.  
  42.  
  43. void setup() {
  44.  
  45.   // INICIALIZAÇÃO DA PORTA SERIAL E TEMPO
  46.   Serial.begin(9600);
  47.   tempo = millis();
  48.  
  49.   // PORTAS DE ENTRADA DE SINAL
  50.   pinMode(SinalPressostato, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  51.   pinMode(SinalBombaPress1, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  52.   pinMode(SinalBombaPress2, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  53.   pinMode(SinalBombaOR, INPUT_PULLUP);            // PULLUP INVERTE A LOGICA DA PORTA
  54.   pinMode(SinalModoOperacao, INPUT_PULLUP);          // PULLUP INVERTE A LOGICA DA PORTA
  55.   pinMode(SinalFiltroAreia, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  56.   pinMode(SinalFiltroAbrandador, INPUT_PULLUP);   // PULLUP INVERTE A LOGICA DA PORTA
  57.   pinMode(2, INPUT);                              // ENTRADA DO PULSO DO SENSOR DE VAZAO
  58.   attachInterrupt(0, incpulso, RISING);           // CONFIGURA O PINO 2(INTERRUPÇÃO 0)
  59.  
  60.   // PORTAS DE SAÍDA DE SINAL PARA ACIONAMENTO DO RELÉ (SE ATIVA NO ESTADO LOW)
  61.   pinMode(RelePress1, OUTPUT);
  62.   pinMode(RelePress2, OUTPUT);
  63.   pinMode(ReleBombaOR, OUTPUT);
  64.   pinMode(ReleValvulaAgua, OUTPUT);
  65.   pinMode(ReleAutoFlush, OUTPUT);
  66.   pinMode(ReleStandBy, OUTPUT);
  67.  
  68.   // CONFIGURA OS RELÉS PARA FICAREM INICIALMENTE DESLIGADOS
  69.   digitalWrite(RelePress1, HIGH);
  70.   digitalWrite(RelePress2, HIGH);
  71.   digitalWrite(ReleBombaOR, HIGH);
  72.   digitalWrite(ReleValvulaAgua, HIGH);
  73.   digitalWrite(ReleAutoFlush, HIGH);
  74.   digitalWrite(ReleStandBy, HIGH);
  75.  
  76. }
  77.  
  78. void rotina_fluxo()
  79. {
  80.   mostra = true;                            // TRAVA A TELA
  81.   valor_vazao = (contaPulso / 5.5) / 2 ;    // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
  82.   lcd.clear();
  83.   lcd.setBacklight(HIGH);
  84.   lcd.setCursor(1, 0);
  85.   lcd.print("OR Produzindo");
  86.   lcd.setCursor(3, 1);
  87.   lcd.print(valor_vazao);                   // ESCREVE NO DISPLAY O VALOR DA VAZAO
  88.   lcd.print(" L/min ");                     // ESCREVE L/MIN
  89.   contaPulso = 0;                           // ZERA A VARIÁVEL
  90. }
  91.  
  92. void rotina_baixo_fluxo()
  93. {
  94.   mostra = true;                            // TRAVA A TELA
  95.   valor_vazao = (contaPulso / 5.5) / 2 ;    // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
  96.   lcd.clear();
  97.   lcd.setBacklight(HIGH);
  98.   lcd.setCursor(1, 0);
  99.   lcd.print("Baixa Producao");
  100.   lcd.setCursor(3, 1);
  101.   lcd.print(valor_vazao);                   // ESCREVE NO DISPLAY O VALOR DA VAZAO
  102.   lcd.print(" L/min ");                     // ESCREVE L/MIN
  103.   contaPulso = 0;                           // ZERA A VARIÁVEL
  104. }
  105.  
  106. void rotina_manutencao_filtros()   // AS BOMBAS DE PRESSURIZAÇÃO NÃO PODEM SER LIGADAS AO MESMO TEMPO, E DEVEM SER ALTERNADAS EM CADA DIA.
  107. {
  108.   digitalWrite(RelePress1, LOW);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
  109.   digitalWrite(RelePress2, HIGH);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
  110.   Serial.println("Bomba de Pressurização 1 Ligada - 2 Desligada");
  111.   delay(5000);
  112.   digitalWrite(RelePress1, HIGH);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
  113.   digitalWrite(RelePress2, LOW);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
  114.   Serial.println("Bomba de Pressurização 1 Desligada - 2 Ligada");
  115.  
  116.  
  117. } // FIM DA ROTINA DE MANUTENÇAO DOS FILTROS
  118.  
  119. void rotina_osmose_em_producao()
  120. {
  121.   Serial.println("Osmose entrou em produção");
  122.   delay(5000);
  123.   lcd.clear();
  124.   lcd.setBacklight(HIGH);
  125.   lcd.setCursor(0, 0);
  126.   lcd.print("Monitoramento da");
  127.   lcd.setCursor(1, 1);
  128.   lcd.print("Osmose Reversa");
  129.   digitalWrite(RelePress1, LOW);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
  130.   digitalWrite(RelePress2, HIGH);
  131.   Serial.println("Bomba de Pressurização 1 Ligada - 2 Desligada");
  132.   delay(5000);
  133.   digitalWrite(RelePress2, LOW);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
  134.   digitalWrite(RelePress1, HIGH);
  135.   Serial.println("Bomba de Pressurização 1 Desligada - 2 Ligada");
  136.  
  137.   if (ContatoPressostato == LOW)       // SE O CONTATO DO PRESSOSTATO ESTIVER FECHADO, A OSMOSE SEGUE EM PRODUÇÃO
  138.   {
  139.     Serial.println("Pressostato contato fechado - ");
  140.     delay(1000);
  141.     digitalWrite(ReleValvulaAgua, LOW);// LIGA A VÁLVULA DE ENTRADA D'AGUA
  142.     Serial.println("Válvula de Entrada d'agua aberta");
  143.     digitalWrite(ReleBombaOR, LOW);    // LIGA A BOMBA OR
  144.     delay(2000);
  145.     Serial.println("Bomba OR Ligada");
  146.     delay(2000);
  147.  
  148.     if (valor_vazao != 0)              // SE HÁ FLUXO DE ÁGUA TRATADA, CHAMA A ROTINA FLUXO, INDICANDO QUE A OSMOSE ESTÁ PRODUZINDO CORRETAMENTE
  149.     {
  150.       Serial.println("Entrou rotina de fluxo normal");
  151.       delay(2000);
  152.       Serial.print("OR Produzindo - ");
  153.       Serial.print("Vazão: ");
  154.       Serial.print(valor_vazao);
  155.       Serial.println();
  156.       delay(2000);
  157.       rotina_fluxo();
  158.  
  159.      if (ContatoAreia == LOW || ContatoAbrandador == LOW) // SE ALGUM DOS FILTROS ESTIVER ATIVO, A OSMOSE ENTRARÁ NA ROTINA DE MANUTENÇAO DOS FILTROS
  160.     {
  161.       Serial.println("Entrou na rotina de manutenção dos filtros");
  162.       delay(1000);
  163.       rotina_manutencao_filtros();
  164.     }
  165.     }
  166.     if (valor_vazao == 0)              // SE NÃO HÁ FLUXO DE ÁGUA TRATADA, CHAMA A ROTINA DE BAIXO FLUXO, INDICANDO QUE A OSMOSE NÃO ESTÁ PRODUZINDO
  167.     {
  168.       Serial.println("Entrou rotina de baixo fluxo");
  169.       delay(2000);
  170.       Serial.print("OR com baixa Producao - ");
  171.       Serial.print("Vazão: ");
  172.       Serial.print(valor_vazao);
  173.       Serial.println();
  174.       delay(2000);
  175.       rotina_baixo_fluxo();
  176.     }
  177.   }
  178.  
  179.   if (ContatoPressostato == HIGH)
  180.   {
  181.     Serial.println("Pressostato contato aberto");
  182.     delay(500);
  183.     Serial.println("OR Baixa Pressão de entrada");
  184.     delay(500);
  185.     lcd.clear();
  186.     lcd.setBacklight(HIGH);
  187.     lcd.setCursor(4, 0);
  188.     lcd.print("Atencao");
  189.     lcd.setCursor(2, 1);
  190.     lcd.print("Falta d'agua");
  191.     digitalWrite(ReleValvulaAgua, HIGH);// DESLIGA A VÁLVULA DE ENTRADA D'AGUA
  192.     Serial.println("Válvula de entrada d'agua foi fechada");
  193.     delay(500);
  194.     digitalWrite(ReleBombaOR, HIGH);    // DESLIGA A BOMBA OR
  195.     Serial.println("Bomba OR desligada");
  196.     delay(500);
  197.   }
  198.  
  199. } // FIM DA ROTINA DE OSMOSE EM PRODUÇÃO
  200.  
  201. void rotina_standby()
  202. {
  203.   Serial.println("Aguarda 10seg para produzir");
  204.   delay(10000);                    // AGUARDA 1 HORA PARA ENTRAR EM PRODUÇÃO
  205.   Serial.println("A osmose irá produzir por 1 minuto");
  206.   rotina_osmose_em_producao();
  207.   delay(60000);                     // PRODUZ DURANTE 1 MINUTOS
  208.  
  209.  
  210. } // FIM DA ROTINA DE STANDBY
  211.  
  212. void loop() {
  213.  
  214.   // REALIZA A LEITURA DO MODO DE OPERAÇÃO
  215.  
  216.   ModoOperacao = digitalRead(SinalModoOperacao);
  217.   ContatoPressostato = digitalRead(SinalPressostato);
  218.   ContatoAreia = digitalRead(SinalFiltroAreia);
  219.   ContatoAbrandador = digitalRead(SinalFiltroAbrandador);
  220.  
  221.  
  222.   if ((millis() - tempo) >= ciclo)    // TEMPO DE DISPLAY
  223.   {
  224.     tempo = millis();                   // RECUPERA millis()
  225.     flag = false;                       // LIBERA DISPLAY
  226.     mostra = false;                     // LIBERA TELA FLUXO
  227.   }
  228.   if (ModoOperacao == LOW)           // SE O SINAL DO MODO DE OPERACAO ESTIVER ATIVO, A OSMOSE USARÁ A ROTINA DA OSMOSE EM OPERAÇÃO NORMAL
  229.   {
  230.     Serial.println("Entrou em Operação");
  231.     delay(100);
  232.     rotina_osmose_em_producao();
  233.   }
  234.   else        // SE O SINAL DO MODO DE OPERACAO ESTIVER INATIVO, A OSMOSE USARÁ A ROTINA NO MODO STANDBY
  235.   {
  236.     Serial.println("Entrou em StandBy");
  237.     rotina_standby();
  238.   }
  239. } // FIM DO VOID LOOP
  240.  
  241. void incpulso ()
  242. {
  243.   contaPulso++;                   // INCREMENTA A VARIÁVEL DE PULSOS
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement