/*
* Curso: Engenharia de Computação 3
* Disciplina: Microcontroladores
* Professor: Marcio Grassi
* Estudantes: Bruno Felix, Gustavo Bossolan, Isadora Martins e Pedro Sperandio
*/
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
//-----------------------------------
//setup do stepper
const int stepsPorRevolucao = 200;
const int passo180 = 100;
Stepper mystepper(stepsPorRevolucao, 8, 9, 10, 11);
bool stepperNaPosicao0 = true;
//-----------------------------------
#define LCD_ADDR 0x27
#define LCD_LINHA 2
#define LCD_COLUNA 16
LiquidCrystal_I2C lcd(LCD_ADDR,LCD_LINHA,LCD_COLUNA);
//-----------------------------------
//setup dos componentes mais genéricos
#define LED_1 2
#define LED_2 3
#define BUZZER 4
#define BOTAO 5
#define SENSOR 13
#define TIPO_SENSOR DHT22
#define LIMITE 40
//-------------------------------------
//setup dos delays
const long INTERVALO_LEITURA = 500;
const long INTERVALO_ALARME = 200;
const long INTERVALO_BOTAO = 50;
unsigned long tempoAnteriorLeitura = 0;
unsigned long tempoAnteriorAlarme = 0;
unsigned long tempoAnteriorBotao = 0;
//-------------------------------------
//setup da biblioteca do dht
DHT dht(SENSOR, TIPO_SENSOR);
//graus
byte graus[8] = {
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};
//tony feliz
byte feliz[8] = {
0b00000, //
0b00000, //
0b01010, // █ █
0b00000, //
0b00000, //
0b10001, // █ █
0b01110, // ███
0b00000 //
};
//tony 💀
byte caveira[8] = {
0b00000, //
0b01110, // ███
0b10101, // █ █ █
0b11011, // ██ ██
0b01110, // ███
0b01110, // ███
0b00000, //
0b00000 //
};
//Variaveis de controle usadas
float temperatura = 0;
float humidade = 0;
float tempAnterior = 0;
float humyAnterior = 0;
void setup() {
//--------------------------------
//startup do lcd
lcd.begin(16,2);
lcd.init();
lcd.backlight();
lcd.createChar(0, graus);
lcd.createChar(1, feliz);
lcd.createChar(2, caveira);
lcd.clear();
//--------------------------------
//startup do dht
dht.begin();
Serial.begin(9600);
Serial.println("Inicializando:");
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BOTAO, INPUT_PULLUP);
//--------------------------------
//escolhendo velocidade do motor
mystepper.setSpeed(60);
}
// Antiloop motor / antibounce botão
bool controleTemperaura = true;
bool controleTemperauraAnterior = true;
int ultimoEstadoBotao = HIGH;
//move para 0 graus o motor
void moverStepperPara0()
{
if(!stepperNaPosicao0)
{
Serial.println("Movendo para 0°...");
mystepper.step(-(passo180));
stepperNaPosicao0 = true;
}
}
//move para 180 graus, tinha pensado 90 no começo mas mudei e fiquei com preguiça de mudar o nome kkkk
void moverStepperPara90()
{
if(stepperNaPosicao0)
{
Serial.println("Movendo para 180°...");
mystepper.step(passo180);
stepperNaPosicao0 = false;
}
}
void loop()
{
unsigned long millis_atual = millis(); //contador utilizando millis
int botaoAtual = digitalRead(BOTAO);
//botao que muda o modo de exebição da temperatura
if(botaoAtual == LOW && ultimoEstadoBotao == HIGH)
{
if((millis() - tempoAnteriorBotao) > INTERVALO_BOTAO)
{
controleTemperaura = !controleTemperaura;
if(controleTemperaura) Serial.println("Modo C°");
if(!controleTemperaura) Serial.println("Modo F°");
tempoAnteriorBotao = millis();
}
}
ultimoEstadoBotao = botaoAtual;
//atualiza temperatura
if(millis_atual - tempoAnteriorLeitura >= INTERVALO_LEITURA)
{
temperatura = dht.readTemperature();
humidade = dht.readHumidity();
tempoAnteriorLeitura = millis_atual;
}
//atualiza display conforme ocorre mudança de temperatura, tipo só precisa mudar se tiver
if(temperatura != tempAnterior || controleTemperauraAnterior != controleTemperaura)
{
lcd.clear();
Serial.print("Temp: ");
if(controleTemperaura)
{
Serial.println(temperatura);
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.print(temperatura,1);
lcd.write(0);
lcd.print("C");
tempAnterior = temperatura;
}
else
{
Serial.println((temperatura * 1.8) + 32);
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.print((temperatura * 1.8) + 32,1);
lcd.write(0);
lcd.print("F");
tempAnterior = temperatura;
}
}
controleTemperauraAnterior = controleTemperaura;
//rotaciona o stepeer simulando a abertura de uma valvula
if(temperatura <= LIMITE)
{
moverStepperPara0();
}
else
{
moverStepperPara90();
}
// temperatura ok, led verde ligado, vermelho desligado
if(temperatura <= LIMITE)
{
digitalWrite(LED_2,HIGH);
digitalWrite(LED_1,LOW);
noTone(BUZZER);
lcd.setCursor(0,1);
lcd.print("Status: ");
lcd.write(1);
//moverStepperPara0();
}
//temperatura perigosa, ligando led vermelho e fazendo ele e o alarme piscar.
else
{
digitalWrite(LED_2, LOW);
lcd.setCursor(0,1);
lcd.print("Status: ");
lcd.write(2);
lcd.print(" ALERTA");
//moverStepperPara90();
if(millis_atual - tempoAnteriorAlarme >= INTERVALO_ALARME)
{
bool ligado = digitalRead(LED_1);
if(ligado)
{
digitalWrite(LED_1, LOW);
noTone(BUZZER);
}
else
{
digitalWrite(LED_1, HIGH);
tone(BUZZER, 1000);
}
tempoAnteriorAlarme = millis_atual;
}
}
}
/*
praise the eletronics :D
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠣⡉⢦⢠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⢃⣧⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠞⠉⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢵⡤⠻⢧⢄⠀⠀⠀⠀⠀⠀⠀⠀⢰⣏⣈⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⡾⠗⠉⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣴⡺⣿⣉⣉⣉⡓⠲⡖⣚⣉⡿⡇⣾⡿⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⢖⡩⠗⠛⠛⠹⡇⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⣹⣎⢎⠪⣿⡄⣨⣭⡭⠥⡿⡿⠁⣿⣿⡦⣙⠆⠤⠤⣄⠀⣀⣀⣾⠔⢊⡥⠒⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃⡏⠉⣻⣆⠈⠙⢿⡿⠁⢀⣃⡧⢤⡜⣏⠑⠺⢍⠒⢲⡦⣽⠯⣍⣹⠾⠅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠛⠒⠲⠶⣄⣤⠤⣄⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠞⣲⢣⠎⡇⠙⢦⡀⡠⢷⢔⣯⣽⠥⢆⣷⢻⠀⢀⡬⠿⠛⣪⣳⠟⡟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢸⠃⠉⠉⠓⠒⠭⠭⢙⣒⡒⢿⠶⢶⣶⡧⢾⣧⡾⠠⣇⣀⠤⣿⣧⡀⢹⠿⢀⣀⡀⢹⣿⡿⢯⠀⢀⣼⡋⢩⢁⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⢶⣾⣾⣫⣍⡉⠉⢱⡖⢓⡶⠛⠛⠛⣶⣷⣜⣿⣧⣼⢋⣀⣴⣟⠉⠀⢹⣿⢼⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢳⠹⡟⢿⢷⣚⢢⢼⡄⠀⢸⣿⢿⣿⡿⣧⣽⣞⣏⠛⠻⣏⡗⠤⣾⣽⠸⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⠤⣷⢸⢄⡎⠙⢦⢿⣿⡶⢶⣾⠶⣿⣿⣿⡹⠿⠀⢀⡇⣹⠉⠙⠯⠷⢷⡶⣤⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣜⡼⢀⠏⠘⣮⡤⠔⠚⢏⢁⣠⣾⢣⣿⣿⣞⣿⠛⢿⣿⣟⡽⠭⢿⢿⡿⣿⢾⡧⢾⡬⠭⣕⣒⡀⠤⢤⣀⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⢷⣸⣗⠿⢋⣀⣀⣠⡼⣻⢿⢧⣏⣀⢨⢯⣿⣧⣀⠿⣏⠀⢀⣧⣎⡜⠁⠀⠀⠀⠁⠀⠀⠀⠀⠈⠉⠉⢻⡟⠫⠶⠶⢤⣄⣀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢤⣤⡗⠹⣭⣷⠿⣗⣩⣿⣾⡏⢀⣜⣷⡾⣿⡯⠭⠺⡝⣇⠀⠘⣷⠊⡎⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠇⠀⠀⠀⠀⠀⠈
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠔⢊⡡⣷⡞⣻⢩⡻⠒⠶⢾⠷⣝⠻⢏⡀⠰⠀⠝⣿⣀⣷⣬⢿⡤⣩⣻⢃⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠔⣊⠴⠂⠁⠀⠙⣷⣡⠟⠀⠀⡠⠊⠀⠀⠑⠢⣝⡶⣂⣀⣉⣩⣾⣘⠒⣛⣿⣽⡿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡠⣔⠯⠒⠉⠀⠀⠀⠀⠀⣼⣿⡟⢷⡒⢋⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⠀⠘⡆⠘⡙⣣⡗⢳⣤⠛⣗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣠⡶⠟⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⣷⠟⢧⠈⠳⢼⣖⡀⠀⠀⣀⠀⠈⠀⠀⠀⢀⣸⢱⡄⣷⡏⠀⠐⠋⠳⡌⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⡤⠖⠋⢱⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡛⠀⢸⢷⡜⡮⢻⢦⡀⠀⠀⠉⠁⠀⠀⢀⡴⢾⢪⣷⢷⣃⣸⣀⠀⠀⠈⢦⣣⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡌⡇⠀⡸⠀⢽⣷⣼⠀⠙⠦⣀⣀⣠⠴⣾⣻⡷⠛⣧⠟⣃⡀⢀⣈⡑⠦⡀⣔⣋⣠⡧⠤⡜⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠁⠃⣰⠁⡄⠉⣻⠻⡤⣀⠀⠀⢀⡏⠀⣿⣯⣧⣞⠁⡴⡿⡠⠊⠉⠉⠫⣠⠒⠉⠁⠙⢆⢈⣦⣈⣣⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠇⠀⠐⠁⠀⡡⣾⣽⣷⣧⡙⠒⡷⣳⠒⣺⠟⠓⢦⡉⠙⠛⢿⣅⠀⠀⠀⠀⠀⠀⠀⠀⢠⢿⣯⡁⢣⣤⠖⠋⠀⢹⡇⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠎⢀⣠⢴⣲⣿⠶⣧⡈⣟⡻⣟⡾⣷⡷⠞⠁⠀⢦⣄⠉⠲⡄⣼⡬⠦⡀⠀⠀⠀⠀⣠⣾⠟⢉⡏⣧⢸⡄⢱⣴⢺⠈⡇⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⢼⡾⡵⢪⡿⢛⢿⣃⣬⣿⠋⣹⣾⠋⡌⠀⠀⠀⢀⣧⡘⢫⣜⡴⠋⣠⠞⢯⣵⣄⣠⢊⡼⢥⣴⡻⡀⢳⣺⣷⣚⣻⡇⠀⢱⣄⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⣷⢦⣿⡵⢷⣿⣱⣳⠚⢿⣾⣇⣴⡟⠁⠀⢱⡀⠀⣠⡿⠉⠉⠉⢉⣩⡾⠟⢗⣦⣍⣙⡷⠯⠖⠛⢼⣿⡱⣄⠁⠈⠫⣥⠀⠀⠈⡿⡄⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣰⣟⠀⣼⣮⣼⡳⠀⠀⢙⢯⣗⢤⣰⣿⣎⣽⡀⢀⣀⡠⢷⣾⣋⣀⣠⠤⢾⣿⣿⣷⣤⡈⢏⢿⣹⠤⣀⠀⠀⠀⣟⡆⢻⠛⠦⣄⣿⣄⣀⡰⡃⡇⠀⠀⠀⠀
⠀⠀⠀⠀⢀⡠⠔⠋⡎⢈⠓⣯⡘⣼⣽⣄⣀⣾⠳⠋⠈⣿⠿⡽⠉⢿⠉⠉⠉⢿⣇⡀⢸⣀⣴⢿⣿⣝⣿⣿⣿⣾⢸⠗⠀⠀⠉⠒⠦⡇⢹⢮⠤⠖⠛⢻⡿⣿⡧⢵⡟⠀⠀⠀⠀
⠀⠀⠀⢰⠛⡢⣄⡜⠠⠋⡰⠛⡿⣾⠿⠛⣿⣅⠀⠀⢠⢾⢰⠃⠀⠀⠦⠀⠀⠸⣿⢾⡟⣏⣹⣿⣯⣻⣮⠙⣿⣿⣇⠀⠔⢄⠀⠀⠀⣯⠺⡈⢦⣷⠈⣁⣴⣟⡡⢻⠇⠀⠀⠀⠀
⠀⠀⠀⠘⢇⣀⣈⠽⣄⠼⠁⠘⡄⢸⢧⡜⠀⠙⢿⢶⣿⣸⠇⠀⠀⠀⢀⢹⣶⣒⠛⣿⣷⠻⣇⣿⡞⣿⢿⣾⡟⢣⡈⠻⣦⡈⢆⠀⢰⠳⣄⡹⡄⠈⡟⠛⠋⠀⢀⡼⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢸⣇⠀⢨⣿⣄⣰⠁⡇⠀⢷⠀⠀⠀⠘⢉⠏⠀⠀⠀⠀⡞⣿⣿⣘⣯⣿⢻⣦⣻⣜⣿⣾⠿⠛⢷⣌⡟⢦⠈⠙⢾⣇⣸⣳⡈⢛⡇⢸⠁⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠁⠉⠉⢻⣿⣧⣸⠀⠀⠇⣣⡀⠀⢀⠎⠀⠀⠀⠀⣰⣸⢿⡿⠿⠿⣿⡜⣿⡟⠋⠙⣽⡀⠀⠸⣾⣳⣄⠑⢄⠀⢈⡟⣶⣽⣮⢠⡇⠀⠀⠀⠀⣾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢀⠀⢀⢀⢸⣿⣿⣿⡄⣰⠀⡇⢣⣰⠟⠀⠀⠀⠀⢀⠇⣿⣾⡇⠀⠀⠈⢳⣿⠀⠀⠀⠘⡳⡀⠀⠹⣯⢻⣿⣮⣇⣸⣽⢾⣄⢸⡼⠀⠀⠀⠀⠘⡏⠀⠀⠀⠀⠀⠀
⠀⠀⠶⢴⠶⣾⠿⠿⠿⢽⠁⢸⢿⣾⣿⢶⡤⣺⡟⠀⠀⠀⠀⠀⡸⢰⡿⣿⠀⠀⠀⠀⠘⣿⡀⠀⠀⠀⠙⡵⡄⠀⠘⣿⣿⡸⣿⠻⣜⠈⢻⣿⠃⠀⠀⠀⠀⡌⡇⠀⠀⠀⠀⠀⠀
⠀⠀⠐⠋⠉⠉⠉⠁⢒⣸⠀⢈⣆⣩⣽⢿⣏⡝⠀⠀⠀⠀⠀⢠⣇⣿⣿⡇⠀⠀⠀⠀⠀⢿⡇⠀⠀⠀⠀⠙⣜⢆⠀⣿⣷⣳⣉⢳⣌⣳⣼⠇⠀⠀⠀⠀⠀⢽⠀⠀⠀⠀⠀⠀⠀
*/