Controle total de sua TV usando Alexa e Arduino IoT Cloud
Componentes e suprimentos
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Aplicativos e serviços online
![]() |
| |||
![]() |
| |||
![]() |
|
Sobre este projeto
Observação:este tutorial pode estar desatualizado, vá aqui para uma versão mais atual.
Introdução:Arduino IoT Cloud
Arduino IoT Cloud é uma plataforma que permite a qualquer pessoa construir objetos conectados à IoT com facilidade. Para controlar nossa TV usando o Alexa, também usaremos a habilidade oficial do Arduino Alexa.
Se você for novo no Arduino IoT Cloud, recomendamos primeiro dar uma olhada neste projeto introdutório, que lhe dará uma visão geral e o guiará pelo processo de configuração de uma das placas suportadas, IoT Cloud Things e Propriedades e colocá-lo a bordo.
Parte 1:como controlar um aparelho de TV
A maneira mais fácil de controlar qualquer tipo de televisão é agir como se fôssemos seu próprio controle remoto infravermelho. Para fazer isso, teremos que ouvir para os sinais que o remoto enviará, capture os dados e imite-os com nossa placa Arduino. Assim que o circuito estiver montado, faremos o upload deste esboço para nossa placa. Ele irá traduzir as rajadas de sinal IR geradas pelo pressionamento de botões remotos em uma matriz de inteiros sem sinal. Vamos apontar o controle remoto para o Arduino Receptor IR construímos e pressionamos os seguintes botões:
- POTÊNCIA / ESPERA
- CANAIS DE 1 A 9
- AUMENTO DE VOLUME
- DIMINUIR VOLUME
- MUTE
- ACIMA DE CANAIS
- CANAL ABAIXO
Veremos os valores provenientes do Monitor Serial , relatado como
rawData
. Vamos anotá-los em um arquivo de texto por enquanto, e atribuir a cada lista seu próprio nome de array ( chan1
, chan2
e assim por diante). Os valores a seguir são apenas para referência e são gerados por um controle remoto de TV Samsung. CANAL 1 sem sinal int chan1 [67] ={4450,4500, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550 , 1700, 500.600, 500.600, 550.550, 550.600, 500.600, 550.550, 550.600, 500.1700, 550.600, 500.600, 550.550, 550.600, 500.600, 550.1700, 500.1700, 550.600, 500.1700, 550.1700, 550 , 1700, 500,1700, 550,1700, 500}; CANAL 2 sem sinal int chan2 [67] ={4500,4500, 550,1700, 500,1700, 550,1700, 550,550, 550,550, 550.600, 500.600, 550.600, 500 , 1700, 550,1700, 500,1700, 550.600, 500.600, 550.550, 550.600, 500.600, 550.1700, 500.600, 550.1700, 500.600, 550.550, 550.600, 500.600, 550.550, 550.650, 450.1700, 550.600, 500 , 1700, 550,1700, 500,1700, 550,1700, 550,1700, 500}; CANAL 3 sem sinal int chan3 [67] ={4500,4500, 500,1700, 550,1700, 550,1700, 500,600, 550,550 , 550.600, 500.600, 550.550, 550.1700, 500.1700, 550.1700, 550.550, 550.600, 500.600, 550.550, 550.600, 500.600, 550.1700, 500.1700, 550.600, 550.550, 550.550, 550.600, 550.550, 550 , 1700, 500 , 600, 550,550, 550,1700, 550,1650, 550,1700, 550,1700, 500,1700, 600}; CANAL 4 sem sinal int chan4 [67] ={4450,4450, 550,1700, 550,1700, 500 , 1700, 550.600, 500.600, 550.550, 600.550, 500.600, 550.1700, 500.1700, 550.1700, 550.550, 550.600, 500.600, 550.550, 550.600, 500.600, 550.550, 550.600, 500.1700, 550.600, 500.600, 550.550 , 550.600, 500.1700, 550.1700, 550.1700, 500.600, 550.1700, 500.1700, 550.1700, 550.1700, 500}; CANAL 5 sem sinal int chan5 [67] ={4500,4500, 500,1700, 550,1700, 550,1700, 550,550, 550,550, 550,550, 600,550, 550,550, 550,1700, 550,1650, 550,1700, 550,550, 550,600 , 500.600, 550.550, 550.600, 500.1700, 550.600, 500.600, 550.1700, 500.600, 550.550, 550.600, 550.550, 550.550, 550.1700, 550.1700, 500.600, 550.1700, 500.1700, 550.1700 , 550,1700, 500}; CANAL 6 sem sinal int chan6 [67] ={4500,4500, 550,1650, 550,1700, 550,1700, 500.600, 550.550, 550.600, 500.600, 500.600, 550.1700, 500.1700, 550.1700, 550.550, 600.550 , 500.600, 550.550, 600.550, 550.550, 550.1700, 500.600, 550.1700, 500.600, 550.550, 550.600, 500.600, 550.1700, 500.600, 550.1700, 500.600, 550.1650, 600.1650, 550.1700 , 550,1650, 600}; CANAL 7 sem sinal int chan7 [67] ={4500,4500, 550,1700, 500,1700, 550,1750, 500,550, 550,600, 500,650, 500,550, 550,550, 550,1750, 500,1700, 500,1700, 550,650, 450,650 , 500.550, 550.600, 500.650, 500.550, 550.600, 500.1700, 550.1750, 500.600, 500.550, 550.600, 500.650, 500.1750, 450.1700, 550.600, 500.650, 500.1700, 500.1700, 550.1750 , 500, 1700, 500}; CANAL 8 sem sinal int chan8 [67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550.600, 500.600, 550.550, 550.600, 500.600, 550.1700, 500.1700, 550.1700, 550.550, 550.600 , 500.600, 550.550, 550.600, 500.1700, 550.600, 500.1700, 550.1700, 500.600, 550.550, 550.650, 450.600, 550.550, 550.1700, 550.550, 550.600, 500.1700, 550.1700, 550.1700 , 500, 1700, 550}; CANAL 9 sem sinal int chan9 [67] ={4450,4500, 550,1700, 550,1700, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 500,600, 550,550 , 550.600, 500.600, 550.550, 550.600, 500.1700, 550.1700, 550.1700, 500.600, 550.550, 550.550, 550.600, 500.1700, 550.600, 500.600, 550.550, 550.1700, 550.1700, 500.1700 , 550,1700, 550}; VOLUME UPunsigned int volUp [67] ={4500,4500, 550,1700, 500,1750, 500,1700, 550,600, 500,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,1700, 500,650, 450,600 , 550.600, 500.650, 450.650, 500.1700, 500.1750, 500.1750, 500.550, 550.600, 500.650, 500.550, 550.600, 500.650, 500.600, 500.600, 500.1700, 550.1750, 450.1750, 500.1700 , 550,1700, 500}; VOLUME DOWNunsigned int volDown [67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550,600, 550,550, 550,600, 500,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600 , 500.600, 550.550, 550.600, 500.1700, 550.1700, 550.600, 500.1700, 550.600, 500.600, 500.600, 550.550, 550.600, 500.650, 500.1700, 500.650, 500.1700, 500.1750, 500.1700 , 550,1700, 500}; CHANNEL UPunsigned int chanUp [67] ={4500,4450, 550,1700, 550,1650, 550,1700, 550,550, 550,600, 550,550, 550,550, 600,550, 550,1650, 550,1700, 550,1650, 600,550, 550,550 , 550.600, 500.600, 550.550, 550.550, 550.1700, 550.550, 600.550, 550.1650, 550.600, 550.550, 550.550, 550.1700, 550.550, 550.1700, 550.1700, 550.550, 550.1650, 600.1650 , 550,1700, 550}; CHANNEL DOWNunsigned int chanDown [67] ={4500,4450, 600,1650, 550,1700, 550,1650, 550.600, 550.550, 550.550, 550.600, 500.600, 550.1700, 500.1700, 550.1700, 550.550, 550.600 , 550.550, 550.550, 550.550, 600.550, 550.550, 550.600, 500.600, 550.1650, 600.550, 550.550, 550.550, 600.1650, 550.1700, 500.1700, 600.1650, 550.550, 600.1650, 550.1700 , 500, 1700, 550};
Parte 2:Arduino IoT Cloud
Da nuvem Arduino IoT principal página, vamos criar um novo Coisa e atribua a ele um nome significativo. Vamos chamá-lo de TVRemoteController . Em seguida, selecionaremos a placa que iremos usar. Para este tutorial usamos um Arduino Nano 33 IoT, mas se você tiver outra placa compatível também vai servir, apenas lembre-se que a pinagem e o comportamento da biblioteca IR podem mudar. Se neste ponto você não consegue ver o seu quadro, você pode ter pulado o Primeiros passos procedimento que mencionamos acima, se for esse o caso, volte por esse processo.
Uma vez feito isso, vamos adicionar uma Propriedade para nossa Coisa , ele representará nosso aparelho de TV. Na casa inteligente categoria, selecione "TV" como o tipo de propriedade, defina-o como "Leitura e gravação" e, em "Atualizar", selecione "Quando o valor mudar".
Aqui está o que as Propriedades visão de nossa coisa deve ser semelhante a este ponto:

Parte 3:Editor da Web do Arduino
Chegou a hora de clicar no botão "EDIT SKETCH", que nos levará ao Web Editor, onde podemos adicionar algum código personalizado ao Sketch gerado automaticamente pelo IoT Cloud.
A primeira coisa que temos que incluir é a biblioteca IR Remote, de Ken Shirriff.
#include
Em seguida, temos que configurar um array bidimensional para nossos canais e 6 arrays para os comandos de que precisamos. Se você se lembra, na Parte 1 capturamos alguns dados de infravermelho que agora usaremos para preencher nossos arrays
const unsigned int chan [9] [67] ={{chan1}, {chan2}, {chan3}, {chan4}, {chan5}, {chan6}, {chan7}, {chan8}, {chan9}}; const unsigned int volUp [67] ={...}; const unsigned int volDown [67] ={...}; const unsigned int chanUp [67] ={...}; const unsigned int chanDown [67] ={...}; const unsigned int onoff [67] ={...}; const unsigned int mute [67] ={...};
Vamos então configurar a biblioteca IR e a frequência necessária (para este tipo de aplicação, sempre será 38KHz)
IRsend irsend; const int freq =38;
Também precisaremos de uma função para enviar comandos IR e piscar o LED embutido (neste estágio principalmente para fins de depuração). O valor de atraso usado dependerá da marca e do modelo de sua televisão, portanto, fique à vontade para ajustá-lo se as coisas não estiverem funcionando como esperado (comandos errados ou nenhum comando recebido).
void sendIR (const unsigned int buf []) {digitalWrite (LED_BUILTIN, HIGH); irsend.sendRaw (buf, 67, freq); atraso (300); digitalWrite (LED_BUILTIN, LOW);}
A etapa final é concluir o retorno de chamada gerado
onTvChange ()
com algum código personalizado para enviar comandos IR quando a propriedade TV é alterada por comandos Alexa. Por exemplo, se o volume for aumentado, temos que virtualmente pressionar o botão Aumentar o volume, se o canal estiver configurado para 7, temos que enviar a sequência para o botão do canal 7 e assim por diante. void onTvChange () {Serial.println ("=================="); Serial.println ("Switch:" + String (tv.getSwitch ())); Serial.println ("Volume:" + String (tv.getVolume ())); Serial.println ("Canal:" + String (tv.getChannel ())); Serial.println ("Mudo:" + String (tv.getMute ())); Serial.println ("=================="); if (primeiro) {prevSwitch =tv.getSwitch (); prevVolume =tv.getVolume (); prevChannel =tv.getChannel (); prevMute =tv.getMute (); primeiro =falso; Retorna; } // Volume alterado if (tv.getVolume ()> prevVolume) {tv.setMute (false); prevMute =false; for (int k =prevVolume + 1; k <=tv.getVolume (); k ++) {sendIR (volUp); Serial.println ("Volume solicitado:" + String (tv.getVolume ()) + "Set:" + String (k)); } prevVolume =tv.getVolume (); } else if (tv.getVolume () =tv.getVolume (); k--) {sendIR (volDown); Serial.println ("Volume alterado:" + String (tv.getVolume ()) + "Set:" + String (k)); } prevVolume =tv.getVolume (); } // Mudo alterado if (tv.getMute ()! =PrevMute &&tv.getMute ()) {prevMute =tv.getMute (); sendIR (mudo); Serial.println ("Mudo alterado:" + String (tv.getMute ())); } else if (tv.getMute ()! =prevMute &&! tv.getMute ()) {prevMute =tv.getMute (); sendIR (mudo); Serial.println ("Mudo alterado:" + String (tv.getMute ())); } // Canal alterado if (tv.getChannel ()! =PrevChannel) {int newChannel =tv.getChannel (); if (newChannel> 0 &&newChannel <10) {sendIR (chan [newChannel-1]); } else if (newChannel> 9) {if (newChannel> prevChannel) {for (int ch =prevChannel; ch newChannel; ch--) {sendIR (chanDown); Serial.println ("Chan solicitado:" + String (newChannel) + "Set:" + String (ch)); }}} prevChannel =newChannel; Serial.println ("Canal alterado:" + String (tv.getChannel ())); } // Ligado / Desligado alterado if (tv.getSwitch ()! =PrevSwitch) {prevSwitch =tv.getSwitch (); if (tv.getSwitch ()) {sendIR (chan [6]); } else {sendIR (onoff); } Serial.println ("Switch alterado:" + String (tv.getSwitch ())); }
Parte 4:Amazon Alexa
Agora precisaremos do aplicativo Amazon Alexa que pode ser baixado da Apple App Store ou Google Play Store. Depois de instalado, faça login com sua conta existente ou crie uma nova.
Vamos seguir as etapas necessárias para instalar o Arduino Alexa Skill e configurá-lo para acessar e controlar nossa TV. Seguiremos a sequência de imagens abaixo para ver todas as etapas necessárias.











Terminamos, agora é hora de controlar a voz da nossa TV perguntando coisas como
- ”Alexa, aumente o volume da TV.”
- ”Alexa, ativar o som da TV" ou “Alexa, ativar o som da TV.”
- ”Alexa, próximo canal na TV.”
Divirta-se jogando com Alexa e IoT Cloud. Se você tiver dúvidas e / ou construir este projeto, deixe-nos saber nos comentários abaixo.
Obrigada,
A equipe do Arduino
Código
Arduino
Esquemas

Processo de manufatura
- Habilite o controle Alexa para o seu ventilador de teto
- Máquina de LEVITAÇÃO ULTRASÔNICA Usando ARDUINO
- Controle remoto universal usando Arduino, 1Sheeld e Android
- Faça você mesmo voltímetro usando Arduino e Smartphone
- Monitor de freqüência cardíaca usando IoT
- Usando IoT para controlar remotamente um braço robótico
- IOT - Jar inteligente usando ESP8266, Arduino e sensor ultrassônico
- Conheça a temperatura de sua casa de qualquer lugar com a nuvem Arduino!
- Controle o Arduino Rover usando Firmata e o controlador do Xbox One
- Controle do umidificador Arduino