Philippp
09.09.2020, 16:26
Moin,
ich arbeite nun schon seit längerem an einer recht einfach gehaltenen Datenübertragung. In der Summe nutze ich sechs Komponenten:
Vier Clients (Wemos D1 Mini)
Ein Server (NodeMCU V3)
Ein WLAN Router (Fritzbox)
Gewünschte Funktion:
Die Clients senden zu verschiedenen Zeitpunkten je eine Zahl, welche einen von zwei Status repräsentiert. Abhängig von der Zahl, wird eine LED (über einen Transistor) über den NodeMCU angesteuert. Der Staus bleibt erhalten (die LED leuchtet), bis eine andere Zahl übertragen wird und ein anderer Status eintritt. Nachdem ein Client eine Zahl übertragen hat, geht selbiger in den DeepSleep (10 Sekunden), um anschließend wieder eine Zahl zu senden.
Was passiert:
Am Anfang klappt alles super. Clients und Server verbinden sich mit der Fritzbox, und ich kann über die Clients munter die LEDs welche an dem NodeMCU angeschlossen sind steuern. Nach ein paar Minuten friert der NodeMCU dann ein, während die Clients motiviert weiter arbeiten. Ich bin mir recht sicher das dass Problem beim Server liegt.
Was ich bislang versucht habe:
Stromversorgung getauscht, von 5V, 2A Handy Netzteil auf Laptop und zurück.
Ping Befehl an die Fritzbox (gegenwärtig nicht im Programm).
"delay(500);" Befehl aus der "Verbinden mit Netzwerk Schleife" im Setup gelöscht (was verhindert hat das dass Programm startet).
Ich bin nun leider mit meinem Latein am Ende. Wäre super wenn mal jemand drüber schauen könnte. Entsprechend meiner bescheidenen Erfahrung ist das Programm sehr einfach und übersichtlich geschrieben.
Vielen Dank,
Philippp
/*
Lazy gardener V1 - Server
Der Server zeigt über die angeschlossenen LEDs an, wie der Status der Beete,
des Wassertankes und des Netzwerkes ist.
*/
#include <SPI.h>
#include <ESP8266WiFi.h>
/* Im folgenden werden die Ausgänge für die LEDs definiert.
Die Pinnummern unterscheiden sich von den Bezeichnungen auf dem Board*/
#define led_Tomaten_rot 16 //LED für Tomaten rot
#define led_Tomaten_gruen 5 //LED für Tomaten grün
#define led_Kraeuter_rot 4 //LED für Kraeuter rot
#define led_Kraeuter_gruen 0 //LED für Kraeuter grün
#define led_WIFI_rot 14 //LED für WIFI rot
#define led_WIFI_gruen 2 //LED für WIFI grün
#define led_Blumen_rot 12 //LED für Blumen rot
#define led_Blumen_gruen 13 //LED für Blumen grün
#define led_Wassertank_rot 15 //LED für Wassertank rot
#define led_Wassertank_gruen 3 //LED für Wassertank grün
/************************************************** **********************/
/* Im folgenden werden Netzwerkdaten definiert. DIese Daten müssen dem
Netzwerk entsprechend angepasst werden*/
char ssid[] = "Netzwerk"; // Name des Netzwerkes
char pass[] = "Passwort"; // Passwort des Netzwerkes
WiFiServer server(80);
/************************************************** **************************/
/*Alle Anweisungen der Funktion setup() werden nur einmal am Start des Programs
ausgeführt*/
void setup() {
Serial.begin(115200); // Startet die Serielle Schnittstelle
WiFi.begin(ssid, pass); // Baut eine Verbindung zum W-LAN Router auf.
pinMode(led_Tomaten_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Tomaten_gruen, OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
pinMode(led_Kraeuter_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Kraeuter_gruen , OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
pinMode(led_WIFI_rot, OUTPUT); // LED zeigt an das keine Verbindung zum W-LAN besteht. LED wird als Ausgang definiert.
pinMode(led_WIFI_gruen, OUTPUT); // LED zeigt an das eine Verbindung zum W-LAN besteht. LED wird als Ausgang definiert.
pinMode(led_Blumen_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Blumen_gruen, OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
pinMode(led_Wassertank_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Wassertank_gruen, OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
//Da die folgeden PINS beim booten HIGH sind, werden selbige hier zur Sicherheit noch einmal auf LOW gesetzt
digitalWrite(led_Tomaten_rot, LOW);
digitalWrite(led_WIFI_gruen, LOW);
digitalWrite(led_Wassertank_gruen, LOW);
while (WiFi.status() != WL_CONNECTED) // Schleife läuft so lange, bis eine Verbindung zum W-LAN aufgebaut ist.
{
Serial.print(".");
digitalWrite(led_WIFI_rot, HIGH); //Zeigt an das keine Netzwerkverbindung besteht
delay(500);
}
server.begin(); // Startet die Serverfunktion
Serial.println(" ");
Serial.println("Connected to wifi");
Serial.print("IP: "); Serial.println(WiFi.localIP()); // Zeigt die IP an
Serial.print("Subnet: "); Serial.println(WiFi.subnetMask()); // Zeigt die Subnet Mask an
Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP()); // Zeigt die Gateway Adresse an
Serial.print("SSID: "); Serial.println(WiFi.SSID()); // Zeigt den Netzwerknamen an
Serial.print("Signal: "); Serial.println(WiFi.RSSI()); // Signalstärke in dBm
}
void loop () {
//Folgende Abfrage klärt ob noch immer eine Netzwerkverbindung besteht.
if (WiFi.status() != WL_CONNECTED)
{
//Zeigt an das keine Netzwerkverbindung besteht.
digitalWrite(led_WIFI_rot, HIGH);
digitalWrite(led_WIFI_gruen, LOW);
digitalWrite(led_Tomaten_gruen, LOW);
digitalWrite(led_Kraeuter_gruen, LOW);
digitalWrite(led_Blumen_gruen, LOW);
digitalWrite(led_Wassertank_gruen, LOW);
digitalWrite(led_Tomaten_rot, LOW);
digitalWrite(led_Kraeuter_rot, LOW);
digitalWrite(led_Blumen_rot, LOW);
digitalWrite(led_Wassertank_rot, LOW);
}
else {
//Zeigt an das eine Netzwerkverbindung aufgebaut wurde.
digitalWrite(led_WIFI_rot, LOW);
digitalWrite(led_WIFI_gruen, HIGH);
}
int a = -1; // speichert Übergabe des Clients
WiFiClient client = server.available();
if (client) {
if (client.connected()) {
Serial.println(".");
while(a == -1) //Schleife läuft so lange bis ein passendes Ergebnis übertragen wird.
{
a = client.read(); // Liest die Übergabe des Clients
}
Serial.println("Kontrollwert: "); // Gibt gelesenen Wert zur Kontrolle aus
Serial.print(a); // Gibt gelesenen Wert zur Kontrolle aus
switch(a) // Mehrfachauswahl Anfang
{
case 0: //Tomaten hat genug Wasser
digitalWrite(led_Tomaten_rot, LOW);
digitalWrite(led_Tomaten_gruen, HIGH);
break;
case 1: //Tomaten müssen bewaessert werden
digitalWrite(led_Tomaten_rot, HIGH);
digitalWrite(led_Tomaten_gruen, LOW);
break;
case 2: //Kraeuter hat genug Wasser
digitalWrite(led_Kraeuter_rot, LOW);
digitalWrite(led_Kraeuter_gruen, HIGH);
break;
case 3: //Kraeuter muss bewaessert werden
digitalWrite(led_Kraeuter_rot, HIGH);
digitalWrite(led_Kraeuter_gruen, LOW);
break;
case 4: //Blumen hat genug Wasser
digitalWrite(led_Blumen_rot, LOW);
digitalWrite(led_Blumen_gruen, HIGH);
break;
case 5: //Blumen muss bewaessert werden
digitalWrite(led_Blumen_rot, HIGH);
digitalWrite(led_Blumen_rot, LOW);
break;
case 6: //Wassertank hat genug Wasser
digitalWrite(led_Wassertank_rot, LOW);
digitalWrite(led_Wassertank_gruen, HIGH);
break;
case 7: //Wassertank muss nachgefuellt werden
digitalWrite(led_Wassertank_rot, HIGH);
digitalWrite(led_Wassertank_rot, LOW);
break;
}// Mehrfachauswahl Ende
}
client.stop(); // Beendet die Verbindung mit dem Client
}
}
ich arbeite nun schon seit längerem an einer recht einfach gehaltenen Datenübertragung. In der Summe nutze ich sechs Komponenten:
Vier Clients (Wemos D1 Mini)
Ein Server (NodeMCU V3)
Ein WLAN Router (Fritzbox)
Gewünschte Funktion:
Die Clients senden zu verschiedenen Zeitpunkten je eine Zahl, welche einen von zwei Status repräsentiert. Abhängig von der Zahl, wird eine LED (über einen Transistor) über den NodeMCU angesteuert. Der Staus bleibt erhalten (die LED leuchtet), bis eine andere Zahl übertragen wird und ein anderer Status eintritt. Nachdem ein Client eine Zahl übertragen hat, geht selbiger in den DeepSleep (10 Sekunden), um anschließend wieder eine Zahl zu senden.
Was passiert:
Am Anfang klappt alles super. Clients und Server verbinden sich mit der Fritzbox, und ich kann über die Clients munter die LEDs welche an dem NodeMCU angeschlossen sind steuern. Nach ein paar Minuten friert der NodeMCU dann ein, während die Clients motiviert weiter arbeiten. Ich bin mir recht sicher das dass Problem beim Server liegt.
Was ich bislang versucht habe:
Stromversorgung getauscht, von 5V, 2A Handy Netzteil auf Laptop und zurück.
Ping Befehl an die Fritzbox (gegenwärtig nicht im Programm).
"delay(500);" Befehl aus der "Verbinden mit Netzwerk Schleife" im Setup gelöscht (was verhindert hat das dass Programm startet).
Ich bin nun leider mit meinem Latein am Ende. Wäre super wenn mal jemand drüber schauen könnte. Entsprechend meiner bescheidenen Erfahrung ist das Programm sehr einfach und übersichtlich geschrieben.
Vielen Dank,
Philippp
/*
Lazy gardener V1 - Server
Der Server zeigt über die angeschlossenen LEDs an, wie der Status der Beete,
des Wassertankes und des Netzwerkes ist.
*/
#include <SPI.h>
#include <ESP8266WiFi.h>
/* Im folgenden werden die Ausgänge für die LEDs definiert.
Die Pinnummern unterscheiden sich von den Bezeichnungen auf dem Board*/
#define led_Tomaten_rot 16 //LED für Tomaten rot
#define led_Tomaten_gruen 5 //LED für Tomaten grün
#define led_Kraeuter_rot 4 //LED für Kraeuter rot
#define led_Kraeuter_gruen 0 //LED für Kraeuter grün
#define led_WIFI_rot 14 //LED für WIFI rot
#define led_WIFI_gruen 2 //LED für WIFI grün
#define led_Blumen_rot 12 //LED für Blumen rot
#define led_Blumen_gruen 13 //LED für Blumen grün
#define led_Wassertank_rot 15 //LED für Wassertank rot
#define led_Wassertank_gruen 3 //LED für Wassertank grün
/************************************************** **********************/
/* Im folgenden werden Netzwerkdaten definiert. DIese Daten müssen dem
Netzwerk entsprechend angepasst werden*/
char ssid[] = "Netzwerk"; // Name des Netzwerkes
char pass[] = "Passwort"; // Passwort des Netzwerkes
WiFiServer server(80);
/************************************************** **************************/
/*Alle Anweisungen der Funktion setup() werden nur einmal am Start des Programs
ausgeführt*/
void setup() {
Serial.begin(115200); // Startet die Serielle Schnittstelle
WiFi.begin(ssid, pass); // Baut eine Verbindung zum W-LAN Router auf.
pinMode(led_Tomaten_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Tomaten_gruen, OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
pinMode(led_Kraeuter_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Kraeuter_gruen , OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
pinMode(led_WIFI_rot, OUTPUT); // LED zeigt an das keine Verbindung zum W-LAN besteht. LED wird als Ausgang definiert.
pinMode(led_WIFI_gruen, OUTPUT); // LED zeigt an das eine Verbindung zum W-LAN besteht. LED wird als Ausgang definiert.
pinMode(led_Blumen_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Blumen_gruen, OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
pinMode(led_Wassertank_rot, OUTPUT); // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
pinMode(led_Wassertank_gruen, OUTPUT); // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
//Da die folgeden PINS beim booten HIGH sind, werden selbige hier zur Sicherheit noch einmal auf LOW gesetzt
digitalWrite(led_Tomaten_rot, LOW);
digitalWrite(led_WIFI_gruen, LOW);
digitalWrite(led_Wassertank_gruen, LOW);
while (WiFi.status() != WL_CONNECTED) // Schleife läuft so lange, bis eine Verbindung zum W-LAN aufgebaut ist.
{
Serial.print(".");
digitalWrite(led_WIFI_rot, HIGH); //Zeigt an das keine Netzwerkverbindung besteht
delay(500);
}
server.begin(); // Startet die Serverfunktion
Serial.println(" ");
Serial.println("Connected to wifi");
Serial.print("IP: "); Serial.println(WiFi.localIP()); // Zeigt die IP an
Serial.print("Subnet: "); Serial.println(WiFi.subnetMask()); // Zeigt die Subnet Mask an
Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP()); // Zeigt die Gateway Adresse an
Serial.print("SSID: "); Serial.println(WiFi.SSID()); // Zeigt den Netzwerknamen an
Serial.print("Signal: "); Serial.println(WiFi.RSSI()); // Signalstärke in dBm
}
void loop () {
//Folgende Abfrage klärt ob noch immer eine Netzwerkverbindung besteht.
if (WiFi.status() != WL_CONNECTED)
{
//Zeigt an das keine Netzwerkverbindung besteht.
digitalWrite(led_WIFI_rot, HIGH);
digitalWrite(led_WIFI_gruen, LOW);
digitalWrite(led_Tomaten_gruen, LOW);
digitalWrite(led_Kraeuter_gruen, LOW);
digitalWrite(led_Blumen_gruen, LOW);
digitalWrite(led_Wassertank_gruen, LOW);
digitalWrite(led_Tomaten_rot, LOW);
digitalWrite(led_Kraeuter_rot, LOW);
digitalWrite(led_Blumen_rot, LOW);
digitalWrite(led_Wassertank_rot, LOW);
}
else {
//Zeigt an das eine Netzwerkverbindung aufgebaut wurde.
digitalWrite(led_WIFI_rot, LOW);
digitalWrite(led_WIFI_gruen, HIGH);
}
int a = -1; // speichert Übergabe des Clients
WiFiClient client = server.available();
if (client) {
if (client.connected()) {
Serial.println(".");
while(a == -1) //Schleife läuft so lange bis ein passendes Ergebnis übertragen wird.
{
a = client.read(); // Liest die Übergabe des Clients
}
Serial.println("Kontrollwert: "); // Gibt gelesenen Wert zur Kontrolle aus
Serial.print(a); // Gibt gelesenen Wert zur Kontrolle aus
switch(a) // Mehrfachauswahl Anfang
{
case 0: //Tomaten hat genug Wasser
digitalWrite(led_Tomaten_rot, LOW);
digitalWrite(led_Tomaten_gruen, HIGH);
break;
case 1: //Tomaten müssen bewaessert werden
digitalWrite(led_Tomaten_rot, HIGH);
digitalWrite(led_Tomaten_gruen, LOW);
break;
case 2: //Kraeuter hat genug Wasser
digitalWrite(led_Kraeuter_rot, LOW);
digitalWrite(led_Kraeuter_gruen, HIGH);
break;
case 3: //Kraeuter muss bewaessert werden
digitalWrite(led_Kraeuter_rot, HIGH);
digitalWrite(led_Kraeuter_gruen, LOW);
break;
case 4: //Blumen hat genug Wasser
digitalWrite(led_Blumen_rot, LOW);
digitalWrite(led_Blumen_gruen, HIGH);
break;
case 5: //Blumen muss bewaessert werden
digitalWrite(led_Blumen_rot, HIGH);
digitalWrite(led_Blumen_rot, LOW);
break;
case 6: //Wassertank hat genug Wasser
digitalWrite(led_Wassertank_rot, LOW);
digitalWrite(led_Wassertank_gruen, HIGH);
break;
case 7: //Wassertank muss nachgefuellt werden
digitalWrite(led_Wassertank_rot, HIGH);
digitalWrite(led_Wassertank_rot, LOW);
break;
}// Mehrfachauswahl Ende
}
client.stop(); // Beendet die Verbindung mit dem Client
}
}