Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal_I2C.h> // Biblioteca LCD I2C
- #include <TimerOne.h> // Biblioteca do timer1
- #include <Limits.h>
- const int temperatura = 0;
- const int buzzer = A2;
- int SistemaOnOff = 8;
- int pinoativaluz = A1; // Pino ligado ao acionamento da lampada
- int pinopir = 9; // Pino ligado ao sensor
- int acionamento; // Variavel para guardar valor do sensor
- int ConRegre = 240; // Variavel com o valor definido de 30 segundos
- int ConRegreReg = ConRegre; // Recebe valor de referencia
- int MenuCarga = 1;
- int ConfigTemp = 29;
- int val1 = 1; // variavel que recebe valores entre 0 e 100
- int val2 = 1;
- int val3 = 1;
- int val4 = 1;
- int str5 = 0;
- #define bLeft 10 // Os pinos analogicos podem ser
- #define bRight 11 // Usados como digitais, bastando
- //#define bUp 13
- #define bUp 3 // <----------- mudei era 13
- #define bDown 12
- #define bLeft0 90 // Valor de referencia que a
- #define bRight0 91 // funcaoo CheckButton() passa
- #define bUp0 92 // indicando que um botao foi
- #define bDown0 93 // solto
- boolean aLeft, aRight, aUp, aDown; // Grava o ultimo valor lidos nos botoes.
- const int sensorTemp = 0;
- int valorSensorTemp = 0;
- int menorValorTemp = INT_MAX;
- int state = 1; // variavel que guarda posicao atual do menu
- //LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
- LiquidCrystal_I2C lcd(0x39, 2, 1, 0, 7, 6, 5, 4, 3, POSITIVE); // <--------- Meu LCD
- byte seta_direita[8] = {0x00, 0x04, 0x02, 0x1F, 0x02, 0x04, 0x00, 0x00}; //cria seta direita
- byte seta_esquerda[8] = {0x00, 0x04, 0x08, 0x1F, 0x08, 0x04, 0x00, 0x00}; //cria seta esquerda
- byte seta_abaixo[8] = {0x00, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x00, 0x00}; // cria seta abaixo
- byte seta_acima[8] = {0x00, 0x04, 0x0E, 0x15, 0x04, 0x04, 0x00, 0x00}; // cria seta acima
- byte Dir = 1;
- byte Esq = 2;
- byte Desce = 3;
- byte Sobe = 4;
- unsigned char Canal1 = 4; // Port para Triac 1
- unsigned char Canal2 = 5; // Port para Triac 2
- unsigned char Canal3 = 6; // Port para Triac 3
- unsigned char Canal4 = 7; // Port para Triac 4
- unsigned char Pulso_Timer1; // Pulsos gerados pelo Timer1
- unsigned char Disparo[4] = {100, 100, 100, 100}; // Valor inicias para cargas (Apagadas)
- int Contador = 0;
- //--------------------------------
- void setup()
- {
- Serial.begin(9600);
- attachInterrupt(0, zero_cross, FALLING); // Define rotina chamada pela passagem do zero de uma senoide
- Timer1.initialize(75); // Define interrupt de Timer1 a cada 75 us
- Timer1.attachInterrupt(Timer1Zr); // OverFlow de Timer1
- pinMode(bLeft, INPUT_PULLUP); // Botoes
- pinMode(bRight, INPUT_PULLUP);
- pinMode(bUp, INPUT_PULLUP);
- pinMode(bDown, INPUT_PULLUP);
- pinMode(A3, OUTPUT);
- pinMode(buzzer, OUTPUT);
- pinMode(pinoativaluz, OUTPUT); // Define port como saida
- pinMode(pinopir, INPUT); // Define port sensor como entrada
- pinMode(SistemaOnOff, OUTPUT);
- digitalWrite(SistemaOnOff, HIGH); // Comuta para o controle digital digital
- digitalWrite(pinoativaluz, HIGH);
- pinMode(Canal1, OUTPUT); // Define port para Canal1 como saida
- pinMode(Canal2, OUTPUT); // Define port para Canal2 como saida
- pinMode(Canal3, OUTPUT); // Define port para Canal3 como saida
- pinMode(Canal4, OUTPUT); // Define port para Canal4 como saida
- lcd.begin(16, 2); // Iniciando a biblioteca do LCD
- lcd.print("INICIANDO... ");
- delay(500);
- lcd.createChar(Dir, seta_direita); // vai criar novos caracteres
- lcd.createChar(Esq, seta_esquerda);
- lcd.createChar(Desce, seta_abaixo);
- lcd.createChar(Sobe, seta_acima);
- }
- //----------------------------------
- void loop()
- {
- if (MenuCarga == 1)
- {
- Controla_Vent_Temp();
- }
- acionamento = digitalRead(pinopir); //Le o valor do sensor
- if (acionamento != 0)
- {
- digitalWrite(pinoativaluz, HIGH); //aciona a luz se estiver desligada
- ConRegre = ConRegreReg; // reseta o contador para o valor definido pela variavel ConRegreReg
- }
- if (ConRegre <= 0)
- {
- digitalWrite(pinoativaluz, LOW); // desliga a luz ao final da contagem
- }
- ////////////////////////////////////////////////////cod. sensor
- switch (state)
- {
- case 1: //MENU 1 - CONTROLE (LIGADO/DESLIGADO)
- switch (CheckButton())
- {
- case bUp:
- Set_state(2);
- break;
- case bDown:
- Set_state(12);
- break;
- case bLeft:
- digitalWrite(8, LOW);
- lcd.setCursor(0, 1);
- lcd.print("DESLIGADO ");
- tone(buzzer, 1500, 50);
- break;
- case bRight:
- digitalWrite(8, HIGH);
- lcd.setCursor(0, 1);
- lcd.print("LIGADO ");
- tone(buzzer, 1500, 50);
- break;
- default:
- Set_state(1);
- break;
- }
- break;
- case 2: //ILUMINACAO
- switch (CheckButton())
- {
- case bUp:
- Set_state(3);
- break;
- case bDown:
- Set_state(1);
- break;
- case bLeft:
- if (ConRegreReg >= 30)
- {
- ConRegreReg = ConRegreReg - 30;
- }
- ConRegre = ConRegreReg;
- tone(buzzer, 1500, 50);
- break;
- case bRight:
- ConRegreReg = ConRegreReg + 30;
- ConRegre = ConRegreReg;
- tone(buzzer, 1500, 50);
- break;
- default:
- Set_state(2);
- break;
- }
- break;
- case 3: //ILUMINACAO - CONFIGURA TEMPO
- switch (CheckButton())
- {
- case bUp:
- Set_state(4);
- break;
- case bDown:
- Set_state(2);
- break;
- case bLeft:
- if (ConRegreReg >= 30)
- {
- ConRegreReg = ConRegreReg - 30;
- }
- ConRegre = ConRegreReg;
- tone(buzzer, 1500, 50);
- break;
- case bRight:
- ConRegreReg = ConRegreReg + 30;
- ConRegre = ConRegreReg;
- tone(buzzer, 1500, 50);
- break;
- default:
- Set_state(3);
- break;
- }
- break;
- case 4: //ILUMINACAO - MONITORACAO
- switch (CheckButton())
- {
- case bUp:
- Set_state(5);
- break;
- case bDown:;
- Set_state(3);
- break;
- default:
- Set_state(4);
- break;
- }
- break;
- case 5: //CARGA
- switch (CheckButton())
- {
- case bUp:
- Set_state(6);
- break;
- case bDown:
- Set_state(4);
- break;
- default:
- Set_state(5);
- break;
- }
- break;
- case 6: //CARGA - 1
- switch (CheckButton())
- {
- case bUp:
- Set_state(7);
- break;
- case bDown:;
- Set_state(5);
- break;
- case bLeft:
- if (val1 < 100 )
- {
- val1 = val1 + 5;
- if (val1 == 6) val1 = 5;
- Disparo[0] = 105 - val1;
- tone(buzzer, 1500, 50);
- }
- break;
- case bRight:
- if (val1 > 0)
- {
- val1 = val1 - 5;
- if (val1 <= 0) val1 = 1;
- Disparo[0] = 105 - val1;
- tone(buzzer, 1500, 50);
- }
- break;
- default:
- Set_state(6);
- break;
- }
- break;
- case 7: //CARGA - 2
- switch (CheckButton())
- {
- case bUp:
- Set_state(8);
- break;
- case bDown:
- Set_state(6);
- break;
- case bLeft:
- if (val2 < 100 )
- {
- val2 = val2 + 5;
- if (val2 == 6) val2 = 5;
- Disparo[1] = 105 - val2;
- tone(buzzer, 1500, 50);
- }
- break;
- case bRight:
- if (val2 > 0)
- {
- val2 = val2 - 5;
- if (val2 <= 0) val2 = 1;
- Disparo[1] = 105 - val2;
- tone(buzzer, 1500, 50);
- }
- break;
- default:
- Set_state(7);
- break;
- }
- break;
- case 8: //CARGA - 3
- switch (CheckButton())
- {
- case bUp:
- Set_state(9);
- break;
- case bDown:
- Set_state(7);
- break;
- case bLeft:
- if (val3 < 100 )
- {
- val3 = val3 + 1;
- Disparo[2] = 101 - val3;
- tone(buzzer, 1500, 50);
- }
- break;
- case bRight:
- if (val3 > 0)
- {
- val3 = val3 - 1;
- if (val3 <= 0) val3 = 1;
- Disparo[2] = 101 - val3;
- tone(buzzer, 1500, 50);
- }
- break;
- default:
- Set_state(8);
- break;
- }
- break;
- case 9: //CARGA - 4
- switch (CheckButton())
- {
- case bUp:
- Set_state(10);
- break;
- case bDown:
- Set_state(8);
- break;
- case bLeft:
- if (val4 < 100 )
- {
- val4 = val4 + 1;
- Disparo[3] = 101 - val4;
- tone(buzzer, 1500, 50);
- }
- break;
- case bRight:
- if (val4 > 0)
- {
- val4 = val4 - 1;
- if (val4 <= 0) val4 = 1;
- Disparo[3] = 101 - val4;
- tone(buzzer, 1500, 50);
- }
- break;
- default:
- Set_state(9);
- break;
- }
- break;
- case 10: //CARGA - MONITOR TEMPERATURA
- switch (CheckButton())
- {
- case bUp:
- Set_state(11);
- break;
- case bDown:
- Set_state(9);
- break;
- case bLeft:
- tone(buzzer, 1500, 50);
- break;
- case bRight:
- if (MenuCarga == 1)
- {
- tone(buzzer, 1500, 50);
- }
- else if (MenuCarga == 0)
- {
- tone(buzzer, 1500, 50);
- }
- break;
- default:
- Set_state(10);
- break;
- }
- break;
- case 11: //MENU CARGA - ATIVA AUTOMACAO DE ATIVACAO DO DIMMER AUTOMATICAMENTE
- switch (CheckButton())
- {
- case bUp:
- Set_state(12);
- break;
- case bDown:
- Set_state(10);
- break;
- case bLeft:
- MenuCarga = 0;
- lcd.setCursor(0, 1);
- lcd.print("DESLIGADO ");
- tone(buzzer, 1500, 50);
- break;
- case bRight:
- MenuCarga = 1;
- lcd.setCursor(0, 1);
- lcd.print("LIGADO ");
- tone(buzzer, 1500, 50);
- break;
- default:
- Set_state(11);
- }
- break;
- case 12: //MENU CARGA - CONFIGURA TEMPO
- switch (CheckButton())
- {
- case bUp:
- Set_state(1);
- break;
- case bDown:
- Set_state(11);
- break;
- case bLeft:
- ConfigTemp++;
- lcd.setCursor(0, 1);
- lcd.print(ConfigTemp);
- tone(buzzer, 1500, 50);
- break;
- case bRight:
- ConfigTemp--;
- lcd.setCursor(0, 1);
- lcd.print(ConfigTemp);
- tone(buzzer, 1500, 50);
- break;
- default:
- Set_state(12);
- lcd.setCursor(0, 1);
- lcd.print(ConfigTemp);
- lcd.write(B11011111); // Simbolo de graus celsius
- lcd.print("C ");
- }
- default: ;
- }
- }
- //----------------------------------
- char CheckButton() // Checa botoes acionados aLeft Inical = 0
- {
- if (aLeft != digitalRead(bLeft)) // Se aLeft diferente de bLeft
- { // Faça
- aLeft = !aLeft; // Inverste aLeft
- if (aLeft) return bLeft0; // Se aLeft diferente de 0 retorne bLeft0 (90)??
- else return bLeft; // Se aLeft igual a 0 retorne bLeft
- }
- else // Se aLeft igual de bLeft
- if (aRight != digitalRead(bRight)) // Se aRight diferente de bRight
- { // Faça
- aRight = !aRight; // Inverste aRight
- if (aRight) return bRight0; // Se aRight diferente de 0 retorne bRight0 (91)??
- else return bRight; // Se aRight igual a 0 retorne bRight
- }
- else // Se aRight igual de bRight
- if (aUp != digitalRead(bUp)) // Se aUp diferente de bUp
- { // Faça
- aUp = !aUp; // Inverste aUp
- if (aUp) return bUp0; // Se aUp diferente de 0 retorne bUp0 (92)??
- else return bUp; // Se aUp igual a 0 retorne bUp
- }
- else // Se aUp igual de bUp
- if (aDown != digitalRead(bDown)) // Se aDown diferente de bDown
- { // Faça
- aDown = !aDown; // Inverste aDown
- if (aDown) return bDown0; // Se aDown diferente de 0 retorne bDown0 (93)??
- else return bDown; // Se aDown igual a 0 retorne bDown
- }
- else // Se aDown igual de bDown
- return 0; // Retorne 0
- }
- //---------------------------------
- void Set_state(char index)
- {
- state = index; // Atualiza a variavel state para a nova tela
- switch (state) // verifica qual a tela atual e exibe o conteudo correspondente
- {
- case 1: //==================== state 1
- lcd.setCursor(0, 0);
- lcd.print("CONTROLE ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- if (digitalRead(8) == HIGH)
- lcd.print("LIGADO "); // Print LIGADO
- else // Se o sistema estiver desligado
- lcd.print("DESLIGADO "); // Print DESLIGADO
- break;
- case 2: //==================== state 2
- lcd.setCursor(0, 0);
- lcd.print("ILUMINACAO ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print("T. CONF:");
- lcd.print(ConRegreReg);
- lcd.print("s");
- break;
- case 3: //==================== state 3
- lcd.setCursor(0, 0);
- lcd.print("CONF. TEMPO ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print("TEMPO: ");
- lcd.print(ConRegreReg);
- lcd.print("s ");
- break;
- case 4: //==================== state 4
- lcd.setCursor(0, 0);
- lcd.print("MONIT. TEMPO ");
- lcd.write(Sobe);
- lcd.write(Desce); ;
- lcd.setCursor(0, 1);
- lcd.print("TEMPO: ");
- lcd.print(ConRegre);
- lcd.print("s ");
- break;
- case 5: //==================== state 5
- lcd.setCursor(0, 0);
- lcd.print("CARGAS ");
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print("CONFIGURACAO");
- break;
- case 6: //==================== state 6
- lcd.setCursor(0, 0);
- lcd.print("CARGA 1 ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print(val1, DEC); // mostra o valor de "variavel"
- lcd.print(" % ");
- break;
- case 7: //==================== state 7
- lcd.setCursor(0, 0);
- lcd.print("CARGA 2 ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print(val2, DEC); // mostra o valor de "variavel"
- lcd.print(" % ");
- break;
- case 8: //==================== state 8
- lcd.setCursor(0, 0);
- lcd.print("CARGA 3 ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print(val3, DEC); // mostra o valor de "variavel"
- lcd.print(" % ");
- break;
- case 9: //==================== state 9
- lcd.setCursor(0, 0);
- lcd.print("CARGA 4 ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- lcd.print(val4, DEC); // mostra o valor de "variavel"
- lcd.print(" % ");
- break;
- case 10: //==================== state 10
- lcd.setCursor(0, 0);
- lcd.print("TEMPERATURA ");
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- atualizaTemperatura(); // <------------------ Chama rotina de temperatura
- lcd.print(menorValorTemp); // Imprime menor valor
- lcd.write(B11011111); // Simbolo de graus celsius
- lcd.print("C ");
- delay(250);
- break;
- case 11: //==================== state 11
- lcd.setCursor(0, 0);
- lcd.print("AUTOMACAO ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- lcd.setCursor(0, 1);
- if (MenuCarga == 1)
- lcd.print("LIGADO "); // Print LIGADO
- else // Se o sistema estiver desligado
- lcd.print("DESLIGADO "); // Print DESLIGADO
- break;
- case 12: //==================== state 12
- lcd.setCursor(0, 0);
- lcd.print("AJUSTE TEMP ");
- lcd.write(Esq);
- lcd.write(Dir);
- lcd.write(Sobe);
- lcd.write(Desce);
- break;
- default:;
- }
- }
- //-------------------------------------------
- void atualizaTemperatura()
- {
- menorValorTemp = INT_MAX; // Inicializando com o maior valor int possivel
- for (int i = 1; i <= 8; i++)
- {
- valorSensorTemp = analogRead(sensorTemp); // Lendo o valor do sensor de temperatura.
- valorSensorTemp *= 0.54 ; // Transformando valor lido no sensor de temperatura em graus celsius aproximados.
- if (valorSensorTemp < menorValorTemp) // Mantendo sempre a menor temperatura lida
- {
- menorValorTemp = valorSensorTemp;
- }
- }
- }
- //--------------------------------------------
- void Controla_Vent_Temp() // define qual valor a variavel str1 vai receber de acordo com a temperatura
- {
- int verificasistema = digitalRead(8); // le o valor na saida se estao ou nao ativado
- int verificaLuz = digitalRead(A1); // le o valor na saida do luzes
- if (verificasistema == HIGH) // verifica se o sistema estao ou nao operante
- {
- if (verificaLuz == HIGH) // verifica se a luz esta ou nao ligado
- {
- atualizaTemperatura(); // chama a rotina de temperatura
- }
- if (menorValorTemp <= ConfigTemp) // compara a temperatura (LM35) menorValorTemp funcao do sensor e ConfigTemp variavel definida pelo usuario
- {
- str5 = 0;
- }
- if (menorValorTemp >= 35)
- {
- str5 = 90;
- }
- else if (menorValorTemp < 34 && menorValorTemp > 32 )
- {
- str5 = 60;
- }
- else if (menorValorTemp < 31 && menorValorTemp > 30 )
- {
- str5 = 40;
- }
- }
- if (verificasistema == LOW)
- {
- str5 = 0;
- }
- }
- //--------------------------------
- void Timer1Zr() // Rotina chamada pelo Interrupt de Zero do Timer1
- {
- Contador++; // Incrementa contador para contar 1 Segundo
- if (Contador == 13333) // Valor de contagem para 1 segundo
- {
- ConRegre--; // Decrementa tempo programado
- if (ConRegre <= 0) ConRegre = 0; // Se chegar em zero, fica em zero
- Contador = 0; // Zera contador
- }
- Pulso_Timer1++; // Incrementa o tempo de controle de disparo
- if (Disparo[0] == Pulso_Timer1) // Se o atraso do Triac 0 for igual a tempo apos o zerocross
- {
- digitalWrite(Canal1, HIGH); // Dispara Triac
- delayMicroseconds(5); // Tempo de disparo ligado
- digitalWrite(Canal1, LOW); // Corta disparo Triac
- }
- if (Disparo[1] == Pulso_Timer1) // Se o atraso do Triac 1 for igual a tempo apos o zerocross
- {
- digitalWrite(Canal2, HIGH); // Dispara Triac
- delayMicroseconds(5); // Tempo de disparo ligado
- digitalWrite(Canal2, LOW); // Corta disparo Triac
- }
- if (Disparo[2] == Pulso_Timer1) // Se o atraso do Triac 2 for igual a tempo apos o zerocross
- {
- digitalWrite(Canal3, HIGH); // Dispara Triac
- delayMicroseconds(5); // Tempo de disparo ligado
- digitalWrite(Canal3, LOW); // Corta disparo Triac
- }
- if (Disparo[3] == Pulso_Timer1) // Se o atraso do Triac 3 for igual a tempo apos o zerocross
- {
- digitalWrite(Canal4, HIGH); // Dispara Triac
- delayMicroseconds(5); // Tempo de disparo ligado
- digitalWrite(Canal4, LOW); // Corta disparo Triac
- }
- }
- //--------------------------------
- void zero_cross() // Senoide Passou pelo zero
- {
- Pulso_Timer1 = 0; // Zera contador de tempo
- }
Add Comment
Please, Sign In to add comment