#include <WiFi.h>
#include <HTTPClient.h>
#include <CTBot.h>
#include <DHT.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <Adafruit_Sensor.h>
#include <stdlib.h>
#include <ESP32Servo.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define RTCPIN 22
const char* apiKey = "ed128fdaf67b28ea933497f226f1ce98";
const char* server = "api.openweathermap.org";
const char* apiEndpoint = "/data/2.5/weather?q=Facatativá&appid=";
String TOKEN = "6257753461:AAHSxuxPfEbtVx5pis0G0ozzJdEd13xJUPM";
String SSID = "Wokwi-GUEST";
String PAWD = "";
float ultimoValorTemperatura = 0;
float ultimoValorHumedad = 0;
float ss=0.034;
float dist_cm;
int ledPin = 13;
int inputPin = 12;
int pirState = LOW;
int val = 0;
int t_p=5;
int e_p=18;
int buzzerPin = 14;
int servoPin = 27;
long durn;
DHT dht(DHTPIN, DHTTYPE);
CTBot esp_treintaidos_bot;
WiFiClient client;
HTTPClient http;
Servo miServo;
int httpCode = http.GET();
String payload = http.getString();
String obtenerDescripcionClima(const String& descripcion) {
String descripcionNueva;
if (descripcion == "Clear") {
descripcionNueva = "Despejado";
} else if (descripcion == "Clouds") {
descripcionNueva = "Nublado";
} else if (descripcion == "Rain") {
descripcionNueva = "Lluvioso";
} else if (descripcion == "Drizzle") {
descripcionNueva = "Llovizna";
} else if (descripcion == "Thunderstorm") {
descripcionNueva = "Tormenta";
} else if (descripcion == "Snow") {
descripcionNueva = "Nevado";
} else if (descripcion == "Mist" ) {
descripcionNueva = "Niebla";
} else if (descripcion == "Smoke" ) {
descripcionNueva = "Humo";
} else if (descripcion == "Haze" ) {
descripcionNueva = "Neblina";
} else if (descripcion == "Dust" ) {
descripcionNueva = "Polvo";
} else if (descripcion == "Fog" ) {
descripcionNueva = "Niebla";
} else if (descripcion == "Sand" ) {
descripcionNueva = "Arena";
} else if (descripcion == "Ash" ) {
descripcionNueva = "Ceniza";
} else if (descripcion == "Squal" ) {
descripcionNueva = "Chubasco";
} else if (descripcion == "light rain") {
descripcionNueva = "Lluvia Ligera";
} else if (descripcion == "moderate rain") {
descripcionNueva = "Lluvia Moderada";
} else if (descripcion == "overcast clouds") {
descripcionNueva = "Parcialmente Nublado";
} else {
descripcionNueva = descripcion;
}
return descripcionNueva;
}
//setup
void setup() {
Serial.begin(115200);
configTime(-5 * 3600, 0, "pool.ntp.org");
while (!time(nullptr)) {
delay(500);
}
dht.begin();
esp_treintaidos_bot.wifiConnect(SSID, PAWD);
esp_treintaidos_bot.setTelegramToken(TOKEN);
if (esp_treintaidos_bot.testConnection()) {
Serial.println("Conectado");
} else {
Serial.println("No Se Ha Conectado");
}
pinMode(ledPin, OUTPUT);
pinMode(inputPin, INPUT);
pinMode(t_p, OUTPUT);
pinMode(e_p, INPUT);
pinMode(buzzerPin, OUTPUT);
Serial.println("Configurando hora...");
miServo.attach(servoPin);
}
//_________________________________________________________________________________________________________________________________
//void loop
void loop() {
TBMessage mensaje;
//__________________________________________________________________________________________________________________________________________
//API
if (WiFi.status() == WL_CONNECTED) {
if (http.begin(client, server, 80, apiEndpoint + String(apiKey))) {
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
float temp = doc["main"]["temp"].as<float>() - 273.15;
int humidity = doc["main"]["humidity"];
String weatherDescription = doc["weather"][0]["description"];
Serial.print("___________________________________________________________________________________\n");
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.print(" °C, Humedad: ");
Serial.print(humidity);
Serial.print("%, \nEstado del clima: ");
Serial.println(obtenerDescripcionClima(weatherDescription));
time_t now = time(nullptr);
struct tm* timeinfo;
timeinfo = localtime(&now);
char buffer[80];
strftime(buffer, sizeof(buffer), "Fecha: %d/%m/%Y, Hora: %H:%M", timeinfo);
Serial.println(buffer);
}
else {
Serial.print("Error al hacer la solicitud HTTP. Código de error: ");
Serial.println(httpCode);
}
http.end();
}
else {
Serial.println("Error al iniciar la conexión HTTP");
}
}
else {
Serial.println("No se pudo conectar a WiFi");
}
//_________________________________________________________________________________________________________________________________
//Medidor de Movimiento
val = digitalRead(inputPin);
if (val == HIGH) {
digitalWrite(ledPin, HIGH);
if (pirState == LOW) {
String response = "Movimiento Detectado! ";
// Gira servo hacia adelante
miServo.write(90);
pirState = HIGH;
}
delay(1000);
digitalWrite(ledPin, LOW);
if (pirState == HIGH) {
pirState = LOW;
tone(buzzerPin, 1600);
delay(500);
tone(buzzerPin, 820);
delay(500);
noTone(buzzerPin);
}
}
//________________________________________________________________________________________________________________________________
//Registro DHT22
float temperatura = dht.readTemperature();
float humedad = dht.readHumidity();
if (temperatura != ultimoValorTemperatura) {
Serial.print("Ultima Temperatura de la Planta: ");
Serial.print(temperatura);
Serial.println(" °C");
ultimoValorTemperatura = temperatura;
}
if (humedad != ultimoValorHumedad) {
Serial.print("Ultimo Valor de Humedad de la Planta: ");
Serial.print(humedad);
Serial.println(" % ");
ultimoValorHumedad = humedad;
}
//_______________________________________________________________________________________________________________________________________
// Photosensor LDR
const int ldr_pin = 34;
int sensorValue = analogRead(ldr_pin);
int lux = map(sensorValue, 0, 4095, 1, 100000);
//______________________________________________________________________________________________________________________________________________
//Mensajes del Usuario
if (esp_treintaidos_bot.getNewMessage(mensaje)) {
Serial.print("Usuario: ");
Serial.println(mensaje.text);
//_________________________________________________________________________________________________________________________________
//Sensor Ultrasonico
digitalWrite(t_p, LOW);
delayMicroseconds(2);
digitalWrite(t_p, HIGH);
delayMicroseconds(10);
digitalWrite(t_p, LOW);
durn=pulseIn(e_p, HIGH);
dist_cm=durn*ss/2;
//_________________________________________________________________________________________________________________________________
//Bot de Telegram
//Temperatura
if (mensaje.text == "/temperatura") {
float temperatura = dht.readTemperature();
if (isnan(temperatura)) {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Error al leer la temperatura.");
} else {
String response = "La temperatura es de: " + String(temperatura) + " °C \n";
if (temperatura > 28) {
String mensajesCalor[] = {
"Me muero de calor",
"Por favor, qué calor",
"Me siento marchito y débil",
"De esta no paso",
"Socorro",
"Ojú, qué calor!.",
"Me achicharro",
"Me estoy azando",
"Me asfixio",
"Hace un calor que aprieta",
"No puedo crecer más en estas condiciones",
"Me sofoco",
"Me frío de calor",
"Esto no es calor, es fuego",
"Me siento como si estuviera en un horno",
"Mis hojas se están quemando",
"No puedo respirar en estas condiciones",
"Necesito más sombra para sobrevivir",
"Me siento como si estuviera en un ambiente tóxico",
"Me siento como si estuviera en un ambiente extremadamente caliente y peligroso"
};
int index = rand() % (sizeof(mensajesCalor) / sizeof(mensajesCalor[0]));
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
esp_treintaidos_bot.sendMessage(mensaje.sender.id, mensajesCalor[index]);
} else if (temperatura < 18) {
String mensajesFrio[] = {
"Mis hojas se sienten secas y crujientes",
"Me siento marchita y débil",
"No puedo crecer más en estas condiciones",
"Me siento congelado y rígido",
"Necesito más calor para prosperar",
"Me siento como si estuviera en hibernación",
"No puedo soportar este frío",
"Mis hojas se están cayendo",
"Necesito más sol para sobrevivir",
"Me siento como si estuviera en un ambiente hostil",
"No puedo hacer fotosíntesis en estas condiciones",
"Me siento como si estuviera en un ambiente inhóspito",
"Necesito más agua para sobrevivir en este frío",
"Me siento como si estuviera en un ambiente árido y seco"
};
int index = rand() % (sizeof(mensajesFrio) / sizeof(mensajesFrio[0]));
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
esp_treintaidos_bot.sendMessage(mensaje.sender.id, mensajesFrio[index]);
} else {
String mensajesNormal[] = {
"Me siento feliz y saludable",
"Mis hojas están verdes y vibrantes",
"Estoy creciendo fuerte y rápido",
"Me siento cómodo y seguro",
"Estoy disfrutando del sol y la lluvia",
"Me siento en armonía con mi entorno",
"Estoy floreciendo y dando frutos",
"Me siento en paz y relajado",
"Estoy absorbiendo los nutrientes que necesito",
"Me siento enérgico y vital",
"Estoy respirando aire fresco y limpio",
"Me siento en equilibrio y en sintonía con la naturaleza",
"Estoy absorbiendo la luz solar que necesito",
"Me siento en un ambiente acogedor y agradable",
"Estoy en un clima perfecto para mi crecimiento y desarrollo"
};
int index = rand() % (sizeof(mensajesNormal) / sizeof(mensajesNormal[0]));
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
esp_treintaidos_bot.sendMessage(mensaje.sender.id, mensajesNormal[index]);
}
}
}
//Humedad
else if (mensaje.text == "/humedad") {
float humedad = dht.readHumidity();
if (isnan(humedad)) {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Error al leer la humedad.");
} else {
String response = "La humedad es de: " + String(humedad) + " % \n";
if (humedad > 80) {
String mensajesHumedo[] = {
"Me siento empapada y pesada",
"Mis hojas están amarillas o caídas",
"No puedo respirar en estas condiciones",
"Me siento como si estuviera en un pantano",
"Mis raíces están blandas o podridas",
"Me siento como si estuviera ahogándome",
"Mis hojas están blandas al tacto",
"No puedo absorber más agua",
"Me siento como si estuviera en un ambiente húmedo y sofocante",
"Mis hojas están manchadas o tienen moho",
"Me siento como si estuviera en un ambiente tóxico",
"Mis hojas están cayendo",
"Me siento como si estuviera en un ambiente insalubre",
"Mis hojas están creciendo lentamente o no están creciendo en absoluto",
"Me siento como si estuviera en un ambiente desequilibrado"
};
int index = rand() % (sizeof(mensajesHumedo) / sizeof(mensajesHumedo[0]));
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
esp_treintaidos_bot.sendMessage(mensaje.sender.id, mensajesHumedo[index]);
} else if (humedad < 40) {
String mensajesSeco[] = {
"Me siento seca y sedienta",
"Mis hojas están marchitas o secas",
"Me siento como si estuviera en un desierto",
"Mis hojas están amarillas o marrones",
"Me siento como si estuviera muriendo de sed",
"Mis tallos están blandos o arrugados",
"No puedo absorber suficiente agua",
"Me siento como si estuviera en un ambiente seco y árido",
"Mis hojas están quebradizas o crujientes",
"Me siento como si estuviera en un ambiente hostil",
"Mis hojas están cayendo",
"Me siento como si estuviera en un ambiente inhóspito",
"Mis hojas están creciendo lentamente o no están creciendo en absoluto",
"Me siento como si estuviera en un ambiente desequilibrado"
};
int index = rand() % (sizeof(mensajesSeco) / sizeof(mensajesSeco[0]));
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
esp_treintaidos_bot.sendMessage(mensaje.sender.id, mensajesSeco[index]);
} else {
String mensajesNormalH[] = {
"¡Estoy tan feliz de tener agua perfecta!",
"¡Mis hojas están tan verdes y vibrantes!",
"¡Mis tallos están tan fuertes!",
"¡Estoy creciendo tan rápido!",
"¡Gracias por cuidarme tan bien!",
"¡Me siento tan saludable!",
"¡Estoy tan agradecido por el agua que me das!",
"¡Me encanta tener agua perfecta!",
"¡Estoy tan contento de estar aquí!",
"¡Me siento tan fuerte y enérgico!",
"¡Estoy tan emocionado de florecer!",
"¡Estoy tan emocionado de dar frutos!",
"¡Me siento tan vivo y vibrante!",
"¡Estoy tan agradecido por el sol y el agua que me das!",
"¡Me encanta estar aquí y crecer con ustedes!"
};
int index = rand() % (sizeof(mensajesNormalH) / sizeof(mensajesNormalH[0]));
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
esp_treintaidos_bot.sendMessage(mensaje.sender.id, mensajesNormalH[index]);
}
}
//Otros
} else if (mensaje.text == "/distancia") {
String response = "La distancia es de: " + String(dist_cm) + "Cm";
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
}else if (mensaje.text == "/luz") {
String response = "La iluminacion es de: " + String(lux) + "lux";
esp_treintaidos_bot.sendMessage(mensaje.sender.id, response);
}else if (mensaje.text == "/comandos") {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Prueba usar /luz o /temperatura o /humedad o /distancia o /adios tambien puede usar /grupo para ver quienes participaron en este proyecto");
} else if (mensaje.text == "/start") {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Bot Iniciado");
} else if (mensaje.text == "/grupo") {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Los participantes son:\n- Julian Andres Perez Mendigaño\n- Kevin Esteban Ramos Romero\n- Kevin Santiago Garcia Ospina");
}else if (mensaje.text == "/adios") {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Hasta la proxima!");
}else {
esp_treintaidos_bot.sendMessage(mensaje.sender.id, "Comando no reconocido. Intente usar /comandos");
}
}
//________________________________________________________________________________________________________________________________________________________
delay(1500);
//________________________________________________________________________________________________________________________________________________________
}