#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Display OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Pinos
const int ledPin = 13;
const int buzzerPin = 12; // Pino do buzzer
const int btnMaisPin = 2;
const int btnMenosPin = 3;
// Variáveis
float temperatura = 22.5;
float umidade = 52.7;
float tempMax = 35.0;
float tempMin = 22.0;
// Controle de debounce
bool btnMaisPressionado = false;
bool btnMenosPressionado = false;
void setup() {
Serial.begin(9600);
// Inicializa o display OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Falha ao iniciar o display OLED");
for (;;);
}
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(btnMaisPin, INPUT_PULLUP);
pinMode(btnMenosPin, INPUT_PULLUP);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
}
void loop() {
// Leitura dos botões com controle de pressionamento único
if (digitalRead(btnMaisPin) == LOW) {
if (!btnMaisPressionado) {
temperatura += 0.5;
btnMaisPressionado = true;
}
} else {
btnMaisPressionado = false;
}
if (digitalRead(btnMenosPin) == LOW) {
if (!btnMenosPressionado) {
temperatura -= 0.5;
btnMenosPressionado = true;
}
} else {
btnMenosPressionado = false;
}
// Controle do LED
digitalWrite(ledPin, temperatura >= 30.0 ? HIGH : LOW);
// Controle do buzzer
if (temperatura > 35.0) {
tone(buzzerPin, 1000); // Liga buzzer com 1000 Hz
} else {
noTone(buzzerPin); // Desliga buzzer
}
// Exibe os dados no display OLED
display.clearDisplay();
display.setCursor(0, 0);
display.println("Estacao Virtual");
display.println("GUANAMBI");
display.println("-------------------");
display.print("Temp: ");
display.print(temperatura, 1);
display.println(" C");
display.print("Umid: ");
display.print(umidade, 1);
display.println(" %");
display.print("Max: ");
display.print(tempMax, 1);
display.println(" C");
display.print("Min: ");
display.print(tempMin, 1);
display.println(" C");
display.display();
delay(100); // Atualiza rápido, mas sem pular cliques
}