J.A.R.V.I.S. – Asistente virtual para hogar inteligente con Arduino
Componentes y suministros
![]() |
Arduino 101 | × | 1 |
![]() |
Arduino 4 Relays Shield | × | 1 |
![]() |
Arduino GSM Shield V2 | × | 1 |
Herramientas y máquinas necesarias
![]() |
Soldador (genérico) |
![]() |
Pistola de pegamento caliente (genérica) |
Aplicaciones y servicios en línea
![]() |
Unity |
![]() |
Android Studio |
| Vuforia | |
| Adobe Illustrator | |
![]() |
Arduino IDE |
Sobre este proyecto
¿Por qué abordar el problema del hogar inteligente?
¿Qué hay de nuevo?

¿Por qué decidimos hacerlo?





Funcionamiento
El medidor de energía digital



El asistente virtual IA
Flujo de señales:
- Entrada de voz en la App Android
- Procesamiento en la App Android
- Envío de datos encriptados a Arduino vía Bluetooth
- Procesamiento en Arduino 101
- Señales digitales a relés
Conexiones de pines:
- Pin 8 → PulseIn [Entrada Digital]
- Pin 6 → IN1 → Ventilador
- Pin 4 → IN2 → Luz
- Pin 5 → IN3 → Cafetera







Conexiones del medidor de energía:
- Conecta el medidor a la alimentación.
- Cubre el medidor con cinta negra para evitar luz externa en el LDR interno.
- Conecta el neutro directamente a las cargas y la fase al relé.
- Saca los cables del LDR fuera del medidor al circuito contador.
- Conecta la salida del contador al pin 8 (pulsePin) como en el código.
- Conecta TX/RX del Arduino 101 a RX/TX del módulo GSM.
- Alimenta las placas tras subir el código.
Diagrama de circuito

Hardware y equipos utilizados
- Dentro del medidor: LDR (fotorresistencia)
- Módulo GSM
- Circuito contador: potenciómetro, IC LM358N
- Arduino 101
- Módulo Bluetooth HC-05
- Módulo relé 4 canales 12V 10A con optoacoplador para PIC AVR ARM
Plataformas de programación
- Arduino IDE para programar el Arduino 101.
- Android Studio (Java y XML) para la app Android.
- Firebase de Google para conectividad de base de datos.
- Unity con Vuforia SDK para realidad aumentada.
Implementación
- Todos los componentes envían lecturas al Arduino, que las convierte a código de carácter para envío eficiente por puerto serie.
- Un código en el PC recibe los datos enviados por Arduino vía puertos serie.
- App Android con Android Studio; conversión voz-texto con API estándar de Google.
- Reconocimiento de voz con parámetros acústico-fonéticos para reconocimiento independiente del hablante.
- Asistente virtual IA con deep learning (CNN en Python) para procesamiento de lenguaje natural.
- App de realidad aumentada con Unity IDE y Vuforia SDK.
Videos
Videos disponibles en el proyecto original.
Enlaces útiles
Enlaces disponibles en el proyecto original.
Código
Código Arduino para lectura de energía digital y cálculo de coste
Implementa las unidades de energía consumidas por un aparato conectado al Arduino.
Instrucciones:
- Haz las conexiones e inserta un número móvil en el código Arduino.
- Sube el código a un Arduino 101.
- Ejecuta el código.
- Envía un SMS desde cualquier móvil al número especificado en formato
#cualquier_texto*. - Recibirás una respuesta con unidades consumidas y coste.
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
int led=13;
#define pulsein 8
unsigned int pusle_count=0;
float units=0;
unsigned int rupees=0;
unsigned int temp=0,i=0;
char str[70],flag1=0,flag2=0;
void setup() {
lcd.begin(16,2);
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(pulsein, INPUT);
digitalWrite(pulsein, HIGH);
lcd.setCursor(0,0); lcd.print("Wireless Energy");
lcd.setCursor(0,1); lcd.print(" Meter ");
delay(2000); lcd.clear();
lcd.print("By "); delay(2000); lcd.clear();
lcd.print("GSM Initilizing..."); gsm_init(); lcd.clear();
lcd.print("System Ready");
Serial.println("AT+CNMI=2,2,0,0,0");
init_sms(); send_data("System Ready"); send_sms(); delay(1000);
digitalWrite(led, LOW); lcd.clear();
}
void loop() {
serialEvent();
units=rupees/5.0;
lcd.setCursor(0,0); lcd.print("Units:"); lcd.print(units); lcd.print(" ");
lcd.setCursor(0,1); lcd.print("Rupees:"); lcd.print(rupees); lcd.print(" ");
read_pulse();
if(temp==1) check();
}
void serialEvent() {
while(Serial.available()) {
if(Serial.find("#")) {
digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW);
while (Serial.available()) {
char inChar=Serial.read(); str[i++]=inChar;
if(inChar=='*') { temp=1; return; }
}
}
}
}
void init_sms() {
Serial.println("AT+CMGF=1"); delay(200);
Serial.println("AT+CMGS=\"INSERT MOBILE NUMBER HERE\""); delay(200);
}
void send_data(String message) {
Serial.println(message); delay(200);
}
void send_sms() { Serial.write(26); }
void read_pulse() {
if(!digitalRead(pulsein)) {
digitalWrite(led, HIGH);
units++; rupees=units*5;
while(!digitalRead(pulsein)); digitalWrite(led,LOW);
}
}
void check() {
if(!(strncmp(str,"units",5))) {
Serial.println("AT+CMGF=1"); delay(200);
Serial.println("AT+CMGS=\"INSERT MOBILE NUMBER HERE\""); delay(200);
lcd.setCursor(0,1);
send_data("Energy Meter Unit:"); Serial.println(units);
send_data("\nRupees:"); Serial.println(rupees); delay(200);
Serial.write(26); flag1=1; flag2=1; temp=0;
}
}
void message_sent() {
lcd.clear(); lcd.print("Message Sent."); delay(1000);
}
void gsm_init() {
lcd.clear(); lcd.print("Finding Module..");
boolean at_flag=1;
while(at_flag) {
Serial.println("AT");
while(Serial.available()>0) { if(Serial.find("OK")) at_flag=0; }
delay(1000);
}
lcd.clear(); lcd.print("Module Connected.."); delay(1000);
lcd.clear(); lcd.print("Disabling ECHO");
boolean echo_flag=1;
while(echo_flag) {
Serial.println("ATE0");
while(Serial.available()>0) { if(Serial.find("OK")) echo_flag=0; }
delay(1000);
}
lcd.clear(); lcd.print("Echo OFF"); delay(1000);
lcd.clear(); lcd.print("Finding Network..");
boolean net_flag=1;
while(net_flag) {
Serial.println("AT+CPIN?");
while(Serial.available()>0) { if(Serial.find("+CPIN: READY")) net_flag=0; }
delay(1000);
}
lcd.clear(); lcd.print("Network Found.."); delay(1000); lcd.clear();
}
Arduino implementando conexión JARVIS a relés vía Bluetooth
Código para transferencia serial Bluetooth de caracteres entre la app Android y el Arduino.
#define CH3 7
#define CH4 4
#define CH5 5
#define CH6 6
void setup() {
Serial.begin(9600);
pinMode(CH3, OUTPUT); pinMode(CH4, OUTPUT);
pinMode(CH5, OUTPUT); pinMode(CH6, OUTPUT);
digitalWrite(CH3, HIGH); digitalWrite(CH4, HIGH);
digitalWrite(CH5, HIGH); digitalWrite(CH6, HIGH);
delay(2000);
}
void loop() {
delay(100);
if(Serial.available()) {
char c = Serial.read(); Serial.print(c);
if(c=='b') { /* café off */ }
else if(c=='c') { digitalWrite(CH4,LOW); delay(100); } // luz on
else if(c=='d') { digitalWrite(CH6,LOW); delay(100); } // ventilador on
else if(c=='k') { digitalWrite(CH5,LOW); delay(100); } // café on
else if(c=='g') { digitalWrite(CH5,HIGH); delay(100); } // café off
else if(c=='e') { digitalWrite(CH4,HIGH); delay(100); } // luz off
else if(c=='f') { digitalWrite(CH6,HIGH); delay(100); } // ventilador off
else if(c=='z') { // goodbye
digitalWrite(CH6,HIGH); digitalWrite(CH4,HIGH);
digitalWrite(CH3,HIGH); digitalWrite(CH5,HIGH); delay(500);
digitalWrite(CH5,LOW); delay(500); digitalWrite(CH5,HIGH);
delay(500); digitalWrite(CH5,LOW); delay(500);
digitalWrite(CH5,HIGH); delay(10000);
}
}
}
Piezas personalizadas y cajas
Instrucciones:
- Descarga e instala la app.
- Asegúrate de que el teléfono tenga conexión a Internet.
- Inicia la app y apúntala a un electrodoméstico configurado con Vuforia (se usa el marcador por defecto).
- El electrodoméstico debería encenderse.
- Para apagarlo, pulsa el botón virtual que aparece en pantalla al apuntar al dispositivo.
jarvisaugmented_I2zWAu2jGG.apk
Esquemáticos
Nota: Se requiere conexión a Internet activa en el teléfono en todo momento.
Instrucciones:
- Instala la app en un teléfono Android.
- Tras configurar el hardware y ejecutarlo, inicia la app.
- Para usar el Asistente Virtual (Voz), di la palabra clave: "Listen Up JARVIS". Esto activará al agente.
- Habla tu comando claramente.
- El agente debería responder.
- Para iniciar la app de realidad aumentada, pulsa el botón "augment"; aparecerá una pantalla en blanco.
- Abre la app Jarvis Augmented en otro teléfono (NOTA: la app J.A.R.V.I.S. Android debe estar en un teléfono diferente).
- Sigue las instrucciones de JarvisAugmented para implementar la realidad aumentada.
NOTAS:
- Si la app se bloquea, reiníciala.
- Si aparece "Could not open Microphone", reinicia la app.
- Esta app usa módulo Bluetooth HC05 para ampliar el alcance. Se recomienda HC05.
app-release_eo3LK2AsLV.apk
Proceso de manufactura
- Construya una Red de Sensores Inalámbrica Económica para su Hogar
- Construye tu propia máquina de escribir deberes casera (DIY Homework Writing Machine)
- Sistema de Iluminación DMX Controlado por Web – Controlador Maestro Arduino
- Construye un Spybot controlado por Bluetooth con Arduino
- Construye un Skateboard VR Casero con Arduino, Google Cardboard y Bluetooth
- Robot Asistente Doméstico Autónomo "O'nine" – Integración ROS, Alexa y Brazo Robótico
- Controlador doméstico Arduino con Alexa: Automatización inteligente simplificada
- Shield de Programación Inalámbrica para Arduino con HC-05 Bluetooth – Sin Cable USB
- Pantalla TFT Shield de Alto Rendimiento 2.8” para Arduino Nano – Display SPI 320×240
- Shield de Reloj Nixie NCS314 para Arduino UNO/MEGA – Compatibilidad IN‑14/IN‑12
- Sistema Avanzado de Monitorización Doméstica con Arduino Mega y Sensores IoT







