/***********************************************/
/* Estação Meteorológica Simples com ESP32 */
/* Projetos e Aplicação de Sistemas Embarcados */
/* Prof. Dr. Francisco Fambrini */
/* Pós-Graduanda: Liz Lene - RA: 220022690 */
/**********************************************/
//Definição das bibliotecas
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
//Definição dos pinos
#define DHTPIN (4)
#define DHTTYPE DHT22
#define LDR_PIN (34)
#define RELAY_PUMP_PIN (12)
#define RELAY_VALVE_PIN (14)
#define BMP_SCK (18)
#define BMP_MISO (19)
#define BMP_MOSI (23)
#define BMP_CS (5)
//Inicialização do Sensor BMP280
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
//Inicialização do Sensor DHT22
DHT dht(DHTPIN, DHTTYPE);
//Inicialização do LCD I2C (endereço 0x27, 16 caracteres, 2 linhas)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
//Inicialização da comunicação serial
Serial.begin(115200);
dht.begin(); //Inicializa o sensor DHT22
lcd.init(); // inicializa o lcd
lcd.backlight(); // Liga a luz de fundo
lcd.clear();
lcd.print("IoT Meteorological"); // mostra na primeira linha do lcd e primeira coluna
lcd.setCursor(0, 1); //posiciona o cursor na segunda linha e primeira coluna
lcd.print("Station");
delay(5000);
//Definição de modos de fixação
pinMode(LDR_PIN, INPUT);
pinMode(RELAY_PUMP_PIN, OUTPUT);
pinMode(RELAY_VALVE_PIN, OUTPUT);
//Desliga inicialmente os LEDs (relés)
digitalWrite(RELAY_PUMP_PIN, LOW);
digitalWrite(RELAY_VALVE_PIN, LOW);
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
"try a different address!"));
Serial.print("SensorID was: 0x");
Serial.println(bmp.sensorID(),16);
Serial.print("ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print("ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print("ID of 0x60 represents a BME 280.\n");
Serial.print("ID of 0x61 represents a BME 680.\n");
// Configurações padrão do datasheet
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, //Modo operacional
Adafruit_BMP280::SAMPLING_X2, //Temp. de sobre amostragem
Adafruit_BMP280::SAMPLING_X16, // Sobre amostragem de pressão
Adafruit_BMP280::FILTER_X16, //Filtragem
Adafruit_BMP280::STANDBY_MS_500); //Tempo de espera
}
void loop() {
// Gera valores aleatórios de sensores para umidade do solo e chuva
int soilMoistureValue = random(300, 700); // Valor simulado de umidade do solo
int rainValue = random(0, 2); // Valor simulado do sensor de chuva (0 ou 1)
// Lendo a temperatura, umidade do DHT22 e pressão
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
float pressure = bmp.readPressure() / 100.0F;
float altitud = bmp.readAltitude(1013.25);
// Lendo o valor do sensor de luz do módulo LDR digital
int lightValue = digitalRead(LDR_PIN);
// Exibe os valores dos sensores no Monitor Serial
Serial.print("Temperatura: ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Umidade Ar: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Nível Luz: ");
Serial.println(lightValue == HIGH ? "Claro" : "Escuro");
Serial.print("Chovendo: ");
Serial.println(rainValue == 0 ? "Sim" : "Não");
/*Serial.print(F("Temp_BMP280: "));
Serial.print(bmp.readTemperature());
Serial.println(" C");*/
Serial.print(F("Pressao: "));
Serial.print(pressure);
Serial.println(" Pa");
Serial.print(F("Altitude: "));
Serial.print(altitud);
Serial.println(" m");
Serial.print("Umidade Solo: ");
Serial.println(soilMoistureValue);
Serial.println("********************");
// Atualiza o LCD com valores dos sensores
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura:");
lcd.setCursor(0,1);
lcd.print(temperature, 1); // Exibe a temperatura com uma casa decimal
lcd.setCursor(4,1);
lcd.print("C");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Umidade Ar:");
lcd.setCursor(0,1);
lcd.print(humidity, 1); // Exibe a umidade com uma casa decimal
lcd.setCursor(5,1);
lcd.print("%");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nivel Luz:");
lcd.setCursor(0,1);
lcd.print(lightValue == HIGH ? "Claro" : "Escuro");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Chovendo:");
lcd.setCursor(0,1);
lcd.print(rainValue == 0 ? "Sim" : "Nao");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pressao: ");
lcd.setCursor(5,1);
lcd.print(pressure);
lcd.print("Pa");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Altitude: ");
lcd.setCursor(5,1);
lcd.print(altitud);
lcd.print("m");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Umidade Solo:");
lcd.setCursor(0,1);
lcd.print(soilMoistureValue);
delay(3000);
// Controle dos LEDs com base nos dados do sensor
bool irrigationOn = soilMoistureValue < 500 && rainValue == 1;
digitalWrite(RELAY_PUMP_PIN, irrigationOn ? HIGH : LOW); // Ligar/desligar a bomba d'água (LED)
digitalWrite(RELAY_VALVE_PIN, irrigationOn ? HIGH : LOW); // Ligar/desligar a válvula solenóide (LED)
// Exibição do status da irrigação no LCD
lcd.setCursor(8, 1);
lcd.print(irrigationOn ? "Ligar" : "Desligar");
// Adicionando um atraso antes da próxima iteração do loop
delay(3000);
}