Projeto Smart Home IoT usando o Arduino Cloud e ESP32 Alexa

Tempo de leitura: 8 minutes

Neste projeto de IoT para casa inteligente, expliquei como criar um sistema de automação residencial Arduino Cloud ESP32 Alexa para controlar aparelhos com a Internet de qualquer lugar do mundo. Com este projeto de internet das coisas, você pode controlar 4 relés de Painel do Arduino IoT Cloud, Alexa, Controle remoto IR, e interruptores manuais. Você também pode monitorar o tempo real. temperatura ambiente no painel de nuvem do Arduino e no aplicativo Amazon Alexa. Se houver sem internet disponível ainda, você pode controlar os aparelhos a partir do controle remoto IR e comutadores.

Eu usei tudo Ferramentas GRATUITAS e você não precisa de nenhum dispositivo Alexa ou Amazon Echo Dot para este projeto de IoT em casa inteligente de controle de voz.

Portanto, se você seguir todas as etapas, poderá facilmente criar este sistema de automação residencial Nuvem de arduino IoT ESP32 para sua casa.

 

Componentes necessários para os projetos da IoT ESP32

  1. ESP32 DevKIT V1
  2. Módulo de relé SPDT de 4 canais e 5V
  3. Sensor DHT11
  4. Receptor de infravermelho TSOP1838 (com estojo metálico)
  5. Botões de pressão
  6. Qualquer controle remoto de infravermelho
  7. Amazon Echo Dot (opcional)

Circuito dos projetos do Arduino Cloud ESP32

O circuito é muito simples, eu já usei D23, D22, D21 e D19 GPIO para controlar o módulo de relé de 4 canais.

E o GPIO D13, D12, D14 e D27 conectado com botões para controlar o módulo de relé manualmente.

Eu usei o INPUT_PULLUP funcione no IDE do Arduino em vez de usar os resistores de puxar para cima a cada botão.

De acordo com o código fonte, quando os pinos de controle do módulo de relé recebem a BAIXO sinalize o relé ligue e o revezamento irá desligue para o ALTO sinal no pino de controle.

Receptor remoto IR (TSOP1838) conectado D35. E o. Sensor DHT11 conectado com RX2 (GPIO16).

Se você deseja usar os interruptores travados em vez de botões, basta conectar os interruptores em vez dos botões nos pinos GPIO e GND

Usei um carregador móvel de 5V 5Amp para fornecer o circuito.

Tome as devidas precauções de segurança ao conectar os aparelhos CA.

 

Configuração do controle sem a nuvem da IoT

Para este projeto de IoT, usei o Arduino Cloud Plano livre.

Primeiro, você deve adicionar dispositivos ESP32 no Arduino IoT Cloud.

Então você tem que adicionar 4 Switch compatível com Alexa variáveis e 1 Variável do sensor de temperatura para a coisa da nuvem do Arduino.

Clique no link a seguir para obter mais detalhes sobre a configuração do Arduino IoT Cloud.

Tutorial do Arduino IoT Cloud para ESP8266 e ESP32

Pontos importantes para o projeto da Internet das Coisas ESP32 :

  1. Você pode controlar no máximo 5 relés ou sensores com o plano GRATUITO da nuvem Arduino IoT.
  2. Receptor de infravermelho sensor deve ter um invólucro metálico Caso contrário, você poderá enfrentar problemas ao tentar obter o código Hex.
  3. Você não precisa de uma Amazon Echo Dot ou quaisquer outros dispositivos Alexa para este projeto. Mas se você tiver, pode usá-lo.
  4. Depois de compilar o código, você precisa pressione e segure o botão BOOT do ESP32 até o código começar a carregar.
  5. Você também pode usar Editor da Web do Arduino para programar o ESP32.
  6. Você receberá feedback em tempo real se o ESP32 estiver conectado à Internet.
  7. Use um estábulo Fonte de alimentação de 5V 5A DC.

Programa ESP32 com Arduino IDE

Segue as etapas para programar o NodeMCU usando o IDE do Arduino

  1. Atualize o Preferências -> Placas adicionais URLs do gerente: https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
  2. Então instale o ESP32 em Ferramentas -> Placa -> Gerenciador de Placas ou Clique aqui para baixar o driver da placa ESP32.
  3. Faça o download das bibliotecas necessárias nos seguintes links :

 

Vá para Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas no IDE do Arduino.

Quando você tenta instalar o ArduinoIoTCloud biblioteca, ele solicitará que você instale todas as dependências. Então clique em Instale tudo.

Código para automação residencial Arduino IoT Cloud ESP32

<Código do Botão Download> <Código de Chamado Download>

/**********************************************************************************
 ** TÍTULO: Arduino IoT Cloud + Alexa + IR + Controle manual 4 relés com DHT11 e feedback em tempo real usando ESP32
  * Clique nos links a seguir para saber mais.
  * Preferências -> URLs do gerenciador de placas adicionais:
  * https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
  *
  * Baixe o Board ESP32: https://github.com/espressif/arduino-esp32
  * Baixe as bibliotecas
  * Biblioteca ArduinoIoTCloud com todas as dependências: https://github.com/arduino-libraries/ArduinoIoTCloud
  * Biblioteca IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote
 **********************************************************************************/

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
#include <DHT.h>
#include <IRremote.h>

const char THING_ID[]           = ""; //Entre com THING ID
const char DEVICE_LOGIN_NAME[]  = ""; //Entre com DEVICE ID

const char SSID[]               = "";    //Insira WiFi SSID (nome)
const char PASS[]               = "";    //Digite a senha do WiFi
const char DEVICE_KEY[]         = "";    //Digite a senha secreta do dispositivo (chave secreta)

#define DHTPIN              16 //RX2 pino conectado com DHT
#define IR_RECV_PIN         35 //D35 pino conectado com IC receptor IR

// define o GPIO conectado com relés e interruptores
#define RelayPin1 23  //D23
#define RelayPin2 22  //D22
#define RelayPin3 21  //D21
#define RelayPin4 19  //D19

#define SwitchPin1 13  //D13
#define SwitchPin2 12  //D12
#define SwitchPin3 14  //D14
#define SwitchPin4 27  //D27

#define wifiLed    2   //D2

// Remova o comentário de qualquer tipo que você esteja usando!
#define DHTTYPE DHT11     // DHT 11
//#define DHTTYPE DHT22   // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21   // DHT 21, AM2301


DHT dht(DHTPIN, DHTTYPE);
IRrecv irrecv(IR_RECV_PIN);
decode_results results;

int toggleState_1 = 0; //Defina o número inteiro para lembrar o estado de alternância para o relé 1
int toggleState_2 = 0; //Defina o número inteiro para lembrar o estado de alternância para o relé 2
int toggleState_3 = 0; //Defina o número inteiro para lembrar o estado de alternância para o relé 3
int toggleState_4 = 0; //Defina o número inteiro para lembrar o estado de alternância para o relé 4

float temperature1 = 0;
float humidity1   = 0;
int   reconnectFlag = 0;

void onSwitch1Change();
void onSwitch2Change();
void onSwitch3Change();
void onSwitch4Change();

CloudSwitch switch1;
CloudSwitch switch2;
CloudSwitch switch3;
CloudSwitch switch4;
CloudTemperatureSensor temperature;

void initProperties(){

  ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
  ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
  ArduinoCloud.setThingId(THING_ID);
  ArduinoCloud.addProperty(switch1, READWRITE, ON_CHANGE, onSwitch1Change);
  ArduinoCloud.addProperty(switch2, READWRITE, ON_CHANGE, onSwitch2Change);
  ArduinoCloud.addProperty(switch3, READWRITE, ON_CHANGE, onSwitch3Change);
  ArduinoCloud.addProperty(switch4, READWRITE, ON_CHANGE, onSwitch4Change);
  ArduinoCloud.addProperty(temperature, READ, 8 * SECONDS, NULL); //Update temperature value after every 8 seconds
}

WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);

void readSensor(){
     
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // ou dht.readTemperature(true) para Fahrenheit
  
  if (isnan(h) || isnan(t)) {
    Serial.println("Falha ao ler do sensor DHT!");
    return;
  }
  else {
    humidity1 = h;
    temperature = t;
   // Serial.println(tempareture);
  }  
}

void sendSensor()
{
  readSensor();
}

void ir_remote_control(){
  if (irrecv.decode(&results)) {
    
      switch(results.value){
          case 0x80BF49B6:  relayOnOff(1); switch1 = toggleState_1; break; //atualize o código HEX
          case 0x80BFC936:  relayOnOff(2); switch2 = toggleState_2; break; //atualize o código HEX
          case 0x80BF33CC:  relayOnOff(3); switch3 = toggleState_3; break; //atualize o código HEX
          case 0x80BF718E:  relayOnOff(4); switch4 = toggleState_4; break; //atualize o código HEX
          default : break;         
        }   
        //Serial.println(results.value, HEX);    
        irrecv.resume();   
  } 
}

void relayOnOff(int relay) {

  switch (relay) {
    case 1:
      if (toggleState_1 == 0) {
        digitalWrite(RelayPin1, LOW); // ligar o relé 1
        toggleState_1 = 1;
        Serial.println("Device1 ON");
      }
      else {
        digitalWrite(RelayPin1, HIGH); // desligue o relé 1
        toggleState_1 = 0;
        Serial.println("Device1 OFF");
      }
      delay(100);
      break;
    case 2:
      if (toggleState_2 == 0) {
        digitalWrite(RelayPin2, LOW); // ligar o relé 2
        toggleState_2 = 1;
        Serial.println("Device2 ON");
      }
      else {
        digitalWrite(RelayPin2, HIGH); // desligue o relé 2
        toggleState_2 = 0;
        Serial.println("Device2 OFF");
      }
      delay(100);
      break;
    case 3:
      if (toggleState_3 == 0) {
        digitalWrite(RelayPin3, LOW); // ligar o relé 3
        toggleState_3 = 1;
        Serial.println("Device3 ON");
      } else {
        digitalWrite(RelayPin3, HIGH); // desligue o relé 3
        toggleState_3 = 0;
        Serial.println("Device3 OFF");
      }
      delay(100);
      break;
    case 4:
      if (toggleState_4 == 0) {
        digitalWrite(RelayPin4, LOW); // ligar o relé 4
        toggleState_4 = 1;
        Serial.println("Device4 ON");
      }
      else {
        digitalWrite(RelayPin4, HIGH); // desligue o relé 4
        toggleState_4 = 0;
        Serial.println("Device4 OFF");
      }
      delay(100);
      break;
    default : break;
  }
}

void manual_control() {
  //Manual Switch Control
  if (digitalRead(SwitchPin1) == LOW) {
    delay(200);
    relayOnOff(1);
    switch1 = toggleState_1;
  }
  else if (digitalRead(SwitchPin2) == LOW) {
    delay(200);
    relayOnOff(2);
    switch2 = toggleState_2;
  }
  else if (digitalRead(SwitchPin3) == LOW) {
    delay(200);
    relayOnOff(3);
    switch3 = toggleState_3;
  }
  else if (digitalRead(SwitchPin4) == LOW) {
    delay(200);
    relayOnOff(4);
    switch4 = toggleState_4;
  }
}

void doThisOnConnect(){
  /* adicione seu código personalizado aqui */
  Serial.println("Placa conectada com sucesso ao Arduino IoT Cloud");
  digitalWrite(wifiLed, HIGH); //Desligue o LED WiFi
}
void doThisOnSync(){
  /* adicione seu código personalizado aqui */
  Serial.println("Propriedades da Coisa sincronizadas");
}

void doThisOnDisconnect(){
  /* add your custom code here */
  Serial.println("Placa desconectada do Arduino IoT Cloud");
  digitalWrite(wifiLed, LOW); //Desligue o LED WiFi
}

void setup() {
  // Inicialize o serial e espere a porta abrir:
  Serial.begin(9600);
  // Este atraso dá a chance de esperar por um Monitor Serial sem bloquear se nenhum for encontrado
  delay(1500);

  // Definido em thingProperties.h
  initProperties();
  dht.begin();
  irrecv.enableIRIn(); // Start the receiver
  // Conecte-se ao Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);

  ArduinoCloud.addCallback(ArduinoIoTCloudEvent::CONNECT, doThisOnConnect);
  ArduinoCloud.addCallback(ArduinoIoTCloudEvent::SYNC, doThisOnSync);
  ArduinoCloud.addCallback(ArduinoIoTCloudEvent::DISCONNECT, doThisOnDisconnect);

  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();

  pinMode(RelayPin1, OUTPUT);
  pinMode(RelayPin2, OUTPUT);
  pinMode(RelayPin3, OUTPUT);
  pinMode(RelayPin4, OUTPUT);

  pinMode(wifiLed, OUTPUT);

  pinMode(SwitchPin1, INPUT_PULLUP);
  pinMode(SwitchPin2, INPUT_PULLUP);
  pinMode(SwitchPin3, INPUT_PULLUP);
  pinMode(SwitchPin4, INPUT_PULLUP);

  //Durante a partida, todos os relés devem DESLIGAR
  digitalWrite(RelayPin1, HIGH);
  digitalWrite(RelayPin2, HIGH);
  digitalWrite(RelayPin3, HIGH);
  digitalWrite(RelayPin4, HIGH);
}

void loop() {

  ArduinoCloud.update();
  
  manual_control();     //Manual Control
  ir_remote_control();  //Controle Remoto IR
  sendSensor();         //Obter dados do sensor
}

void onSwitch1Change() {
  //Controlar o dispositivo
  if (switch1 == 1)
  {
    digitalWrite(RelayPin1, LOW);
    Serial.println("Device1 ON");
    toggleState_1 = 1;
  }
  else
  {
    digitalWrite(RelayPin1, HIGH);
    Serial.println("Device1 OFF");
    toggleState_1 = 0;
  }
}

void onSwitch2Change() {
  if (switch2 == 1)
  {
    digitalWrite(RelayPin2, LOW);
    Serial.println("Device2 ON");
    toggleState_2 = 1;
  }
  else
  {
    digitalWrite(RelayPin2, HIGH);
    Serial.println("Device2 OFF");
    toggleState_2 = 0;
  }
}

void onSwitch3Change() {
  if (switch3 == 1)
  {
    digitalWrite(RelayPin3, LOW);
    Serial.println("Device3 ON");
    toggleState_3 = 1;
  }
  else
  {
    digitalWrite(RelayPin3, HIGH);
    Serial.println("Device3 OFF");
    toggleState_3 = 0;
  }
}

void onSwitch4Change() {
  if (switch4 == 1)
  {
    digitalWrite(RelayPin4, LOW);
    Serial.println("Device4 ON");
    toggleState_4 = 1;
  }
  else
  {
    digitalWrite(RelayPin4, HIGH);
    Serial.println("Device4 OFF");
    toggleState_4 = 0;
  }
}

Após fazer o upload do código para o ESP32, consulte os seguintes artigos para conectar a conta do Arduino IoT Cloud ao aplicativo Amazon Alexa.

Conecte Arduino Cloud com Alexa

Depois de fazer todas essas etapas, agora você controla os aparelhos com Alexa.

Relé de controle do Alexa ESP32 usando o Arduino Cloud

Se o ESP32 estiver conectado com WiFi, então você pode pedir a Alexa para acender a luz [“Alexa, Turn ON Room Light”]. Assim, você pode controlar os aparelhos como luzes, ventiladores, etc. com comandos de voz usando o aplicativo Amazon Alexa de qualquer lugar do mundo.

Você também pode monitorar os feedbacks em tempo real e a temperatura ambiente no aplicativo Alexa.

 

Relés de controle com o aplicativo remoto Arduino IoT Cloud

Você também pode controlar os relés e monitorar a temperatura ambiente Aplicativo remoto para nuvem IoT do Arduino.

Basta baixar e instalar o aplicativo Arduino IoT Cloud Remote Google Play Store ou App Store, faça login na sua conta do Arduino Cloud e selecione o painel.

Às vezes, você precisa atualizar o painel várias vezes se enfrentar algum problema.

 

Relés de controle manualmente com botões de pressão

Sem controle manual Wi-Fi
Sem controle manual Wi-Fi
Relés de controle com botões de pressão
Relés de controle com botões de pressão

Você sempre pode controlar os aparelhos manualmente com botões. e se o ESP32 não estiver conectado ao Wi-Fi, você ainda poderá controlar os aparelhos com botões.

 

Relés de controle remoto IR com ESP32

Você também pode controlar os aparelhos com qualquer controle remoto IR.

Primeiro, você precisa obter os códigos HEX dos botões remotos e atualizar o código HEX no código. É isso aí. Agora você pode controlar os aparelhos com o controle remoto IR.

 

Visits: 2 Visits: 1126003