NodeMCU Client
cpp
#include
#include
#include
#include
// WLAN-Konfiguration für die Verbindung zum Server
const char* ssid = "NodeMCU-Server"; // Name des Server-WLAN-Netzwerks
const char* password = "12345678"; // Passwort des Server-WLAN-Netzwerks
// Server-Adresse (Standard-IP des NodeMCU im AP-Modus)
const char* serverAddress = "http://192.168.4.1";
// Variablen für die Client-Funktionalität
const int buttonPin = D3; // Pin für einen Button (falls vorhanden)
bool lastButtonState = HIGH; // Letzter Status des Buttons (Pull-Up Widerstand, daher HIGH = nicht gedrückt)
bool ledStatus = false; // Status der LED auf dem Server
unsigned long lastStatusCheck = 0; // Zeitpunkt der letzten Statusabfrage
void setup() {
// Serielle Kommunikation starten
Serial.begin(115200);
Serial.println("\n\nNodeMCU Client startet...");
// Button-Pin konfigurieren (falls vorhanden)
pinMode(buttonPin, INPUT_PULLUP);
// Mit dem Server-WLAN verbinden
WiFi.begin(ssid, password);
Serial.print("Verbinde mit ");
Serial.print(ssid);
// Warten auf WLAN-Verbindung
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Verbindungsinformationen anzeigen
Serial.println();
Serial.print("Verbunden! IP-Adresse: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Prüfen, ob die WLAN-Verbindung noch besteht
if (WiFi.status() == WL_CONNECTED) {
// Button abfragen (falls vorhanden)
bool currentButtonState = digitalRead(buttonPin);
// Wenn der Button gedrückt wurde (Flanke HIGH zu LOW)
if (lastButtonState == HIGH && currentButtonState == LOW) {
// LED-Status umschalten
ledStatus = !ledStatus;
// Steuerbefehl an den Server senden
sendControlCommand(ledStatus);
delay(50); // Entprellung
}
// Button-Status aktualisieren
lastButtonState = currentButtonState;
// Regelmäßig den Status vom Server abfragen (alle 5 Sekunden)
if (millis() - lastStatusCheck > 5000) {
getServerStatus();
lastStatusCheck = millis();
}
} else {
// Bei Verbindungsverlust neu verbinden
Serial.println("WLAN-Verbindung verloren. Versuche neu zu verbinden...");
WiFi.begin(ssid, password);
// Kurz warten und fortfahren
delay(5000);
}
}
// Funktion zum Abrufen des Serverstatus
void getServerStatus() {
// HTTP-Client-Objekte erstellen
WiFiClient client;
HTTPClient http;
// URL für die Statusabfrage
String url = String(serverAddress) + "/status";
// HTTP-Anfrage vorbereiten
http.begin(client, url);
// HTTP-GET-Anfrage senden
int httpCode = http.GET();
// Antwort prüfen
if (httpCode > 0) {
// Erfolgreiche Antwort
if (httpCode == HTTP_CODE_OK) {
// Antwort als String holen
String payload = http.getString();
Serial.println("Status-Antwort vom Server:");
Serial.println(payload);
// JSON-Antwort parsen
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload);
// Prüfen, ob das Parsen erfolgreich war
if (!error) {
// Daten aus dem JSON extrahieren
int sensorValue = doc["sensorValue"];
bool serverLedStatus = doc["ledStatus"];
// Daten anzeigen
Serial.print("Sensorwert: ");
Serial.println(sensorValue);
Serial.print("LED-Status: ");
Serial.println(serverLedStatus ? "AN" : "AUS");
// Lokale Variable aktualisieren
ledStatus = serverLedStatus;
} else {
Serial.print("Fehler beim Parsen des JSON: ");
Serial.println(error.c_str());
}
}
} else {
Serial.print("Fehler bei der HTTP-Anfrage: ");
Serial.println(http.errorToString(httpCode).c_str());
}
// Verbindung beenden
http.end();
}
// Funktion zum Senden eines Steuerbefehls
void sendControlCommand(bool ledOn) {
// HTTP-Client-Objekte erstellen
WiFiClient client;
HTTPClient http;
// URL für die Steuerung
String url = String(serverAddress) + "/control";
// HTTP-Anfrage vorbereiten
http.begin(client, url);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Parameter für die LED-Steuerung
String httpRequestData = "led=" + String(ledOn ? "1" : "0");
// HTTP-POST-Anfrage senden
int httpCode = http.POST(httpRequestData);
// Antwort prüfen
if (httpCode > 0) {
// Erfolgreiche Antwort
if (httpCode == HTTP_CODE_OK) {
String response = http.getString();
Serial.println("Server-Antwort:");
Serial.println(response);
}
} else {
Serial.print("Fehler bei der HTTP-Anfrage: ");
Serial.println(http.errorToString(httpCode).c_str());
}
// Verbindung beenden
http.end();
}
Informationen zum Code
Wofür ist dieser Code?
Dieser Code lässt einen NodeMCU als Client fungieren um mit einem zweiten NodeMCU (Server) zu Kommunizieren. Dieser Code ist Bestandteil eines Artikels um mehrere NodeMCU miteinander zu verbinden.