Campanello smart con ESP32, ESP8266 o Raspberry Pi Pico W per Alexa e Google Home

In questa sezione vedremo come creare un campanello usando un pulsante (tattile) collegato a un ESP32, ESP8266 o Raspberry Pi Pico W, per poi ricevere una notifica in Alexa, Google Home o nell’app Sinric Pro.

Prerequisiti :

  1. ESP32, ESP8266 o Raspberry Pi Pico W x 1.
  2. Pulsante x 1.
  3. Resistenza da 1K ~ 10K x 1
  4. Cavetti jumper.

Cablaggio del pulsante del campanello

Per collegare il nostro pulsante useremo la configurazione pull-down. Quando il pulsante viene premuto, digitalRead legge il segnale HIGH (1).

Sinric Pro doorbell push button wiring diagram

MCU Pin GPIO
ESP32 34
ESP8266 4 (D2)
Pico W 7

Leggere lo stato del pulsante

Verifichiamo che il pulsante sia collegato correttamente e funzioni.

#if defined(ESP8266)
  #define BUTTON_PIN        D4
#elif defined(ESP32) 
  #define BUTTON_PIN        34
#elif (ARDUINO_ARCH_RP2040)
  #define BUTTON_PIN        7
#endif

int button_state;
int lastbutton_state = LOW;

unsigned long last_debounce_time = 0;
unsigned long debounce_delay = 50; // increase if needed.

void setup() {
  Serial.begin(115200);	
  pinMode(BUTTON_PIN, INPUT);
}

void handle_button_press() {
  int reading = digitalRead(BUTTON_PIN);  
  if (reading != lastbutton_state) {
    last_debounce_time = millis();
  }

  if ((millis() - last_debounce_time) > debounce_delay) {
    if (reading != button_state) {
      button_state = reading;
      
      if (button_state == HIGH) {
        Serial.printf("Pressed!\r\n");
      }
    }
  }
  
  lastbutton_state = reading;
}

void loop() {
  handle_button_press();
}

Vedi questo codice su GitHub Gist

Sinric Pro pull-down arduino serial monitor

Passo 1 : Collegati a Sinric Pro

Crea un nuovo dispositivo: doorbell

Sinric Pro create device alexa

Appena fai clic sul pulsante di salvataggio, Amazon Alexa rileva automaticamente il dispositivo che abbiamo appena creato (se hai già collegato la nostra skill Alexa).

Sinric Pro alexa doorbell notification

Se non hai ricevuto la notifica push, chiedi semplicemente ad Alexa di cercare i dispositivi

Passo 1.1 Installa la libreria Sinric Pro

Sinric Pro install SinricPro library

2.2 Codice completo

// Uncomment the following line to enable serial debug output
//#define ENABLE_DEBUG

#ifdef ENABLE_DEBUG
  #define DEBUG_ESP_PORT Serial
  #define NODEBUG_WEBSOCKETS
  #define NDEBUG
#endif 

#include <Arduino.h>
#if defined(ESP8266)
  #include <ESP8266WiFi.h>
#elif defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
  #include <WiFi.h>
#endif

#include "SinricPro.h"
#include "SinricProDoorbell.h"

// Grab it from https://portal.sinric.pro.
#define APP_KEY    "" //Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx"
#define APP_SECRET "" //Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx"
#define DOORBELL_ID  "" //Should look like "6534xxxxxxxc08c6ea1b"

#define SSID       "" // Your WiFi SSID
#define PASS       "" // Your WiFi Password 

#define BAUD_RATE         115200                // Change baudrate to your need

#if defined(ESP8266)
  #define BUTTON_PIN        D4
#elif defined(ESP32) 
  #define BUTTON_PIN        34
#elif (ARDUINO_ARCH_RP2040)
  #define BUTTON_PIN        7
#endif

int button_state;
int lastbutton_state = LOW;

unsigned long last_debounce_time = 0;
unsigned long debounce_delay = 50; // increase if needed.
SinricProDoorbell& myDoorbell = SinricPro[DOORBELL_ID];

void handleButtonPress() {
  int reading = digitalRead(BUTTON_PIN);  
  if (reading != lastbutton_state) {
    last_debounce_time = millis();
  }

  if ((millis() - last_debounce_time) > debounce_delay) {
    if (reading != button_state) {
      button_state = reading;
      
      if (button_state == HIGH) {
        Serial.printf("[handleButtonPress()]: Button pressed!\r\n");
        bool success = myDoorbell.sendDoorbellEvent();
        if(!success) {
          Serial.printf("[handleButtonPress()]: Something went wrong...could not send Event to server!\r\n");
        }        
      }
    }
  }
  
  lastbutton_state = reading;
}
 
void setupWiFi() {
  Serial.printf("\r\n[setupWiFi()]: Connecting");

  #if defined(ESP8266)
    WiFi.setSleepMode(WIFI_NONE_SLEEP); 
    WiFi.setAutoReconnect(true);
  #elif defined(ESP32)
    WiFi.setSleep(false); 
    WiFi.setAutoReconnect(true);
  #endif

  WiFi.begin(WIFI_SSID, WIFI_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.printf(".");
    delay(250);
  }
  IPAddress localIP = WiFi.localIP();
  Serial.printf("connected!\r\n[setupWiFi()]: IP-Address is %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]);
}
 
void setupSinricPro() {
  SinricPro.onConnected([](){ Serial.printf("Connected to SinricPro\r\n"); }); 
  SinricPro.onDisconnected([](){ Serial.printf("Disconnected from SinricPro\r\n"); });
  SinricPro.begin(APP_KEY, APP_SECRET);
}

void setupButton() {
  pinMode(BUTTON_PIN, INPUT);
}

void setup() {
  Serial.begin(BAUD_RATE); Serial.printf("\r\n\r\n");
  setupButton();
  setupWiFi();
  setupSinricPro();
}

void loop() {
  handleButtonPress();
  SinricPro.handle();
}

Vedi questo codice su GitHub Gist

Nota: le notifiche del campanello di Alexa sono disattivate per impostazione predefinita. Devi abilitarle aprendo l’app per ricevere la notifica DingDong in Alexa.

Sinric Pro Alexa enable doorbell notification settings

Risoluzione dei problemi

Tutorial correlati

Questo documento è open source. Hai trovato un errore di battitura? Crea una issue