Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- // INICIALIZA O DISPLAY NO ENDEREÇO 0X27
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- // DEFINIÇÃO DE ENTRADAS E SÁIDAS DIGITAIS
- #define SinalPressostato 4 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO PRESSOSTATO
- #define SinalBombaPress1 5 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 1
- #define SinalBombaPress2 6 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 2
- #define SinalBombaOR 7 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA OR
- #define SinalModoOperacao 8 // ENTRADA DE SINAL DO CONTATO DA CHAVE DO MODO DE OPERAÇÃO
- #define SinalFiltroAreia 9 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO DE AREIA
- #define SinalFiltroAbrandador 10 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO ABRANDADOR
- #define RelePress1 11 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 1
- #define RelePress2 12 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 2
- #define ReleBombaOR A0 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA OR
- #define ReleValvulaAgua A1 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE ENTRADA D'AGUA
- #define ReleAutoFlush A2 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE AUTO FLUSH
- #define ReleStandBy A3 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE STANDBY
- // VARIAVÉIS GLOBAIS PARA USO NO FLUXO DE ÁGUA
- float valor_vazao = 0; // VARIÁVEL PARA ARMAZENAR O VALOR EM L/MIN
- float media = 0; // VARIÁVEL PARA FAZER A MEDIA DA VAZAO
- float Litros = 0; // VARIÁVEL PARA A QUANTIDADE DE ÁGUA
- float MiliLitros = 0; // VARIÁVEL PARA CONVERSÃO
- int contaPulso; // VARIÁVEL PARA A QUANTIDADE DE PULSOS
- int Min = 0; // VARIÁVEL PARA MINUTOS
- int i = 0; // VARIÁVEL PARA SEGUNDOS
- bool mostra = false; // LIBERA TELA DE FLUXO
- bool flag = false; // CONTROLE PARA EVITAR REPETIÇÃO DO DISPLAY
- unsigned long tempo = 0; // TEMPO DE millis()
- unsigned long ciclo = 500; // TEMPO DE LIBERAÇÃO DO DISPLAY
- // VARIAVÉIS PARA MODO DE OPERAÇÃO
- int ModoOperacao = 0; // VARIÁVEL PARA ARMAZENAR O MODO DE OPERAÇÃO AUTOMATICO
- int ContatoPressostato = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO PRESSOSTATO
- int ContatoAreia = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO DE AREIA
- int ContatoAbrandador = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO ABRANDADOR
- void setup() {
- // INICIALIZAÇÃO DA PORTA SERIAL E TEMPO
- Serial.begin(9600);
- tempo = millis();
- // PORTAS DE ENTRADA DE SINAL
- pinMode(SinalPressostato, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalBombaPress1, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalBombaPress2, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalBombaOR, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalModoOperacao, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalFiltroAreia, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalFiltroAbrandador, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(2, INPUT); // ENTRADA DO PULSO DO SENSOR DE VAZAO
- attachInterrupt(0, incpulso, RISING); // CONFIGURA O PINO 2(INTERRUPÇÃO 0)
- // PORTAS DE SAÍDA DE SINAL PARA ACIONAMENTO DO RELÉ (SE ATIVA NO ESTADO LOW)
- pinMode(RelePress1, OUTPUT);
- pinMode(RelePress2, OUTPUT);
- pinMode(ReleBombaOR, OUTPUT);
- pinMode(ReleValvulaAgua, OUTPUT);
- pinMode(ReleAutoFlush, OUTPUT);
- pinMode(ReleStandBy, OUTPUT);
- // CONFIGURA OS RELÉS PARA FICAREM INICIALMENTE DESLIGADOS
- digitalWrite(RelePress1, HIGH);
- digitalWrite(RelePress2, HIGH);
- digitalWrite(ReleBombaOR, HIGH);
- digitalWrite(ReleValvulaAgua, HIGH);
- digitalWrite(ReleAutoFlush, HIGH);
- digitalWrite(ReleStandBy, HIGH);
- }
- void rotina_fluxo()
- {
- mostra = true; // TRAVA A TELA
- valor_vazao = (contaPulso / 5.5) / 2 ; // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
- lcd.clear();
- lcd.setBacklight(HIGH);
- lcd.setCursor(1, 0);
- lcd.print("OR Produzindo");
- lcd.setCursor(3, 1);
- lcd.print(valor_vazao); // ESCREVE NO DISPLAY O VALOR DA VAZAO
- lcd.print(" L/min "); // ESCREVE L/MIN
- contaPulso = 0; // ZERA A VARIÁVEL
- }
- void rotina_baixo_fluxo()
- {
- mostra = true; // TRAVA A TELA
- valor_vazao = (contaPulso / 5.5) / 2 ; // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
- lcd.clear();
- lcd.setBacklight(HIGH);
- lcd.setCursor(1, 0);
- lcd.print("Baixa Producao");
- lcd.setCursor(3, 1);
- lcd.print(valor_vazao); // ESCREVE NO DISPLAY O VALOR DA VAZAO
- lcd.print(" L/min "); // ESCREVE L/MIN
- contaPulso = 0; // ZERA A VARIÁVEL
- }
- void rotina_manutencao_filtros() // AS BOMBAS DE PRESSURIZAÇÃO NÃO PODEM SER LIGADAS AO MESMO TEMPO, E DEVEM SER ALTERNADAS EM CADA DIA.
- {
- digitalWrite(RelePress1, LOW); // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
- digitalWrite(RelePress2, HIGH); // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
- Serial.println("Bomba de Pressurização 1 Ligada - 2 Desligada");
- delay(5000);
- digitalWrite(RelePress1, HIGH); // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
- digitalWrite(RelePress2, LOW); // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
- Serial.println("Bomba de Pressurização 1 Desligada - 2 Ligada");
- } // FIM DA ROTINA DE MANUTENÇAO DOS FILTROS
- void rotina_osmose_em_producao()
- {
- Serial.println("Osmose entrou em produção");
- delay(5000);
- lcd.clear();
- lcd.setBacklight(HIGH);
- lcd.setCursor(0, 0);
- lcd.print("Monitoramento da");
- lcd.setCursor(1, 1);
- lcd.print("Osmose Reversa");
- digitalWrite(RelePress1, LOW); // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 1
- digitalWrite(RelePress2, HIGH);
- Serial.println("Bomba de Pressurização 1 Ligada - 2 Desligada");
- delay(5000);
- digitalWrite(RelePress2, LOW); // FALTA DETERMINAR QUANDO SERÁ LIGADA A BOMBA PRESSURIZAÇÃO 2
- digitalWrite(RelePress1, HIGH);
- Serial.println("Bomba de Pressurização 1 Desligada - 2 Ligada");
- if (ContatoPressostato == LOW) // SE O CONTATO DO PRESSOSTATO ESTIVER FECHADO, A OSMOSE SEGUE EM PRODUÇÃO
- {
- Serial.println("Pressostato contato fechado - ");
- delay(1000);
- digitalWrite(ReleValvulaAgua, LOW);// LIGA A VÁLVULA DE ENTRADA D'AGUA
- Serial.println("Válvula de Entrada d'agua aberta");
- digitalWrite(ReleBombaOR, LOW); // LIGA A BOMBA OR
- delay(2000);
- Serial.println("Bomba OR Ligada");
- delay(2000);
- if (valor_vazao != 0) // SE HÁ FLUXO DE ÁGUA TRATADA, CHAMA A ROTINA FLUXO, INDICANDO QUE A OSMOSE ESTÁ PRODUZINDO CORRETAMENTE
- {
- Serial.println("Entrou rotina de fluxo normal");
- delay(2000);
- Serial.print("OR Produzindo - ");
- Serial.print("Vazão: ");
- Serial.print(valor_vazao);
- Serial.println();
- delay(2000);
- rotina_fluxo();
- if (ContatoAreia == LOW || ContatoAbrandador == LOW) // SE ALGUM DOS FILTROS ESTIVER ATIVO, A OSMOSE ENTRARÁ NA ROTINA DE MANUTENÇAO DOS FILTROS
- {
- Serial.println("Entrou na rotina de manutenção dos filtros");
- delay(1000);
- rotina_manutencao_filtros();
- }
- }
- 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
- {
- Serial.println("Entrou rotina de baixo fluxo");
- delay(2000);
- Serial.print("OR com baixa Producao - ");
- Serial.print("Vazão: ");
- Serial.print(valor_vazao);
- Serial.println();
- delay(2000);
- rotina_baixo_fluxo();
- }
- }
- if (ContatoPressostato == HIGH)
- {
- Serial.println("Pressostato contato aberto");
- delay(500);
- Serial.println("OR Baixa Pressão de entrada");
- delay(500);
- lcd.clear();
- lcd.setBacklight(HIGH);
- lcd.setCursor(4, 0);
- lcd.print("Atencao");
- lcd.setCursor(2, 1);
- lcd.print("Falta d'agua");
- digitalWrite(ReleValvulaAgua, HIGH);// DESLIGA A VÁLVULA DE ENTRADA D'AGUA
- Serial.println("Válvula de entrada d'agua foi fechada");
- delay(500);
- digitalWrite(ReleBombaOR, HIGH); // DESLIGA A BOMBA OR
- Serial.println("Bomba OR desligada");
- delay(500);
- }
- } // FIM DA ROTINA DE OSMOSE EM PRODUÇÃO
- void rotina_standby()
- {
- Serial.println("Aguarda 10seg para produzir");
- delay(10000); // AGUARDA 1 HORA PARA ENTRAR EM PRODUÇÃO
- Serial.println("A osmose irá produzir por 1 minuto");
- rotina_osmose_em_producao();
- delay(60000); // PRODUZ DURANTE 1 MINUTOS
- } // FIM DA ROTINA DE STANDBY
- void loop() {
- // REALIZA A LEITURA DO MODO DE OPERAÇÃO
- ModoOperacao = digitalRead(SinalModoOperacao);
- ContatoPressostato = digitalRead(SinalPressostato);
- ContatoAreia = digitalRead(SinalFiltroAreia);
- ContatoAbrandador = digitalRead(SinalFiltroAbrandador);
- if ((millis() - tempo) >= ciclo) // TEMPO DE DISPLAY
- {
- tempo = millis(); // RECUPERA millis()
- flag = false; // LIBERA DISPLAY
- mostra = false; // LIBERA TELA FLUXO
- }
- if (ModoOperacao == LOW) // SE O SINAL DO MODO DE OPERACAO ESTIVER ATIVO, A OSMOSE USARÁ A ROTINA DA OSMOSE EM OPERAÇÃO NORMAL
- {
- Serial.println("Entrou em Operação");
- delay(100);
- rotina_osmose_em_producao();
- }
- else // SE O SINAL DO MODO DE OPERACAO ESTIVER INATIVO, A OSMOSE USARÁ A ROTINA NO MODO STANDBY
- {
- Serial.println("Entrou em StandBy");
- rotina_standby();
- }
- } // FIM DO VOID LOOP
- void incpulso ()
- {
- contaPulso++; // INCREMENTA A VARIÁVEL DE PULSOS
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement