Nota

Ciao, benvenuto nella community degli appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino e ESP32 con altri appassionati.

Perché unirti?

  • Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del team.

  • Apprendimento e Condivisione: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri ultimi prodotti.

  • Promozioni Festive e Concorsi: Partecipa a concorsi e promozioni speciali.

👉 Pronto per esplorare e creare con noi? Clicca [Qui] e unisciti oggi!

Sistema di Chiamata Cloud con MQTT

Il protocollo di messaggistica Message Queuing Telemetry Transport (MQTT) è semplice ma ampiamente utilizzato nel campo dell’Internet delle cose (IoT).

I protocolli MQTT definiscono come i dispositivi IoT scambiano dati. Operano in modo event-driven e sono interconnessi utilizzando il modello Publish/Subscribe. Il mittente (Publisher) e il ricevente (Subscriber) comunicano tramite Topics. Un dispositivo pubblica un messaggio su un topic specifico e tutti i dispositivi abbonati a quel topic ricevono il messaggio.

In questa sezione, creeremo un sistema di campanello di servizio utilizzando UNO R4, HiveMQ (un servizio broker MQTT pubblico gratuito) e quattro pulsanti. Ogni pulsante corrisponde a un tavolo del ristorante e quando un cliente preme un pulsante, sarà possibile vedere quale tavolo ha bisogno di assistenza su HiveMQ.

Componenti Necessari

Per questo progetto, sono necessari i seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ARTICOLI IN QUESTO KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

È anche possibile acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK DI ACQUISTO

Arduino Uno R4 WiFi

-

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Pulsante

ACQUISTA

Cablaggio

../_images/04_mqtt_button_bb.png

Schema

../_images/04_mqtt_button_schematic.png

Come Funziona?

HiveMQ è una piattaforma di messaggistica basata su broker MQTT che facilita il trasferimento rapido, efficiente e affidabile dei dati ai dispositivi IoT.

  1. Apri HiveMQ Web Client nel tuo browser web.

  2. Collega il client al proxy pubblico predefinito.

    ../_images/04_mqtt_1.png
  3. Clicca su Aggiungi Nuova Sottoscrizione Topic.

    ../_images/04_mqtt_2.png
  4. Inserisci i topic che desideri seguire e clicca su Sottoscrivi. Assicurati che i topic che imposti qui siano unici per evitare di ricevere messaggi da altri utenti e presta attenzione alla sensibilità delle maiuscole e minuscole.

    In questo esempio di codice, impostiamo il topic come SunFounder MQTT Test. Se hai apportato modifiche, assicurati che il topic nel codice corrisponda al topic sottoscritto sulla pagina web.

    ../_images/04_mqtt_3.png

Installazione della Libreria

Per installare la libreria, utilizza il Gestore delle Librerie Arduino e cerca «ArduinoMqttClient» e installalo.

ArduinoMqttClient.h: Utilizzato per la comunicazione MQTT.

Esecuzione del Codice

Nota

  • Puoi aprire il file 04_mqtt_button.ino nel percorso elite-explorer-kit-main\iot_project\04_mqtt_button direttamente.

  • Oppure copia questo codice nell’IDE di Arduino.

Nota

Nel codice, SSID e password sono memorizzati in arduino_secrets.h. Prima di caricare questo esempio, è necessario modificarli con le proprie credenziali WiFi. Inoltre, per motivi di sicurezza, assicurati che queste informazioni siano mantenute riservate durante la condivisione o la memorizzazione del codice.

arduino_secrets.h
#define SECRET_SSID "your_ssid"        // your network SSID (name)
#define SECRET_PASS "your_password"        // your network password (use for WPA, or use as key for WEP)
04_mqtt_button.ino
  1/*
  2  The code is designed for an Arduino Uno R4 WiFi to establish a connection with 
  3  both a Wi-Fi network and an MQTT broker. It constantly monitors the status of 
  4  four buttons that are connected to digital inputs. Whenever a button is pressed, 
  5  it sends a message to a specific MQTT topic. Additionally, the code incorporates 
  6  functions for displaying Wi-Fi network information and managing received MQTT 
  7  messages.
  8
  9  Board: Arduino Uno R4 WiFi
 10  Component: Button
 11  Library: https://github.com/arduino-libraries/ArduinoMqttClient (ArduinoMqttClient by Arduino)
 12*/
 13
 14#include <WiFiS3.h>
 15#include <ArduinoMqttClient.h>
 16
 17#include "arduino_secrets.h"
 18///////please enter your sensitive data in the Secret tab/arduino_secrets.h
 19char ssid[] = SECRET_SSID;    // your network SSID (name)
 20char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
 21int status = WL_IDLE_STATUS;  // the WiFi radio's status
 22
 23WiFiClient wifiClient;
 24MqttClient mqttClient(wifiClient);
 25
 26const char broker[] = "broker.hivemq.com";
 27int port = 1883;
 28const char topic[] = "SunFounder MQTT Test";
 29
 30//init buttons & states
 31const int buttonPins[4] = { 2, 3, 4, 5 };
 32bool previousButtonStates[4] = { false, false, false, false };
 33
 34void setup() {
 35  //Initialize serial and wait for port to open:
 36  Serial.begin(9600);
 37
 38  while (!Serial) {
 39    ;  // wait for serial port to connect. Needed for native USB port only
 40  }
 41
 42  // check for the WiFi module:
 43  if (WiFi.status() == WL_NO_MODULE) {
 44    Serial.println("Communication with WiFi module failed!");
 45    // don't continue
 46    while (true)
 47      ;
 48  }
 49
 50  String fv = WiFi.firmwareVersion();
 51  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
 52    Serial.println("Please upgrade the firmware");
 53  }
 54
 55  // attempt to connect to WiFi network:
 56  while (status != WL_CONNECTED) {
 57    Serial.print("Attempting to connect to WPA SSID: ");
 58    Serial.println(ssid);
 59    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
 60    status = WiFi.begin(ssid, pass);
 61
 62    // wait 5 seconds for connection:
 63    delay(5000);
 64  }
 65
 66  // you're connected now, so print out the data:
 67  Serial.print("You're connected to the network");
 68  printCurrentNet();
 69  printWifiData();
 70
 71  // You can provide a unique client ID, if not set the library uses Arduino-millis()
 72  // Each client must have a unique client ID
 73  // mqttClient.setId("clientId");
 74
 75  // You can provide a username and password for authentication
 76  // mqttClient.setUsernamePassword("username", "password");
 77
 78  Serial.print("Attempting to connect to the MQTT broker: ");
 79  Serial.println(broker);
 80
 81  if (!mqttClient.connect(broker, port)) {
 82    Serial.print("MQTT connection failed! Error code = ");
 83    Serial.println(mqttClient.connectError());
 84
 85    while (1)
 86      ;
 87  }
 88
 89  Serial.println("You're connected to the MQTT broker!");
 90  Serial.println();
 91
 92  // set the message receive callback
 93  mqttClient.onMessage(onMqttMessage);
 94
 95  Serial.print("Subscribing to topic: ");
 96  Serial.println(topic);
 97  Serial.println();
 98
 99  // subscribe to a topic
100  mqttClient.subscribe(topic);
101
102  // topics can be unsubscribed using:
103  // mqttClient.unsubscribe(topic);
104
105  Serial.print("Waiting for messages on topic: ");
106  Serial.println(topic);
107  Serial.println();
108
109  // set button pins as INPUT_PULLUP
110  for (int i = 0; i < 4; i++) {
111    pinMode(buttonPins[i], INPUT_PULLUP);
112    previousButtonStates[i] = digitalRead(buttonPins[i]);
113  }
114}
115
116void loop() {
117
118  // call poll() regularly to allow the library to receive MQTT messages and
119  // send MQTT keep alives which avoids being disconnected by the broker
120  mqttClient.poll();
121
122  // Check button status
123  for (int i = 0; i < 4; i++) {
124    bool currentButtonState = digitalRead(buttonPins[i]);
125
126    // If the button is pressed and its previous state was not pressed.
127    if (!currentButtonState && previousButtonStates[i]) {
128      sendButtonMessage(i + 1);  // The message that the send button has been pressed.
129    }
130
131    previousButtonStates[i] = currentButtonState;  // Update button status
132  }
133
134  // Add a delay to avoid constant pinging
135  delay(50);
136}
137
138void printWifiData() {
139  // print your board's IP address:
140  IPAddress ip = WiFi.localIP();
141  Serial.print("IP Address: ");
142
143  Serial.println(ip);
144
145  // print your MAC address:
146  byte mac[6];
147  WiFi.macAddress(mac);
148  Serial.print("MAC address: ");
149  printMacAddress(mac);
150}
151
152void printCurrentNet() {
153  // print the SSID of the network you're attached to:
154  Serial.print("SSID: ");
155  Serial.println(WiFi.SSID());
156
157  // print the MAC address of the router you're attached to:
158  byte bssid[6];
159  WiFi.BSSID(bssid);
160  Serial.print("BSSID: ");
161  printMacAddress(bssid);
162
163  // print the received signal strength:
164  long rssi = WiFi.RSSI();
165  Serial.print("signal strength (RSSI):");
166  Serial.println(rssi);
167
168  // print the encryption type:
169  byte encryption = WiFi.encryptionType();
170  Serial.print("Encryption Type:");
171  Serial.println(encryption, HEX);
172  Serial.println();
173}
174
175void printMacAddress(byte mac[]) {
176  for (int i = 5; i >= 0; i--) {
177    if (mac[i] < 16) {
178      Serial.print("0");
179    }
180    Serial.print(mac[i], HEX);
181    if (i > 0) {
182      Serial.print(":");
183    }
184  }
185  Serial.println();
186}
187
188
189void onMqttMessage(int messageSize) {
190  // we received a message, print out the topic and contents
191  Serial.print("Received a message with topic '");
192  Serial.print(mqttClient.messageTopic());
193  Serial.println("'");
194  Serial.print("Message length: ");
195  Serial.print(messageSize);
196  Serial.println(" bytes:");
197
198  // Read the message contents into a String
199  String message = mqttClient.readString();
200
201  // Convert the received message and comparison strings to lowercase
202  message.toLowerCase();
203
204  Serial.print("Message to me: ");
205  Serial.println(message);
206
207  Serial.println();
208}
209
210void sendButtonMessage(int buttonNumber) {
211  String message = "Button " + String(buttonNumber) + " was pressed.";
212
213  Serial.println(message);
214
215  mqttClient.beginMessage(topic);
216  mqttClient.print(message);
217  mqttClient.endMessage();
218}

Dopo aver eseguito il codice, torna su HiveMQ Web Client e quando premi uno dei pulsanti sulla breadboard, vedrai il prompt Messaggi su HiveMQ.

../_images/04_mqtt_4.png

Funzionamento del Codice

Questo codice è per un progetto basato su Arduino che si connette al WiFi e comunica con un broker MQTT utilizzando il protocollo MQTT. Inoltre, può rilevare se quattro pulsanti sono premuti e inviare i messaggi corrispondenti al broker MQTT.

Ecco una spiegazione dettagliata del codice:

  1. Includi Librerie Pertinenti:

    #include <WiFiS3.h>
    #include <ArduinoMqttClient.h>
    
  2. Includi Informazioni Sensibili:

    • Il file arduino_secrets.h contiene l’SSID e la password per la rete WiFi.

    #include "arduino_secrets.h"
    char ssid[] = SECRET_SSID;
    char pass[] = SECRET_PASS;
    
  3. Inizializza Variabili:

    • Variabili per gestire le connessioni WiFi e MQTT.

    • Inizializza pin dei pulsanti e stati dei pulsanti.

  4. setup():

    • Inizializza la comunicazione seriale.

    • Verifica la presenza del modulo WiFi e tenta di connettersi al WiFi.

    • Stampa dati di rete.

    • Tentativo di connessione al broker MQTT.

    • Sottoscrivi i topic MQTT.

    • Imposta i pulsanti in modalità input.

  5. loop():

    • Mantieni attiva la connessione MQTT.

    • Verifica se ogni pulsante è premuto e, in caso affermativo, invia messaggi MQTT.

  6. Altre Funzioni di Utilità:

    • printWifiData(): Stampa informazioni sulla rete WiFi attualmente connessa.

    • printCurrentNet(): Stampa dati rilevanti sulla rete attuale.

    • printMacAddress(byte mac[]): Stampa l’indirizzo MAC.

    • onMqttMessage(int messageSize): Funzione di callback attivata quando viene ricevuto un messaggio dal broker MQTT. Stampa il topic del messaggio ricevuto e il contenuto.

    • sendButtonMessage(int buttonNumber): Usa questa funzione per inviare messaggi MQTT quando viene premuto un pulsante.