Su primer pedido gratis en PCBWay visita https://www.pcbway.es/ En este tutorial veremos como armar un timbre hogareño o para nuestra oficina, con el esp32cam, un módulo pulsador, un módulo buzzer y un circuito impreso. Este dispositivo funcionará como un timbre, que hará sonar buzzer emulando un timbre, pero además enviará un mensaje de texto por telegram, advirtiendo que alguien lo presionó y también sacará una foto de quien, está tocando el timbre, llegándonos la imagen también a telegram. Otra función que tiene el dispositivo es el control, para poder tomar esas fotos desde telegram manualmente, ya sea con flash o sin flash.
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
Componentes electrónicos
Adaptador usb serial
Descripción
FTDI Basic Program Downloader USB to TTL FT232RL 3.3V 5V DTR
Esta es una placa de conexión básica para el FTDI FT232RL USB a serie IC. El pinout de esta placa coincide con el cable FTDI para funcionar con placas Arduino oficiales y placas Arduino de 5V clonadas. También se puede utilizar para aplicaciones seriales generales. La principal diferencia con esta placa es que resalta el pin DTR en lugar del pin RTS del cable FTDI. El pin DTR permite que un objetivo Arduino se reinicie automáticamente cuando se descarga un nuevo Sketch. Esta es una característica realmente agradable y permite descargar un boceto sin tener que presionar el botón de reinicio. Esta placa reiniciará automáticamente cualquier placa Arduino que tenga el pin de reinicio en un conector de 6 pines.
Esta placa tiene LED TX y RX que hacen que sea un poco mejor usarla sobre el cable FTDI. De hecho, puede ver el tráfico en serie en los LED para verificar si la placa está funcionando.
Esta placa fue diseñada para disminuir el costo del desarrollo de Arduino y aumentar la facilidad de uso (¡la función de reinicio automático es genial!). Nuestras placas Arduino Pro y LilyPads utilizan este tipo de conector.
Una de las características agradables de esta placa es un puente en la parte posterior de la placa que permite que la placa se configure a 3.3 V o 5 V (tanto la salida de potencia como el nivel de E / S). Esta placa se envía de forma predeterminada a 5 V, pero puede cortar la traza predeterminada y agregar un puente de soldadura si necesita cambiar a 3,3 V.
CARACTERÍSTICAS
- Diseño de interfaz estándar, compatible con una variedad de Arduinos como el Pro Mini
- Chip FTDI FT232 original, rendimiento estable
- Con indicador de encendido, envío, recepción, indicadores LED de estado de funcionamiento
- Con opciones de suministro de nivel TTL de 3,3 V y 5 V
- Módulo TTL de USB a serie, descargue STC SCM
- Conexión de puerto mini USB
- Standard interface, compliant with Arduino official controller; With power, sending, reveiving indicator, With 3.3V / 5V power supply; Can be used as ordinary USB to serial TTL module, download STC singlechip
Hardware introduction
- Adopt FTDI company’s FT232RL chip
- Lead out FT232RL chip all signal port, TTL / CMOS level
- RXD/TXD send-receive communication indicator
- USB power supply, can choose 5V or 3.3V interface level (if you need other level, can provide target voltage in VCC and GND pin)
Cables Dupont
Esp32Cam
Descripción
Esp32 Cam Camara Modulo Wifi Bt Arduino Ov2640 2mp Esp 32
ESP32 CAM Modulo WiFi con Bluetooth y Camara OV2640 2MP, es una tarjeta de desarrollo que integra una pequeña cámara que puede funcionar de manera independiente.
La camara OV2640 de 2MP integra un sensor de imagen CMOS UXGA (1632*1232) de 1/4 de pulgada. El pequeño tamaño del sensor y el bajo voltaje de operación brindan todas las características de una sola cámara UXGA y un procesador de imágenes. A través del control de bus SCCB, puede generar datos de imagen de 8/10 bits de varias resoluciones, como fotograma completo, submuestreo, zoom y ventanas.
La imagen UXGA de esta camara puede alcanzar hasta 15 cuadros por segundo (hasta 30 cuadros para SVGA y 60 cuadros para CIF). Los usuarios tienen un control completo sobre la calidad de la imagen, el formato de datos y la transmisión.
Todas las funciones de procesamiento de imágenes, incluida la curva gamma, el balance de blancos, el contraste, el croma, etc. se pueden programar a través de la interfaz SCCB.
Los sensores de imagen Omni Vision utilizan una tecnología de sensor única para mejorar la calidad de la imagen y reducir las imágenes en color nítidas y estables mediante la reducción o eliminación de defectos ópticos o electrónicos, como el ruido de patrón fijo, manchas y flotación.
Principales Características:
• Modelo: ESP32-CAM + Cámara OV2640
• Voltaje de Alimentación ESP 32 CAM: 5V
• Módulo Wi-Fi BT 802.11b/g/n
• Tipo de cámara: OV2640 2MP
• El modulo ESP 32CAM tiene CPU 32 bits de doble núcleo de baja potencia
• Frecuencia principal de hasta 240 MHz
• Potencia informática de hasta 600 DMIPS
• Velocidad de reloj de hasta 160 MHz
• Incorpora SRAM 520Kb, 4MPSRAM externa
• El modulo ESP-32 CAM Soporta interfaces: UART / SPI / I2C / PWM / ADC / DAC
• El modulo ESP-32-CAM Soporta cámaras OV2640 y OV7670, Flash Incorporado
• El modulo ESP 32-CAM Soporta tarjetas TF micro SD (Máximo 4 GB)
• El modulo ESP-32CAM Soporta la carga de imagen WiFi
• Compatible con modos de operación STA / AP / STA+AP
• Con antena PCB
• El modulo ESP32CAM integra conectores u.FL y FPC
Features:
– Ultra-small 802.11b/g/n Wi-Fi + BT/BLE SoC module
– Low-power dual-core 32-bit CPU for application processors
– Up to 240MHz, up to 600 DMIPS
– Built-in 520 KB SRAM, external 4M PSRAM
– Supports interfaces such as UART/SPI/I2C/PWM/ADC/DAC
– Support OV2640 and OV7670 cameras with built-in flash
– Support for images WiFI upload
-Support TF card
– Support multiple sleep modes
– Embedded Lwip and FreeRTOS
– Support STA/AP/STA+AP working mode
– Support Smart Config/AirKiss One-click distribution network
– Support for serial local upgrade and remote firmware upgrade (FOTA)
– Support secondary development
Product Specifications:
Module model: ESP32-CAM
Package: DIP-16
Size: 27*40.5*4.5(±0.2)mm
SPI Flash: default 32Mbit
RAM: internal520KB+external 4M PSRAM
bluetooth: bluetooth4.2BR/EDR and BLE standards
Wi-Fi: 802.11 b/g/n/e/i
Support interface: UART, SPI, I2C, PWM
Support TF card: Maximum support 4G
IO port: 9
Serial port rate: default 115200 bps
Image output format: JPEG (only supported by OV2640), BMP, GRAYSCALE
Spectrum range: 2412 ~ 2484MHz
Antenna form: onboard PCB antenna , gain 2dBi
Transmit power: 802.11b: 17±2 dBm (@11Mbps)
802.11g: 14±2 dBm (@54Mbps)
802.11n: 13±2 dBm (@MCS7)
Receiving sensitivity: CCK, 1 Mbps : -90dBm
CCK, 11 Mbps: -85dBm
6 Mbps (1/2 BPSK): -88dBm
54 Mbps (3/4 64-QAM): -70dBm
MCS7 (65 Mbps, 72.2 Mbps): -67dBm
Power consumption Turn off the flash: 180mA@5V
Turn on the flash and adjust the brightness to the maximum: 310mA@5V
Deep-sleep: The lowest power consumption can reach 6mA@5V
Moderm-sleep: up to 20mA@5V
Light-sleep: up to 6.7mA@5V
Security WPA/WPA2/WPA2-Enterprise/WPS
Power supply range: 5V
Operating temperature: -20 °C ~ 85 °C
Storage environment: -40 °C ~ 90 °C, < 90%RH
Módulo pulsador (KY-004)
Descripción
MÓDULO KEY SWITCH KY-004 – ARDUINO – Pack x 100 unidades –
Los push button se utilizan en dispositivos mecánicos, electrónicos y también aplica para programar, los cuales se utilizan para mandar una señal o reiniciar un programa.
Se pueden utilizar varios button en un solo circuito o también en un programa.
Voltaje de operación: 3.3V – 5V
Interruptor Digital salida (0 / 1)
Vida de Contacto: 100.000 Ciclos
3 pines:
1 – GND
2 – 5V
3 – Señal
Dimensiones: 15×18.5mm
Jumper
Módulo Buzzer (KY-006)
Descripción
Este modulo buzzer piezoelectrico pasivo puede generar un rango de tonos de sonido dependiendo de la frecuencia de la señal de entrada.
Puede generar tonos desde 1.5kHz a 2.5kHz enciendo y apagandolo en diferentes frecuencias usando delays o PWM.
ESPECIFICACIONES
– Voltaje de Operacion: 1.5 – 15V DC
– Rango de tonos generados: 1.5 – 2.5KHz
– Dimensiones: 18.5mm x 15mm
Pines Hembra
Pines macho
Circuito
Crear Bot en Telegram
En telegram buscamos BotFather
Escribimos /start y nos aparecerá algo similar a esto
Escribimos /newbot
Nos apareceré el nombre del bot, y inventamos un nombre para nuestro bot, debe tener el formato «usuario_bot»
Obtendremos un token que vamos a usar en el código fuente
Ahora buscaremos IDBot, y lo iniciamos
Escribimos /getid y nos entregará el user_id que debemos colocar en el código fuente
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 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
//Librerías - sitio www.rogerbit.com #include <WiFi.h> #include <WiFiClientSecure.h> #include "soc/soc.h" #include "soc/rtc_cntl_reg.h" #include "esp_camera.h" #include <UniversalTelegramBot.h> #include <ArduinoJson.h> #include <Wire.h> //Reemplazar con los datos de tu red wifi const char* ssid = "Tu_red_wifi"; const char* password = "Tu_clave"; String idChat = "xxxxxxxxx";//ID_Chat se obtiene de telegram //Token de Telegram BOT se obtenienen desde Botfather en telegram String token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; bool envioFoto = false; WiFiClientSecure clientTCP; UniversalTelegramBot bot(token, clientTCP); //PARA CÁMARA MODELO AI THINKER #define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 #define flashLed 4 bool flashEstado = LOW; int estadoFlash = 0; //Timbre bool timbre = false; #define buzzer 2 int tiempoMsg = 1000; //tiempo medio entre escaneo de mensajes long ultimoEscaneo; //la última vez que se realizó el escaneo de mensajes void manejarMensajes(int nuevoMensajes); String sendPhotoTelegram(); // Indica cuando se apretó el timbre static void IRAM_ATTR pulsarTimbre(void * arg){ Serial.println("Timbre precionado!"); timbre = true; } void setup(){ WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); Serial.begin(115200); pinMode(buzzer, OUTPUT); pinMode(flashLed, OUTPUT); digitalWrite(flashLed, flashEstado); WiFi.mode(WIFI_STA); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); clientTCP.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Agregar certificado raíz para api.telegram.org while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); bot.sendMessage(idChat, "Sistema preparado!!!, escribe /ayuda para ver las opciones", "");//Enviamos un mensaje a telegram para informar que el sistema está listo } Serial.println(); Serial.print("Dirección IP del modulo esp32cam: "); Serial.println(WiFi.localIP()); camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 1; //0-63 menor número significa mayor calidad config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 2; //0-63 menor número significa mayor calidad config.fb_count = 1; } // inicio de la cámara esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("El inicio de la cámara falló 0x%x", err); delay(1000); ESP.restart(); } // Tamaño de cuadro desplegable para una mayor velocidad de cuadro inicial sensor_t * s = esp_camera_sensor_get(); s->set_framesize(s, FRAMESIZE_CIF); // UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA // En el pin 13 se coloca el pulsador err = gpio_isr_handler_add(GPIO_NUM_13, &pulsarTimbre, (void *) 13); if (err != ESP_OK){ Serial.printf("hubo un error 0x%x \r\n", err); } err = gpio_set_intr_type(GPIO_NUM_13, GPIO_INTR_POSEDGE); if (err != ESP_OK){ Serial.printf("hubo un error 0x%x \r\n", err); } } void loop(){ if (envioFoto){ Serial.println("Preparando foto"); sendPhotoTelegram(); if(estadoFlash == 1){ envioFoto = false; flashEstado = !flashEstado; digitalWrite(flashLed, flashEstado); estadoFlash = 0; } } if(timbre){//Hacemos sonar el buzzer en forma intermitente para emular el timbre for (int buz=0; buz<25;buz++){ digitalWrite(buzzer, HIGH); delay(50); digitalWrite(buzzer, LOW); delay(50); } bot.sendMessage(idChat, "Alguien está tocando el timbre", ""); Serial.println("Alguien está tocando el timbre"); sendPhotoTelegram(); timbre = false; } if (millis() > ultimoEscaneo + tiempoMsg){ int nuevoMensajes = bot.getUpdates(bot.last_message_received + 1); while (nuevoMensajes){ Serial.println("se obtuvo respuesta"); manejarMensajes(nuevoMensajes); nuevoMensajes = bot.getUpdates(bot.last_message_received + 1); } ultimoEscaneo = millis(); } } String sendPhotoTelegram() { const char* url = "api.telegram.org"; String todo = ""; String cuerpo = ""; camera_fb_t * fb = NULL; fb = esp_camera_fb_get(); if(!fb) { Serial.println("Captura de cámara falló"); delay(1000); ESP.restart(); return "Captura de cámara falló"; } Serial.println("Conectar a " + String(url)); if (clientTCP.connect(url, 443)) { Serial.println("Conexión establecida"); String cadena1 = "--rogerBit\r\nContent-Disposition: form-data; name=\"chat_id\"; \r\n\r\n" + idChat + "\r\n--rogerBit\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"; String cadena2 = "\r\n--rogerBit--\r\n"; uint16_t ima1 = fb->len; uint16_t ima2 = cadena1.length() + cadena2.length(); uint16_t ima1y2 = ima1 + ima2; clientTCP.println("POST /bot"+token+"/sendPhoto HTTP/1.1"); clientTCP.println("Host: " + String(url)); clientTCP.println("Content-Length: " + String(ima1y2)); clientTCP.println("Content-Type: multipart/form-data; boundary=rogerBit"); clientTCP.println(); clientTCP.print(cadena1); uint8_t *fbBuf = fb->buf; size_t fbLen = fb->len; for (size_t n=0;n<fbLen;n=n+1024) { if (n+1024<fbLen) { clientTCP.write(fbBuf, 1024); fbBuf += 1024; } else if (fbLen%1024>0) { size_t remainder = fbLen%1024; clientTCP.write(fbBuf, remainder); } } clientTCP.print(cadena2); esp_camera_fb_return(fb); int espera = 10000; // 10 segundos long tiempoInicial = millis(); boolean estado = false; while ((tiempoInicial + espera) > millis()){ Serial.print("."); delay(100); while (clientTCP.available()) { char c = clientTCP.read(); if (estado==true) cuerpo += String(c); if (c == '\n') { if (todo.length()==0) estado=true; todo = ""; } else if (c != '\r') todo += String(c); tiempoInicial = millis(); } if (cuerpo.length()>0) break; } clientTCP.stop(); Serial.println(cuerpo); } else { cuerpo="Conexión a api.telegram.org falló."; Serial.println("Conexión a api.telegram.org falló "); } return cuerpo; } void manejarMensajes(int nuevoMensajes){ Serial.print("Nuevo mensaje: "); Serial.println(nuevoMensajes); for (int i = 0; i < nuevoMensajes; i++){ // ID de chat del solicitante String chat_id = String(bot.messages[i].chat_id); if (chat_id != idChat){ bot.sendMessage(idChat, "Usuario no autorizado", ""); continue; } // Imprime el mensaje recibido String text = bot.messages[i].text; Serial.println(text); String fromName = bot.messages[i].from_name; if (text == "/flash") {//Activa o desactiva el flash flashEstado = !flashEstado; digitalWrite(flashLed, flashEstado); } if (text == "/fotofh") {//Toma una foto con flash envioFoto = true; Serial.println("Solicitud de nueva foto"); flashEstado = !flashEstado; digitalWrite(flashLed, flashEstado); estadoFlash = 1; } if (text == "/foto") {//Toma una foto envioFoto = true; Serial.println("Solicitud de nueva foto"); } if (text == "/ayuda")//Nos muestra la ayuda en telegram { String ayuda = "Bienvenido al sistema de timbre con foto con ESP32CAM " ".\n"; ayuda += "Estas son tus opciones.\n\n"; ayuda += "/foto : Toma una foto nueva \n"; ayuda += "/fotofh: saca una foto con flash y luego lo desactiva \n"; ayuda += "/flash : Activa el flash \n"; ayuda += "/ayuda: Imprime este menú \n"; ayuda += "Recuerda el sistema distingue entre mayuculas y minusculas \n"; bot.sendMessage(idChat, ayuda, ""); } } } |
VIDEO RECOMENDADO
Buen día.
Quisiera saber ¿Dónde puedo bajar las librerías para este proyecto?
Muchas gracias.
Me gustaria saber donde puedo localizar las librerias para descargar? algun enlace directo, que he estado revisando la pagina de http://www.rogerbit.com pero no la encuentro.