Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [ hier ] und treten Sie heute bei!

Cloud-Anrufsystem mit MQTT

Message Queuing Telemetry Transport (MQTT) ist ein einfaches Messaging-Protokoll und das am weitesten verbreitete in der Welt des Internet of Things (IoT).

MQTT-Protokolle definieren, wie IoT-Geräte Daten austauschen. Sie funktionieren ereignisgesteuert und sind über das Publish/Subscribe-Modell miteinander verbunden. Der Sender (Publisher) und der Empfänger (Subscriber) kommunizieren über Themen. Ein Gerät veröffentlicht eine Nachricht zu einem bestimmten Thema, und alle Geräte, die dieses Thema abonniert haben, erhalten die Nachricht.

In diesem Abschnitt erstellen wir ein Serviceklingelsystem mit UNO R4, HiveMQ (einem kostenlosen öffentlichen MQTT-Broker-Dienst) und vier Tasten. Jede der vier Tasten entspricht einem Restauranttisch, und wenn ein Kunde eine Taste drückt, können Sie auf HiveMQ sehen, welcher Tisch bedient werden muss.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Sie können sie auch separat über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 WiFi

-

Steckbrett

KAUFEN

Jumperkabel

KAUFEN

Knopf

KAUFEN

Verdrahtung

../_images/04_mqtt_button_bb.png

Schaltplan

../_images/04_mqtt_button_schematic.png

Wie funktioniert des?

HiveMQ ist ein MQTT-Broker und eine auf Client-Nachrichten basierende Plattform, die schnelle, effiziente und zuverlässige Datenübertragungen zu IoT-Geräten ermöglicht.

  1. Öffnen Sie HiveMQ Web Client in Ihrem Webbrowser.

  2. Verbinden Sie den Client mit dem standardmäßigen öffentlichen Proxy.

    ../_images/04_mqtt_1.png
  3. Klicken Sie auf Add New Topic Subscription.

    ../_images/04_mqtt_2.png
  4. Geben Sie die Themen ein, denen Sie folgen möchten, und klicken Sie auf Subscribe. Stellen Sie sicher, dass die von Ihnen festgelegten Themen einzigartig sind, um Nachrichten von anderen Benutzern zu vermeiden, und achten Sie auf Groß- und Kleinschreibung.

    In diesem Beispielcode haben wir das Thema als SunFounder MQTT Test festgelegt. Wenn Sie Änderungen vorgenommen haben, stellen Sie sicher, dass das Thema im Code mit dem auf der Webseite abonnierten Thema übereinstimmt.

    ../_images/04_mqtt_3.png

Bibliothek installieren

Um die Bibliothek zu installieren, verwenden Sie den Arduino Library Manager und suchen Sie nach „ArduinoMqttClient“, um sie zu installieren.

ArduinoMqttClient.h: Wird für die MQTT-Kommunikation verwendet.

Code ausführen

Bemerkung

  • Sie können die Datei 04_mqtt_button.ino direkt unter dem Pfad elite-explorer-kit-main\iot_project\04_mqtt_button öffnen.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

Bemerkung

Im Code werden SSID und Passwort in arduino_secrets.h gespeichert. Bevor Sie dieses Beispiel hochladen, müssen Sie sie mit Ihren eigenen WLAN-Anmeldeinformationen ändern. Außerdem sollten Sie aus Sicherheitsgründen diese Informationen vertraulich halten, wenn Sie den Code teilen oder speichern.

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}

Nachdem Sie den Code ausgeführt haben, gehen Sie zurück zu HiveMQ Web Client, und wenn Sie einen der Tasten auf dem Breadboard drücken, sehen Sie die Nachrichtenaufforderung auf HiveMQ.

../_images/04_mqtt_4.png

Wie funktioniert des?

Dieser Code ist für ein Arduino-basiertes Projekt, das sich mit Wi-Fi verbindet und über das MQTT-Protokoll mit einem MQTT-Broker kommuniziert. Zusätzlich kann es erkennen, ob vier Tasten gedrückt werden, und sendet die entsprechenden Nachrichten an den MQTT-Broker.

Hier ist eine detaillierte Erklärung des Codes:

  1. Einschließen relevanter Bibliotheken:

    #include <WiFiS3.h>
    #include <ArduinoMqttClient.h>
    
  2. Sensible Informationen einbinden:

    • Die Datei arduino_secrets.h enthält den SSID und das Passwort für das Wi-Fi-Netzwerk.

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

    • Variablen für die Verwaltung von Wi-Fi- und MQTT-Verbindungen.

    • Initialisieren der Tastenpins und Tastenzustände.

  4. setup():

    • Initialisieren der seriellen Kommunikation.

    • Überprüfen des Vorhandenseins des Wi-Fi-Moduls und Versuch, eine Verbindung zu Wi-Fi herzustellen.

    • Netzwerkdaten ausgeben.

    • Versuch, eine Verbindung zum MQTT-Broker herzustellen.

    • Abonnieren von MQTT-Themen.

    • Tasten auf Eingabemodus setzen.

  5. loop():

    • Die MQTT-Verbindung aktiv halten.

    • Überprüfen, ob jede Taste gedrückt wird, und gegebenenfalls MQTT-Nachrichten senden.

  6. Andere Hilfsfunktionen:

    • printWifiData(): Gibt Informationen über das aktuell verbundene Wi-Fi-Netzwerk aus.

    • printCurrentNet(): Gibt relevante Daten über das aktuelle Netzwerk aus.

    • printMacAddress(byte mac[]): Gibt die MAC-Adresse aus.

    • onMqttMessage(int messageSize): Rückruffunktion, die ausgelöst wird, wenn eine Nachricht vom MQTT-Broker empfangen wird. Sie gibt das empfangene Nachrichtenthema und den Inhalt aus.

    • sendButtonMessage(int buttonNumber): Verwenden Sie diese Funktion, um MQTT-Nachrichten zu senden, wenn eine Taste gedrückt wird.