J.A.R.V.I.S. – Assistente Virtual Inteligente para Casa Inteligente com Arduino
Componentes e Materiais Necessários
| Componente | Quantidade |
|---|---|
| Arduino 101 | 1 |
| Arduino 4 Relays Shield | 1 |
| Arduino GSM Shield V2 | 1 |
Ferramentas e Máquinas Necessárias
- Ferro de solda (genérico)
- Pistola de cola quente (genérica)
Aplicativos e Serviços Online
- Unity
- Android Studio
- Vuforia
- Adobe Illustrator
- Arduino IDE
Sobre este Projeto
Por que enfrentar o problema da Casa Inteligente?
O que há de novo?
Por que decidimos fazer isso?
Funcionamento
O Medidor de Energia Digital
O Assistente Virtual com IA
O fluxo de sinais é o seguinte:
- Entrada de voz no App Android
- Processamento no App Android
- Envio de dados criptografados ao Arduino via Bluetooth
- Processamento no Arduino 101
- Sinais digitais para o relé
Conexões dos pinos:
- Pino 8 → PulseIn [Entrada Digital]
- Pino 6 → IN1 → Saída Ventilador
- Pino 4 → IN2 → Saída Luz
- Pino 5 → IN3 → Cafeteira
Conexões do Medidor de Energia:
- Conecte o medidor à alimentação.
- Cubra o medidor de energia com fita preta, impedindo que o LDR interno receba luz externa.
- Conecte o fio neutro diretamente às cargas e o fio fase ao relé.
- Retire os fios do LDR de fora do medidor para o circuito contador.
- Agora leve a saída do circuito contador ao pino 8 (pulsePin) conforme o código.
- Conecte os pinos TX, RX do Arduino 101 aos pinos RX, TX do módulo GSM.
- Alimente as placas após gravar o código.
Diagrama de Circuito
Hardware e Equipamentos Utilizados
- Dentro do medidor de energia: LDR (Resistor Dependente de Luz)
- Módulo GSM
- Circuito contador: potenciômetro, CI LM358N
- Arduino 101
- Módulo Bluetooth HC05
- Módulo de controle de relé 4 canais 12V 10A com optoacoplador para PIC AVR ARM
Plataformas de Programação
- Para programar o Arduino 101, usamos o Arduino IDE padrão.
- Desenvolvemos nosso app Android usando Android Studio (JAVA e XML).
- Conectividade de banco de dados feita com Firebase do Google.
- Para realidade aumentada usamos Unity junto com Vuforia SDK.
Implementação
- Todos os componentes enviam leituras ao Arduino, onde convertemos essas leituras em código de caractere para enviar bytes de forma eficiente e rápida ao computador. Em um loop infinito, cada leitura corresponde a um caractere.
- Um código deve rodar no computador para receber os dados enviados pelo Arduino via portas seriais.
- Para desenvolver o app Android usamos Android Studio e para converter voz em texto usamos a API padrão do Google.
- Para reconhecimento de fala usamos parâmetros acústico-fonéticos para reconhecimento de fala independente de locutor no app Android.
- Temos o assistente virtual com IA que usa técnicas de deep learning como CNN (Rede Neural Convolucional) usando Python para implementar processamento de linguagem natural.
- Para o app de realidade aumentada usamos Unity IDE e VuforiaSDK (Kit de Desenvolvimento de Software de Realidade Aumentada para dispositivos móveis que permite a criação de aplicações de RA).
Vídeos
Links Úteis
Código
Código Arduino para leitura de energia digital e cálculo de custo
Este código implementa as unidades de energia consumidas por um aparelho conectado ao Arduino.
Instruções:
- Faça as conexões e insira um número de celular no código Arduino
- Carregue o código em um Arduino 101
- Execute o código
- Envie um SMS de qualquer celular para o número especificado no código no formato
#qualquertexto* - Uma resposta contendo as unidades consumidas e o custo será recebida
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
int led=13; // declarando LED no pino 13
#define pulsein 8 // definindo pino de entrada de pulso 8
unsigned int pusle_count=0; // Declarando tipo de contagem de pulso como inteiro
float units=0; // Declarando unidades como Float
unsigned int rupees=0; // declarando tipo rupias como inteiro sem sinal
unsigned int temp=0,i=0; // declarando temp e i como inteiro sem sinal
char str[70],flag1=0,flag2=0; // comprimento de caractere como string e declarando flags
void setup() {
lcd.begin(16,2); // inicializando LCD como 16x2
Serial.begin(9600); // inicializando taxa de baud serial como 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 Inicializando...");
gsm_init();
lcd.clear();
lcd.print("Sistema Pronto");
Serial.println("AT+CNMI=2,2,0,0,0");
init_sms();
send_data("Sistema Pronto");
send_sms();
delay(1000);
digitalWrite(led, LOW);
lcd.clear();
}
void loop() {
serialEvent(); // verificando evento serial
units=rupees/5.0; // cálculo de unidade
lcd.setCursor(0,0);
lcd.print("Unidades:");
lcd.print(units);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Rupias:");
lcd.print(rupees);
lcd.print(" ");
read_pulse();
if(temp==1) {
check();
}
}
void serialEvent() // evento serial para receber e verificar SMS recebido
{
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() // inicializando e configuração de envio de mensagem
{
Serial.println("AT+CMGF=1");
delay(200);
Serial.println("AT+CMGS=\"INSIRA NUMERO DE CELULAR AQUI\"");
delay(200);
}
void send_data(String message) {
Serial.println(message);
delay(200);
}
void send_sms() {
Serial.write(26);
}
// Leitura de Pulso do Medidor de Energia
void read_pulse() {
if(!digitalRead(pulsein)) {
digitalWrite(led, HIGH);
units++;
rupees=units*5;
while(!digitalRead(pulsein));
digitalWrite(led,LOW);
}
}
// Verificando o status da Mensagem
void check() {
if(!(strncmp(str,"units",5))) {
Serial.println("AT+CMGF=1");
delay(200);
Serial.println("AT+CMGS=\"INSIRA NUMERO DE CELULAR AQUI\"");
delay(200);
lcd.setCursor(0,1);
send_data("Unidade Medidor Energia:");
Serial.println(units);
send_data("\nRupias:");
Serial.println(rupees);
delay(200);
Serial.write(26);
flag1=1;
flag2=1;
temp=0;
}
}
void message_sent() {
lcd.clear();
lcd.print("Mensagem Enviada.");
delay(1000);
}
void gsm_init() {
lcd.clear();
lcd.print("Encontrando Modulo..");
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("Modulo Conectado..");
delay(1000);
lcd.clear();
lcd.print("Desativando 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("Encontrando Rede..");
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("Rede Encontrada..");
delay(1000);
lcd.clear();
}
Arduino implementando conexão JARVIS ao relé usando Arduino
Este é um código implementando transferência serial Bluetooth de caracteres entre o app Android e o 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);
// Fornece energia para ambos LEDs
// Desliga qualquer energia nos canais do relé
digitalWrite(CH3, HIGH);
digitalWrite(CH4, HIGH);
digitalWrite(CH5, HIGH);
digitalWrite(CH6, HIGH);
delay(2000); // Aguarda 2 segundos antes de iniciar sequência
}
void loop() {
delay(100);
if(Serial.available()) {
char c = Serial.read();
Serial.print(c);
if(c=='b') {
// café desligado
} else if(c=='c') // luz ligada
{digitalWrite(CH4 ,LOW); delay(100);}
else if(c=='d') // ventilador ligado
{digitalWrite(CH6,LOW); delay(100);}
else if(c=='k') // café ligado
{digitalWrite(CH5,LOW); delay(100);}
else if(c=='g') // café desligado
{digitalWrite(CH5,HIGH); delay(100);}
else if(c=='e') // luz desligada
{digitalWrite(CH4,HIGH); delay(100);}
else if(c=='f') // ventilador desligado
{digitalWrite(CH6,HIGH); delay(100);}
else if(c=='z') // adeus
{
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);
}
}
}
Peças Personalizadas e Gabinetes
Instruções:
- Baixe e instale o app
- Certifique-se de que o telefone está conectado à internet
- Inicie o app e aponte para um aparelho configurado com Vuforia (o marcador padrão Vuforia é usado aqui)
- O aparelho deve iniciar
- Para desligar o aparelho, clique no botão virtual que aparece na tela sempre que o telefone é apontado para o dispositivo
jarvisaugmented_I2zWAu2jGG.apk
Esquemáticos

Observação: Conexão ativa à Internet no telefone é necessária o tempo todo
Instruções:
- Instale o app em um telefone Android
- Após configurar o hardware e executá-lo com sucesso, inicie o app
- Para usar o Assistente Virtual (Voz), diga a palavra-chave "Listen Up JARVIS". Isso deve ativar o agente
- Fale seu comando claramente
- O agente deve fornecer uma resposta
- Para iniciar o app de realidade aumentada, clique no botão augment; uma tela em branco deve aparecer
- Abra o Jarvis Augmented App em outro telefone (NOTA: O app J.A.R.V.I.S. Android deve estar em outro telefone)
- Prossiga para as instruções dadas no JarvisAugmented para implementar realidade aumentada
NOTA:
- Se o app travar em qualquer ponto, tente reiniciar o app
- Se uma mensagem semelhante a "Não foi possível abrir Microfone" aparecer na tela, reinicie o app
- Este app é implementado usando módulo Bluetooth HC05 para aumentar o escopo do projeto. Portanto, Módulo Bluetooth HC05 é recomendado
app-release_eo3LK2AsLV.apk
Processo de manufatura
- Construa uma Rede de Sensores Sem Fio Acessível para Sua Casa
- Construa Sua Própria Máquina de Escrever Deveres de Casa (Plotter de Caneta) em Casa
- Sistema de Iluminação DMX Controlado via Web – Controlador Mestre Arduino
- Construa um Spybot Controlado por Bluetooth com Arduino
- Construa um Skate VR DIY com Arduino, Google Cardboard e Bluetooth
- Robô Assistente Doméstico Autônomo: Lista Completa de Peças e Guia de Configuração
- Controlador Residencial Arduino com Alexa: Automação Inteligente Simplificada
- Shield de Programação Wireless Arduino com HC-05 Bluetooth – Sem Cabo USB
- Shield TFT 2,8" para Arduino Nano – Display SPI 320×240 de Alto Desempenho
- Shield Relógio Nixie NCS314 para Arduino UNO/MEGA – Compatibilidade IN‑14/IN‑12