Die Werte des Solarmoduls lassen sich mit folgendem Code auslesen
// battery stuff
float solar_voltage;
float battery_voltage;
int battery_level;
float battery_temp;
String battery_status_info;
void solar_update() {
/*
* I2C i/f with following info on address 0x32:
* - Register 0: cell voltage, 20mV/LSB
* - Register 1: input voltage, 100mV/LSB
* - Register 2: status bits: [B,I,L3,L2,L1,L0,F,C]
* B=battery present >2.8V
* I=Input voltage present >4.5V
* L0-L3=battery status LEDs
* F=Fast charge enabled
* C=Charging
* - Register 3: temperature in C, signed 8-bit
* Thresholds: L0: 3.2V, L1: 3.6V, L2: 3.7V, L3: 3.9V <- somewhere the order
* is wrong
*
* i Switch to slow charge at 8*C Switch to fast charge at 12*C
*/
byte address = 0x32;
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Wire.requestFrom((uint8_t)address, (uint8_t)4);
uint vbat = Wire.read();
uint vin = Wire.read();
uint flags = Wire.read();
int temp = (int8_t)(Wire.read());
battery_voltage = 0.02 * vbat;
solar_voltage = 0.1 * vin;
if (flags & 32)
battery_level = 4;
else if (flags & 16)
battery_level = 3;
else if (flags & 8)
battery_level = 2;
else if (flags & 4)
battery_level = 1;
else
battery_level = 0;
if (flags & 1)
battery_status_info = "charging\n" + String(flags);
else
battery_status_info = "not charging\n";
if (flags & 64)
battery_status_info += "good input voltage\n";
else
battery_status_info += "low input voltage\n";
if (flags & 128)
battery_status_info += "battery present";
else
battery_status_info += "battery missing";
} else if (error == 2) {
battery_status_info = "Solar module not connected";
} else if (error) {
battery_status_info = "unknown error ";
battery_status_info += String(error);
}
}
mit
Wire.begin();
in setup() und
solar_update();
in loop().
Am meisten Strom verbraucht der Feinstaubsensor SDS011. Danach kommen Display und das Wlan Modul.
Die einfachste Methode bei der Nutzung von Solar Modul und Wlan ist ein Deep Sleep der kompletten senseBox, bei dem alle Anschlüsse ausgeschaltet werden. Nach dem Wake up startet die senseBox neu, um alle sensoren zu reinitialisieren:
#include <ArduinoLowPower.h>
// deep sleep
void sleep_and_restart(uint32_t sleep_time) {
senseBoxIO.powerNone();
LowPower.deepSleep(max(0, sleep_time - 1000));
delay(1000);
noInterrupts();
NVIC_SystemReset();
while (1)
;
}
mit
while (millis() < 30000)
; // enshure SDS011 was on for at least 30 seconds
am Anfang und
sleep_and_restart(sleep_time);
am Ende von loop().
Bei LoRa ist das schwieriger, da die Verbindung nach Neustart sehr lange dauert. Man kann aber nur den Feinstaubsensor über die UARTs auschalten und 30 Sekunden vor dem nächsten send_job() wieder einschalten, um das meiste an Strom zu sparen:
static osjob_t restartParticleSensorJob;
void do_restartParticleSensor(osjob_t* j) {
senseBoxIO.powerUART(true);
Serial.println(F("UARTs on"));
delay(500);
sds.begin();
sds.setQueryReportingMode();
Serial.println(F("particle sensor restarted"));
}
mit einem zusätzlichen os_setTimedCallback(...) 30 Sekunden früher in onEvent()
...
case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK) Serial.println(F("Received ack"));
if (LMIC.dataLen) {
Serial.println(F("Received "));
Serial.println(LMIC.dataLen);
Serial.println(F(" bytes of payload"));
}
// Schedule dustsensor restart 30 seconds before
os_setTimedCallback(&restartParticleSensorJob,
os_getTime() + sec2osticks(TX_INTERVAL - 30),
do_restartParticleSensor);
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL),
do_send);
break;
...
und dem Auschalten der UARTs am Ende von send_job():
...
senseBoxIO.powerUART(false);
Serial.println(F("UARTs off"));
Es ist auch sinnvoll das Upload Intervall zu erhöhen:
const unsigned TX_INTERVAL = 600; // 10 minutes
Für den Feinstaubsensor wurde die Bibliothek
#include <SdsDustSensor.h>
verwendet, weil
#include <SDS011-select-serial.h>
bei den ersten Tests nicht funktioniert hat. Das kann aber ach andere Gründe haben.
Es gibt ein paar Beispiel Skripte zu den senseBoxen beim Nabu Münster und dem MexLab der Uni Münster in den umliegenden Ordnern. Wlan Passwörter und andere Credentials sind durch "TODO" ausgetauscht worden. Die LoRa Daten haben Jan oder Paul.
from https://sensebox.github.io/books-v2/home/de/Stromverbrauch.html
senseBox:home mit Feinstaubsensor 100mA 200-300mA senseBox:home ohne Feinstaubsensor 30-35mA 140mA senseBox:home ohne einen Sensor angeschlossen 30mA keine Peaks senseBox:home mit I2C aus 26-30mA keine Peaks senseBox:home mit UART(Serielle Ports) aus 26-30mA keine Peaks senseBox:home mit XB2 aus 26-30mA keine Peaks senseBox:home mit jedem Port aus(XB1,XB2,UART,I2C) 21mA keine Peaks
own tests, mA mA(restart)
default 28 29
sleep 13 28
deep-sleep 13 28
deep-sleep-io-off 5 28
programming mode 15
power off 17
solar board alone 5
nur wlan 113
wlan +few I2C 114
Solarplatte: 20W (oder 10W) 12V -> 4000mA (oder 2000mA)
Typische Kapazität 3500mAh Min. Kapazität 3350mAh Nennspannung 3,6V - 3,7V Ladeschlussspannung 4,2V ± 0,05V Entladeschlussspannung 2,5V Ladestrom/Ladezeit 0 - 1500mA/3,5h