#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 5
#define BATTERY_ICON_HEIGHT 9
#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; // Número de leituras para a média móvel
float readings[numReadings]; // Armazena as leituras
int idx = 0; // Índice atual do array de leituras
float total = 0; // Soma das leituras
float averageTemp = 0; // Média das leituras
// Função para desenhar o ícone da bateria verticalmente
void drawBatteryIcon(int x, int y, int width, int height, int batteryLevel) {
// Desenha o contorno da bateria
display.drawRect(x, y, width, height, WHITE);
// Calcula a altura do preenchimento da bateria com base no nível de bateria
int batteryFill = map(batteryLevel, 0, 100, 0, height-2); // Mapeia o nível de bateria para o tamanho da bateria
display.fillRect(x + 1, y + height - batteryFill, width - 2, batteryFill, 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.5); // Tamanho da fonte
display.setTextColor(WHITE);
// Calcula a posição x inicial para centralizar o texto
int16_t x = (SCREEN_WIDTH - display.getCursorX()) / 2;
display.setCursor(34, 10);
display.println("Eletronica");
display.setCursor(37, 25);
display.println("Bem-vindo");
display.setCursor(32, 40);
display.println("Etec - 2024");
display.display();
delay(2000);
}
void loop() {
// Simulação do nível de bateria (para fins de demonstração)
static int batteryLevel = 150;
batteryLevel -= 1; // Decrementa o nível de bateria a cada ciclo
// Realiza a leitura da temperatura várias vezes e calcula a média
total = total - readings[idx];
readings[idx] = dht.readTemperature();
if (isnan(readings[idx])) {
Serial.println("Erro ao ler a temperatura!");
return;
}
total = total + readings[idx];
idx = (idx + 1) % numReadings;
averageTemp = total / numReadings;
float humidity = dht.readHumidity();
if (isnan(humidity)) {
Serial.println("Erro ao ler a umidade!");
return;
}
int potValue = analogRead(POT_PIN);
float tempRef = map(potValue, 0, 4095, -40, 40); // Ajustado o intervalo para -40 a 40°C
Serial.print("Valor do potenciometro: ");
Serial.println(potValue);
Serial.print("Temperatura de referencia: ");
Serial.println(tempRef);
if (averageTemp >= tempRef) {
digitalWrite(RELAY_NO_PIN, HIGH); // Aciona o LED no pino RELAY_NO_PIN
digitalWrite(RELAY_NC_PIN, LOW);
tone(BUZZER_PIN, 660);
} else {
digitalWrite(RELAY_NO_PIN, LOW); // Desliga o LED no pino RELAY_NO_PIN
digitalWrite(RELAY_NC_PIN, HIGH);
noTone(BUZZER_PIN);
}
display.clearDisplay();
// Desenha o ícone da bateria no canto superior direito da tela
int batteryIconX = SCREEN_WIDTH - BATTERY_ICON_WIDTH - 2;
int batteryIconY = 2;
drawBatteryIcon(batteryIconX, batteryIconY, BATTERY_ICON_WIDTH, BATTERY_ICON_HEIGHT, batteryLevel);
display.setCursor(0, 20);
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();
// Scanner I2C para verificar conexão
Wire.beginTransmission(0);
if (Wire.endTransmission() == 0) {
Serial.println("I2C device found!");
} else {
Serial.println("I2C device not found!");
}
delay(2000); // Intervalo de leitura ajustado para 2 segundos
}