/*
Kaue Vinicius Samartino da Silva - 559317
João dos Santos Cardoso de Jesus - 560400
Davi Praxedes Santos Silva - 560719
*/
#include <DHT.h>
// --- Mapeamento de Pinos ---
#define DHT_PINO 2
#define DHT_TIPO DHT22
// LEDs em ordem física (1º é o mais à esquerda)
#define LED1 3 // Azul
#define LED2 4 // Vermelho
#define LED3 5 // Amarelo
#define LED4 6 // Verde
// Botões em ordem física (1º é o mais à esquerda)
#define BTN1 7
#define BTN2 9
#define BTN3 11
#define BTN4 13
#define POT_PIN A0
// --- Instanciação de Objetos ---
DHT dht(DHT_PINO, DHT_TIPO);
// --- Variáveis Globais ---
// Ex01
int contador_ex01 = 0;
// Ex02
int placar_1_ex02 = 0;
int placar_2_ex02 = 0;
int estadoBotao1_anterior_ex02 = HIGH;
int estadoBotao2_anterior_ex02 = HIGH;
int estadoBotao3_anterior_ex02 = HIGH;
unsigned long ultimo_pisca_led1 = 0;
unsigned long ultimo_pisca_led2 = 0;
int intervalo_led1 = 500;
int intervalo_led2 = 500;
bool led1_estado = LOW;
bool led2_estado = LOW;
bool jogo_finalizado_ex02 = false;
unsigned long tempoUltimoPonto_ex02 = 0;
unsigned long ultimoTempoLoop_ex02 = 0;
// Ex03
int placar1_ex03 = 0;
int placar2_ex03 = 0;
int estadoBtn1_ant_ex03 = HIGH;
int estadoBtn2_ant_ex03 = HIGH;
int estadoBtnReset_ant_ex03 = HIGH;
int estadoBtnComp_ant_ex03 = HIGH;
// Ex04
int estado_led_ex04 = 0;
int estadoBtn1_ant_ex04 = HIGH;
int estadoBtn2_ant_ex04 = HIGH;
int estadoBtn3_ant_ex04 = HIGH;
int estadoBtn4_ant_ex04 = HIGH;
// Ex05
float temperatura, umidade;
int modo_ex05 = 0;
int setPointTemp = 25;
int setPointUmid = 50;
int estadoBotaoModo_anterior = HIGH;
int estadoBotaoSalva_anterior = HIGH;
unsigned long ultimaLeituraDHT = 0;
unsigned long ultimoTempoLoop_ex05 = 0;
unsigned long tempoUltimoBotao_ex05 = 0;
void setup() {
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(BTN1, INPUT_PULLUP);
pinMode(BTN2, INPUT_PULLUP);
pinMode(BTN3, INPUT_PULLUP);
pinMode(BTN4, INPUT_PULLUP);
dht.begin();
Serial.println("Setup concluído. Iniciando o programa...");
}
// Para testar exercicios, descomentar exercicio desejado e comentar o anterior, por favor.
void loop() {
// ex01();
//ex02();
//ex03();
//ex04();
ex05();
}
/**
* @brief Exercício 1: Contador de Acionamentos
*/
void ex01() {
int estadoBotao_atual = digitalRead(BTN1);
static int estadoBotao_anterior = HIGH;
if (estadoBotao_anterior == LOW && estadoBotao_atual == HIGH) {
if (contador_ex01 < 5) {
contador_ex01++;
Serial.print("Contagem: ");
Serial.println(contador_ex01);
for (int i = 0; i < contador_ex01; i++) {
digitalWrite(LED1, HIGH);
delay(150);
digitalWrite(LED1, LOW);
delay(150);
}
}
}
if (contador_ex01 >= 5) {
digitalWrite(LED1, HIGH);
if (contador_ex01 == 5) {
Serial.println("Meta atingida!");
contador_ex01 = 6;
}
}
estadoBotao_anterior = estadoBotao_atual;
delay(50);
}
/**
* @brief Exercício 2: Placar de Pontos Simples
*/
void ex02() {
unsigned long tempoAtual = millis();
if (tempoAtual - ultimoTempoLoop_ex02 < 20) {
return;
}
ultimoTempoLoop_ex02 = tempoAtual;
int estadoBotao1 = digitalRead(BTN1);
int estadoBotao2 = digitalRead(BTN2);
int estadoBotao3 = digitalRead(BTN3);
if (!jogo_finalizado_ex02) {
if (estadoBotao1_anterior_ex02 == LOW && estadoBotao1 == HIGH) {
if (tempoAtual - tempoUltimoPonto_ex02 > 250) {
placar_1_ex02++;
Serial.print("Ponto Jogador 1! Placar: "); Serial.print(placar_1_ex02); Serial.print(" x "); Serial.println(placar_2_ex02);
tempoUltimoPonto_ex02 = tempoAtual;
}
}
if (estadoBotao2_anterior_ex02 == LOW && estadoBotao2 == HIGH) {
if (tempoAtual - tempoUltimoPonto_ex02 > 250) {
placar_2_ex02++;
Serial.print("Ponto Jogador 2! Placar: "); Serial.print(placar_1_ex02); Serial.print(" x "); Serial.println(placar_2_ex02);
tempoUltimoPonto_ex02 = tempoAtual;
}
}
}
if (estadoBotao3_anterior_ex02 == LOW && estadoBotao3 == HIGH) {
placar_1_ex02 = 0; placar_2_ex02 = 0; jogo_finalizado_ex02 = false;
digitalWrite(LED1, LOW); digitalWrite(LED2, LOW);
Serial.println("--- JOGO RESETADO ---");
}
if (!jogo_finalizado_ex02) {
if (placar_1_ex02 >= 10) {
digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW);
Serial.println("Vencedor: Jogador 1!");
jogo_finalizado_ex02 = true;
} else if (placar_2_ex02 >= 10) {
digitalWrite(LED2, HIGH); digitalWrite(LED1, LOW);
Serial.println("Vencedor: Jogador 2!");
jogo_finalizado_ex02 = true;
}
}
if (!jogo_finalizado_ex02) {
if (placar_1_ex02 > placar_2_ex02) {
intervalo_led1 = 150; intervalo_led2 = 500;
} else if (placar_2_ex02 > placar_1_ex02) {
intervalo_led1 = 500; intervalo_led2 = 150;
} else {
digitalWrite(LED1, LOW); digitalWrite(LED2, LOW);
led1_estado = LOW; led2_estado = LOW;
}
if (placar_1_ex02 != placar_2_ex02) {
if (tempoAtual - ultimo_pisca_led1 > intervalo_led1) {
ultimo_pisca_led1 = tempoAtual;
led1_estado = !led1_estado;
digitalWrite(LED1, led1_estado);
}
if (tempoAtual - ultimo_pisca_led2 > intervalo_led2) {
ultimo_pisca_led2 = tempoAtual;
led2_estado = !led2_estado;
digitalWrite(LED2, led2_estado);
}
}
}
estadoBotao1_anterior_ex02 = estadoBotao1;
estadoBotao2_anterior_ex02 = estadoBotao2;
estadoBotao3_anterior_ex02 = estadoBotao3;
}
/**
* @brief Exercício 3: Placar com Comparação e Reset
*/
void ex03() {
int btnP1 = digitalRead(BTN1);
int btnP2 = digitalRead(BTN2);
int btnComp = digitalRead(BTN3);
int btnReset = digitalRead(BTN4);
if (estadoBtn1_ant_ex03 == LOW && btnP1 == HIGH) {
placar1_ex03++;
Serial.print("Ponto Jogador 1. Placar: "); Serial.println(placar1_ex03);
for (int i = 0; i < placar1_ex03; i++) {
digitalWrite(LED1, HIGH); delay(100);
digitalWrite(LED1, LOW); delay(100);
}
}
if (estadoBtn2_ant_ex03 == LOW && btnP2 == HIGH) {
placar2_ex03++;
Serial.print("Ponto Jogador 2. Placar: "); Serial.println(placar2_ex03);
for (int i = 0; i < placar2_ex03; i++) {
digitalWrite(LED2, HIGH); delay(100);
digitalWrite(LED2, LOW); delay(100);
}
}
if (estadoBtnComp_ant_ex03 == LOW && btnComp == HIGH) {
Serial.println("Comparando placares...");
if (placar1_ex03 > placar2_ex03) {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
} else if (placar2_ex03 > placar1_ex03) {
digitalWrite(LED2, HIGH);
digitalWrite(LED1, LOW);
} else {
for (int i = 0; i < 3; i++) {
digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED2, LOW);
delay(200);
}
}
}
if (estadoBtnReset_ant_ex03 == LOW && btnReset == HIGH) {
placar1_ex03 = 0;
placar2_ex03 = 0;
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
Serial.println("PLACAR RESETADO!");
}
estadoBtn1_ant_ex03 = btnP1;
estadoBtn2_ant_ex03 = btnP2;
estadoBtnComp_ant_ex03 = btnComp;
estadoBtnReset_ant_ex03 = btnReset;
delay(50);
}
/**
* @brief Exercício 4: Sequência de LEDs e Botão de Reset Mestre
*/
void ex04() {
int btn1 = digitalRead(BTN1);
int btn2 = digitalRead(BTN2);
int btn3 = digitalRead(BTN3);
int btn4 = digitalRead(BTN4);
if (estadoBtn1_ant_ex04 == LOW && btn1 == HIGH) {
if (estado_led_ex04 == 0 || estado_led_ex04 == 4) {
estado_led_ex04 = 1;
}
}
if (estadoBtn2_ant_ex04 == LOW && btn2 == HIGH) {
if (estado_led_ex04 == 1) {
estado_led_ex04 = 2;
}
}
if (estadoBtn3_ant_ex04 == LOW && btn3 == HIGH) {
if (estado_led_ex04 == 2) {
estado_led_ex04 = 3;
}
}
if (estadoBtn4_ant_ex04 == LOW && btn4 == HIGH) {
if (estado_led_ex04 == 3) {
estado_led_ex04 = 4;
} else {
estado_led_ex04 = 0;
Serial.println("RESET MESTRE ACIONADO!");
}
}
digitalWrite(LED1, estado_led_ex04 == 1 ? HIGH : LOW);
digitalWrite(LED2, estado_led_ex04 == 2 ? HIGH : LOW);
digitalWrite(LED3, estado_led_ex04 == 3 ? HIGH : LOW);
digitalWrite(LED4, estado_led_ex04 == 4 ? HIGH : LOW);
estadoBtn1_ant_ex04 = btn1;
estadoBtn2_ant_ex04 = btn2;
estadoBtn3_ant_ex04 = btn3;
estadoBtn4_ant_ex04 = btn4;
delay(50);
}
/**
* @brief Exercício 5: Estação Meteorológica Interativa (Botões Alterados)
*/
void ex05() {
unsigned long tempoAtual = millis();
if (tempoAtual - ultimoTempoLoop_ex05 >= 1500) {
ultimoTempoLoop_ex05 = tempoAtual;
if (tempoAtual - ultimaLeituraDHT > 2000) {
ultimaLeituraDHT = tempoAtual;
temperatura = dht.readTemperature();
umidade = dht.readHumidity();
}
digitalWrite(LED2, (temperatura > setPointTemp) ? HIGH : LOW);
digitalWrite(LED1, (umidade < setPointUmid) ? HIGH : LOW);
int potDisplay = analogRead(POT_PIN);
int mapDisplay = (modo_ex05 == 0) ? map(potDisplay, 0, 1023, -40, 80) : map(potDisplay, 0, 1023, 0, 100);
if (temperatura > setPointTemp) Serial.println("ALARME! TEMPERATURA ALTA!");
if (umidade < setPointUmid) Serial.println("ALARME! UMIDADE BAIXA!");
Serial.print("Modo: "); Serial.print(modo_ex05 == 0 ? "Temp" : "Umid");
Serial.print(" | Pot: "); Serial.print(mapDisplay);
Serial.print(modo_ex05 == 0 ? "C" : "%");
Serial.print(" || Atual: "); Serial.print(temperatura, 1);
Serial.print("C (SP: "); Serial.print(setPointTemp);
Serial.print("C) | "); Serial.print(umidade, 1);
Serial.print("% (SP: "); Serial.print(setPointUmid);
Serial.println("%)");
Serial.println("-----------------------------------");
}
// --- ALTERAÇÃO REALIZADA AQUI ---
int btnModo = digitalRead(BTN1); // Alterado de BTN2 para BTN1
int btnSalva = digitalRead(BTN2); // Alterado de BTN3 para BTN2
if (estadoBotaoModo_anterior == LOW && btnModo == HIGH) {
if (tempoAtual - tempoUltimoBotao_ex05 > 250) {
modo_ex05 = !modo_ex05;
Serial.println(modo_ex05 == 0 ? ">> Modo: Ajuste de TEMPERATURA <<" : ">> Modo: Ajuste de UMIDADE <<");
tempoUltimoBotao_ex05 = tempoAtual;
}
}
if (estadoBotaoSalva_anterior == LOW && btnSalva == HIGH) {
if (tempoAtual - tempoUltimoBotao_ex05 > 250) {
int potAtual = analogRead(POT_PIN);
if (modo_ex05 == 0) {
setPointTemp = map(potAtual, 0, 1023, -40, 80);
Serial.print("!!! Set point de Temperatura SALVO: "); Serial.print(setPointTemp); Serial.println(" C");
} else {
setPointUmid = map(potAtual, 0, 1023, 0, 100);
Serial.print("!!! Set point de Umidade SALVO: "); Serial.print(setPointUmid); Serial.println(" %");
}
tempoUltimoBotao_ex05 = tempoAtual;
}
}
estadoBotaoModo_anterior = btnModo;
estadoBotaoSalva_anterior = btnSalva;
}