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+ |
È anche possibile acquistarli separatamente dai link sottostanti.
INTRODUZIONE AI COMPONENTI |
LINK DI ACQUISTO |
|---|---|
- |
|
Cablaggio
Schema
Come Funziona?
HiveMQ è una piattaforma di messaggistica basata su broker MQTT che facilita il trasferimento rapido, efficiente e affidabile dei dati ai dispositivi IoT.
Apri HiveMQ Web Client nel tuo browser web.
Collega il client al proxy pubblico predefinito.
Clicca su Aggiungi Nuova Sottoscrizione Topic.
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.
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.inonel percorsoelite-explorer-kit-main\iot_project\04_mqtt_buttondirettamente.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.
#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)
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.
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:
Includi Librerie Pertinenti:
#include <WiFiS3.h> #include <ArduinoMqttClient.h>
Includi Informazioni Sensibili:
Il file
arduino_secrets.hcontiene l’SSID e la password per la rete WiFi.
#include "arduino_secrets.h" char ssid[] = SECRET_SSID; char pass[] = SECRET_PASS;
Inizializza Variabili:
Variabili per gestire le connessioni WiFi e MQTT.
Inizializza pin dei pulsanti e stati dei pulsanti.
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.
loop():Mantieni attiva la connessione MQTT.
Verifica se ogni pulsante è premuto e, in caso affermativo, invia messaggi MQTT.
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.