#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <DHT.h>
#define SCREEN_WIDTH 128 // OLED display width
#define SCREEN_HEIGHT 64 // OLED display height
#define DHTPIN 15 // Pino do sensor DHT11
#define DHTTYPE DHT11 // Tipo do sensor DHT11
#define POT_PIN 34 // Pino do potenciômetro
#define RELAY_NO_PIN 19 // Pino do relé NO
#define RELAY_NC_PIN 18 // Pino do relé NC
#define BUZZER_PIN 25 // Pino do buzzer
#define BATTERY_ICON_WIDTH 6
#define BATTERY_ICON_HEIGHT 12
#define BATTERY_PIN 35 // Pino para leitura da tensão da bateria
#define VOLTAGE_MAX 3.3 // Tensão máxima da bateria (3.3V para ESP32)
#define VOLTAGE_MIN 3.0 // Tensão mínima da bateria
#define LOW_BATTERY_LEVEL 20 // Nível de bateria considerado baixo
#define SCL_PIN 22 // Pino SCL
#define SDA_PIN 21 // Pino SDA
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int numReadings = 10;
float readings[numReadings];
int idx = 0;
float total = 0;
float averageTemp = 0;
float readBatteryVoltage() {
int rawValue = analogRead(BATTERY_PIN);
float voltage = rawValue * (VOLTAGE_MAX / 4095.0); // Ajuste para 3.3V
voltage = voltage * 2.0; // Considerando o divisor de tensão 10kΩ e 10kΩ
return voltage;
}
int calculateBatteryLevel(float voltage) {
int level = map(voltage, VOLTAGE_MIN, VOLTAGE_MAX, 0, 100);
return constrain(level, 0, 100);
}
void drawBatteryIcon(int x, int y, int width, int height, int batteryLevel) {
int batteryFill = map(batteryLevel, 0, 100, height - 2, 2);
display.drawRect(x, y, width, height, WHITE);
display.fillRect(x + 1, y + height - batteryFill, width - 2, batteryFill, WHITE);
if (batteryLevel <= LOW_BATTERY_LEVEL) {
display.fillRect(x + 1, y + height - batteryFill, width - 2, batteryFill, BLACK);
display.drawRect(x, y, width, height, WHITE);
}
}
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(RELAY_NO_PIN, OUTPUT);
pinMode(RELAY_NC_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
dht.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1.8);
display.setTextColor(WHITE);
int16_t x = (SCREEN_WIDTH - display.getCursorX()) / 2;
display.setCursor(35, 10);
display.println("Eletronica");
display.setCursor(38, 25);
display.println("Bem-vindo");
display.setCursor(32, 40);
display.println("Etec - 2024");
display.display();
delay(4000);
}
void loop() {
static int batteryLevel = 100;
batteryLevel -= 1;
float humidity = dht.readHumidity();
total = total - readings[idx];
readings[idx] = dht.readTemperature();
total = total + readings[idx];
idx = (idx + 1) % numReadings;
averageTemp = total / numReadings;
int potValue = analogRead(POT_PIN);
float tempRef = map(potValue, 0, 4095, -40, 40);
if (isnan(averageTemp) || isnan(humidity)) {
Serial.println("Erro ao ler o sensor DHT11!");
return;
}
if (averageTemp >= tempRef) {
digitalWrite(RELAY_NO_PIN, HIGH);
digitalWrite(RELAY_NC_PIN, LOW);
tone(BUZZER_PIN, 660);
} else {
digitalWrite(RELAY_NO_PIN, LOW);
digitalWrite(RELAY_NC_PIN, HIGH);
noTone(BUZZER_PIN);
}
float voltage = readBatteryVoltage();
Serial.print("Tensão da bateria: ");
Serial.println(voltage);
batteryLevel = calculateBatteryLevel(voltage);
display.clearDisplay();
display.setTextSize(0.5);
display.setCursor(SCREEN_WIDTH - BATTERY_ICON_WIDTH - 15, 5);
display.print(batteryLevel);
display.print("%");
drawBatteryIcon(SCREEN_WIDTH - BATTERY_ICON_WIDTH - 2, 2, BATTERY_ICON_WIDTH, BATTERY_ICON_HEIGHT, batteryLevel);
display.setTextSize(1);
display.setCursor(0, 18);
display.print("Temp. Ref.: ");
display.print(tempRef);
display.println(" C");
display.print("Temp. Atual: ");
display.print(averageTemp);
display.println(" C");
display.print("Umidade: ");
display.print(humidity);
display.println(" %");
display.display();
Wire.beginTransmission(0);
if (Wire.endTransmission() == 0) {
Serial.println("I2C device found!");
} else {
Serial.println("I2C device not found!");
}
delay(2000);
}