... und sorry für den Thread Titel aber ich bin mir mitterweile nicht mehr sicher ob der Fehler vor der Maschine sitzt....
Ich habe die aktuelle Arduino IDE (1.8.5) und benutze einen NodeMCU als Board.
Folgendes Problem habe ich:
Das analogRead verursacht in unregelmäßigen aber sehr oft auftreten Abständen das ein WLAN reconnect durchgeführt wird. Wenn ich analogRead auskommentiere oder durch digitalRead austausche, dann scheint der Sketch zu funktionieren.
Verwenden tue ich im Moment die 2.3.0 der ESP8266 Library --> kommend von der 2.4.1. Dachte ich probiere mal eine ältere Lib um den Fehler auszuschließen. Passiert wohl bei beiden Library Versionen.
#include <ESP8266WiFi.h>
#define WIFI_SSID "GEHEIM"
#define WIFI_PASS "AUCH_GEHEIM"
#define DEBUG
#ifdef DEBUG
#define DEBUG_BEGIN(x) Serial.begin(x)
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_BEGIN(x)
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
static const byte pinLDR = A0;
static const byte PIN_STATUSLED = LED_BUILTIN;
unsigned int meanValueLDR = 0;
void setup()
{
pinMode(pinLDR, INPUT);
pinMode(PIN_STATUSLED, OUTPUT);
DEBUG_BEGIN(115200);
connectWifi();
DEBUG_PRINTLN("Debug Ausgabe aktiviert...");
}
void loop()
{
connectWifi();
getMeanValueLDR(pinLDR, 100, meanValueLDR);
}
/*
F U N K T I O N E N
##########################################################################
Diverse Funktionen
*/
void getMeanValueLDR(byte readPin, byte avCount, unsigned int &meanValue)
{
unsigned long value = 0;
for(int i=0; i< avCount; i++)
{
value += digitalRead(readPin);
}
meanValue = (unsigned int) (value / avCount);
}
void connectWifi()
{
if (WiFi.status() == WL_CONNECTED) return;
WiFi.begin(WIFI_SSID,WIFI_PASS);
DEBUG_PRINT("Connecting to ");
DEBUG_PRINTLN(WIFI_SSID);
while (WiFi.status() != WL_CONNECTED)
{
// Blink 2 times when connecting
blinkStatusLED(2);
delay(500);
DEBUG_PRINT(".");
}
DEBUG_PRINTLN("");
DEBUG_PRINTLN("WiFi connected");
DEBUG_PRINTLN("Obtained IP address: ");
DEBUG_PRINTLN(WiFi.localIP());
}
void blinkStatusLED(const int times)
{
for (int i = 0; i < times; i++)
{
// Enable LED
digitalWrite(PIN_STATUSLED, LOW);
delay(100);
// Disable LED
digitalWrite(PIN_STATUSLED, HIGH);
delay(100);
}
}
Ist bei mir auch so...
Habs etwas modifiziert und rufe die Methode getMeanValueLDR() nur alle x ms auf... x wird Stück für Stück erhöht, bis kein Reset mehr kommt...
mal schauen, was rauskommt.
Nachtrag:
nach gut 1h30min hat sich das Programm auf 13ms korrigiert... die Frage ist, warum?
Könnte ein zu häufiger Aufruf von analogRead() zu Leistungsengpässen führen?
Ich hatte ein ähnliches Problem. Nach einigem Suchen habe ich gelesen das dies ein internes Problem vom ESP8266 ist. Man sollte nicht in jedem Loop durchlauf AnalogRead durchführen. Ich habe das gelöst indem ich es zyklisch alle 100-200ms eingelesen habe je nach Anwendung.
Wobei ich in deinem Code auch kein analogRead sehe in der Funktion getMeanValueLLDR.
ja das beruhigt mich erstmal, das dieser Fehler noch bei jemanden anderen auftaucht.
Ich hatte die gleiche Idee, die Funktion nur alle x ms aufzurufen, jedoch war gestern zu spät und ich habe erst jetzt ins Forum geschaut. Also scheint es so zu sein, das der analogRead wohl dieses Problem verursacht. Die Frage ist wohl warum....
Als ob das senden mit analogRead was zu tun hätten... nur was soll das bitte sein?
In der FritzBox sieht man das wirklich dieser reconnect zu Stande kommt. So als ob das WLAN Signal auf einmal abreißt...
@combie: Das lässt sich einfach erklären. Die Funktion wurde Ursprünglich wirklich nur in der setup() Routine hinterlegt. Aufgrund der Fehlersuche und der Tatsache dass das WLAN Signal immer abriss habe ich dann kurzerhand die Funktion auch in die Loop genommen, sodass die WLAN Verbindung gleich wieder hergestellt wurde.
@Dani: Interessant. Gibt es hierzu weitere Hinweise? P.s. Zeile 6 in der Funktion ist mein analogRead versteckt
Dani hat recht. Habe soeben was gefunden. Das Problem scheint zu sein, das die Lib den ADC benutzt um die Sendeleistung zu berechnen und zu regulieren. Wenn der ADC von analogRead zu oft blockiert wird, kommt es zu einem Engpass beim senden und das Signal ist dann zu schwach.....Anbei der Link:
Wenn ich das jetzt richtig verstanden habe, lässt sich das gar nicht anders umgehen.
Kann mir jemand noch kurz erklären auf welche Basis die Rate zustande kommt? "To avoid dripping connections at all (because of using A0), do not take more than 200 samples in a single continuous shoot."
Soll das bedeuten das ich nicht mehr als 200 Messwerte pro Sekunde nehmen darf?
sorry. Ich habe probeweise das analogRead mit dem digitalRead ersetzt um zu sehen ob es besser wird, wenn gleich ich weis das es nicht viel sinn macht. Dieser Code war wohl noch in der Zwischenablage. Wie gesagt, gestrn Abend war schon spät.
ht81:
"To avoid dripping connections at all (because of using A0), do not take more than 200 samples in a single continuous shoot."
Soll das bedeuten das ich nicht mehr als 200 Messwerte pro Sekunde nehmen darf?
Nö, nur dass du nicht mehr als 200 Messwerte unmittelbar hintereinander machen darfst.
Da du ja einen LDR misst ist das keine Einschränkung, die ändern sich recht langsam.
Ansprechzeit (Zeit, die nach Einschalten einer Beleuchtungsstärke von 1000 Lux nach Dunkelheit vergeht, bis der Strom 65 % seines spezifizierten Wertes erreicht hat), typischer Wert 1 bis 3 ms
...womit man sich auch Gedanken drüber machen müsste, ob es wirklich sinnvoll ist, in einer for-Schleife den Pin A0 100x hintereinander auslesen zu lassen...
DerLehmi:
Könnte ein zu häufiger Aufruf von analogRead() zu Leistungsengpässen führen?
Natürlich. Abgesehen davon dass hier der ADC noch für was anderes gebraucht wird, dauert eine Messung etwas. Wenn man das ständig aufruft (und auch noch in einer for-Schleife) ist das nichts anderes als ein Delay