#include <Wire.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 4 // Pin which is connected to the DHT sensor.
// Uncomment the type of sensor in use:
#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define DHTTYPE DHT21 // DHT 21 (AM2301)
// See guide for details on sensor wiring and usage:
// https://learn.adafruit.com/dht/overview
DHT_Unified dht (DHTPIN, DHTTYPE);// configurando o Sensor DHT - pino e tipo
uint32_t delayMS;// variável para atraso no tempo
const int ok = A1;
const int UP = A2; //BOTOES
const int DOWN = A3;
const int mosfetbulb = 3; //LAMPADA
const int mosfetvap = 6; //FAN
const int rs = 8;
const int en = 9;
const int d4 = 10;
const int d5 = 11; //DISPLAY
const int d6 = 12;
const int d7 = 13;
const int beep = 5;
//COMPONENTES DA CHOCADEIRA
int pwmluz;
int pwmfan;
int T_threshold = 38;
int H_threshold = 60;
int D_threshold;
int A_threshold = 2;
int SET = 0;
int Direction = 0;
int pos = 0;
int eventoHumidade;
int eventoTemperatura;
int tempo = D_threshold;
int led = 2;
boolean T_condition = true;
boolean H_condition = true;
boolean D_condition = true;
boolean A_condition = true;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Servo motor;
//Recebe dias de jogo;
int dias;
//Recebe horas de jogo;
int horas;
//Recebe minutos de jogo;
int minutos;
//Recebe segundos de jogo;
int segundos;
void setup() {
Serial.begin(9600);// monitor serial 9600 bps
dht.begin();// inicializa a função
// Print temperature sensor details.
sensor_t sensor;
sensors_event_t event;
dht.temperature().getSensor(&sensor);
dht.temperature().getEvent(&event);
eventoTemperatura = event.temperature;
// Print humidity sensor details.
dht.humidity().getSensor(&sensor);
dht.humidity().getEvent(&event);
eventoHumidade = event.relative_humidity;
lcd.begin (16, 2); //Initialize the LCD
lcd.home ();
pinMode(ok, INPUT);
pinMode(UP, INPUT);
pinMode(DOWN, INPUT);
pinMode(mosfetbulb, OUTPUT);
pinMode(mosfetvap, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(mosfetbulb, LOW);
digitalWrite(mosfetvap, LOW);
digitalWrite(ok, HIGH);
digitalWrite(UP, HIGH);
digitalWrite(DOWN, HIGH);
delay(50);
motor.attach(A4);
motor.write(pos);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTROLE DA");
lcd.setCursor(0, 1);
lcd.print("CHOCADEIRA");
delay (3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperature &");
lcd.setCursor(0, 1);
lcd.print("Humidity & Day ");
delay (3000);
lcd.clear();
tone(beep, 1300);
delay(100);
noTone(beep);
delay(100);
}
void loop() {
choco(SET);
cronometro(tempo);
controletemp(pwmluz);
controleumid(pwmfan);
controlemoto(pos);
}
void choco(int eclod) {
delay(delayMS);// atraso entre as medições
// Get temperature event and print its value.
sensors_event_t event;// inicializa o evento da Temperatura
dht.temperature().getEvent(&event);// faz a leitura da Temperatura
if (event.relative_humidity < H_threshold) {
tone(beep, 300);
delay(100);
noTone(beep);
delay(100);
}
if (!(event.temperature)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Error reading temperature!");
}
if (SET == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Insira Temperatura:");
lcd.setCursor(0, 1);
lcd.print(T_threshold);
lcd.print(" *C");
while (T_condition) {
if (digitalRead(UP) == LOW) {
tone(beep, 900);
delay(100);
noTone(beep);
delay(100);
T_threshold = T_threshold + 1;
lcd.setCursor(0, 1);
lcd.print(T_threshold);
lcd.print(" *C");
delay(200);
}
if (digitalRead(DOWN) == LOW) {
tone(beep, 1000);
delay(100);
noTone(beep);
delay(100);
T_threshold = T_threshold - 1;
lcd.setCursor(0, 1);
lcd.print(T_threshold);
lcd.print(" *C");
delay(200);
}
if (digitalRead(ok) == LOW) {
delay(200);
T_condition = false;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Insira a Umidade:");
lcd.setCursor(0, 1);
lcd.print(H_threshold);
lcd.print("%");
delay(100);
while (H_condition) {
if (digitalRead(UP) == LOW) {
tone(beep, 1100);
delay(100);
noTone(beep);
delay(100);
H_threshold = H_threshold + 1;
lcd.setCursor(0, 1);
lcd.print(H_threshold);
lcd.print("%");
delay(100);
}
if (digitalRead(DOWN) == LOW) {
tone(beep, 1000);
delay(100);
noTone(beep);
delay(100);
H_threshold = H_threshold - 1;
lcd.setCursor(0, 1);
lcd.print(H_threshold);
lcd.print("%");
delay(200);
}
if (digitalRead(ok) == LOW)
{
delay(100);
H_condition = false;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Insira os Dias:");
lcd.setCursor(0, 1);
lcd.print(D_threshold);
lcd.print(" :");
delay(100);
while (D_condition) {
if (digitalRead(UP) == LOW) {
tone(beep, 1300);
delay(100);
noTone(beep);
delay(100);
D_threshold = D_threshold + 1;
lcd.setCursor(0, 1);
lcd.print(D_threshold);
lcd.print(" :");
delay(100);
}
if (digitalRead(DOWN) == LOW) {
tone(beep, 1200);
delay(100);
noTone(beep);
delay(100);
D_threshold = D_threshold - 1;
lcd.setCursor(0, 1);
lcd.print(D_threshold);
lcd.print(" :");
delay(200);
}
if (digitalRead(ok) == LOW) {
tone(beep, 800);
delay(100);
noTone(beep);
delay(100);
delay(100);
D_condition = false;
}
}
SET = 1;
}
}
void controletemp(int controleT) {
sensors_event_t event;
dht.temperature().getEvent(&event);
// Realiza o cálculo de pwm da luz de acordo com a temperatura
pwmluz = -(event.temperature - T_threshold) * 255;
for (int x = 0; x < mosfetbulb; x++)
{
pwmluz++;
}
if (pwmluz > 255) {
analogWrite(mosfetbulb, 255);
}
if (pwmluz <= 255) {
analogWrite(mosfetbulb, pwmluz);
}
if (pwmluz <= 1) {
digitalWrite(mosfetbulb, LOW);
delay(5000);
}
}
void controleumid(int contoleU) {
sensor_t sensor;
sensors_event_t event;
eventoHumidade = event.relative_humidity;
dht.humidity().getSensor(&sensor);
dht.humidity().getEvent(&event);
// Realiza o cálculo de pwm da luz de acordo com a temperatura
pwmfan = -(event.relative_humidity - H_threshold) * 255;
/*for (int y = 0; y < mosfetvap; y++)
{delay(delayMS);}*/
if (pwmfan < 255) {
analogWrite(mosfetvap, 255);
}
if (pwmfan >= 255) {
analogWrite(mosfetvap, pwmfan);
}
if (pwmfan >= 1) {
digitalWrite(mosfetvap, LOW);
delay(5000);
}
}
void controlemoto(int controleM) {
if (horas == 4 && minutos == 0 && segundos == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ROTACIONANDO OVOS PARA FRENTE");
//Rolagem para a esquerda
for (int posicao = 0; posicao < 16; posicao++) {
lcd.scrollDisplayLeft();
delay(500);
}
for (pos = 45; pos <= 135; pos += 1) {
motor.write(pos);
delay(25);
}
}
if (horas == 8 && minutos == 0 && segundos == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ROTACIONANDO OVOS PARA TRAS");
lcd.setCursor(0, 0);
lcd.print("");//Serial.println(" ROTACIONANDO PARA TRAS ");
//Rolagem para a esquerda
for (int posicao = 0; posicao < 16; posicao++) {
lcd.scrollDisplayLeft();
delay(500);
}
horas = 0;
for (pos = 135; pos >= 45; pos -= 1) {
motor.write(pos);
delay(25);
}
}
/*if ((horas == 0) && (minutos == 0) && (segundos == 0)) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Faltam: ");
lcd.print(dias);
lcd.print(" dias *");
delay(3000);*/
/*do while (D_threshold <= 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OVOS ECLODINDO: AGUARDE");// funcão certa OK
lcd.setCursor(0, 1);
lcd.print("AGUARDE OBSERVE");// funcão certa OK
digitalWrite(mosfetbulb, HIGH);
digitalWrite(mosfetvap, HIGH);
tone(beep, 3300);
delay(100);
noTone(beep);
delay(100);
//Rolagem para a direita
for (int posicao = 0; posicao < 16; posicao++) {
lcd.scrollDisplayRight();
delay(600);
}*/
}
void cronometro(int Decrescente) {
//O LOOP acontece enquanto segundos forem diferentes de zero (valor que muda dentro de condições IF ao final do laço);
//for (segundos != 0; millis() - segundos; millis() > 3600) {}
if (segundos >= 0) {
segundos = segundos - 1;
segundos = -- segundos ;
Serial.println("Entrou no LAÇO");
sensors_event_t event;
dht.temperature().getEvent(&event);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tp ");
lcd.print(event.temperature);
dht.humidity().getEvent(&event);
lcd.print("Um ");
lcd.print(event.relative_humidity);
//Variavél recebe tempo de jogo;
int tempoEscolhido = (D_threshold * 120);//21 dias / = 1.440;
//Recebe tempo total de jogo em minutos menos o segundo inicial;
int tempoFormatado = tempoEscolhido - 1;
horas = tempoFormatado / 60;
dias = horas / 24;
Serial.print("Dias Inicial: ");
Serial.println(dias);
Serial.print("Hora Inicial: ");
Serial.println(horas);
minutos = tempoFormatado % 60;
Serial.print("Minuto Inicial: ");
Serial.println(minutos);
segundos = 60;
Serial.print("Segundo Inicial: ");
Serial.println(segundos);
//Fim da configuração do cronômetro;
//Verifica se a hora é menor que 10 para formatação do texto e se não apenas escreve a hora;
if (horas < 10) {
//Serial.print("Horas LAÇO: ");
Serial.println(horas);
lcd.setCursor(0, 1);
lcd.print('0');
lcd.print(horas);
} else {
//Serial.print("Horas LAÇO: ");
Serial.println(horas);
lcd.setCursor(0, 1);
lcd.print(horas);
}
//Escreve os dois pontos do formato horas ":" ;
lcd.setCursor(3, 1);
lcd.print(":");
//Verifica se o minuto é menor que 10 para formatação do texto;
if (minutos < 10) {
//Serial.print("Minutos LAÇO: ");
Serial.println(minutos);
lcd.setCursor(4, 1);
lcd.print('0');
lcd.print(minutos);
//Verifica se os minutos + segundos equivalem a 1 hora se sim formata a saída, se não apenas exibe os minutos;
} else if ((minutos == 59) && (segundos == 60)) {
int horasVisor = horas + 1;
if (horasVisor < 10) {
lcd.setCursor(4, 1);
lcd.print('0');
lcd.print(horasVisor);
lcd.setCursor(4, 1);
lcd.print("00");
} else {
lcd.setCursor(4, 1);
lcd.print(horasVisor);
}
} else {
Serial.print("Minutos LAÇO: ");
Serial.println(minutos);
lcd.setCursor(4, 1);
lcd.print(minutos);
}
//Escreve os dois pontos do formato horas":"minutos":" ;
lcd.setCursor(6, 1);
lcd.print(":");
//Verifica se o segundo é menor que 10 para formatação do texto;
if (segundos < 10) {
Serial.print("Segundos LAÇO: ");
Serial.println(segundos);
lcd.setCursor(7, 1);
lcd.print('0');
lcd.print(segundos);
//Formata minutos para segundos igual a 60;
} else if (segundos == 60) {
int minutosVisor = minutos + 1;
if ((minutos >= 0) && (minutos < 59)) {
if (minutosVisor < 10) {
lcd.setCursor(7, 1);
lcd.print('0');
lcd.print(minutosVisor);
} else {
lcd.setCursor(7, 1);
lcd.print(minutosVisor);
}
}
lcd.setCursor(7, 1);
lcd.print("00");
} else {
Serial.print("Segundos LAÇO: ");
Serial.println(segundos);
lcd.setCursor(7, 1);
lcd.print(segundos);
}
//Exibe a tela durante 1 segundo e diminui segundos;
//delay(1000);
//lcd.clear();
segundos --;
//
if ((horas > 0) && (segundos == 0)) {
Serial.println("Entrou no IF horas > 0");
if (minutos != 0) {
minutos --;
segundos = 60;
} else {
horas --;
minutos = 59;
segundos = 60;
}
}
if ((horas == 0) && (minutos != 0) && (segundos == 0)) {
Serial.println("Entrou no IF horas == 0 e minutos != 0");
segundos = 60;
minutos --;
}
if ((horas > 0) && (minutos == 00) && (segundos == 0)) {
Serial.println("Entrou no IF horas > 0 e minutos == 0");
segundos = 60;
horas --;
}
if ((horas == 1) && (minutos == 0) && (segundos == 0)) {
Serial.println("Entrou no Quarto IF");
segundos = 60;
horas --;
minutos = 59;
}
if ((horas == 0) && (minutos == 0) && (segundos == 0)) {
lcd.setCursor(2, 0);
lcd.print("GAME OVER!!!");
//delay(1000);
}
}
}