Octopod: Solución IoT Inteligente de Automatización para Hogar e Industria
Componentes y suministros
| Arduino UNO | ×1 |
| Arduino MKR WiFi 1010 (o NodeMCU ESP8266 / ESP32) | ×1 |
| Maxim MAX32630FTHR (alternativa: MAX32620FTHR, Arduino 1010, ESP8266 + WiFi externo) | ×1 |
| Raspberry Pi Zero Wireless (o Pi 2/3) | ×1 |
| Sensor DHT11 Temperatura/Humedad (4 pines) | ×1 |
| Sensor Gas MQ2 (Grove Seeed) | ×1 |
| Sensor Humedad Suelo SparkFun (terminales tornillo) | ×1 |
| Sensor PIR Movimiento genérico | ×1 (opcional) |
| Lector RFID genérico | ×1 |
| Relé genérico (2 canales preferiblemente) | ×1 |
| LED RGB Difuso Cátodo Común | ×1 |
| Módulo Cámara Raspberry Pi | ×1 |
| Servo Tower Pro MG996R | ×1 |
| Zumbador | ×2 |
| Módulo Bluetooth HC-05 | ×1 (opcional) |
| LED genérico | ×4 |
| Adaptador pared / Power Bank | ×2 |
| Tarjeta memoria (>4GB, Class 10 para Raspberry Pi OS) | ×1 |
Herramientas necesarias
- Pistola silicona caliente
- Impresora 3D (opcional)
- Herramientas manuales: alicates, tijeras, cutter, etc.
Aplicaciones y servicios en línea
- Blynk (app control smartphone)
- OpenCV (visión artificial en Raspberry Pi)
Sobre el proyecto
Existen muchos proyectos IoT, pero Octopod es único. Combina NodeMCU (ESP8266), Arduino Uno y Raspberry Pi 3. Permite:
- Monitorear temperatura, humedad, calidad gas en hogar/oficina/industria.
- Notificaciones al detectar movimiento.
- Aviso cuando regar plantas (humedad suelo).
- Controlar electrodomésticos via app Blynk en smartphone.
- Iluminación ambiental (mood lighting) con LED RGB.
- Cámara con IA (OpenCV): detección humana, envío fotos por email, streaming en vivo.
- Cerradura inteligente RFID para puerta.
¿Cómo funciona todo?
- NodeMCU conectado a sensores, relé, LED RGB. Conectado a app Blynk vía WiFi → envía datos y permite control.
- Raspberry Pi en WiFi: streaming cámara en vivo. OpenCV detecta humanos y envía fotos por email.
- Unidad puerta inteligente: módulo RFID. Tarjeta autorizada → abre puerta (servo).
PASO 1: Programar Octopod principal (NodeMCU/ESP8266)
Código comentado línea a línea. Resumen:
Librerías
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#define BLYNK_PRINT Serial
Credenciales Blynk y WiFi
char auth[] = "Tu Auth Key Blynk";
char ssid[] = "Tu WiFi SSID";
char pass[] = "Tu WiFi Password";
Definición pines y variables
#define DHTPIN 2 // DHT11
#define soilPin 4 // Sensor humedad suelo
#define gasPin A0 // MQ2 gas
#define pirPin 12 // PIR movimiento
int pirValue, soilValue;
int PIRpinValue, SOILpinValue; // Valores desde app Blynk (pines virtuales V0, V1)
BLYNK_WRITE() - Control desde app
BLYNK_WRITE(V0) { PIRpinValue = param.asInt(); } // Activar detección movimiento
BLYNK_WRITE(V1) { SOILpinValue = param.asInt(); } // Activar sensor suelo
Enviar datos sensores (timer 1 seg)
void sendSensor() {
int h = dht.readHumidity();
int t = dht.readTemperature();
if (isnan(h) || isnan(t)) return;
Blynk.virtualWrite(V5, h); // Humedad → V5
Blynk.virtualWrite(V6, t); // Temperatura → V6
}
Lectura PIR y Suelo con notificaciones
void getPirValue() {
pirValue = digitalRead(pirPin);
if (pirValue) { Serial.println("Movimiento detectado"); Blynk.notify("Movimiento detectado"); }
}
void getSoilValue() {
soilValue = digitalRead(soilPin);
if (soilValue == HIGH) { Serial.println("Regar plantas"); Blynk.notify("Regar plantas"); }
}
Setup y Loop
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
Blynk.tweet("OCTOPOD IS ONLINE!");
pinMode(pirPin, INPUT); pinMode(soilPin, INPUT);
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run(); timer.run();
if (PIRpinValue == HIGH) getPirValue();
if (SOILpinValue == HIGH) getSoilValue();
}
PASO 2: Cerradura RFID (Arduino UNO)
Dos versiones: con y sin Bluetooth. Simple:
- Instalar librería MFRC522 (Sketch → Include Library → Manage Libraries).
- Ejecutar ejemplo
dumpInfopara leer UID tarjetas. Anotar UIDs autorizados. - En código, reemplazar
"XX XX XX XX"por UID autorizado. - Si UID coincide: servo abre puerta (180°), LED verde, beep agudo, 5 seg, cierra. Si no: LED rojo, beep grave.
PASO 3: Raspberry Pi - Detección Humana con IA (OpenCV)
Guía completa para cámara de seguridad inteligente:
- Conectar cámara Pi: Insertar cable en conector entre Ethernet y HDMI (contactos plateados hacia HDMI).
sudo raspi-config→ habilitar cámara → reboot. - Instalar OpenCV 3.3.0 en Raspbian Stretch:
- Expandir filesystem (
sudo raspi-config→ Advanced → Expand). - Liberar espacio:
sudo apt-get purge wolfram-engine libreoffice* && sudo apt-get clean autoremove(~1GB). - Instalar dependencias: build-essential, cmake, pkg-config, libjpeg, libtiff, libjasper, libpng, libavcodec, libavformat, libswscale, libv4l, libxvidcore, libx264, libgtk2.0, libgtk-3, libatlas-base, gfortran, python2.7-dev, python3-dev.
- Descargar OpenCV y opencv_contrib 3.3.0, descomprimir.
- Instalar pip, virtualenv, virtualenvwrapper. Crear entorno
cv(mkvirtualenv cv -p python3). - Instalar NumPy:
pip install numpy. - Compilar OpenCV con CMake (configurar Python 3, módulos extra). Clave: aumentar swap a 1024MB (
/etc/dphys-swapfile) para compilar con 4 núcleos (make -j4). Tarda ~4 horas. sudo make install && sudo ldconfig. Symlinkcv2.soen entorno virtual.- Restaurar swap a 100MB. Probar:
python -c "import cv2; print(cv2.__version__)"→ 3.3.0.
- Expandir filesystem (
- Programa Python (Smart Security Camera):
- Descargar modelos y código desde Google Drive (enlace en proyecto).
- Configurar
mail.pycon credenciales Gmail (remitente, destinatario, contraseña). Habilitar "apps menos seguras" en Google. - Ajustar
main.py: intervalo emails (600s), flip cámara, clasificador (fullbody/upperbody/facial). - Ejecutar:
python main.py. Streaming enIP_Pi:5000(red local). Para acceso externo:ngrok http 5000.
PASO 4: Configuración App Blynk
- Descargar Blynk (App Store/Play Store). Crear proyecto: dispositivo NodeMCU, conexión WiFi. Copiar Auth Key al código.
- Añadir widgets:
- 3 Gauges: Temperatura (V6, 0-50°C), Humedad (V5, 0-100%), Gas (V7, 0-1023).
- zeRGBa: R→GP15, G→GP3, B→GP1 (control LED RGB).
- 4 Botones: Control relés, activar PIR, activar sensor suelo, etc.
- SuperChart: 3 streams (Temp, Humedad, Gas) con colores, pines, rangos.
- Pestaña 2: Twitter, Notifications, Email, Eventor. Configurar credenciales Twitter, email, notificaciones al desconectar hardware, triggers Eventor.
- Pulsar Play. Interfaz lista y personalizable.
PASO 5: Estructura Octopod (Cartón / Impresión 3D)
Advertencia: Proceso más laborioso. Opcional: usar caja zapatos o imprimir en 3D (archivos .f3d incluidos).
Diseño inspirado en octágono 3D. Pasos:
- Cartón: rectángulos 9x9.5cm, 4 unidos (8 si cartón largo). Cortes parciales entre rectángulos.
- Ángulos 135° en uniones (16 total). Pegar con silicona.
- Unir 2 estructuras abiertas → octágono cerrado. Otras 2 perpendiculares → forma 3D.
- Rellenar huecos con 4 piezas 9x9.5cm. 8 triángulos abiertos → cubrir con papel vegetal (no pegar aún).
- Pintar: 3 capas spray en área ventilada, mascarilla/guantes. Secar 4-5h entre capas.
¡Pieza única de arte funcional!
PASO 6: Envolvente Cerradura Puerta
Caja zapatos + 2-3 capas spray + patrón cinta adhesiva (opcional).
PASO 7: Ensamblaje Octopod
Esquemático adjunto. Resumen conexiones NodeMCU en protoboard grande con fuente alimentación:
- DHT11 → D4/GP2
- MQ2 → A0/ADC0
- Sensor suelo → D2/GP4
- PIR → D6/GP12
- RGB: R→D8/GP15, G→RX/GP3, B→TX/GP1
- Relé: Ln1→D0/GP16, Ln2→D5/GP14
- Alimentación: Power Bank o adaptador pared a fuente protoboard.
- Raspberry Pi + cámara: agujero en pared cartón, pegar/cinta cámara.
- Insertar electrónica por triángulo abierto, cerrar con papel vegetal. Dejar 1-2 triángulos abiertos para mantenimiento. Puntas sensor suelo fuera.
¡Encender y disfrutar! Streaming en IP Raspberry Pi.
PASO 8: Ensamblaje Cerradura Puerta
Subir código a Arduino. Conexiones según esquemático Fritzing. Caja zapatos: 2 agujeros para LEDs, servo sobresaliendo. Pegar RFID, protoboard, Arduino. Alimentar (power bank/adaptador). ¡Listo! (Solo experimento, no usar como cerradura real).
Conclusión
Proyecto muy divertido y completo. Luces RGB quedan geniales; vale la pena hacer solo como lámpara ambiental. Gracias a creadores de Blynk y OpenCV por librerías excelentes. ¡Preguntas bienvenidas!
- Saksham
Enlaces: Blog Arduino | Instructable completo
Actualización
Integrando con Amazon Alexa. Código en 2-3 días.
Código
octopod.ino (Arduino) - Código principal NodeMCU/ESP8266
/***************************************************************************
OCTOPOD: PROYECTO AUTOMATIZACIÓN HOGAR INTELIGENTE BY SAKSHAM
Blynk lib: https://github.com/blynkkk/blynk-library/releases/latest
DHT lib: https://github.com/adafruit/DHT-sensor-library
***************************************************************************/
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#define BLYNK_PRINT Serial
char auth[] = "Tu Blynk Auth Key";
char ssid[] = "Tu WiFi SSID";
char pass[] = "Tu WiFi Password";
#define DHTPIN 2
#define soilPin 4
#define gasPin A0
#define pirPin 12
int pirValue, soilValue;
int PIRpinValue, SOILpinValue;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
BLYNK_WRITE(V0) { PIRpinValue = param.asInt(); }
BLYNK_WRITE(V1) { SOILpinValue = param.asInt(); }
void sendSensor() {
int h = dht.readHumidity();
int t = dht.readTemperature();
if (isnan(h) || isnan(t)) { Serial.println("Error lectura DHT"); return; }
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);
}
void getPirValue() {
pirValue = digitalRead(pirPin);
if (pirValue) { Serial.println("Movimiento detectado"); Blynk.notify("Movimiento detectado"); }
}
void getSoilValue() {
soilValue = digitalRead(soilPin);
if (soilValue == HIGH) { Serial.println("Regar plantas"); Blynk.notify("Regar plantas"); }
}
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
Blynk.tweet("OCTOPOD IS ONLINE!");
pinMode(pirPin, INPUT); pinMode(soilPin, INPUT);
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run(); timer.run();
if (PIRpinValue == HIGH) getPirValue();
if (SOILpinValue == HIGH) getSoilValue();
}
octopod_door.ino (Arduino) - Cerradura RFID sin Bluetooth
/***********************************************************************************************************
OCTOPOD: CERRADURA RFID ARDUINO - Librería MFRC522
************************************************************************************************************/
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 5
#define LED_R 4
#define BUZZER 2
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo myServo;
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
myServo.attach(3); myServo.write(0);
pinMode(LED_G, OUTPUT); pinMode(LED_R, OUTPUT); pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
Serial.println("Acerca tarjeta al lector...");
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
String content = "";
Serial.print("UID tag: ");
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
content.toUpperCase();
if (content.substring(1) == "XX XX XX XX") { // Cambiar por UID autorizado
Serial.println("Acceso autorizado");
digitalWrite(LED_G, HIGH); tone(BUZZER, 500); delay(300); noTone(BUZZER);
myServo.write(180); delay(5000); myServo.write(0); digitalWrite(LED_G, LOW);
} else {
Serial.println("Acceso denegado");
digitalWrite(LED_R, HIGH); tone(BUZZER, 300); delay(1000); digitalWrite(LED_R, LOW); noTone(BUZZER);
}
}
octopod_door_bluetooth.ino (Arduino) - Cerradura RFID con Bluetooth
/***********************************************************************************************************
OCTOPOD: CERRADURA RFID CON BLUETOOTH - Librería MFRC522
************************************************************************************************************/
#include <SoftwareSerial.h>
SoftwareSerial BTserial(0, 1); // RX | TX
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 5
#define LED_R 4
#define BUZZER 2
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo myServo;
void setup() {
BTserial.begin(9600);
BTserial.println("Esperando conexiones...");
SPI.begin();
mfrc522.PCD_Init();
myServo.attach(3); myServo.write(0);
pinMode(LED_G, OUTPUT); pinMode(LED_R, OUTPUT); pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
BTserial.println("Acerca tarjeta al lector...");
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
String content = "";
BTserial.print("UID tag: ");
for (byte i = 0; i < mfrc522.uid.size; i++) {
BTserial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
BTserial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
BTserial.println();
content.toUpperCase();
if (content.substring(1) == "33 3E A7 E5" || content.substring(1) == "E5 36 6B 49") {
BTserial.println("Acceso autorizado");
digitalWrite(LED_G, HIGH); tone(BUZZER, 500); delay(300); noTone(BUZZER);
myServo.write(180); delay(5000); myServo.write(0); digitalWrite(LED_G, LOW);
} else {
BTserial.println("Acceso denegado");
digitalWrite(LED_R, HIGH); tone(BUZZER, 300); delay(1000); digitalWrite(LED_R, LOW); noTone(BUZZER);
}
}
Piezas personalizadas y envolventes
- Diseño básico cartón/madera:
octopod_v2_ukTmIJ0uMl.f3d - Envolvente para impresión 3D:
octo_2_v3_sii4tuCF7d.f3d
Esquemáticos
Configuración pines puede variar con Arduino MKR 1010.

Versión con Bluetooth: Rx(HC-05)→Tx(Arduino), Tx(HC-05)→Rx(Arduino), 5V→5V, GND→GND.
Tabla equivalencias pines ESP8266 ↔ MAX32620FTHR incluida en imagen.

Proceso de manufactura
- Construye sistema domótico con Raspberry Pi para control remoto
- Persianas Inteligentes: Control Automático de Luz con Arduino y Energía Solar
- Construye un tarro inteligente IoT con ESP8266, Arduino y sensor ultrasónico: Monitorización en tiempo real
- Construye un sistema de automatización y seguridad del hogar inteligente con 1Sheeld
- Tres en raya con Arduino, matriz LED MAX7219 y carcasa de cartón
- Construye un Temporizador Regresivo Fiable con Arduino y Pantalla de 7 Segmentos SparkFun
- Construye tu Propio Coche RC Porsche con Arduino: Guía Paso a Paso
- Cerradura Inteligente WiFi con Arduino y ESP8266: Desbloqueo desde el Móvil
- Automatización Industrial 4.0: Revolucionando la eficiencia productiva
- Cómo la tecnología de hogar inteligente transforma la vida cotidiana
- Malvertising amenaza IoT de hogar inteligente: Anuncios ocultos pueden comprometer sus dispositivos