// Libraries
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <Adafruit_SH110X.h>
#include <Wire.h>
#include "Potentiometer.h"
#include "DHTSensor.h"
// Parameters
const char* SSID = "Wokwi-GUEST";
const char* PASS = "";
const char* BOT_TOKEN = "7276940920:AAG5Jp7Z-Keu4ZFFt2LITcS8ecHJqIWAbgU";
// Devices
#define PIN_LED_GREEN 23
#define PIN_LED_BLUE 2
#define PIN_DHT22 33
#define PIN_POTENTIOMETER 32
// Constants
#define POTENCIOMETER_RESOLUTION 8
#define MAX_VOLTAGE 3.3
#define MIN_VOLTAGE 0
#define TIEMPO_ESCANEO 1000
// Objects
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1);
Potentiometer potentiometer(PIN_POTENTIOMETER, MIN_VOLTAGE, MAX_VOLTAGE, POTENCIOMETER_RESOLUTION);
DHTSensor dhtSensor(PIN_DHT22, DHT22);
// Variables
unsigned long tiempoAnterior;
String chat_id;
bool ledVerdeEncendido;
bool ledAzulEncendido;
float voltajePotenciometro;
float humedad;
float temperatura;
//const char * ID_Chat = "tu_id_chat";//ID_Chat se obtiene de telegram
void mensajesNuevos(int numerosMensajes) {
for (int i = 0; i < numerosMensajes; i++) {
String chat_id = bot.messages[i].chat_id;
String text = bot.messages[i].text;
Serial.println(text);
// /start
// Formatear los pines en cadenas de dos dígitos
char pinGreen[3];
char pinBlue[3];
sprintf(pinGreen, "%02d", PIN_LED_GREEN); // convierte 23 a "23"
sprintf(pinBlue, "%02d", PIN_LED_BLUE); // convierte 2 a "02"
// Lectura de perifericos
temperatura = dhtSensor.getTemperature();
humedad = dhtSensor.getHumidity();
voltajePotenciometro = potentiometer.readVoltage();
if (text == "/start") {
bot.sendMessage(chat_id, "¡Bienvenido! Comandos disponibles:\n/start - Iniciar comunicación con bot\n/led<led><on/off> - Controlar LEDs (23 = verde, 02 = azul)\n/dht22 - Obtener temperatura y humedad\n/pote - Obtener voltaje del potenciómetro\n/platiot - Enviar datos a plataforma IoT\n/display<comando> - Mostrar estado en OLED", "");
}
// /led
// Control de LED
else if (text.startsWith("/led")) {
int ledPin;
// Extraer el valor del pin
String ledCommand = text.substring(4, 6);
if (ledCommand == pinGreen) {
ledPin = PIN_LED_GREEN;
} else if (ledCommand == pinBlue) {
ledPin = PIN_LED_BLUE;
} else {
bot.sendMessage(chat_id, "Error: LED no válido (23 = verde, 02 = azul).", "");
continue;
}
if (text.endsWith("on")) {
digitalWrite(ledPin, HIGH);
bot.sendMessage(chat_id, "LED encendido!", "");
if (ledPin == PIN_LED_GREEN) {
ledVerdeEncendido = true;
} else if (ledPin == PIN_LED_BLUE) {
ledAzulEncendido = true;
}
}
else if (text.endsWith("off")) {
digitalWrite(ledPin, LOW);
bot.sendMessage(chat_id, "LED apagado!", "");
if (ledPin == PIN_LED_GREEN) {
ledVerdeEncendido = false;
} else if (ledPin == PIN_LED_BLUE) {
ledAzulEncendido = false;
}
}
else {
bot.sendMessage(chat_id, "Comando incorrecto. Usa /led<led><on/off>", "");
}
}
// /dht22
// Informar temperatura y humedad del DHT22
else if (text == "/dht22") {
if (isnan(temperatura) || isnan(humedad)) {
bot.sendMessage(chat_id, "Error al leer el sensor DHT22", "");
}
else {
String mensaje = "Temperatura: " + String(temperatura) + "°C\nHumedad: " + String(humedad) + "%";
bot.sendMessage(chat_id, mensaje, "");
}
}
// /pote
// Informar voltaje del potenciómetro
else if (text == "/pote") {
String mensaje = "Voltaje del potenciómetro: " + String(voltajePotenciometro) + "V";
bot.sendMessage(chat_id, mensaje, "");
}
// /platiot
// Enviar temperatura y humedad a la plataforma IoT
else if (text == "/platiot") {
if (isnan(temperatura) || isnan(humedad)) {
bot.sendMessage(chat_id, "Error al leer el sensor DHT22", "");
}
else {
// TODO
//enviarDatosIoT(temperatura, humedad); // Función que envía los datos a la plataforma IoT
bot.sendMessage(chat_id, "Datos enviados a la plataforma IoT", "");
}
}
// /display
// Mostrar estado en OLED
else if (text == "/displayled") {
String estadoLedVerde = ledVerdeEncendido ? "Encendido" : "Apagado";
String estadoLedAzul = ledAzulEncendido ? "Encendido" : "Apagado";
setOLEDText("Estado led verde: " + estadoLedVerde + "\Estado led azul: " + estadoLedAzul);
bot.sendMessage(chat_id, "Estado de los LED mostrado en el OLED", "");
}
else if (text == "/displaypote") {
setOLEDText("Voltaje potenciometro: " + String(voltajePotenciometro) + "v");
bot.sendMessage(chat_id, "Estado del potenciometro mostrado en el OLED", "");
}
else if (text == "/displaydht22") {
setOLEDText("Temperatura: " + String(temperatura) + "C\nHumedad: " + String(humedad) + "%");
bot.sendMessage(chat_id, "Estado del dht22 mostrado en el OLED", "");
}
else if (text.startsWith("/display")) {
setOLEDText("Comando invalido");
bot.sendMessage(chat_id, "Comando /display no válido. Usa: /displayled, /displaypote, o /displaydht22", "");
}
else {
bot.sendMessage(chat_id, "Comando no valido", "");
}
}
}
void setup() {
Serial.begin(9600);
pinMode(PIN_LED_GREEN, OUTPUT);
pinMode(PIN_LED_BLUE, OUTPUT);
// Intenta conectarse a la red wifi
Serial.print("Conectando a la red ");
WiFi.begin(SSID, PASS);
// Agregar certificado raíz para api.telegram.org
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.print("\nConectado a la red wifi. Dirección IP: ");
Serial.println(WiFi.localIP());
// Define potenciometer resolution (0 to 2 ^ POTENCIOMETER_RESOLUTION - 1)
analogReadResolution(POTENCIOMETER_RESOLUTION);
// Inicializar OLED
display.begin(0x3c, true);
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
}
void loop() {
// Verifica si hay datos nuevos en telegram cada TIEMPO_ESCANEO milisegundos
if (millis() - tiempoAnterior > TIEMPO_ESCANEO) {
int numerosMensajes = bot.getUpdates(bot.last_message_received + 1);
while (numerosMensajes) {
Serial.println("Comando recibido");
mensajesNuevos(numerosMensajes);
numerosMensajes = bot.getUpdates(bot.last_message_received + 1);
}
tiempoAnterior = millis();
}
}
void setOLEDText(String txt) {
display.clearDisplay();
display.setCursor(0, 0);
display.println(txt);
display.display();
}