Advertisement
GildeonJunior

Temporizar Sistema

Feb 7th, 2019
633
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.57 KB | None | 0 0
  1.  
  2. #include <Wire.h>
  3. #include <LiquidCrystal_I2C.h>
  4.  
  5. // INICIALIZA O DISPLAY NO ENDEREÇO 0X27
  6. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  7.  
  8. // DEFINIÇÃO DE ENTRADAS E SÁIDAS DIGITAIS
  9. #define SinalPressostato 3            // ENTRADA DE SINAL DO CONTATO AUXILIAR DO PRESSOSTATO
  10. #define SinalBombaPress1 A0           // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 1
  11. #define SinalBombaPress2 A1           // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 2
  12. #define SinalBombaOR 4                // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA OR
  13. #define SinalModoProducao 5           // ENTRADA DE SINAL DO CONTATO DA CHAVE DO MODO DE PRODUCAO
  14. #define SinalModoStandBy 6            // ENTRADA DE SINAL DO CONTATO DA CHAVE DO MODO DE STANDBY
  15. #define SinalFiltroAreia 7            // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO DE AREIA
  16. #define SinalFiltroAbrandador 8       // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO ABRANDADOR
  17. #define RelePress1 9                  // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 1
  18. #define RelePress2 10                 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 2
  19. #define ReleBombaOR A2                // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA OR
  20. #define ReleValvulaAgua A3            // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE ENTRADA D'AGUA
  21. #define ReleAutoFlush 11              // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE AUTO FLUSH
  22. #define ReleStandBy 12                // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE STANDBY
  23.  
  24. // VARIAVÉIS GLOBAIS PARA USO NO FLUXO DE ÁGUA
  25. float valor_vazao = 0;        // VARIÁVEL PARA ARMAZENAR O VALOR EM L/MIN
  26. int contaPulso;               // VARIÁVEL PARA A QUANTIDADE DE PULSOS
  27. bool mostra = false;          // LIBERA TELA DE FLUXO
  28. bool flag = false;            // CONTROLE PARA EVITAR REPETIÇÃO DO DISPLAY
  29. unsigned long tempo = 0;      // TEMPO DE millis()
  30. unsigned long ciclo  = 500;   // TEMPO DE LIBERAÇÃO DO DISPLAY
  31.  
  32. // VARIAVÉIS PARA MODO DE OPERAÇÃO
  33. bool ModoProducao = 0;       // VARIÁVEL PARA ARMAZENAR O MODO DE PRODUCAO
  34. bool ModoStandBy = 0;        // VARIÁVEL PARA ARMAZENAR O MODO DE STANDBY
  35. bool ContatoPressostato = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO PRESSOSTATO
  36. bool ContatoAreia = 0;       // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO DE AREIA
  37. bool ContatoAbrandador = 0;  // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO ABRANDADOR
  38. bool ContatoBP1 = 0;
  39. bool ContatoBP2 = 0;
  40. bool ContatoBombaOR = 0;
  41. int  comando = 0;
  42. unsigned long tempo_pressostato = 0;
  43. unsigned long tempo_standby = 0;
  44.  
  45.  
  46. void setup() {
  47.  
  48.   // INICIALIZAÇÃO DA PORTA SERIAL E TEMPO
  49.   Serial.begin(9600);
  50.  
  51.  
  52.   // PORTAS DE ENTRADA DE SINAL
  53.   pinMode(SinalPressostato, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  54.   pinMode(SinalBombaPress1, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  55.   pinMode(SinalBombaPress2, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  56.   pinMode(SinalBombaOR, INPUT_PULLUP);            // PULLUP INVERTE A LOGICA DA PORTA
  57.   pinMode(SinalModoProducao, INPUT_PULLUP);       // PULLUP INVERTE A LOGICA DA PORTA
  58.   pinMode(SinalModoStandBy, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  59.   pinMode(SinalFiltroAreia, INPUT_PULLUP);        // PULLUP INVERTE A LOGICA DA PORTA
  60.   pinMode(SinalFiltroAbrandador, INPUT_PULLUP);   // PULLUP INVERTE A LOGICA DA PORTA
  61.   pinMode(2, INPUT);                              // ENTRADA DO PULSO DO SENSOR DE VAZAO
  62.   attachInterrupt(0, incpulso, RISING);           // CONFIGURA O PINO 2(INTERRUPÇÃO 0)
  63.  
  64.   // PORTAS DE SAÍDA DE SINAL PARA ACIONAMENTO DO RELÉ (SE ATIVA NO ESTADO LOW)
  65.   pinMode(RelePress1, OUTPUT);
  66.   pinMode(RelePress2, OUTPUT);
  67.   pinMode(ReleBombaOR, OUTPUT);
  68.   pinMode(ReleValvulaAgua, OUTPUT);
  69.   pinMode(ReleAutoFlush, OUTPUT);
  70.   pinMode(ReleStandBy, OUTPUT);
  71.  
  72.   // CONFIGURA OS RELÉS PARA FICAREM INICIALMENTE DESLIGADOS
  73.   digitalWrite(RelePress1, HIGH);
  74.   digitalWrite(RelePress2, HIGH);
  75.   digitalWrite(ReleBombaOR, HIGH);
  76.   digitalWrite(ReleValvulaAgua, HIGH);
  77.   digitalWrite(ReleAutoFlush, HIGH);
  78.   digitalWrite(ReleStandBy, HIGH);
  79.  
  80. }
  81.  
  82. void rotina_manutencao_filtros()   // AS BOMBAS DE PRESSURIZAÇÃO NÃO PODEM SER LIGADAS AO MESMO TEMPO, E DEVEM SER ALTERNADAS EM CADA DIA.
  83. {
  84.   Serial.println("Manutenção dos Filtros");
  85.   digitalWrite(RelePress1, LOW);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
  86.   digitalWrite(RelePress2, HIGH);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
  87.   Serial.println("Bomba de Pressurização 1 Ligada - 2 Desligada");
  88.   delay(5000);
  89.   digitalWrite(RelePress1, HIGH);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
  90.   digitalWrite(RelePress2, LOW);     // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
  91.   Serial.println("Bomba de Pressurização 1 Desligada - 2 Ligada");
  92. } // FIM DA ROTINA DE MANUTENÇAO DOS FILTROS
  93.  
  94. void rotina_baixo_fluxo()
  95. {
  96.   mostra = true;                            // TRAVA A TELA
  97.   valor_vazao = (contaPulso / 5.5) / 2 ;    // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
  98.   contaPulso = 0;                           // ZERA A VARIÁVEL
  99. }
  100.  
  101. void rotina_fluxo()
  102. {
  103.   mostra = true;                            // TRAVA A TELA
  104.   valor_vazao = (contaPulso / 5.5) / 2 ;    // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
  105.   lcd.clear();
  106.   lcd.setBacklight(HIGH);
  107.   lcd.setCursor(1, 0);
  108.   lcd.print("OR Produzindo");
  109.   lcd.setCursor(3, 1);
  110.   lcd.print(valor_vazao);                   // ESCREVE NO DISPLAY O VALOR DA VAZAO
  111.   lcd.print(" L/min ");                     // ESCREVE L/MIN
  112.   contaPulso = 0;                           // ZERA A VARIÁVEL
  113. }
  114.  
  115. void desligamento_do_sistema()
  116. {
  117.   Serial.println("Desligando o Sistema da OR");
  118.   digitalWrite(RelePress1, HIGH);
  119.   digitalWrite(RelePress2, HIGH);
  120.   digitalWrite(ReleValvulaAgua, HIGH);
  121.   digitalWrite(ReleAutoFlush, HIGH);
  122.   digitalWrite(ReleBombaOR, HIGH);
  123. }
  124. void loop()
  125. {
  126.   // REALIZA A LEITURA DO MODO DE OPERAÇÃO
  127.   ModoProducao = digitalRead(SinalModoProducao);
  128.   ModoStandBy = digitalRead(SinalModoStandBy);
  129.   ContatoPressostato = digitalRead(SinalPressostato);
  130.   ContatoBP1 = digitalRead(SinalBombaPress1);
  131.   ContatoBP2 = digitalRead(SinalBombaPress2);
  132.   ContatoBombaOR = digitalRead(SinalBombaOR);
  133.   ContatoAreia = digitalRead(SinalFiltroAreia);
  134.   ContatoAbrandador = digitalRead(SinalFiltroAbrandador);
  135.   unsigned long tempo_atual = millis();
  136.  
  137.   if (ModoProducao == LOW && ModoStandBy == HIGH)         // SE O SINAL DO MODO DE PRODUUCAO ESTIVER ATIVO, A OSMOSE USARÁ A ROTINA DA OSMOSE EM OPERAÇÃO NORMAL
  138.   {
  139.     Serial.println("Entrou em Producao");
  140.     digitalWrite(RelePress1, LOW);           // PRIMEIRAMENTE LIGA A BOMBA DE PRESSURIZAÇÃO
  141.     digitalWrite(ReleValvulaAgua, LOW);      // ABRE A VÁLVULA DE ENTRADA D'AGUA
  142.     Serial.println("Aguarda 5s para verificar pressostato");
  143.    
  144.     if ((tempo_atual - tempo_pressostato) > 5000)
  145.     {
  146.       tempo_pressostato = tempo_atual;
  147.  
  148.       if (ContatoPressostato == LOW)
  149.       {
  150.         digitalWrite(ReleBombaOR, LOW);
  151.         Serial.println("Bomba OR Ligada");
  152.       }
  153.       if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao >= 5)
  154.       {
  155.         comando = 0;
  156.       }
  157.       if (ContatoAreia == LOW || ContatoAbrandador == LOW)
  158.       {
  159.         comando = 1;
  160.       }
  161.       if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao < 5)
  162.       {
  163.         comando = 2;
  164.       }
  165.       if (ContatoBombaOR == HIGH)
  166.       {
  167.         comando = 3;
  168.       }
  169.       if (ContatoPressostato == HIGH)
  170.       {
  171.         comando = 4;
  172.       }
  173.       if (ContatoBP1 == HIGH && ContatoBP2 == HIGH)
  174.       {
  175.         comando = 5;
  176.       }
  177.       switch (comando)
  178.       {
  179.         case 0:
  180.           rotina_fluxo();
  181.           Serial.print("OR Produzindo - ");
  182.           Serial.print("Vazão: ");
  183.           Serial.println(valor_vazao);
  184.           delay(500);
  185.           break;
  186.  
  187.         case 1:
  188.           Serial.println("Manutenção dos Filtros");
  189.           delay(500);
  190.           break;
  191.  
  192.         case 2:
  193.           Serial.print("OR c/ Baixa Produção - ");
  194.           rotina_baixo_fluxo();
  195.           Serial.print("Vazão: ");
  196.           Serial.println(valor_vazao);
  197.           delay(500);
  198.           break;
  199.  
  200.         case 3:
  201.           Serial.println("Defeito na Bomba OR");
  202.           delay(500);
  203.           break;
  204.  
  205.         case 4:
  206.           Serial.println("Pressostato c/ Contato Aberto");
  207.           delay(500);
  208.           digitalWrite(ReleBombaOR, HIGH);
  209.           break;
  210.  
  211.           break;
  212.  
  213.         case 5:
  214.           Serial.println("Defeito nas Bombas de Pressurização");
  215.           delay(500);
  216.           break;
  217.  
  218.         case 6:
  219.           break;
  220.       }
  221.     }
  222.   }
  223.  
  224.  
  225.   if (ModoProducao == HIGH && ModoStandBy == LOW)
  226.   {
  227.     Serial.println("Entrou em Modo Stand By");
  228.     Serial.println("Aguarda 30sec minuto para produzir");
  229.     if ((tempo_atual - tempo_standby) > 30000)
  230.     {
  231.       digitalWrite(RelePress1, LOW);           // PRIMEIRAMENTE LIGA A BOMBA DE PRESSURIZAÇÃO
  232.       digitalWrite(ReleValvulaAgua, LOW);      // ABRE A VÁLVULA DE ENTRADA D'AGUA
  233.       digitalWrite(ReleAutoFlush, LOW);
  234.       delay(500);                              // ESPERA 0,5 SEGUNDOS PARA CHEGAR A PRESSÃO NO PRESSOSTATO
  235.       if (ContatoPressostato == LOW)
  236.       {
  237.         digitalWrite(ReleBombaOR, LOW);
  238.         Serial.println("Bomba OR Ligada");
  239.       }
  240.       if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao >= 5)
  241.       {
  242.         comando = 0;
  243.       }
  244.       if (ContatoAreia == LOW || ContatoAbrandador == LOW)
  245.       {
  246.         comando = 1;
  247.       }
  248.       if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao < 5)
  249.       {
  250.         comando = 2;
  251.       }
  252.       if (ContatoBombaOR == HIGH)
  253.       {
  254.         comando = 3;
  255.       }
  256.       if (ContatoPressostato == HIGH)
  257.       {
  258.         comando = 4;
  259.       }
  260.       if (ContatoBP1 == HIGH && ContatoBP2 == HIGH)
  261.       {
  262.         comando = 5;
  263.       }
  264.       switch (comando)
  265.       {
  266.         case 0:
  267.           rotina_fluxo();
  268.           Serial.print("OR Produzindo - ");
  269.           Serial.print("Vazão: ");
  270.           Serial.println(valor_vazao);
  271.           delay(500);
  272.           break;
  273.  
  274.         case 1:
  275.           Serial.println("Manutenção dos Filtros");
  276.           delay(500);
  277.           break;
  278.  
  279.         case 2:
  280.           Serial.print("OR c/ Baixa Produção - ");
  281.           rotina_baixo_fluxo();
  282.           Serial.print("Vazão: ");
  283.           Serial.println(valor_vazao);
  284.           delay(500);
  285.           break;
  286.  
  287.         case 3:
  288.           Serial.println("Defeito na Bomba OR");
  289.           delay(500);
  290.           break;
  291.  
  292.         case 4:
  293.           Serial.println("Pressostato c/ Contato Aberto");
  294.           digitalWrite(ReleBombaOR, HIGH);
  295.           delay(500);
  296.           break;
  297.  
  298.           break;
  299.  
  300.         case 5:
  301.           Serial.println("Defeito nas Bombas de Pressurização");
  302.           delay(500);
  303.           break;
  304.  
  305.         case 6:
  306.           break;
  307.       }
  308.     }
  309.   }
  310.   if ((tempo_atual - tempo_standby) >= 60000) // DESLIGA O SISTEMA POR 1 MINUTO
  311.   {
  312.     desligamento_do_sistema();
  313.     tempo_standby = tempo_atual;
  314.   }
  315.  
  316.   if (ModoProducao == HIGH && ModoStandBy == HIGH)       // SE NÃO HÁ NENHUM SINAL DE MODO DE PRODUCAO, O SISTEMA DA OSMOSE IRÁ DESLIGAR.
  317.   {
  318.     desligamento_do_sistema();
  319.   }
  320. }
  321.  
  322. void incpulso ()
  323. {
  324.   contaPulso++;                   // INCREMENTA A VARIÁVEL DE PULSOS
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement