//Projeto N.Dágua - Sensor ultrassonico AJ-SR04M/HC-SR04 - SERVER/CLIENT -LCD16x2
// Desenvolvimento - Elias codigo client
//Obs: Não use a alimentanção do esp para alimentar o LCD e os sensores, use fonte externa 5v
//#include <ESP8266WiFi.h> //remova a barra para usar 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 <WiFiMulti_Generic.h> // Substituído WiFiMulti por WiFiMulti_Generic
WiFiMulti_Generic WiFiMulti;
/*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"; // IP do servidor ESP8266
const int serverPort = 80;
const char* waterLevelEndpoint = "/waterlevel";
const char* dht22Endpoint = "/dht22";
//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
char* LargeText = "Deus seja louvado ";
int iLineNumber = 0;
int iCursor = 0;
const int led1Pin = 19; // Pino do LED1 esp8266 (D5)
const int led2Pin = 18; // Pino do LED2 esp8266 (D6)
const int led3Pin = 15; // Pino do LED3 esp8266 (D7)
unsigned long lcdUpdateTime = 0;
const long LCD_UPDATE_INTERVAL = 5000;
// Protótipo da função oscillateLEDs()
void oscillateLEDs();
void setup() {
Serial.begin(9600);
delay(1000);
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(350);
}
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("N.agua");
/* lcd.setCursor(0, 1);
lcd.print(int(round(waterLevel)));
//lcd.print(waterLevel);
lcd.print("%");
*/
//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("|");
// Exibe a temperatura no display LCD
lcd.setCursor(9, 0);
lcd.print(F("T:"));
lcd.setCursor(12, 0);
// Exibe a umidade no display LCD
lcd.setCursor(9, 1);
lcd.print(F("U:"));
lcd.setCursor(12, 1);
WiFi.begin("Wokwi-GUEST", "", 6); ////
Serial.println("Connecting to WiFi...");
WiFiMulti.addAP(ssid, password);
while (WiFiMulti.run() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
// Imprime o endereço IP atribuído
Serial.print("Endereço IP atribuído: ");
Serial.println(WiFi.localIP());
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
}
void loop() {
if (WiFiMulti.run() == WL_CONNECTED) {
unsigned long currentMillis = millis();
if (currentMillis - lcdUpdateTime >= LCD_UPDATE_INTERVAL) {
requestWaterLevel();
requestDHT22Data();
lcdUpdateTime = currentMillis;
}
}
delay(10000); // Delay para leituras periódicas
}
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 requestWaterLevel() {
WiFiClient client;
if (!client.connect(serverAddress, serverPort)) {
Serial.println("Connection failed");
delay(5000);
return;
}
client.print(String("GET ") + waterLevelEndpoint + " HTTP/1.1\r\n" +
"Host: " + serverAddress + "\r\n" +
"Connection: close\r\n\r\n");
while (!client.available()) {
delay(100);
}
while (client.available()) {
String line = client.readStringUntil('\r');
if (line.startsWith("HTTP/1.1 200 OK")) {
while (client.available()) {
line = client.readStringUntil('\r');
if (line.startsWith("\r\n")) {
break;
}
}
float waterLevel = client.readStringUntil('\r').toFloat();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("N.agua");
lcd.setCursor(0, 1);
//lcd.print(int(round(waterLevel)));
lcd.print(waterLevel);
lcd.print("%");
Serial.print("Water Level: ");
Serial.println(waterLevel);
// Acende LEDs de acordo com o nível de água
//se o nível da água for menor que 10%, o LED no pino led1Pin será ligado (HIGH), caso contrário, será desligado (LOW).
digitalWrite(led1Pin, waterLevel < 10 ? HIGH : LOW);
//se o nível da água for igual a 50%, o LED no pino led2Pin será ligado (HIGH), caso contrário, será desligado (LOW).
digitalWrite(led2Pin, waterLevel == 50 ? HIGH : LOW);
//se o nível da água for menor/igual a 100%, o LED no pino led3Pin será ligado (HIGH), caso contrário, será desligado (LOW).
digitalWrite(led3Pin, waterLevel >= 100 ? HIGH : LOW);
// Verifica se o nível de água está entre 6 e 15% e chama a função de oscilação dos LEDs
if (waterLevel >= 6 && waterLevel <= 99) {
oscillateLEDs();
}
}
}
client.stop();
}
void requestDHT22Data() {
WiFiClient client;
if (!client.connect(serverAddress, serverPort)) {
Serial.println("Connection failed");
delay(5000);
return;
}
client.print(String("GET ") + dht22Endpoint + " HTTP/1.1\r\n" +
"Host: " + serverAddress + "\r\n" +
"Connection: close\r\n\r\n");
while (!client.available()) {
delay(100);
}
while (client.available()) {
String line = client.readStringUntil('\r');
if (line.startsWith("HTTP/1.1 200 OK")) {
while (client.available()) {
line = client.readStringUntil('\r');
if (line.startsWith("\r\n")) {
break;
}
}
String response = client.readStringUntil('\r');
int commaIndex = response.indexOf(',');
if (commaIndex != -1) {
float temperature = response.substring(0, commaIndex).toFloat();
float humidity = response.substring(commaIndex + 1).toFloat();
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
lcd.setCursor(9, 0);
lcd.print(F("T:"));
lcd.setCursor(12, 0);
lcd.print(int(round(temperature)));
lcd.print(" ");
lcd.setCursor(15, 0);
lcd.write(223);
lcd.setCursor(9, 1);
lcd.print(F("U:"));
lcd.setCursor(12, 1);
lcd.print(int(round(humidity)));
lcd.print(" ");
lcd.setCursor(15, 1);
lcd.print(F("%"));
} else {
Serial.println("Invalid response from server");
}
}
}
client.stop();
}
void oscillateLEDs() {
// Oscilação dos LEDs
for (int i = 0; i < 3; i++) {
digitalWrite(led1Pin, HIGH);
delay(200);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(200);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(200);
digitalWrite(led3Pin, LOW);
}
}