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 3 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO PRESSOSTATO
- #define SinalBombaPress1 A0 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 1
- #define SinalBombaPress2 A1 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA DE PRESSURIZAÇÃO 2
- #define SinalBombaOR 4 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO DISJUNTOR DA BOMBA OR
- #define SinalModoProducao 5 // ENTRADA DE SINAL DO CONTATO DA CHAVE DO MODO DE PRODUCAO
- #define SinalModoStandBy 6 // ENTRADA DE SINAL DO CONTATO DA CHAVE DO MODO DE STANDBY
- #define SinalFiltroAreia 7 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO DE AREIA
- #define SinalFiltroAbrandador 8 // ENTRADA DE SINAL DO CONTATO AUXILIAR DO FILTRO ABRANDADOR
- #define RelePress1 9 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 1
- #define RelePress2 10 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA DE PRESSURIZAÇÃO 2
- #define ReleBombaOR A2 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA BOMBA OR
- #define ReleValvulaAgua A3 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE ENTRADA D'AGUA
- #define ReleAutoFlush 11 // SAÍDA DE SINAL PARA ACIONAR O RELÉ DA VÁLVULA DE AUTO FLUSH
- #define ReleStandBy 12 // 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
- int contaPulso; // VARIÁVEL PARA A QUANTIDADE DE PULSOS
- 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
- bool ModoProducao = 0; // VARIÁVEL PARA ARMAZENAR O MODO DE PRODUCAO
- bool ModoStandBy = 0; // VARIÁVEL PARA ARMAZENAR O MODO DE STANDBY
- bool ContatoPressostato = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO PRESSOSTATO
- bool ContatoAreia = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO DE AREIA
- bool ContatoAbrandador = 0; // VARIÁVEL PARA ARMAZENAR O ESTADO DO FILTRO ABRANDADOR
- bool ContatoBP1 = 0;
- bool ContatoBP2 = 0;
- bool ContatoBombaOR = 0;
- int comando = 0;
- unsigned long tempo_pressostato = 0;
- unsigned long tempo_standby = 0;
- void setup() {
- // INICIALIZAÇÃO DA PORTA SERIAL E TEMPO
- Serial.begin(9600);
- // 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(SinalModoProducao, INPUT_PULLUP); // PULLUP INVERTE A LOGICA DA PORTA
- pinMode(SinalModoStandBy, 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_manutencao_filtros() // AS BOMBAS DE PRESSURIZAÇÃO NÃO PODEM SER LIGADAS AO MESMO TEMPO, E DEVEM SER ALTERNADAS EM CADA DIA.
- {
- Serial.println("Manutenção dos Filtros");
- 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_baixo_fluxo()
- {
- mostra = true; // TRAVA A TELA
- valor_vazao = (contaPulso / 5.5) / 2 ; // CONVERTE PARA L/MIN / 2 DEVIDO OS 500MS UTILIZADO NO CICLO
- contaPulso = 0; // ZERA A VARIÁVEL
- }
- 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 desligamento_do_sistema()
- {
- Serial.println("Desligando o Sistema da OR");
- digitalWrite(RelePress1, HIGH);
- digitalWrite(RelePress2, HIGH);
- digitalWrite(ReleValvulaAgua, HIGH);
- digitalWrite(ReleAutoFlush, HIGH);
- digitalWrite(ReleBombaOR, HIGH);
- }
- void loop()
- {
- // REALIZA A LEITURA DO MODO DE OPERAÇÃO
- ModoProducao = digitalRead(SinalModoProducao);
- ModoStandBy = digitalRead(SinalModoStandBy);
- ContatoPressostato = digitalRead(SinalPressostato);
- ContatoBP1 = digitalRead(SinalBombaPress1);
- ContatoBP2 = digitalRead(SinalBombaPress2);
- ContatoBombaOR = digitalRead(SinalBombaOR);
- ContatoAreia = digitalRead(SinalFiltroAreia);
- ContatoAbrandador = digitalRead(SinalFiltroAbrandador);
- unsigned long tempo_atual = millis();
- 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
- {
- Serial.println("Entrou em Producao");
- digitalWrite(RelePress1, LOW); // PRIMEIRAMENTE LIGA A BOMBA DE PRESSURIZAÇÃO
- digitalWrite(ReleValvulaAgua, LOW); // ABRE A VÁLVULA DE ENTRADA D'AGUA
- Serial.println("Aguarda 5s para verificar pressostato");
- if ((tempo_atual - tempo_pressostato) > 5000)
- {
- tempo_pressostato = tempo_atual;
- if (ContatoPressostato == LOW)
- {
- digitalWrite(ReleBombaOR, LOW);
- Serial.println("Bomba OR Ligada");
- }
- if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao >= 5)
- {
- comando = 0;
- }
- if (ContatoAreia == LOW || ContatoAbrandador == LOW)
- {
- comando = 1;
- }
- if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao < 5)
- {
- comando = 2;
- }
- if (ContatoBombaOR == HIGH)
- {
- comando = 3;
- }
- if (ContatoPressostato == HIGH)
- {
- comando = 4;
- }
- if (ContatoBP1 == HIGH && ContatoBP2 == HIGH)
- {
- comando = 5;
- }
- switch (comando)
- {
- case 0:
- rotina_fluxo();
- Serial.print("OR Produzindo - ");
- Serial.print("Vazão: ");
- Serial.println(valor_vazao);
- delay(500);
- break;
- case 1:
- Serial.println("Manutenção dos Filtros");
- delay(500);
- break;
- case 2:
- Serial.print("OR c/ Baixa Produção - ");
- rotina_baixo_fluxo();
- Serial.print("Vazão: ");
- Serial.println(valor_vazao);
- delay(500);
- break;
- case 3:
- Serial.println("Defeito na Bomba OR");
- delay(500);
- break;
- case 4:
- Serial.println("Pressostato c/ Contato Aberto");
- delay(500);
- digitalWrite(ReleBombaOR, HIGH);
- break;
- break;
- case 5:
- Serial.println("Defeito nas Bombas de Pressurização");
- delay(500);
- break;
- case 6:
- break;
- }
- }
- }
- if (ModoProducao == HIGH && ModoStandBy == LOW)
- {
- Serial.println("Entrou em Modo Stand By");
- Serial.println("Aguarda 30sec minuto para produzir");
- if ((tempo_atual - tempo_standby) > 30000)
- {
- digitalWrite(RelePress1, LOW); // PRIMEIRAMENTE LIGA A BOMBA DE PRESSURIZAÇÃO
- digitalWrite(ReleValvulaAgua, LOW); // ABRE A VÁLVULA DE ENTRADA D'AGUA
- digitalWrite(ReleAutoFlush, LOW);
- delay(500); // ESPERA 0,5 SEGUNDOS PARA CHEGAR A PRESSÃO NO PRESSOSTATO
- if (ContatoPressostato == LOW)
- {
- digitalWrite(ReleBombaOR, LOW);
- Serial.println("Bomba OR Ligada");
- }
- if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao >= 5)
- {
- comando = 0;
- }
- if (ContatoAreia == LOW || ContatoAbrandador == LOW)
- {
- comando = 1;
- }
- if (ContatoPressostato == LOW && ContatoBombaOR == LOW && valor_vazao < 5)
- {
- comando = 2;
- }
- if (ContatoBombaOR == HIGH)
- {
- comando = 3;
- }
- if (ContatoPressostato == HIGH)
- {
- comando = 4;
- }
- if (ContatoBP1 == HIGH && ContatoBP2 == HIGH)
- {
- comando = 5;
- }
- switch (comando)
- {
- case 0:
- rotina_fluxo();
- Serial.print("OR Produzindo - ");
- Serial.print("Vazão: ");
- Serial.println(valor_vazao);
- delay(500);
- break;
- case 1:
- Serial.println("Manutenção dos Filtros");
- delay(500);
- break;
- case 2:
- Serial.print("OR c/ Baixa Produção - ");
- rotina_baixo_fluxo();
- Serial.print("Vazão: ");
- Serial.println(valor_vazao);
- delay(500);
- break;
- case 3:
- Serial.println("Defeito na Bomba OR");
- delay(500);
- break;
- case 4:
- Serial.println("Pressostato c/ Contato Aberto");
- digitalWrite(ReleBombaOR, HIGH);
- delay(500);
- break;
- break;
- case 5:
- Serial.println("Defeito nas Bombas de Pressurização");
- delay(500);
- break;
- case 6:
- break;
- }
- }
- }
- if ((tempo_atual - tempo_standby) >= 60000) // DESLIGA O SISTEMA POR 1 MINUTO
- {
- desligamento_do_sistema();
- tempo_standby = tempo_atual;
- }
- if (ModoProducao == HIGH && ModoStandBy == HIGH) // SE NÃO HÁ NENHUM SINAL DE MODO DE PRODUCAO, O SISTEMA DA OSMOSE IRÁ DESLIGAR.
- {
- desligamento_do_sistema();
- }
- }
- void incpulso ()
- {
- contaPulso++; // INCREMENTA A VARIÁVEL DE PULSOS
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement