SenseBox:home V2 Wifi für WLAN-Unterbrechung programmieren


#1

Guten Morgen,

nach vielen Mühen ist es mir eben endlich gelungen, die SenseBox:home V2 in Gang zu bekommen und sie sendet jetzt auch Daten an OpenSenseMap.

Das Gerät ist über Wifi mit meinem Router verbunden. Zwischen 00 und 07 Uhr wird bei mir das WLAN abgeschaltet. Ich habe festgestellt, dass die SenseBox in den Bootloader-Modus wechselt, wenn die Verbindung nicht klappt.

Ist es möglich die Sensebox so zu programmieren, dass Sie während festgelegter Zeiten das WLAN nicht zu aktivieren versucht? Ich bin zwar hauptberuflich Programmierer, habe aber noch nie einen Arduino programmiert und weiß nicht, was man dafür machen muss.

Reicht es, wenn ich in diesem Code-Block die client.stop()-Anweisung auskommentiere?

while (client.available()) {
char c = client.read();
DEBUG_WRITE©;
// if the server’s disconnected, stop the client:
if (!client.connected()) {
DEBUG();
DEBUG(“disconnecting from server.”);
client.stop();
break;
}

Ich würde mich freuen, wenn mir jemand dabei helfen könnte. Ansonsten werde ich den einfachen Weg gehen und eine Zeitschaltuhr an der Stromversorgung der SenseBox anbringen.

Ich bitte darum, nicht darüber zu diskutieren, warum ich das WLAN abschalte. Ich habe meine Gründe.

Vorab vielen Dank für die Hilfe.
Frank


#2

Ich habe das jetzt so gelöst, dass ich in der Methode “submitValues” aus dem hier

  if (connected == false) {
    // Reset durchführen
    DEBUG(F("connection failed. Restarting System."));
    delay(5000);
    noInterrupts();
    NVIC_SystemReset();
    while (1)
      ;
  }

das hier gemacht habe:

  if (connected == false) {
    DEBUG(F("Connection failed. Waiting."));
    // Wait 13 Minutes
    delay(780000);
  }

#3

Da niemand geantwortet hat, habe ich mich über das Wochenende mal in die Arduino-Programmierung eingearbeitet und habe den Sketch so geändert, dass er jetzt den Ausfall der WLAN-Verbindung übersteht. Dabei habe ich noch ein paar Fehler im ursprünglichen Sketch entdeckt und ihn schließlich komplett umgebaut.

Die loop-Funktion ist dadurch deutlich übersichtlicher geworden:

void loop() {
  unsigned long actTimeStamp = millis();

  // Only do something if action wait time has passed
  if(getDurationSinceLastAction(actTimeStamp) >= m_WaitDuration) {
    m_LastActionTimeStamp = actTimeStamp;

    // Check if WiFi is connected
    DEBUG(F("loop: Check wifi status"));
    uint8_t wifiStatus = checkWifiStatus();

    // Only read measurements if there is a WiFi connection
    if(wifiStatus == WL_CONNECTED) {
      // WiFi is connected
      m_WaitDuration = MEASUREMENT_WAIT_DURATION;  // Reset wait duration to measurement interval
      DEBUG2(F("loop: New wait duration is "));
      DEBUG_ARGS(m_WaitDuration, DEC);

      // Do measurements
      DEBUG(F("loop: Gather measurements"));
      gatherMeasurements();

      // Submit values to the server
      DEBUG(F("loop: Submit values"));
      submitValues();
    } else {
      if(m_WaitDuration < MAX_WAIT_DURATION)
        m_WaitDuration += WAIT_DURATION_DELTA;

      DEBUG2(F("loop: New wait duration is "));
      DEBUG_ARGS(m_WaitDuration, DEC);
	}
  }
}