/**
Por Rodrigo Britto Calovi
Projeto para ler temperatura e umidade com gravação na EEPROM
mostrando valor mínimo, máximo e média na serial e display LCD
mostrando valores lidos diretamente do sensor
**/
#include <DHT.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
#define DHTPIN 9 // Pino de sinal do DHT22
#define DHTTYPE DHT22 // Tipo do sensor DHT22
#define EEPROM_SIZE 512 // Tamanho da memória EEPROM
#define NUM_VALUES 10 // Número de valores a serem lidos antes de reiniciar as variáveis
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void mostrarValoresEEPROM() {
Serial.println("Valores utilizados da eeprom para calcular a média:");
Serial.print("\n Addr \tTemp [°C] | Addr Umid [%]\n");
for (int i = 0; i < NUM_VALUES; i++) {
int tempAddr = i * sizeof(int);
int humAddr = (NUM_VALUES + i) * sizeof(int);
int tempValue;
int humValue;
EEPROM.get(tempAddr, tempValue);
EEPROM.get(humAddr, humValue);
if(i<8){
//Serial.print(i+1);
Serial.print(" [0x");
Serial.print(tempAddr,HEX);
Serial.print("] \t ");
//Serial.print("Temperatura: ");
Serial.print(tempValue);
//Serial.print(" °C");
Serial.print(" | ");
//Serial.print("Umidade: ");
Serial.print(" [0x");
Serial.print(humAddr,HEX);
Serial.print("] \t ");
Serial.print(humValue);
//Serial.println("%");
Serial.print("\n");
} else {
//Serial.print(i+1);
Serial.print(" [0x");
Serial.print(tempAddr,HEX);
Serial.print("] ");
//Serial.print("Temperatura: ");
Serial.print(tempValue);
//Serial.print(" °C");
Serial.print(" | ");
//Serial.print("Umidade: ");
Serial.print(" [0x");
Serial.print(humAddr,HEX);
Serial.print("] \t ");
Serial.print(humValue);
//Serial.println("%");
Serial.print("\n");
}
}
}
// Função para ler o sensor de temperatura
int leituraSensorTemperatura() {
return dht.readTemperature();
}
// Função para ler o sensor de umidade
int leituraSensorUmidade() {
return dht.readHumidity();
}
void setup() {
Serial.begin(9600);
dht.begin();
lcd.begin(16, 2);
}
void loop() {
static int numReadings = 0; // Contador de leituras
static float tempSum = 0.0; // Soma das leituras de temperatura
static float tempMinVal = 1000.0; // Valor alto para garantir que seja substituído na primeira iteração
static float tempMaxVal = -1000.0; // Valor baixo para garantir que seja substituído na primeira iteração
static float humSum = 0.0; // Soma das leituras de umidade
static float humMinVal = 1000.0; // Valor alto para garantir que seja substituído na primeira iteração
static float humMaxVal = -1000.0; // Valor baixo para garantir que seja substituído na primeira iteração
// Lê a temperatura e umidade do sensor DHT22 e escreve na EEPROM
int temp = leituraSensorTemperatura();
int hum = leituraSensorUmidade();
if (isnan(temp) || isnan(hum)) {
Serial.println("Erro ao ler o sensor DHT22.");
} else {
// Escreve os valores na EEPROM
int tempAddr = numReadings * sizeof(int);
int humAddr = (NUM_VALUES + numReadings) * sizeof(int);
EEPROM.put(tempAddr, temp);
EEPROM.put(humAddr, hum);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temper.: ");
lcd.print(temp);
lcd.print(" ");
lcd.write(byte(0xDF));
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Umidade: ");
lcd.print(hum);
lcd.print(" %");
// Cálculo dos valores mínimos e máximos da temperatura
tempSum += temp;
if (temp < tempMinVal) {
tempMinVal = temp;
}
if (temp > tempMaxVal) {
tempMaxVal = temp;
}
// Cálculo dos valores mínimos e máximos da umidade
humSum += hum;
if (hum < humMinVal) {
humMinVal = hum;
}
if (hum > humMaxVal) {
humMaxVal = hum;
}
// Incrementa o contador de leituras
numReadings++;
// Se já leu o número de valores definidos, calcula a média e reinicia as variáveis
if (numReadings == NUM_VALUES) {
// Cálculo da média da temperatura e umidade
float tempMedia = tempSum / NUM_VALUES;
float humMedia = humSum / NUM_VALUES;
// Exibe as informações no LCD
//lcd.clear();
//lcd.setCursor(0, 0);
//lcd.print("Temp: ");
//lcd.print(tempMedia);
//lcd.print(" C");
//lcd.setCursor(0, 1);
//lcd.print("Umidade: ");
//lcd.print(humMedia);
//lcd.print("%");
mostrarValoresEEPROM();
//Serial.println("\n");
// Exibe as informações no monitor serial
Serial.println("\n[Temperatura]:");
Serial.println("Mínimo: " + String(tempMinVal) + "°C" + " | " + "Média: " + String(tempMedia) + "°C" + " | " + "Máximo: " + String(tempMaxVal) + "°C");
Serial.println("\n[Umidade]:");
Serial.println("Mínimo: " + String(humMinVal) + "%" + " | " + "Média: " + String(humMedia) + "%" + " | " + "Máximo: " + String(humMaxVal) + "%\n");
// Reinicia as variáveis
numReadings = 0;
tempSum = 0.0;
tempMinVal = 1000.0;
tempMaxVal = -1000.0;
humSum = 0.0;
humMinVal = 1000.0;
humMaxVal = -1000.0;
}
}
// Aguarda 2 segundos antes de fazer a próxima leitura
delay(2000);
}