/**
** Desenvolvido para cadeira de microprocessadores - UERGS - POA
** Por Rodrigo Britto Calovi
** Data: 01/04/2023
**
** Descrição:
** Programa para registro de temperatura e umidade média, mínima e máxima após 10 leituras
** assim iniciando-se novamente para novos registros. Após a estabilização da leitura 10 valores
** Estas leituras são gravavas na EEPROM onde são lidas e mostradas na serial, suas
** 10 medidas usadas para o cálculo são armazenadas em variaveis apenas.
** O display LCD mostra o resultado de temperatura média e umidade média lido da memória EEPROM.
**/
#include <EEPROM.h>
#include <DHT.h>
#include <LiquidCrystal.h>
// Inicializa o display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 13; // Define a porta LED
#define DHTPIN 9 // pino do sensor de temperatura e umidade
#define DHTTYPE DHT22 // tipo do sensor, pode ser DHT11 ou DHT22
DHT dht(DHTPIN, DHTTYPE);
unsigned int numReadings = 10; // núm. leituras para calcular a média
unsigned int readingDelay = 1000; // tempo entre as leituras (em ms.)
//temperature, humidity;
int temperature, humidity;
float tempTotal, humTotal;
float tempMin, humMin;
float tempMax, humMax;
//vetor leituras
float tempReadings[10], humReadings[10];
unsigned int readingIndex = 0;
//endereços de memória
unsigned int tempAddress = 0x00; // endereço de memória EEPROM para armazenar a temperatura
unsigned int humAddress = 0x10; // endereço de memória EEPROM para armazenar a umidade
unsigned int tempMinAddress = 0x20; // endereço de memória EEPROM para armazenar a temperatura mínima
unsigned int humMinAddress = 0x30; // endereço de memória EEPROM para armazenar a umidade mínima
unsigned int tempMaxAddress = 0x40; // endereço de memória EEPROM para armazenar a temperatura máxima
unsigned int humMaxAddress = 0x50; // endereço de memória EEPROM para armazenar a umidade máxima
//mostra valores da EEPROM
void mostraValoresEEPROMSalvos(){
float tempRead, humRead, tempMinRead, humMinRead, tempMaxRead, humMaxRead;
EEPROM.get(tempAddress, tempRead);
EEPROM.get(humAddress, humRead);
EEPROM.get(tempMinAddress, tempMinRead);
EEPROM.get(humMinAddress, humMinRead);
EEPROM.get(tempMaxAddress, tempMaxRead);
EEPROM.get(humMaxAddress, humMaxRead);
Serial.print("[Valores médio, mínimo e máximo de temperatura e umidade lidas da memória EEPROM do arduino:] \n");
Serial.print("\tTemperatura média: ");
Serial.print("[0x0");
Serial.print(tempAddress,HEX);
Serial.print("] - ");
Serial.print(tempRead, 0);
Serial.print("°C - ");
Serial.print("Umidade média: ");
Serial.print(" [0x");
Serial.print(humAddress,HEX);
Serial.print("] - ");
Serial.print(humRead, 0);
Serial.print("%");
Serial.println();
Serial.print("\tTemperatura mínima: ");
Serial.print("[0x");
Serial.print(tempMinAddress,HEX);
Serial.print("] - ");
Serial.print(tempMinRead, 0);
Serial.print("°C - ");
Serial.print("Umidade Mínima: ");
Serial.print(" [0x");
Serial.print(humMinAddress,HEX);
Serial.print("] - ");
Serial.print(humMinRead, 0);
Serial.print("%");
Serial.println();
Serial.print("\tTemperatura máxima: ");
Serial.print("[0x");
Serial.print(tempMaxAddress,HEX);
Serial.print("] - ");
Serial.print(tempMaxRead, 0);
Serial.print("°C - ");
Serial.print("Umidade Máxima: ");
Serial.print(" [0x");
Serial.print(humMaxAddress,HEX);
Serial.print("] - ");
Serial.print(humMaxRead, 0);
Serial.print("%");
Serial.println();
}
//funcoes para leitura
int leituraSensorTemperatura() {
return dht.readTemperature();
}
int leituraSensorUmidade() {
return dht.readHumidity();
}
void setup()
{
pinMode(ledPin, OUTPUT); // Configura a porta do LED como saída
Serial.begin(9600);
dht.begin();
lcd.begin(20, 4);
tempMin = humMin = 1000.0;
tempMax = humMax = -1000.0;
}
void loop() {
for (int i = 0; i < numReadings; i++)
{
temperature = leituraSensorTemperatura();
humidity = leituraSensorUmidade();
digitalWrite(ledPin, HIGH); // Liga o LED
delay(100); // Aguarda 1 segundo
digitalWrite(ledPin, LOW); // Desliga o LED
delay(100); // Aguarda 1 segundo
tempReadings[readingIndex] = temperature;
humReadings[readingIndex] = humidity;
readingIndex = (readingIndex + 1) % numReadings;
tempTotal += temperature;
humTotal += humidity;
if (temperature < tempMin)
{
tempMin = temperature;
}
if (temperature > tempMax)
{
tempMax = temperature;
}
if (humidity < humMin)
{
humMin = humidity;
}
if (humidity > humMax)
{
humMax = humidity;
}
delay(readingDelay);
}
float tempAverage = tempTotal / numReadings;
float humAverage = humTotal / numReadings;
EEPROM.put(tempAddress, tempAverage);
EEPROM.put(humAddress, humAverage);
EEPROM.put(tempMinAddress, tempMin);
EEPROM.put(humMinAddress, humMin);
EEPROM.put(tempMaxAddress, tempMax);
EEPROM.put(humMaxAddress, humMax);
Serial.print("\nValores de temperatura e umidades lidas do sensor: \n ");
for (int i = 0; i < numReadings; i++) {
Serial.print("\t");
Serial.print(i+1);
Serial.print(" - ");
Serial.print(tempReadings[i], 0);
Serial.print("°C - ");
Serial.print(humReadings[i], 0);
Serial.print("% \n");
Serial.print(" ");
}
Serial.println();
mostraValoresEEPROMSalvos();
float tempRead, humRead;
EEPROM.get(tempAddress, tempRead);
EEPROM.get(humAddress, humRead);
// Limpa o display e posiciona o cursor na primeira coluna da primeira linha
lcd.clear();
lcd.setCursor(0, 0);
// Escreve o valor da temperatura média na primeira linha do display
lcd.print("Temperatura:");
lcd.setCursor(9, 1);
lcd.print("[AVG]:");
lcd.setCursor(16, 1);
lcd.print(tempRead, 0);
lcd.write(byte(0xDF));
lcd.print("C");
// Posiciona o cursor na primeira coluna da segunda linha
lcd.setCursor(0, 2);
// Escreve o valor da umidade média na segunda linha do display
lcd.print("Umidade:");
lcd.setCursor(9, 3);
lcd.print("[AVG]:");
lcd.setCursor(16, 3);
lcd.print(humRead, 0);
lcd.print("%");
delay(500); // Aguarda 5 segundos antes de atualizar os valores do display
tempTotal = 0;
humTotal = 0;
tempMin = humMin = 1000.0;
tempMax = humMax = -1000.0;
}