👋 “¡Hola, Makers! Bienvenidos a este nuevo tutorial. Hoy vamos a crear un proyecto muy práctico: un sistema de alarma persistente con ESP32 y una pantalla OLED SH1106.”
🔧 “Este sistema te permitirá programar una alarma desde un servidor web, guardar esa configuración en la memoria del ESP32 y, lo mejor de todo, ¡la alarma permanecerá activa incluso si reinicias el dispositivo! Además, la hora se sincroniza automáticamente desde internet, y podrás ver en la pantalla OLED la hora actual, la hora de la alarma configurada, y la dirección IP de tu ESP32.”
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
🔔 “Cuando llegue la hora programada, un buzzer se activará para recordarte lo que necesitas hacer.”
🛠️ “En este tutorial te guiaré paso a paso para construir este sistema, desde la configuración de la red WiFi hasta la programación de la alarma y el manejo de la memoria persistente. ¡Así que prepara tu ESP32 y manos a la obra!”
Si deseas que revise algún producto escríbeme a reviews@rogerbit.com (sólo contacto empresarial ).
No te pierdas ningún video más suscríbete a nuestro canal de telegram https://t.me/carlosvolt_electronica_robotica
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
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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
#include <WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h> #include <U8g2lib.h> #include <ESPAsyncWebServer.h> #include <Preferences.h> // Librería para almacenamiento persistente // Inicialización de la pantalla OLED U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Inicialización del servidor web AsyncWebServer server(80); // Configuración de la alarma int alarmaHora = -1; int alarmaMinuto = -1; bool alarmaActivada = false; const int buzzerPin = 12; // Configuración del cliente NTP WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", -10800, 60000);//-10800 = -3 UTC // Instancia de Preferences Preferences preferences; // Función para guardar la alarma en la memoria void guardarAlarma(int hora, int minuto) { preferences.begin("alarma", false); preferences.putInt("hora", hora); preferences.putInt("minuto", minuto); preferences.putBool("activada", true); preferences.end(); } // Función para cargar la alarma desde la memoria void cargarAlarma() { preferences.begin("alarma", true); alarmaHora = preferences.getInt("hora", -1); alarmaMinuto = preferences.getInt("minuto", -1); alarmaActivada = preferences.getBool("activada", false); preferences.end(); } void setup() { Serial.begin(115200); // Inicializar buzzer pinMode(buzzerPin, OUTPUT); digitalWrite(buzzerPin, LOW); // Inicializar pantalla OLED u8g2.begin(); // Conectar a WiFi WiFi.begin("Tu_red_wifi", "Tu_clave_wifi"); // Reemplaza con tus credenciales WiFi while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Conectando a WiFi..."); } Serial.println("Conectado a WiFi"); Serial.print("IP: "); Serial.println(WiFi.localIP()); // Inicializar NTP Client timeClient.begin(); // Cargar alarma persistente cargarAlarma(); // Configuración del servidor web server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ String html = "<html><body><h2>Configurar Alarma</h2>"; html += "<form action='/set_alarm' method='POST'>"; html += "Hora: <input type='number' name='hora' min='0' max='23'><br>"; html += "Minuto: <input type='number' name='minuto' min='0' max='59'><br>"; html += "<input type='submit' value='Establecer'>"; html += "</form></body></html>"; request->send(200, "text/html", html); }); // Manejar la configuración de la alarma server.on("/set_alarm", HTTP_POST, [](AsyncWebServerRequest *request){ int params = request->params(); int hora = -1; int minuto = -1; for(int i = 0; i < params; i++){ AsyncWebParameter* p = request->getParam(i); if(p->name() == "hora"){ hora = p->value().toInt(); } if(p->name() == "minuto"){ minuto = p->value().toInt(); } } if(hora >= 0 && hora < 24 && minuto >= 0 && minuto < 60){ alarmaHora = hora; alarmaMinuto = minuto; alarmaActivada = true; guardarAlarma(hora, minuto); // Guardar alarma persistente request->send(200, "text/plain", "Alarma configurada correctamente."); } else { request->send(400, "text/plain", "Parámetros incorrectos."); } }); server.begin(); } void loop() { timeClient.update(); // Obtener hora actual int currentHour = timeClient.getHours(); int currentMinute = timeClient.getMinutes(); int currentSecond = timeClient.getSeconds(); // Mostrar información en OLED u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); // Mostrar hora actual u8g2.setCursor(0, 10); u8g2.print("Hora actual:"); u8g2.setCursor(0, 20); u8g2.printf("%02d:%02d:%02d", currentHour, currentMinute, currentSecond); // Mostrar hora de la alarma configurada u8g2.setCursor(0, 35); u8g2.print("Alarma:"); if (alarmaActivada && alarmaHora >= 0 && alarmaMinuto >= 0) { u8g2.setCursor(0, 45); u8g2.printf("%02d:%02d", alarmaHora, alarmaMinuto); } else { u8g2.setCursor(0, 45); u8g2.print("No configurada"); } // Mostrar IP del servidor u8g2.setCursor(0, 55); u8g2.print("IP: "); u8g2.print(WiFi.localIP()); u8g2.sendBuffer(); // Verificar si se debe activar la alarma if (alarmaActivada && currentHour == alarmaHora && currentMinute == alarmaMinuto && currentSecond == 0) { digitalWrite(buzzerPin, HIGH); // Activar el buzzer delay(1000); // Sonar por 1 segundo digitalWrite(buzzerPin, LOW); // Apagar el buzzer alarmaActivada = false; // Desactivar alarma // Actualizar almacenamiento persistente preferences.begin("alarma", false); preferences.putBool("activada", false); preferences.end(); } } |
No te pierdas ningún video más suscríbete a nuestro canal de telegram https://t.me/carlosvolt_electronica_robotica
PROYECTO RECOMENDADO