/*
Curso: Engenharia de computação
prof: Marcio Grassi
Nome: Gustavo boslan, Bruno felis, Isadora Martins, Pedro Esperandio
Playlist do projeto: aleatório do YTB Music;
Matéria: microcontroladores;
projeto legal viu :D
*/
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
//-----------------------------------
const int stepsPorRevolucao = 200;
const int passo180 = 100;
Stepper mystepper(stepsPorRevolucao, 6, 7, 8, 9);
bool stepperNaPosicao0 = true;
//-----------------------------------
#define LCD_ADDR 0x27
#define LCD_LINHA 2
#define LCD_COLUNA 16
LiquidCrystal_I2C lcd(LCD_ADDR,LCD_LINHA,LCD_COLUNA);
//-----------------------------------
#define LED_1 2
#define LED_2 3
#define BUZZER 4
#define BOTAO 5
#define SENSOR 13
#define TIPO_SENSOR DHT22
#define LIMITE 40
//-------------------------------------
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;
//-------------------------------------
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 //
};
float temperatura = 0;
float humidade = 0;
float tempAnterior = 0;
float humyAnterior = 0;
void setup() {
//--------------------------------
lcd.begin(16,2);
lcd.init();
lcd.backlight();
lcd.createChar(0, graus);
lcd.createChar(1, feliz);
lcd.createChar(2, caveira);
lcd.clear();
//--------------------------------
dht.begin();
Serial.begin(9600);
Serial.println("Inicializando:");
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BOTAO, INPUT_PULLUP);
//--------------------------------
mystepper.setSpeed(60);
}
bool controleTemperaura = true;
bool controleTemperauraAnterior = true;
int ultimoEstadoBotao = HIGH;
void testeStepper()
{
Serial.println("=== TESTE STEPPER ===");
Serial.println("Dando +102 passos...");
mystepper.step(passo180);
delay(1000);
Serial.println("Dando -102 passos...");
mystepper.step(passo180);
Serial.println("Teste completo!");
}
void moverStepperPara0()
{
if(!stepperNaPosicao0)
{
Serial.println("Movendo para 0°...");
mystepper.step(-passo180);
stepperNaPosicao0 = true;
}
}
void moverStepperPara90()
{
if(stepperNaPosicao0)
{
Serial.println("Movendo para 180°...");
mystepper.step(passo180);
stepperNaPosicao0 = false;
}
}
void loop()
{
unsigned long millis_atual = millis();
int botaoAtual = digitalRead(BOTAO);
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;
if(millis_atual - tempoAnteriorLeitura >= INTERVALO_LEITURA)
{
temperatura = dht.readTemperature();
humidade = dht.readHumidity();
tempoAnteriorLeitura = millis_atual;
}
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;
if(temperatura <= LIMITE)
{
digitalWrite(LED_2,HIGH);
digitalWrite(LED_1,LOW);
noTone(BUZZER);
lcd.setCursor(0,1);
lcd.print("Status: ");
lcd.write(1);
moverStepperPara0();
}
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;
}
}
}