#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
//#include <ESPAsyncWebServer.h>
char* LargeText = "Deus seja louvado "; // Texto a ser exibido no LCD
int iLineNumber = 0;
int iCursor = 0;
const int DHTPIN = 15; // Pino de dados do sensor DHT11
// Escolha o tipo de sensor!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22
DHT dht(DHTPIN, DHTTYPE);
// Definindo os pinos do sensor de ultrassom
const int TRIGGER_PIN = 19; // Pino de trigger do sensor AJ-SR04M
const int ECHO_PIN = 18; // Pino de echo do sensor AJ-SR04M
const int REGISTRO = 5; // Pino de acionamento Relé
//AsyncWebServer server(80);
// Definir o endereço do LCD para 0x27 para um display de 16 caracteres e 2 linhas
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(REGISTRO, OUTPUT);
dht.begin();
Wire.begin(21, 22); // Inicializa I2C no ESP8266 nos pinos D1 (SCL) e D2 (SDA)
Serial.println(F("DHTxx teste!"));
lcd.init();
lcd.backlight();
lcd.clear();
// Executa a função UpdateLCDDisplay repetidamente no setup para simular a rolagem do texto
for (int i = 0; i < strlen(LargeText); i++) {
UpdateLCDDisplay(i);
delay(300);
}
// Mensagem de inicialização
lcd.setCursor(0, 0);
lcd.print(" Inicializando.. ");
delay(2000);
lcd.clear();
}
void UpdateLCDDisplay(int startIndex) {
// Limpa o display
lcd.clear();
// Define o cursor na primeira linha do LCD
lcd.setCursor(0, iLineNumber);
// Exibe o texto a partir do índice inicial
for (int iChar = startIndex; iChar < startIndex + 16; iChar++) {
lcd.print(LargeText[iChar % strlen(LargeText)]);
}
}
void clearValueArea(int colStart, int colEnd, int row) {
lcd.setCursor(colStart, row);
for (int i = colStart; i <= colEnd; i++) {
lcd.print(" ");
}
lcd.setCursor(colStart, row);
}
void loop() {
// A leitura da temperatura ou umidade leva cerca de 250 milissegundos!
// O sensor pode ter um atraso de até 2 segundos para a leitura
float h = dht.readHumidity();
// Temperatura em Celsius (default)
float t = dht.readTemperature();
// Verifique se alguma leitura falhou e tenta novamente.
if (isnan(h) || isnan(t)) {
Serial.println(F("Falha de leitura do sensor DHT!"));
return;
}
// Compute heat index in Celsius (isFahrenheit = false)
float hic = dht.computeHeatIndex(t, h, false);
// Mostra a leitura virtualmente no serial monitor do Arduino
Serial.print(F("Humidade: "));
Serial.print(h);
Serial.print(F("% Temperatura: "));
Serial.print(t);
Serial.print(F("°C "));
lcd.setBacklight(HIGH);
// Exibir temperatura
lcd.setCursor(9, 0);
lcd.print(F("T"));
clearValueArea(11, 13, 0); // Limpa apenas a área de valores
lcd.setCursor(11, 0);
lcd.print(int(t)); // mostra valores inteiros
lcd.setCursor(14, 0);
lcd.write(223); // Caracter °
lcd.setCursor(15, 0);
lcd.print(F("C"));
delay(3000);
// Exibir umidade
lcd.setCursor(9, 1);
lcd.print("H");
clearValueArea(11, 14, 1); // Limpa apenas a área de valores
lcd.setCursor(11, 1);
lcd.print(int(h)); // mostra valores inteiros
lcd.setCursor(15, 1);
lcd.print("%");
delay(3000);
long duration, distance;
// Gera um pulso no pino TRIGGER
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Calcula o tempo de duração do eco
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
// Ajuste a altura do recipiente onde o sensor está instalado
// e o intervalo de leitura (máximo e mínimo) para o cálculo do nível de água
int maxDistance = 72; // Distância máxima (em cm) do sensor até a superfície da água
int minDistance = 22; // Distância mínima (em cm) do sensor até a superfície da água
// Mapeia a distância medida para um valor percentual do nível de água
int waterLevelPercent = map(distance, maxDistance, minDistance, 0, 100);
waterLevelPercent = constrain(waterLevelPercent, 0, 100); // Garante que o valor percentual esteja dentro do intervalo de 0 a 100
// Limpa o display e exibe o nível de água
lcd.setCursor(0, 0);
lcd.print("N.agua");
lcd.setCursor(1, 1);
lcd.print(waterLevelPercent);
lcd.print("%");
lcd.print(" ");
Serial.print("Nivel de agua: ");
Serial.print(waterLevelPercent);
Serial.println("%");
// Controle do registro
if (waterLevelPercent <= 15) {
digitalWrite(REGISTRO, HIGH); // Liga o registro
} else if (waterLevelPercent >= 100) {
digitalWrite(REGISTRO, LOW); // Desliga o registro
}
delay(1000);
}