En este tutorial, aprenderás a configurar y usar un dispositivo ESP32 para recibir mensajes de Telegram y mostrarlos en un display SH1106. También incluiremos la funcionalidad de un botón y un buzzer para interactuar con el sistema.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
Requisitos
- Un ESP32.
- Un display SH1106 (128×64) con interfaz I2C.
- Un buzzer.
- Un botón.
- Cables de conexión.
- Biblioteca Arduino IDE instalada.
Paso 1: Instalación de las Bibliotecas Necesarias
Abre el Arduino IDE y asegúrate de tener instaladas las siguientes bibliotecas:
- WiFi.h para la conexión WiFi.
- WiFiClientSecure.h para la conexión segura.
- UniversalTelegramBot.h para interactuar con el bot de Telegram.
- U8g2lib.h para manejar el display SH1106.
Puedes instalarlas desde el Gestor de Bibliotecas del Arduino IDE buscando los nombres de las bibliotecas.
Paso 2: Conexión del Hardware
Conecta los componentes de acuerdo con el siguiente esquema:
- Display SH1106:
- VCC a 5V del ESP32.
- GND a GND del ESP32.
- SCL a GPIO 22 del ESP32.
- SDA a GPIO 21 del ESP32.
- Buzzer:
- Terminal positivo a GPIO 12 del ESP32.
- Terminal negativo a GND del ESP32.
- Botón:
- Un terminal a GPIO 23 del ESP32.
- Otro terminal a GND del ESP32.
Paso 3: Configuración del Bot de Telegram
- Crea un bot en Telegram usando el BotFather y obtén el Token del bot.
- Reemplaza TOKEN_BOT en el código con el token obtenido.
- Reemplaza ssid y contraseña con el nombre de tu red WiFi y la contraseña.
Paso 4: Cargar el Código en el ESP32
- Conecta el ESP32 a tu computadora.
- Selecciona la placa ESP32 Dev Module en el menú Herramientas -> Placa.
- Selecciona el puerto correcto en el menú Herramientas -> Puerto.
- Haz clic en Subir para cargar el código en el ESP32.
Paso 5: Prueba del Sistema
- Una vez cargado el código, abre el Monitor Serial en el Arduino IDE para ver los mensajes de depuración.
- En el display SH1106, debería aparecer el mensaje “Esperando mensaje!”.
- Envía un mensaje a tu bot de Telegram. El mensaje debería aparecer en el display y el buzzer debería sonar.
Componentes electrónicos
Un Esp32
Características del módulo ESP32-T
Conectividad
El módulo ESP32 dispone de todas las variantes del WiFi:
- 802.11 b/g/n/e/i/n
- Wi-Fi Direct (P2P), P2P Discovery, P2P Group Owner mode and P2P Power Management
Esta versión nueva incluye la conectividad mediante Bluethoot de bajo consumo
- Bluetooth v4.2 BR/EDR and BLE
- BLE Beacon
Además, puede comunicarse mediante los protocoles SPI, I2C, UART, MAC Ethernet, Host SD
Prestaciones del microcontrolador
La CPU está formado por un SoC modelo Tensilica LX6 con las siguientes características y memoria
- Doble núcleo de 32 bits con velocidad de 160MHz
- Memoria ROM de 448 kBytes
- Memoria SRAM de 520kBytes
Dispne de 48 Pines
- 18 ADC de 12 bits
- 2 DAC de 8 bits
- 10 pines sensores de contacto
- 16 PWM
- 20 Entradas/salidas digitales
Alimentación y modos de consumo
Para un correcto funcionamiento del ESP32 es necesario subministrar un voltaje de entre 2,8V y 3,6V. La energía que consume depende del modo de funcionamiento. Contiene un modo, el Ultra Low Power Solution (ULP), en que se continúan realizando tareas básicas (ADC, RTC…) en el modo Sleep.
Pines hembra
Cables dupont hembra macho
Display oled sh1106
Se trata de un módulo de pantalla OLED monocromática DE 128×64 puntos con interface I2C .Que presenta varias ventajas en comparación con pantallas LCD, y podemos destacar su alto brillo, un muy buen contraste, un ángulo de visión más amplio, y bajo consumo de energía. ES compatible con Arduino Rasberry Pi y microcontroladores PIC entre otros. Trabaja con niveles lógicos de 3.3V a 5V tiene un angulo de visión mayor a los 160 grados. el Tamaño de la pantalla es de 1,3 pulgadas. Se alimenta con un voltaje de 3.3V a 5V Se lo puede usar en aplicaciones como relojes inteligentes, MP3, termómetros, instrumentos, y proyectos varios, etc.
Características
- Interface: I2C(3.3V / 5V logic level)
- Resolution: 128 x 64
- Angle of view: >160 degree
- Display color: Blue
- Display size: 1.3 inch
- Driver IC: SH1106
- Power supply: DC 3.3V~5V
- Operating temperature: -20~70’C
- Application: smart watch, MP3, thermometer, instruments, DIY projects, etc.
Módulo Buzzer
Módulo ky-004
PCB
Descargar archivo gerber –> Gerber_esp32
Circuito
Código Fuente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
#include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <U8g2lib.h> // Configuración del display SH1106 usando U8g2 U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 22, /* data=*/ 21); // Configuración WiFi const char* ssid = "Tu-red-WiFi"; const char* contrasena = "Tu-Clave-WiFi"; // Token del bot de Telegram #define TOKEN_BOT "Tu-Token-Telegram" // Configuración del buzzer const int pinBuzzer = 12; const int duracionBuzzer = 100; // Duración del sonido en milisegundos // Configuración del botón const int pinBoton = 23; bool botonPresionado = false; WiFiClientSecure cliente; UniversalTelegramBot bot(TOKEN_BOT, cliente); unsigned long ultimaVezBotCorrio; // ID del último chat para enviar respuestas String idUltimoChat; void setup() { Serial.begin(115200); // Conexión WiFi WiFi.begin(ssid, contrasena); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Conectando al WiFi..."); } Serial.println("Conectado al WiFi"); // Configuración del display u8g2.begin(); // Mostrar mensaje inicial en el display u8g2.clearBuffer(); u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawUTF8(0, 10, "Esp. mensaje:"); u8g2.sendBuffer(); // Configuración del buzzer pinMode(pinBuzzer, OUTPUT); digitalWrite(pinBuzzer, LOW); // Configuración del botón pinMode(pinBoton, INPUT_PULLUP); // Configuración de cliente seguro cliente.setCACert(TELEGRAM_CERTIFICATE_ROOT); } // Función para dividir el mensaje en líneas que se ajusten al ancho del display void mostrarTextoLargo(const String &texto) { const int alturaLinea = 10; // Altura de cada línea const int maxLineas = 6; // Máximo número de líneas que caben en el display int indiceInicio = 0; int indiceFin; int linea = 0; while (indiceInicio < texto.length()) { indiceFin = indiceInicio; int anchoLinea = 0; // Encuentra el punto de corte para la línea while (indiceFin < texto.length() && anchoLinea < u8g2.getDisplayWidth()) { indiceFin++; anchoLinea = u8g2.getStrWidth(texto.substring(indiceInicio, indiceFin).c_str()); } // Ajusta el punto de corte para evitar dividir palabras if (indiceFin < texto.length()) { while (indiceFin > indiceInicio && texto[indiceFin] != ' ') { indiceFin--; } } // Muestra la línea en el display u8g2.drawUTF8(0, (linea + 1) * alturaLinea, texto.substring(indiceInicio, indiceFin).c_str()); indiceInicio = indiceFin + 1; linea++; // Si el texto es más largo que el display, desplaza el texto if (linea >= maxLineas) { delay(3000); // Pausa para leer la página actual linea = 0; u8g2.clearBuffer(); } } u8g2.sendBuffer(); } void loop() { // Verificar si el botón ha sido presionado if (digitalRead(pinBoton) == LOW) { if (!botonPresionado) { // Envía un mensaje a Telegram bot.sendMessage(idUltimoChat, "He leído tu mensaje, puedes enviar otro", ""); // Sonar el buzzer digitalWrite(pinBuzzer, HIGH); delay(duracionBuzzer); digitalWrite(pinBuzzer, LOW); // Mostrar mensaje en el display u8g2.clearBuffer(); u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawUTF8(0, 10, "Mens. enviado!"); u8g2.sendBuffer(); botonPresionado = true; } } else { botonPresionado = false; } // Verificar si hay nuevos mensajes de Telegram if (millis() - ultimaVezBotCorrio > 1000) { int numNuevosMensajes = bot.getUpdates(bot.last_message_received + 1); while (numNuevosMensajes) { Serial.println("Nuevo mensaje recibido"); for (int i = 0; i < numNuevosMensajes; i++) { String idChat = bot.messages[i].chat_id; String texto = bot.messages[i].text; // Guardar el ID del último chat para enviar respuestas idUltimoChat = idChat; // Mostrar mensaje en el display u8g2.clearBuffer(); u8g2.setFont(u8g2_font_unifont_t_symbols); // Selecciona la fuente compatible con Unicode mostrarTextoLargo(texto); // Sonar el buzzer digitalWrite(pinBuzzer, HIGH); delay(duracionBuzzer); digitalWrite(pinBuzzer, LOW); bot.sendMessage(idChat, "Mensaje recibido: " + texto, ""); } numNuevosMensajes = bot.getUpdates(bot.last_message_received + 1); } ultimaVezBotCorrio = millis(); } } |
No te pierdas ningún video más suscríbete a nuestro canal de telegram https://t.me/carlosvolt_electronica_robotica
PROYECTO RECOMENDADO