WiFi Bee schlafen legen


#1

Hi,

möchte meine senseBox Batterie betrieben einsetzen.
Dazu würde ich gerne so viele Komponenten wie möglich zwischen den Messungen abschalten.
Mein Problem ist, dass wenn ich die WiFi Bee neustarte, sie nicht mehr vom WiFi Module erkannt wird.

Ein (nicht ganz) minimales Beispiel, welches ich aus dem Forum und angepasst habe:

#include <Wire.h>
#include <SenseBoxMCU.h>
#include <WiFi101.h>


char ssid[] = "";
char pass[] = "";

void setup()
{
  // init serial library
  Serial.begin(9600);
  while (!Serial); // wait for serial monitor
  Serial.println("Test");

  senseBoxIO.powerNone(); //schaltet alle Anschlüsse und LED's aus
}

Bee bee = Bee();

void loop()
{
  senseBoxIO.statusNone(); 
  senseBoxIO.powerNone(); //schaltet alle LED's aus
  Serial.println("Red");
  senseBoxIO.statusRed(); //schaltet Rot an
  delay(1000); // wait 1000ms
  Serial.println("Green");
  senseBoxIO.statusGreen(); //schaltet Rot aus, Grün an
  delay(1000); // wait 1000ms

  Serial.println("I2C/Wire");
  senseBoxIO.powerI2C(true); //schaltet I2C und LED an
  delay(1000); // wait 1000ms
  Serial.println("UART/Serial"); 
  senseBoxIO.powerUART(true); //schaltet UART und LED an
  delay(1000); // wait 1000ms
  Serial.println("XBEE1");
  senseBoxIO.powerXB1(true); //schaltet XBEE1 und LED an
  delay(1000); // wait 1000ms
  Serial.println("XBEE2"); //schaltet XBEE2 und LED an
  senseBoxIO.powerXB2(true);
  // Auskommentiertes würde auch bei .status() hängen bleiben
//  if(WiFi.status() == WL_NO_SHIELD)
//  {
//    Serial.println("WiFi-Schild konnte nicht gefunden werden.");
//    WiFi.end();
//    return;
//  }
  bee.connectToWifi(ssid, pass);
}

Quelle: LED's abschalten

Das Skript bleibt bei dem zweiten Durchgang in der letzten Zeile in loop() hängen.
Die Ausgabe ist:

18:44:46.064 -> Test
18:44:46.064 -> Red
18:44:47.060 -> Green
18:44:48.056 -> I2C/Wire
18:44:49.084 -> UART/Serial
18:44:50.080 -> XBEE1
18:44:51.573 -> XBEE2
18:44:52.204 -> Attempting to connect to SSID: FRITZ!Box Fon WLAN 7390
18:44:58.874 -> Successfully connected to your WiFi.
18:44:58.874 -> Red
18:44:59.870 -> Green
18:45:00.865 -> I2C/Wire
18:45:01.861 -> UART/Serial
18:45:02.856 -> XBEE1
18:45:04.349 -> XBEE2

Fehlt mir hier ein Befehl?

Grüße
Lucas


#2

Moin Lucas, versuch es mal mit diesem Test ohne ob es ohne die senseBoxMCU.h klappt:

#include <senseBoxIO.h>
#include <WiFi101.h>

char ssid[] = "";
char pass[] = "";

char server[] = "internet-test.testing.opensensemap.org";
int status = WL_IDLE_STATUS;
WiFiClient client;

void setup()
{
  Serial.begin(9600);
  while (!Serial); // wait for serial monitor
  Serial.println("WiFi connection test with sleep mode");
}


void loop()
{
  if (WiFi.status() == WL_NO_SHIELD)
  {
    Serial.println("WiFi bee not present");
    delay(1000);
    return;
  }
  Serial.println();
  Serial.println("Check internet connectivity:");
  Serial.println("============================");

  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to WiFi...");
    delay(1000); // wait 1s
    WiFi.begin(ssid, pass);
    delay(5000); // wait 5s
  }
  if (WiFi.status() == WL_CONNECTED) Serial.println("connected!");
  else
  {
    Serial.println("failed! Please check SSID and password.");
    return;
  }
  for (uint8_t timeout = 2; timeout != 0; timeout--)
  {
    Serial.print("Calling openSenseMap server...");
    if (client.connect(server, 80))
    {
      Serial.println("connected!");
      // Make a HTTP request:
      client.println("GET / HTTP/1.1");
      client.print("Host: ");
      client.println(server);
      client.println("Connection: close");
      client.println();
    }
    break;
  }
  if(client.connected())
  {
    // wait for server response
    Serial.println("Server response:\n");
    while (!client.available())
    {
      delay(1);
    }
    // read server response
    while (client.available())
    {
      char c = client.read();
      Serial.write(c);
    }
    Serial.print("\n");
    Serial.println("Disconnecting from server.");
    client.flush();
    client.stop();
  }else Serial.println("failed after 3 trys!");

  Serial.println("Disconnecting from WiFi.");
  WiFi.disconnect();
  WiFi.end();

  //Serial.println(WiFi.scanNetworks());
  Serial.println("Powering off XBee1.");
  senseBoxIO.powerXB1(false);
  delay(5000);
  Serial.println("Powering on XBee1.");
  senseBoxIO.powerXB1(true);
  delay(200);
}

*edited: sorry mein Fehler. Das musste natürlich senseBox.powerXB1(bool) sein. Hab es korrigiert oberhalb.
Du kannst bei deiner Lösung noch versuchen WiFi.end(); aufzurufen bevor du XBee1 ausschaltest.


#3

Hi Jan,

Das Skript funktioniert bei mir.
Allerdings schaltet das I2C aus und nicht XBee1.
Wenn ich z.B. die Zeile

  senseBoxIO.powerI2C(true);

auskommentiere, funktioniert es immer noch.

Wenn ich aber beide Vorkommnisse von powerI2C durch powerXB1 ersetze, bleibt es beim 2. Durchgang hängen.
Also:

#include <senseBoxIO.h>
#include <WiFi101.h>

char ssid[] = "";
char pass[] = "";

char server[] = "internet-test.testing.opensensemap.org";
//int status = WL_IDLE_STATUS;
WiFiClient client;

void setup()
{
  Serial.begin(9600);
  while (!Serial); // wait for serial monitor
  Serial.println("WiFi connection test with sleep mode");
}



void loop()
{
  if (WiFi.status() == WL_NO_SHIELD)
  {
    Serial.println("WiFi bee not present");
    delay(1000);
    return;
  }
  Serial.println();
  Serial.println("Check internet connectivity:");
  Serial.println("============================");

  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to WiFi...");
    delay(1000); // wait 1s
    WiFi.begin(ssid, pass);
    delay(5000); // wait 5s
  }
  if (WiFi.status() == WL_CONNECTED) Serial.println("connected!");
  else
  {
    Serial.println("failed! Please check SSID and password.");
    return;
  }
  for (uint8_t timeout = 2; timeout != 0; timeout--)
  {
    Serial.print("Calling openSenseMap server...");
    if (client.connect(server, 80))
    {
      Serial.println("connected!");
      // Make a HTTP request:
      client.println("GET / HTTP/1.1");
      client.print("Host: ");
      client.println(server);
      client.println("Connection: close");
      client.println();
    }
    break;
  }
  if(client.connected())
  {
    // wait for server response
    Serial.println("Server response:\n");
    while (!client.available())
    {
      delay(1);
    }
    // read server response
    while (client.available())
    {
      char c = client.read();
      Serial.write(c);
    }
    Serial.print("\n");
    Serial.println("Disconnecting from server.");
    client.flush();
    client.stop();
  }else Serial.println("failed after 3 trys!");
  
  Serial.println("Disconnecting from WiFi.");
  WiFi.disconnect();

  Serial.println("Powering off XBee1.");
  senseBoxIO.powerXB1(false);
  delay(5000);
  Serial.println("Powering on XBee1.");
  senseBoxIO.powerXB1(true);
  delay(200);

}

Die Ausgabe ist dann:

19:17:42.424 -> Check internet connectivity:
19:17:42.424 -> ============================
19:17:42.424 -> Connecting to WiFi...connected!
19:17:49.988 -> Calling openSenseMap server...connected!
19:17:50.054 -> Server response:
19:17:50.054 -> 
19:17:50.087 -> HTTP/1.1 200 OK
19:17:50.087 -> Accept-Ranges: bytes
19:17:50.087 -> Content-Length: 49
19:17:50.087 -> Content-Type: text/plain; charset=utf-8
19:17:50.087 -> Date: Fri, 27 Mar 2020 18:17:49 GMT
19:17:50.087 -> Connection: close
19:17:50.087 -> 
19:17:50.087 -> Connection successful! / Verbindung erfolgreich!
19:17:50.087 -> 
19:17:50.087 -> Disconnecting from server.
19:17:50.087 -> Disconnecting from WiFi.
19:17:50.087 -> Powering off XBee1.
19:17:55.097 -> Powering on XBee1.

Grüße,
Lucas