Automação Residencial integrado a assistente virtual
Maria Luiza Coelho Rodrigues, Débora Corrêa Neves Silva, Mariana Inácio de Souza, Isis Clara Possidônio

Introdução

O objetivo desse trabalho é desenvolver uma solução de automação residencial de baixo custo, integrado a uma assistente virtual, capaz de reconhecer comandos de voz e interações simples com o usuário, simulando uma inteligência artificial. Para cumprir com tal objetivo, foi realizado um estudo e integração entre o assistente virtual Jarvis PRO e o sistema de processamento embarcado Arduino MEGA, que processa os comandos recebidos via assistente virtual e controla os equipamentos na residência. Como resultados podemos citar a concepção de uma solução de fácil associação aos equipamentos já instalados na maioria das residências,o que não ocorre com as soluções presentes no mercado. Destacamos também um custo em torno de 20% menor no sistema de interface e processamento do que as soluções encontradas no mercado. O desenvolvimento deste trabalho demonstra com clareza a importância da capacidade em integração de sistemas que o profissional da àrea de tecnologia precisa ser atualmente, sendo capaz de propor soluções eficientes com custos viáveis para atender as demandas emergentes. O SARAV (Sistema de Automação Residencial por Assistente Virtual) faz a integração de vários produtos e tecnologias de forma eficiente, ou seja, com boa qualidade e baixo custo. Com isso traz ao mercado brasileiro um serviço inédito (devido ao uso da língua portuguesa) e acessível.

Montagem

Programa Arduino

#include <DHCP.h>
#include <DNS.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUDP.h>
#include <Ethernet_W5500.h>
#include <Twitter.h>
#include <util.h>

#include <Ethernet_W5500.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>


//CONTROLE REMOTO
#include <IRremote.h>


IRsend irsend;

byte mac[] = {
0x70, 0xB3, 0xD5, 0x0A, 0xC0, 0x4D
};
IPAddress ip(192, 168, 1, 119);

EthernetServer server(80);

//RELES
int pino_rele1 = 2; // Luz do Escritório
int pino_rele2 = 3; // maquina de refri
int pino_rele3 = 5; // bomba1
int pino_rele4 = 6; // bomba2
int pino_rele5 = 7; // Climatizador
int pino_rele6 = 8; // Porta da Sala
int pino_rele7 = 11; //
int pino_rele8 = 12; // Luz da mesa
int pino_rele10 = 4; // Luz da Amarela

void setup() {

Serial.begin(9600);




pinMode(pino_rele1, OUTPUT); // Luz do Escritório
pinMode(pino_rele2, OUTPUT); //
pinMode(pino_rele3, OUTPUT); // bomba 1
pinMode(pino_rele4, OUTPUT); // bomba 2
pinMode(pino_rele5, OUTPUT); // Cliamtizador
pinMode(pino_rele6, OUTPUT); // Porta da Sala
pinMode(pino_rele7, OUTPUT); //
pinMode(pino_rele8, OUTPUT); // Luz da mesa
pinMode(pino_rele10, OUTPUT); // Lâmpada Amarela

//Desliga os reles
digitalWrite(pino_rele1, LOW); // Luz do Escritório
digitalWrite(pino_rele2, LOW); //
digitalWrite(pino_rele3, LOW); // bomba 1
digitalWrite(pino_rele4, LOW); // bomba 2
digitalWrite(pino_rele5, LOW); // Climatizador
digitalWrite(pino_rele6, LOW); // Porta da Sala
digitalWrite(pino_rele7, LOW); //
digitalWrite(pino_rele8, LOW); // Luz da mesa
digitalWrite(pino_rele10, LOW); // Luz da mesa

while (!Serial) {
;
}

Ethernet.begin(mac, ip);
server.begin();

//Controle remoto
pinMode(9,OUTPUT);
digitalWrite(9, LOW);

}

void loop() {

EthernetClient client = server.available();
if (client) {

boolean currentLineIsBlank = true;

String vars;
int acao = 0;

while (client.connected()) {
if (client.available()) {
char c = client.read();
vars.concat(c);

//AQUI ACONTECEM AS COMPARACOES

if (vars.endsWith("/abrirporta")) acao=1;
else if (vars.endsWith("/ligarclima")) acao=2;
else if (vars.endsWith("/bomba1")) acao=3;
else if (vars.endsWith("/bomba2")) acao=4;

else if (vars.endsWith("/assistirtv")) acao=7;
else if (vars.endsWith("/desligartv")) acao=8;
else if (vars.endsWith("/globo")) acao=9;
else if (vars.endsWith("/sbt")) acao=10;
else if (vars.endsWith("/aumentartv")) acao=11;
else if (vars.endsWith("/abaixartv")) acao=12;
else if (vars.endsWith("/tvmudo")) acao=13;
else if (vars.endsWith("/proximocanal")) acao=14;
else if (vars.endsWith("/canalanterior")) acao=15;
else if (vars.endsWith("/aumentando5")) acao=16;
else if (vars.endsWith("/abaixando5")) acao=17;
else if (vars.endsWith("/record")) acao=18;
else if (vars.endsWith("/redetv")) acao=19;
else if (vars.endsWith("/redeminas")) acao=22;
else if (vars.endsWith("/band")) acao=23;
else if (vars.endsWith("/esquerda")) acao=24;
else if (vars.endsWith("/podeiniciar")) acao=25;

else if (vars.endsWith("/luzmesa")) acao=20;
else if (vars.endsWith("/luzescritorio")) acao=21;

else if (vars.endsWith("/luz50")) acao=26;
else if (vars.endsWith("/luz0")) acao=27;
else if (vars.endsWith("/desligarclima")) acao=28;




Serial.write(c);

if (c == '\n' && currentLineIsBlank) {

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();

if (acao == 1) // ABRIR PORTA
{
digitalWrite(pino_rele6, HIGH);
delay(500);
digitalWrite(pino_rele6, LOW);
delay(1000);

break;
}
else if (acao == 2) //CLIMATIZADOR
{
digitalWrite(pino_rele5, HIGH);
delay(500);

break;
}
else if (acao == 28) //CLIMATIZADOR
{
digitalWrite(pino_rele5, LOW);
delay(500);
break;
}
else if (acao == 3) //BOMBA 1
{
digitalWrite(pino_rele3, HIGH);
delay(10000);
digitalWrite(pino_rele3, LOW);
Serial.println("bomba1");
break;
}
else if (acao == 4) //BOMBA 2
{
digitalWrite(pino_rele4, HIGH);
delay(10000);
digitalWrite(pino_rele4, LOW);
break;
}

else if (acao == 7){ //LIGANDO A TV
//Ligar receptor
irsend.sendNEC(0x20DF10EF, 32);
Serial.println("TV ligada");
break;
}
else if (acao == 8){ //DESLIGANDO A TV
//desligar receptor
irsend.sendNEC(0x20DF10EF, 32);
Serial.println("TV Desligada");
break;
}
else if (acao == 9){ //globo
//0
irsend.sendNEC(0x20DF8877, 32);
delay(500);
//1
irsend.sendNEC(0x20DF48B7, 32);
break;
}
else if (acao == 10){ //sbt

irsend.sendNEC(0x20DFA857, 32);
break;
}
else if (acao == 11){ //Aumentando o volume

irsend.sendNEC(0x20DF40BF, 32);
Serial.println("Aumentando volume");
break;
}
else if (acao == 12){ //Abaixando o volume

irsend.sendNEC(0x20DFC03F, 32);
Serial.println("Abaixando volume");
break;
}
else if (acao == 13){ //TV Mudo

irsend.sendNEC(0x20DF906F , 32);
break;
}
else if (acao == 14){ //Proximo canal

irsend.sendNEC(0x20DF00FF, 32);
break;
}
else if (acao == 15){ //Canal anterior

irsend.sendNEC(0x20DF807F, 32);
break;
}
else if (acao == 16){ //Aumentando 6

irsend.sendNEC(0x20DF40BF, 32);
delay(500);
irsend.sendNEC(0x20DF40BF, 32);
delay(500);
irsend.sendNEC(0x20DF40BF, 32);
delay(500);
irsend.sendNEC(0x20DF40BF, 32);
delay(500);
irsend.sendNEC(0x20DF40BF, 32);
delay(500);
irsend.sendNEC(0x20DF40BF, 32);
break;
}
else if (acao == 17){ //Abaixando 6

irsend.sendNEC(0x20DFC03F, 32);
delay(500);
irsend.sendNEC(0x20DFC03F, 32);
delay(500);
irsend.sendNEC(0x20DFC03F, 32);
delay(500);
irsend.sendNEC(0x20DFC03F, 32);
delay(500);
irsend.sendNEC(0x20DFC03F, 32);
delay(500);
irsend.sendNEC(0x20DFC03F, 32);
break;
}
else if (acao == 18){ //Record

irsend.sendNEC(0x20DF48B7, 32);
Serial.println("Abaixando volume");
break;
}
else if (acao == 19){ //rede tv

irsend.sendNEC(0x20DF28D7, 32);
break;
}
else if (acao == 20) //LUZ MESA
{
digitalWrite(pino_rele8, !digitalRead(pino_rele8));
break;
}else if (acao == 21) //LUZ DO ESCRITÓRIO
{
digitalWrite(pino_rele1, !digitalRead(pino_rele1));
break;
}else if (acao == 26) //LUZ amarela 50%
{
analogWrite(pino_rele10, 130);
break;
} else if (acao == 27) //LUZ amarela 0%
{
analogWrite(pino_rele10, 254);
Serial.write("foi");
break;
}else if (acao == 22) //redeminas

{
irsend.sendNEC(0x20DF9867, 32);
break;
}else if (acao == 23) //band
{
irsend.sendNEC(0x20DFE817, 32);
break;
}
/* else if (acao == 24){ //esquerda

irsend.sendNEC(0x20DFE01F, 32);
break;
}
else if (acao == 25){ //pode iniciar

irsend.sendNEC(0x20DF22DD, 32);
break;
}*/

else
{
//NÃO FAZ NADA
}

break;
}
if (c == '\n') {

currentLineIsBlank = true;
} else if (c != '\r') {

currentLineIsBlank = false;
}// Final do if
} //Final do if
} // Final do while

delay(1);

client.stop();
} //Final do if client
}
//Leitor de RFid
/* if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//UID na serial
String conteudo= "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
}
conteudo.toUpperCase();
if (conteudo.substring(1) == "00 00 00 00") //Marcelo
{
abrirporta();
delay(1000);
}

else if (conteudo.substring(1) == "00 00 00 00") //Mônica
{
abrirporta();
delay(1000);
}

else if (conteudo.substring(1) == "00 00 00 00") //Batista
{
abrirporta();
delay(1000);
}

else if (conteudo.substring(1) == "00 00 00 00") //Bruno
{
abrirporta();
delay(1000);
}

else if (conteudo.substring(1) == "00 00 00 00") //Lourdes
{
abrirporta();
delay(1000);
}

else if (conteudo.substring(1) == "00 00 00 00") //Cláudia
{
abrirporta();
delay(1000);
}

else if (conteudo.substring(1) == "00 00 00 00") //Chaveiro VII
{
abrirporta();
delay(1000);
}
else
{
Serial.print("Não abrir portão");
delay(1000);

}
}


//FUNÇÃO PARA ABRIR O PORTA
void abrirporta()
{
digitalWrite(pino_rele6, LOW);
delay(500);
digitalWrite(pino_rele6, HIGH);
}

//FUNÇÃO PARA ABRIR O PORTÃO
void abrirportao()
{
digitalWrite(pino_rele5, LOW);
delay(500);
digitalWrite(pino_rele5, HIGH);
}*/

Conclusão

Após estudos e pesquisas o assistente virtual Jarvis PRO foi escolhido por ser uma plataforma aberta, que possibilita a integração com o Arduino. Esse foi escolhido em decorrência da facilidade de acesso à materiais de suporte, bem como o menor custo em relação a outras plataformas semelhantes. O projeto atendeu aos objetivos quanto a proposta de integração entre o assistente virtual e a plataforma de desenvolvimento, resultando em um sistema de automação residencial moderno e de simples interação. Além disso, com custo de implementação competitivo em relação às outras soluções disponíveis no mercado.

Referências

SILVEIRA João Alexandre; BRITES Paulo, Experimentos com o Arduino, 2015, edição 2.1



Administrado por: Epaminondas Lage