/**
** Desenvolvido para cadeira de microprocessadores - UERGS - POA
** Por Rodrigo Britto Calovi
** Data: 29/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.
** USO de SENSORES: temperatura LM35 e Medidor de Solo YL-96.
** Sensor YL96 não implementado para regulagem de ajuste do D0 com POT, fios WIRE1 e WIRE2 de saída
** estão sendo simulados sua resistências pelo click (interno) assim como o LM35, devido a construção
** modelo para simulação em JSON e bibliotecas do arduino
**/
#include <EEPROM.h>
#include <LiquidCrystal.h>
// Inicializa o display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Defini pino do LM35 e resolução do AD
#define ADC_VREF_mV 5000.0 // in millivolt
#define ADC_RESOLUTION 1024.0
#define PIN_LM35 A0 //usa pino A0 para a temperature
#define PIN_YL69 A3 //usa pino A3 para o moisture
#define PIN_D0 7 //define pino digital do YL69 led acende quando resistencia aumenta em 100%
#define PIN_LED 8 //pino do led para indicar SECO
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() {
// get the ADC value from the temperature sensor
int adcVal = analogRead(PIN_LM35);
// convert the ADC value to voltage in millivolt
float milliVolt = adcVal * (ADC_VREF_mV / ADC_RESOLUTION);
// convert the voltage to the temperature in Celsius
float tempC = milliVolt / 10;
return tempC;
}
int leituraSensorUmidade() {
// get the ADC value from the temperature moisture
int adcVal = analogRead(PIN_YL69);
// convert the ADC value to voltage in millivolt
float milliVolt = adcVal * (ADC_VREF_mV / ADC_RESOLUTION);
// convert the voltage to the temperature in Celsius
float moisture = milliVolt / 10;
return moisture;
}
void setup()
{
Serial.begin(9600);
lcd.begin(20, 4);
//configura pino digital D0 de YL69 para acender LED
pinMode(PIN_D0,INPUT);
pinMode(PIN_LED,OUTPUT);
tempMin = humMin = 1000.0;
tempMax = humMax = -1000.0;
}
void loop() {
delay(500);
if(digitalRead(PIN_D0))
digitalWrite(PIN_LED, HIGH);
else
digitalWrite(PIN_LED, LOW);
delay(200);
for (int i = 0; i < numReadings; i++)
{
temperature = leituraSensorTemperatura();
humidity = leituraSensorUmidade();
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;
}