NodeMCU Client

Board: ESP8266
Hinzugefügt: 15. April 2025
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.