Se você é fanático por automação residencial ou até mesmo quer levar esta comodidade para sua casa, provavelmente já deu uma olhada em alguns produtos e viu o alto custo para automatizar um único cômodo. Pensando nisso, será trazido neste tutorial um projeto de automação através da Amazon Alexa e da plataforma Sinric Pro.
Com os conhecimentos adquiridos neste post, você será capaz de criar diversas aplicações que enviam dados de sensores aos assistentes virtuais compatíveis com Sinric Pro.
Agregar novas funções para os assistentes virtuais é algo fascinante, ainda mais quando colocamos em prática nossas próprias ideias.
Iremos desenvolver um interruptor touch screen que poderá ser programado para executar qualquer função dentro da aplicativo alexa e também um sensor de umidade e temperatura ambiente, que irá enviar dados ao aplicativo. Tudo isso com um único ESP01, o que reduz o custo e deuxa o projeto mais viável.
Para isso, será necessário que tenha:
Aprenda a instalar a biblioteca do Esp8266 e gravar códigos rapidamente no tutorial Módulos Wifi na IDE Arduino.
Se você ainda não tem conta no aplicativo Alexa ou na plataforma Sinric Pro, aprenda a criá-las e configurá-las de forma simples no tutorial Automação Residencial com Alexa (Amazon) e NodeMCU.
Ao acionar o botão touch, o estado do sensor será alterado, este sinal é enviado para o aplicativo e executa a função programada. A partir disso é possível criar rotinas como acender uma lâmpada, dizer alguma frase ou executar uma cena de aplicativo de terceiros.
O sensor DHT11 lê a temperatura do ambiente e envia estes dados ao aplicativo a cada 60 segundos, com isso é possível observar esta temperatura no aplicativo, dar comandos de voz para que o assistente informe a temperatura do cômodo, e até mesmo ligar o sensor em horários programados.
É um micro-controlador compacto com acesso WIFI de baixo custo e baixo consumo de energia. Por ser compatível com Arduino IDE, podemos programá-lo do mesmo modo que uma placa Arduino convencional.
Para saber mais sobre o ESP01, acesse outro tutorial do nosso blog clicando aqui.
Se tornou muito conhecida como assistente pessoal desde o seu lançamento em 2014, para rivalizar com outras assistentes do mercado. Graças ao investimento da Amazon em dispositivos de automação residencial, a Alexa se tornou cada vez mais presente nesse segmento. Há diversos aparelhos domésticos que já vem com a possibilidade de integração com a Alexa nativamente, como TVs, ar condicionados, etc, que poderão ser usados neste projeto.
A Alexa funciona através de comandos de voz, onde você pode gerenciar desde alarmes, lembretes, agenda, bem como perguntar informações gerais como clima, notícias, etc.
O mais importante a se citar é que ela consegue identificar de forma automática dispositivos conectados a ela, através da rede ou de “skills”, que são basicamente a conexão dela a serviços de terceiros, que usaremos neste projeto.
O Sinric Pro é um serviço de Cloud (nuvem) para dispositivos inteligentes, onde ele suporta uma série de dispositivos inteligentes que podemos criar e integrar a ele.
A principal vantagem de se usar o serviço da Sinric é que não necessitamos de um dispositivo especial para integrar aos dispositivos, como um Echo Dot. O Sinric faz esse serviço sem a necessidade de ter um dispositivo adicional, só precisando do aplicativo.
De forma gratuita podemos hospedar até 5 dispositivos, e acessar os registros de uso de até 3 dias! Com isso, podemos hospedar nossos dispositivos criados, e quando a Alexa receber um comando, ela irá requisitar a esse serviço e fazer a alteração no estado de um dispositivo.
Lembrando que se você ainda não tem conta no aplicativo Alexa ou na plataforma Sinric Pro, aprenda a criá-las e configurá-las neste outro tutorial do nosso blog: Automação Residencial com Alexa (Amazon) e NodeMCU.
Após criar suas contas nas duas plataformas, vamos adicionar um novo dispositivo ao Sinric Pro.
Faça login no site da Sinric Pro para entrar na página inicial.
Clique em “Dispositivos” para ver todos os seus dispositivos.
Após entrar na aba de dispositivos, clique em “Adicionar dispositivos” para integrarmos o ESP na plataforma.
Nos campos em vermelho digite o nome do dispositivo ( este nome aparecerá no aplicativo Alexa). Insira uma descrição para identificar o dispositivo, e por último escolha na lista o tipo do dispositivo, escolha “Contact Sensor” para integrar o interruptor touch screen.
Avance em “Next” até o passo 3, após isso, clique em salvar.
Repita este processo adicionando um dispositivo “Temperature Sensor” para integrar o sensor de temperatura DHT11.
Crie seus dispositivos, lembrando que a plataforma permite ser criado até 5 dispositivos de forma gratuita.
Observe que abaixo do nome do dispositivo tem o ID dele, esse ID será importante no futuro, e pode ser facilmente copiado somente apertando o botão “copiar”.
Acesse a guia Credenciais, para ter acesso a “chave do app” e a “senha do app” devemos declarar estas informações no programa a ser enviado na Arduino IDE ao seu ESP8266.
Importante: Esses dados são únicos, não devem ser enviados para ninguém.
Copie os dados da “chave do app” e a “senha do app” clicando em “copiar” ao lado de cada uma.
Já inserimos o dispositivo na nuvem Sinric Pro, mas ainda não terminamos, vamos à programação para dar continuidade ao projeto.
O primeiro passo é instalar a biblioteca ESP8266 de acordo com o post Módulos Wifi na IDE Arduino. Baixe as demais bibliotecas clicando aqui. Após baixar, abra a IDE Arduino e clique em Sketch > Incluir biblioteca > Biblioteca Zip.
Vá na pasta onde salvou as bibliotecas e selecione a biblioteca Sinric Pro.
No menu ferramentas, abra o gerenciador de bibliotecas.
Pesquise por Sinric, e a seguir instale a biblioteca caso não tenha sido instalada automaticamente.
Repita este passo para a biblioteca DHT.
Os códigos originais foram retirados do Git Hub do Sinric Pro, você pode ver mais códigos como este clicando aqui.
Neste tutorial usaremos a junção de dois códigos, “Contact Sensor” e “Temperature Sensor” com leves modificações.
#ifdef ENABLE_DEBUG #define DEBUG_ESP_PORT Serial #define NODEBUG_WEBSOCKETS #define NDEBUG #endif #include <Arduino.h> #ifdef ESP8266 #include <ESP8266WiFi.h> #endif #ifdef ESP32 #include <WiFi.h> #endif #include "SinricPro.h" #include "SinricProContactsensor.h" #include "SinricPro.h" #include "SinricProTemperaturesensor.h" #include "DHT.h" #define WIFI_SSID "YOUR-WIFI-SSID" #define WIFI_PASS "YOUR-WIFI-PASSWORD" #define APP_KEY "YOUR-APP-KEY" #define APP_SECRET "YOUR-APP-SECRET" #define CONTACT_ID "YOUR_CONTACT_ID" #define TEMP_SENSOR_ID "YOUR_TEMP_ID" #define EVENT_WAIT_TIME 60000 #define BAUD_RATE 9600 // Altere o Baud Rate se necessário #define CONTACT_PIN 0 // PINO onde o sensor touch está conectado #define DHT_PIN 2 // PINO onde o sensor de tmperatura está conectado DHT dht; // DHT sensor bool deviceIsOn; // Estado do sensor de temperatura float temperature; // temperatura atual float humidity; // umidade atual float lastTemperature; // temperatura anterior float lastHumidity; // umidade anterior unsigned long lastEvent = (-EVENT_WAIT_TIME); // última mudança bool thingState = false; // estado do sensor touch bool myPowerState = true; // estado do sensor touch (se ligado ou desligado) bool lastContactState = false; // último estado unsigned long lastChange = 0; // última mudança do sensor /** @brief Checks contactsensor connected to CONTACT_PIN If contactsensor state has changed, send event to SinricPro Server state from digitalRead(): HIGH = contactsensor is closed LOW = contactsensor is open */ void handleContactsensor() { if (!myPowerState) return; // se o touch foi desconectado unsigned long actualMillis = millis(); if (actualMillis - lastChange < 250) return; // debounce para evitar ruídos bool actualContactState = digitalRead(CONTACT_PIN); // lê o estado atual do sensor if (actualContactState == true && lastContactState == false) { // se houve mudança de estado Serial.printf("Contactsensor is %s now\r\n", actualContactState ? "open" : "closed"); lastChange = actualMillis; // inicia o tempo de debounce thingState = !thingState; SinricProContactsensor &myContact = SinricPro[CONTACT_ID]; // captura o valor a partir do sinric pro myContact.sendContactEvent(thingState); // envia o estado do sensor touch } lastContactState = actualContactState; // atualiza o último estado } void handleTemperaturesensor() { if (deviceIsOn == false) return; // se o dht foi desconectado unsigned long actualMillis = millis(); if (actualMillis - lastEvent < EVENT_WAIT_TIME) return; //tempo para nova leitura temperature = dht.getTemperature(); // lê temperatura atual em °C // temperature = dht.getTemperature() * 1.8f + 32; // lê temperatura atual em °F humidity = dht.getHumidity(); // lê umidade atual if (isnan(temperature)) { // se houve falha na leitura ou não houve mudança de temperatura Serial.printf("DHT reading failed!\r\n"); // print mensagem de erro return; // faça nova leitura } if (temperature == lastTemperature || humidity == lastHumidity) return; SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID]; // leia a temperatura do sinric pro bool success = mySensor.sendTemperatureEvent(temperature, humidity); // envia a nova temperatura if (success) { // se enviou com sucesso, print novos valores Serial.printf("Temperature: %2.1f Celsius\tHumidity: %2.1f%%\r\n", temperature, humidity); } else { // se o onvio falhou, print mensagem de erro Serial.printf("Something went wrong...could not send Event to server!\r\n"); } lastTemperature = temperature; // salve a temperatura atual lastHumidity = humidity; // salve a umidade atual atual lastEvent = actualMillis; // salve o tempo atual } /** @brief Callback for setPowerState request @param deviceId String containing deviceId (useful if this callback used by multiple devices) @param[in] state bool true=turn on device / false=turn off device @param[out] state bool true=device turned on / false=device turned off @return true request handled properly @return false request can't be handled because some kind of error happened */ bool onPowerState1(const String &deviceId, bool &state) { Serial.printf("Device %s turned %s (via SinricPro) \r\n", deviceId.c_str(), state ? "on" : "off"); myPowerState = state; return true; } bool onPowerState2(const String &deviceId, bool &state) { Serial.printf("Temperaturesensor turned %s (via SinricPro) \r\n", state ? "on" : "off"); deviceIsOn = state; return true; } // setup function for WiFi connection void setupWiFi() { Serial.printf("\r\n[Wifi]: Connecting"); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { Serial.printf("."); delay(250); } IPAddress localIP = WiFi.localIP(); Serial.printf("connected!\r\n[WiFi]: IP-Address is %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]); } // setup function for SinricPro void setupSinricPro() { // add device to SinricPro SinricProContactsensor& myContact = SinricPro[CONTACT_ID]; myContact.onPowerState(onPowerState1); SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID]; mySensor.onPowerState(onPowerState2); // setup SinricPro SinricPro.onConnected([]() { Serial.printf("Connected to SinricPro\r\n"); }); SinricPro.onDisconnected([]() { Serial.printf("Disconnected from SinricPro\r\n"); }); SinricPro.begin(APP_KEY, APP_SECRET); SinricPro.restoreDeviceStates(true); } // main setup function void setup() { Serial.begin(BAUD_RATE); Serial.printf("\r\n\r\n"); dht.setup(DHT_PIN); pinMode(CONTACT_PIN, INPUT); setupWiFi(); setupSinricPro(); } void loop() { handleContactsensor(); handleTemperaturesensor(); SinricPro.handle(); }
No código abaixo apenas faça modificações nas linhas 37 a 41, veja abaixo:
Linha 21: digite o nome da sua rede wifi no lugar de “YOUR-WIFI-SSID”.
Linha 22: digite o nome da senha da sua rede wifi no lugar de “YOUR-WIFI-PASSWORD”.
Linha 23: digite a chave do app contida na aba de credenciais do Sinric Pro no lugar de “YOUR-APP-KEY”.
Linha 24: digite a senha do app contida na aba de credenciais do Sinric Pro no lugar de “YOUR-APP-SECRET”.
Linha 25: copie ID do sensor touch e cole no lugar de “YOUR_CONTACT_ID”.
Linha 26: copie ID do sensor dht11 e cole no lugar de “YOUR_TEMP_ID”.
Mantenha os códigos entre aspas para que a IDE Arduino entenda como texto.
Para carregar o código no ESP01, utilize um conversor USB Serial e o circuito ensinado no tutorial Módulos WIFI na IDE Arduino. Não se esqueça de ligar o ESP01 em 3.3v do conversor, além de TX de ESP01 o RX do conversor e RX do ESP01 em TX do conversor.
Após gravar o código, abra o monitor serial e selecione o Baud Rate de 9600 e então pressione reset no circuito de gravação.
Verifique se a conexão com a internet foi bem sucedida como demonstra a imagem a seguir.
Caso apareça erro de leitura, não se preocupe, basta apenas conectar o ESP01 no circuito e ativar os sensores no app Alexa ou no site Sinric Pro.
Caso tenha sido bem sucedida, desconecte o ESP01 do conversor USB Serial.
Este circuito é bem simples, vamos utilizar uma fonte para protoboard pois ela já possui saídas de 5V e 3.3V.
Note que o VCC do sensor touch vai conectado em 5V, e o VCC do sensor de temperatura e do ESP01 em 3.3V.
O pino de sinal do sensor touch é ligado em um divisor de tensão com resistores, transformando o sinal 5V em 3.3V.
O GPIO0 do ESP01 vai ligado na saída do divisor de tensão, e o GPIO2 vai ligado no pino de sinal do sensor de temperatura.
Com o ESP01 ainda é possível conectar mais dois interruptores touch em GPIO1 e GPIO3, mas para isso é necessário alterar o código e adicionar mais dispositivos na plataforma Sinric Pro.
Após conectá-lo e energizar o circuito, espere alguns segundos até que o ESP01 seja conectado à internet novamente.
Vá no tutorial Automação Residencial com Alexa e NodeMCU e desça a página até o passo “Integrando Alexa ao projeto” para aprender a sincronizar seu dispositivo para que funcione corretamente. Basta ativar a Skill Sinric Pro e buscar por dispositivos.
Após conectado, abra o dispositivo no aplicativo e toque no sensor para verificar a mudança de estado. Repare que ao tocar no sensor, o led do ESP01 pisca, sinalizando que o estado foi alterado.
O sensor de temperatura atualiza e envia dados ao aplicativo a cada 60 segundos abra o dispositivo no aplicativo e no site Sinric Pro e veja a mudança de temperatura no gráfico da página inicial. No aplicativo Alexa, crie um grupo com o nome do cômodo onde estão os sensores e os adicione ao grupo. Quando adicionados tente dizer “Alexa, qual a temperatura do (nome do cômodo)”, ela te responderá com os dados recebidos do sensor.
Veja o vídeo de demonstração:
Você pode confeccionar uma PCB a partir deste circuito e implementar em algum cômodo de sua casa e instalá-lo
Chegamos ao final de mais um tutorial sobre automação residencial, veja os outros tutoriais que abordam este assunto aqui. Lembre-se que o lazer aliado ao estudo é a maneira mais fácil de aprender, então tente mudar o código, utilizar outros sensores e implementar mais dispositivos. Com este código, pode utilizar qualquer sensor que tenha sinal digital (0 ou 1), para alterar estados na Alexa.
Esperamos que tenha gostado e entendido nosso tutorial, compartilhe com amigos e nos marque nas redes sociais a cada novo projeto que fizer.
Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!