//Projeto N.Dágua - Sensor ultrassonico AJ-SR04M/HC-SR04 - SERVER/CLIENT -LCD16x2
// Desenvolvimento - Elias codigo server
//Obs: Não use a alimentanção do esp para alimentar o LCD e os sensores, use fonte externa 5v
//#include <ESP8266WiFi.h> // Retire a barra para gravar no esp8266
#include <WiFi.h> //coloque a barra no incio do include para gravar no esp8266
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // pino do lcd SDA (D1), SCL (D2) pra esp8266 e pino SDA (21), SCL (22) pra esp32
//#include <DHT.h>
#include "ESPAsyncWebServer.h"
/*
const char* ssid = "ESP8266-Access-Point";
const char* password = "123456789";
*/
const char *ssid = "Wokwi-GUEST"; //////
const char *password = ""; //////
const char* serverAddress = "192.168.4.1";
AsyncWebServer server(80);
// Definições do sensor DHT22
//const int DHTPIN = 19; //Pino de dados do sensor DHT22 esp8266 (D6)
//DHT dht(DHTPIN, DHT22); // Tipo do sensor DHT (DHT22)
//Definições do sensor AJ-SR04M/HC-SR04
const int TRIGGER_PIN = 16; // Pino de trigger do sensor AJ-SR04M esp8266 (D3)
const int ECHO_PIN = 17; // Pino de eco do sensor AJ-SR04M esp8266 (D4)
const int RELAY_PIN = 2; // Pino do relé ESP8266 (D5)
const int MAX_DISTANCE = 72; // Distância máxima a ser medida em centímetros sensor AJ-SR04M
const int MIN_DISTANCE = 22; // Distância mínima a ser medida em centímetros sensor AJ-SR04M
//Verifique o ID do LCD ex:0x26
LiquidCrystal_I2C lcd(0x27, 16, 2); // pino do lcd SDA (D1), SCL (D2) pra esp8266 e pino SDA (21), SCL (22) pra esp32
//#define LCD_ADDRESS 0x27
//#define LCD_ROWS 2
//#define LCD_COLUMNS 16
//LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
char* LargeText = "Deus seja louvado "; // Texto a ser exibido no LCD
int iLineNumber = 0; // Delay entre rolagens, em milissegundos
int iCursor = 0; // Largura do display LCD
long duration; // Variável para a duração da onda sonora
int distance_cm; // Variável para a medição da distância
unsigned long previousMillis = 0;
const long INTERVAL = 5000; // Intervalo de leitura do sensor (em milissegundos)
void setup() {
Serial.begin(9600);
Serial.println();
Wire.begin(21, 22);
// Inicializa o LCD
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);
}
lcd.clear();
lcd.setCursor(7, 0);
lcd.print("|");
lcd.setCursor(7, 1);
lcd.write(32); // Abre Caracter espaço
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(7, 1);
lcd.print("|");
// Inicializa o sensor DHT22
// dht.begin();
// Serial.println(F("DHTxx teste!"));
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
Serial.println("Connecting to WiFi...");
WiFi.begin("Wokwi-GUEST", "", 6);
// Imprime o endereço IP atribuído
Serial.print("Endereço IP atribuído: ");
Serial.println(WiFi.localIP());
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
Serial.println("WiFi connected");
server.on("/waterlevel", HTTP_GET, handleWaterLevelRequest);
//server.on("/dht22", HTTP_GET, handleDHT22Request);
server.begin();
}
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 handleWaterLevelRequest(AsyncWebServerRequest * request) {
float percentage = readWaterLevel();
if (percentage < 0) {
percentage = 0;
} else if (percentage > 100) {
percentage = 100;
}
else if (percentage <= 4) {
digitalWrite(RELAY_PIN, LOW);
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(0, 1);
lcd.print(" Vazio ");
}
else if (percentage >= 6 && percentage <= 15) {
digitalWrite(RELAY_PIN, HIGH);
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(0, 1);
lcd.print(" Ench. ");
//lcd.setCursor(0, 1);
//lcd.print(" ");
}
else if (percentage >= 100) {
digitalWrite(RELAY_PIN, LOW);
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(0, 1);
lcd.print(" Cheio ");
}
String response = String(percentage);
request->send(200, "text/plain", response);
}
/*
void handleDHT22Request(AsyncWebServerRequest * request) {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (!isnan(humidity) && !isnan(temperature)) {
String response = String(temperature) + "," + String(humidity);
request->send(200, "text/plain", response);
} else {
request->send(500, "text/plain", "Erro ao ler o sensor DHT22");
}
}*/
float readWaterLevel() {
// Limpa a condição do pino de TRIGGER_PIN
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
// Define o TRIGGER_PIN como HIGH (ATIVO) por 10 microssegundos
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Lê o ECHO_PIN, retorna o tempo de viagem da onda sonora em microssegundos
duration = pulseIn(ECHO_PIN, HIGH);
// Calcula a distância
distance_cm = duration * 0.034 / 2; // Velocidade da onda sonora dividida por 2 (ida e volta)
Serial.print("Distance: ");
Serial.print(distance_cm);
Serial.println(" cm");
// Mapeia a distância medida para a porcentagem de água restante
float percentage = map(distance_cm, MIN_DISTANCE, MAX_DISTANCE, 100, 0);
lcd.setCursor(0, 0);
lcd.print("N.agua");
// Exibe a porcentagem do nivel de agua no display LCD
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa a linha anterior
lcd.setCursor(1, 1);
lcd.print(int(round(percentage)));
//lcd.print(percentage);
lcd.print("%");
// Limita a porcentagem entre 0% e 100%
if (percentage < 0) {
percentage = 0;
} else if (percentage > 100) {
percentage = 100;
}
return percentage;
}
void loop() {
/*
float humidity = dht.readHumidity();
// Temperature em Celsius (default)
float temperature = dht.readTemperature();
float hic = dht.computeHeatIndex(temperature, humidity, false);
//mostra a leitura virtuamente no desktop arduino
Serial.print(F("Umidade: "));
Serial.print(humidity);
Serial.print(F("Temperatura: "));
Serial.print(temperature);
Serial.print(F("°C "));*/
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= INTERVAL) {
// Atualiza o nível de água e controla o relé
float percentage = readWaterLevel();
//float percentage = readWaterLevel();
if (percentage < 0) {
percentage = 0;
} else if (percentage > 100) {
percentage = 100;
}
else if (percentage <= 4) {
digitalWrite(RELAY_PIN, LOW);
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(0, 1);
lcd.print(" Vazio ");
}
else if (percentage >= 6 && percentage <= 15) {
digitalWrite(RELAY_PIN, HIGH);
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(0, 1);
lcd.print(" Ench. ");
//lcd.setCursor(0, 1);
//lcd.print(" ");
}
else if (percentage >= 100) {
digitalWrite(RELAY_PIN, LOW);
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa apenas o local onde os carecteres vai ser escrito
lcd.setCursor(0, 1);
lcd.print(" Cheio ");
}
Serial.print("Water Level: ");
Serial.print(percentage);
Serial.println(" %");
/*
// Obtém a temperatura e umidade do sensor DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Verifica se a leitura foi bem-sucedida
if (!isnan(humidity) && !isnan(temperature)) {
// Exibe a temperatura no display LCD
lcd.setCursor(9, 0);
lcd.print(F("T:"));
lcd.setCursor(12, 0);
lcd.print(int(round(temperature))); // arredondamento de casa decimais para numeros inteiros
//lcd.print(temperature); // sem arredondamento de casa decimais
lcd.print(" "); // Limpa a linha anterior
lcd.setCursor(15, 0);
// lcd.write(32); // Abre Caracter espaço
lcd.write(223); // Caracter °
//lcd.print(F("C")); // Mostra C celsio
//delay(3000);
// Exibe a umidade no display LCD
lcd.setCursor(9, 1);
lcd.print(F("U:"));
lcd.setCursor(12, 1);
lcd.print(int(round(humidity))); // arredondamento de casa decimais para numeros inteiros
//lcd.print(humidity); // sem arredondamento de casa decimais
lcd.print(" "); // Limpa a linha anterior
lcd.setCursor(15, 1);
lcd.print(F("%"));
}
else {
// Exibe uma mensagem de erro se a leitura falhar
lcd.setCursor(9, 0);
lcd.print(" ");
lcd.setCursor(9, 0);
lcd.print("Sensor");
lcd.setCursor(9, 1);
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(" Erro ");
}*/
previousMillis = currentMillis;
}
}