J.A.R.V.I.S. — Умный домашний виртуальный ассистент на Arduino
Компоненты и материалы
| Arduino 101 | ×1 |
| Arduino 4 Relays Shield | ×1 |
| Arduino GSM Shield V2 | ×1 |
Необходимые инструменты
- Паяльник
- Клеевой пистолет
Приложения и онлайн-сервисы
- Unity
- Android Studio
- Vuforia
- Adobe Illustrator
- Arduino IDE
О проекте
Зачем решать проблему умного дома?
Что нового?

Почему мы решили это сделать?





Принцип работы
Цифровой счетчик энергии



ИИ-виртуальный ассистент
Поток сигналов:
- Голосовой ввод в Android-приложении.
- Обработка на телефоне (распознавание речи, NLP).
- Отправка зашифрованных данных на Arduino через Bluetooth.
- Обработка на Arduino 101.
- Цифровые сигналы на реле.
Подключение пинов:
- Pin 8 → PulseIn [Digital Input] (счетчик энергии)
- Pin 6 → IN1 → Вентилятор
- Pin 4 → IN2 → Свет
- Pin 5 → IN3 → Кофемашина







Подключение счетчика энергии:
- Подключите счетчик к сети.
- Заклейте фоторезистор внутри счетчика черной изолентой от внешнего света.
- Ноль подключите прямо к нагрузкам, фазу — через реле.
- Выведите провода от фоторезистора к счетному контуру.
- Выход счетного контура подключите к пину 8 (pulsepin).
- Соедините TX/RX Arduino 101 с RX/TX GSM-модуля.
- Подайте питание после загрузки кода.
Схема подключения

Используемое оборудование
- Внутри счетчика: фоторезистор (LDR)
- GSM-модуль
- Счетный контур: потенциометр, ИС LM358N
- Arduino 101
- Bluetooth HC-05
- 4-канальный релейный модуль 12V 10A с оптопарами
Платформы программирования
- Arduino IDE — для Arduino 101.
- Android Studio (Java/XML) — для Android-приложения.
- Firebase — база данных.
- Unity + Vuforia SDK — дополненная реальность.
Реализация
- Все сенсоры передают показания на Arduino, где они кодируются в символы для быстрой передачи по Serial.
- На компьютере запускается программа для приема данных через последовательный порт.
- Android-приложение использует Google Speech API для преобразования голоса в текст.
- Распознавание речи основано на акустико-фонетических параметрах (speaker-independent).
- ИИ-ассистент использует глубокое обучение (CNN на Python) для NLP.
- AR-приложение на Unity с Vuforia SDK.
Полезные ссылки
(Ссылки отсутствуют в исходнике)
Код
1. Arduino: чтение цифрового счетчика энергии и расчет стоимости
#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();
}
2. Arduino: реализация JARVIS — управление реле через Bluetooth
#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') { /* coffee off */ }
else if(c=='c') { digitalWrite(CH4, LOW); delay(100); } // light on
else if(c=='d') { digitalWrite(CH6, LOW); delay(100); } // fan on
else if(c=='k') { digitalWrite(CH5, LOW); delay(100); } // coffee on
else if(c=='g') { digitalWrite(CH5, HIGH); delay(100); } // coffee off
else if(c=='e') { digitalWrite(CH4, HIGH); delay(100); } // light off
else if(c=='f') { digitalWrite(CH6, HIGH); delay(100); } // fan off
else if(c=='z') { // goodbye sequence
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);
}
}
}
Печатные платы и корпуса
Инструкция для AR-приложения (APK-файлы в проекте):
- Установите приложение.
- Убедитесь в наличии интернета.
- Запустите приложение и наведите на прибор, настроенный в Vuforia (используется стандартный маркер).
- Прибор включится.
- Для выключения нажмите виртуальную кнопку на экране.
Схемы

Важно: Требуется постоянное интернет-соединение на телефоне.
Инструкция для основного Android-приложения (APK в проекте):
- Установите приложение на Android-телефон.
- После настройки железа и успешного запуска, стартуйте приложение.
- Для голосового ассистента скажите ключевую фразу «Listen Up JARVIS».
- Говорите команду четко — ассистент ответит.
- Для AR-режима нажмите кнопку «Augment»; появится пустой экран.
- На другом телефоне откройте Jarvis Augmented App и следуйте его инструкциям.
Примечания: при зависании перезапустите приложение; если ошибка микрофона — перезапустите; используется HC-05 Bluetooth.
Производственный процесс
- Построение доступной беспроводной сети датчиков для дома
- Сборка домашней машины для написания домашних заданий (плоттер-писатель)
- Веб-управляемая DMX-система освещения: Arduino Mega как мастер-контроллер
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- Сборка DIY VR-скейтборда на Arduino, Google Cardboard и Bluetooth
- Автономный домашний помощник-робот: полный список деталей и руководство по настройке (ROS, Alexa, MoveIt)
- Arduino Home Controller с Alexa: умный дом голосовым управлением
- Беспроводная прошивка Arduino через Bluetooth HC-05: щит без USB-кабеля
- TFT Shield 2.8" 320×240 SPI для Arduino Nano — высокопроизводительный дисплей
- Shield Nixie Tube Clock NCS314 для Arduino UNO/MEGA — совместимость с IN-14/IN-12