Forum: Haus & Smart Home Atmega328p LoRa Node (RFM98w) - Zu hoher Stromverbrauch!


von Gregor W. (gregor_w)


Angehängte Dateien:

Lesenswert?

Hallo Mikrocontroller Forum,

ich habe vor kurzem einen eigenen LoRa Sender für mein Smarthome gebaut:
Atmega328p Chip mit BME280 als Sensor und RFM98W zum versenden der Daten 
über LoRa. Das funktioniert Prima: Ich lese den Sensor aus, falls sich 
die Werte geändert haben, sende ich diese über LoRa und gehe dann für 4 
Minuten schlafen mit Hilfe der Rocketscream Library 
(LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);).

Nach meiner Messung verbraucht der Atmega im Sleep Mode 9 Microampere.
Da ich nur einen Multimeter zur Verfügung habe, kann ich den Peak 
während der LoRa Aktivität nur bedingt messen, mein Multimeter zeigt ca. 
20-30 mA an.
Auch wenn ich die Sendeleistung sehr gering halte (4 dBm) und via 
Software den Strom auf 45 mA limitiere, fehlen noch Welten zu der u.g. 
Laufzeit.

Wenn ich jetzt großzügig Rechne, komme ich mit 2xAAA Batterien auf ein 
Jahr:
1 sec. 30 mA, 239 sec. 9 uA --> 0,13 mAh. Bei 1000 mAh sollte es 320 
Tage halten.
Leider sind die Eneloops nach 30 Tagen Leer. Ich habe via Software die 
Spannung gemessen und hier ist der schnelle Abfall deutlich zu sehen 
(BatteryVoltage.png)
(https://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/)

Habt ihr eine Idee, warum ich um mind. Faktor 10x danebenliege?
Den Schaltplan habe ich Beigefügt (LoraWiring.png).


Vielen Dank schon mal!

von hinz (Gast)


Lesenswert?

Gregor W. schrieb:
> Leider sind die Eneloops nach 30 Tagen Leer.

Hohe Selbstentladung wegen früherer schlechter Behandlung?

von Randy (Gast)


Lesenswert?

Gregor W. schrieb:

> Leider sind die Eneloops nach 30 Tagen Leer.

Welche Eneloops genau.

von Εrnst B. (ernst)


Lesenswert?

Vorab zu deinem "Schaltplan": AGND und AVCC müssen auch angeschlossen 
werden. Wenn du den ADC nicht verwendest, direkt mit GND und VCC 
verbinden.

Dann die Frage: 9µA gemessen incl. BME und RFM-Modul, oder nur der AVR 
alleine?

von Gregor W. (gregor_w)


Lesenswert?

Also an den Akkus kann das nicht liegen. Ich habe es sowohl mit neuen 
AAA wie auch mit AA Eneloops probiert und sogar mit AA Alkaline.

Ich hoffe dass die 9 uA für die gesamte Schaltung gilt. In dem oben 
angehängten Bild habe ich auch die Messstellen (Amperemeter) eingefügt.
Interessant ich wusste gar nicht dass AGND und AVCC verbunden werden 
müssen. Funktionieren tut es trotzdem. Kann dies eine "positive" 
Entwicklung auf den Stromverbrauch haben?

von Johannes S. (Gast)


Lesenswert?

Wird der RFM auch für die ganze Pausenzeit schlafen gelegt? SLEEP_8S 
sind keine 4 Minuten, da wird relativ hochfrequent wieder alles geweckt, 
evtl. der RFM wieder konfiguriert. Das wären alle 8 s noch ordentliche 
Strompeaks. Wenn dabei nach 8 s der RFM nicht in den standby geschickt 
wird und empfängt, dann läuft der auch mit einigen mA. Besser wäre 
wirklich die 4 min. zu schlafen, dafür sind aber neuere AVR besser 
geeignet, sagen die AVR Experten welcher einer ich nicht bin.

von Gregor W. (gregor_w)


Lesenswert?

Interessant, daran habe ich gar nicht gedacht.
Wie gesagt, mit einem Multimeter kann ich die sehr kurzen Peaks gar 
nicht sehen.
Der Sleep läuft in einer Schleife, da wird codemäßig nichts anderes 
ausgeführt:
for (int i=0; i<SLEEPTIME; i++)
   LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

Ich würde mich ungern von dem Atmega328p trennen, die sind unschlagbar 
günstig und ich hab schon 'n Dutzend. Außerdem würde das Aufwecken nur 
Mikrosekunden dauern. Reicht es um so eine Laufzeitverkürzung 
hinzubekommen?

von Tim N. (Gast)


Lesenswert?

Gregor W. schrieb:
> Reicht es um so eine Laufzeitverkürzung
> hinzubekommen?

Nein.
1Ah/24/30 => ~1mA sind gesucht.

Die Lösung wird wohl in dem hoch geheimen Code stecken..

Wenn du die Akkus durch große, niederohmige Kondensatoren ersetzt, 
kannst du anhand der Kondenstorspannung auf den realen 
Strom/Ladungsmenge schließen..

von Gregor W. (gregor_w)


Angehängte Dateien:

Lesenswert?

Der Code ist nicht geheim (siehe Anhang). Aber ich gehe eher von einem 
HW Fehler, bzw. Messfehler aus, denn irgendwo muss ja der Strom 
verschwinden, sonst hätte ich nicht das Problem.

Zu den Kondensatoren: Da bin ich elektrotechnisch nicht so gut 
bewandert, aber ich weiß ja, dass irgendwo der Strom verschwindet. Ich 
könnte damit zwar den realen Strom messen, aber warum weiß ich dann ja 
auch nicht.

von Der Gilb (Gast)


Lesenswert?

Gregor W. schrieb:

// carrier frequency:           444.0 MHz

443,59375 - 444,96875 MHz Funkanwendungen der BOS

von Gregor W. (gregor_w)


Lesenswert?

Der Gilb schrieb:
> Gregor W. schrieb:
>
> // carrier frequency:           444.0 MHz
>
> 443,59375 - 444,96875 MHz Funkanwendungen der BOS

Danke, werde ich ändern.

von Johannes S. (Gast)


Lesenswert?

wie lange blockiert lora.transmit(), wartet das evtl. auf ein 
acknowledge? Zur Kontrolle könnte man vorher eine LED ein und danach 
wieder ausschalten. Um zu sehen, ob das hängt. Oder ein serial Print 
wenn der Status nicht ok ist.

von Gregor W. (gregor_w)


Lesenswert?

Johannes S. schrieb:
> wie lange blockiert lora.transmit(), wartet das evtl. auf ein
> acknowledge? Zur Kontrolle könnte man vorher eine LED ein und danach
> wieder ausschalten. Um zu sehen, ob das hängt. Oder ein serial Print
> wenn der Status nicht ok ist.

Ich habe testweise die Laufzeit der Loop (ohne sleep natürlich) 
gemessen:

void loop() {

  startTime=millis();

  //Sensor auslesen und verschicken, lora in sleep versetzen

  duration = millis()-startTime;
  for (unsigned long i=0; i<(seconds/8); i++)
  {
      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }
}

Diese ist zwischen 125 und 250 ms. Das bestätigt auch den kurzen 
Ausschlag von 20-30 mA am Multimeter wie im ersten Post genannt.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Gregor W. schrieb:
> Den Schaltplan habe ich Beigefügt (LoraWiring.png).

Da bekommt man ja Augenkrebs und einen verkurbelten Nacken, wenn man den 
lesen will.

Wenn du Probleme hast, den Sendepeak vernünftig zu messen, teste doch im 
Programm erstmal die einzelnen Phasen separat, d.h. nur Sleep und nur 
Aufwachen mit LoRa Aussendung. Mit einem Multimeter alleine wird es 
allerdings müßig sein, die Stromaufnahme sauber zu erfassen (allenfalls 
mit einem Drehspulinstrument und definierter, schneller Sendefolge).

von Gregor W. (gregor_w)


Lesenswert?

@Wolfgang: Egal wie hoch der Sendepeak ist, so hoch kann er gar nicht 
sein, dass dieser meine Batterie auffrisst (~250 mA). Zudem die Spec des 
Chips folgende Werte auflistet:
RFOP = +20 dBm, on PA_BOOST - 120 mA
RFOP = +17 dBm, on PA_BOOST - 87 mA
RFOP = +13 dBm, on RFO_LF/HF pin - 29 mA
RFOP = + 7 dBm, on RFO_LF/HF pin - 20 mA


Danke für eure Hilfe. So wie es scheint, ist mir nicht irgendein grober 
Schnitzer unterlaufen, sondern der Teufel steckt irgendwo im Detail.
Ich versuche als nächstes den RFM nicht direkt an VCC zu legen sondern 
an einen Pin, den ich LOW halte und nur fürs Senden auf HIGH setze.

Aber für weitere (Test) Vorschläge bin ich natürlich offen!

von Funkie (Gast)


Lesenswert?

Gregor W. schrieb:
> Nach meiner Messung verbraucht der Atmega im Sleep Mode 9 Microampere.

Wie viel µA verbraucht denn die gesamte Schaltung wenn sie schläft?

von Gregor W. (gregor_w)


Lesenswert?

Funkie schrieb:
> Gregor W. schrieb:
>> Nach meiner Messung verbraucht der Atmega im Sleep Mode 9 Microampere.
>
> Wie viel µA verbraucht denn die gesamte Schaltung wenn sie schläft?

Das war von mir unglücklich formuliert:
Nach meiner Messung verbraucht der Atmega mit BME und LoRa im Sleep Mode 
9 Microampere.

von Johannes S. (Gast)


Lesenswert?

ich würde wie schon vorgeschlagen vor und nach dem Senden eine Meldung 
ausgeben und das über lange Zeit in eine Datei loggen. Wenn das Programm 
über kurze Zeit funktioniert, dann heisst es noch nicht, das es auch 
über längere Zeit alles richtig macht.
Am I2C sind im Schaltplan keine Widerstände drin, hat das Modul die 
PullUp aktiviert? Das I2C könnte sich auch verhaken und den µC längere 
Zeit wach halten.
Die Empfangsseite könnte auch Aussetzer der Pakete zählen. Ist das ein 
Grafana Plot im ersten Posting? Werden da Werte aufgefüllt wenn keine 
empfangen wurden?

von Jörn P. (jonnyp)


Lesenswert?

Εrnst B. schrieb:
> Vorab zu deinem "Schaltplan": AGND und AVCC müssen auch angeschlossen
> werden. Wenn du den ADC nicht verwendest, direkt mit GND und VCC
> verbinden.

Zeig mir bitte mal den AGND Anschluss.

von Gregor W. (gregor_w)


Lesenswert?

Ok, ich werde die Pakete auf der Sendeseite Nummerieren und an der 
Empfangsseite auswerten, guter Punkt.
Vielleicht ist es eine heiße Spur, denn:
Ich logge in der Datenbank den Timestamp mit, also sollte alle 240 sec 
(+-15 sec) etwas empfangen werden. Von 1498 Einträgen sehe ich dass 72 
den doppelten Timestamp haben (480 sec +-15 sec.). Also sieht es eher 
nach "verlorenen" LoRa Paket aus.

Von den Empfangenen Sensordaten sind jedoch alle stimmig, also es sind 
reale Werte ohne Ausreißer.
"Das I2C könnte sich auch verhaken und den µC längere
Zeit wach halten." wie würde ich das mitbekommen? Ich müßte die Zeit vor 
dem Auslesen des BME und danach messen, oder?

von Gregor W. (gregor_w)


Lesenswert?

Jörn P. schrieb:
> Εrnst B. schrieb:
>> Vorab zu deinem "Schaltplan": AGND und AVCC müssen auch angeschlossen
>> werden. Wenn du den ADC nicht verwendest, direkt mit GND und VCC
>> verbinden.
>
> Zeig mir bitte mal den AGND Anschluss.

Der ist nicht verbunden.

von Johannes S. (Gast)


Lesenswert?

Gregor W. schrieb:
> wie würde ich das mitbekommen? Ich müßte die Zeit vor
> dem Auslesen des BME und danach messen, oder?

um den Übeltäter zu finden wäre das sinnvoll.

Bei einem LPC812 hatte ich das Problem das der im deep power down auch 
die internen PullUp abschaltet und die floatenden SPI Leitungen am RFM 
zu höherem Strom (ein paar mA) geführt hatten. Das liess sich auch mit 
dem Multimeter messen. Aber soweit ich weiss behält der Mega328 die 
PullUp im power down? Oder ist es doch anders?

Zum AVR Tiefschlaf gibt es hier auch zwei Artikel im Wiki:
https://www.mikrocontroller.net/articles/Ultra_low_power
https://www.mikrocontroller.net/articles/Sleep_Mode

von Gregor W. (gregor_w)


Lesenswert?

Johannes S. schrieb:
> Aber soweit ich weiss behält der Mega328 die
> PullUp im power down? Oder ist es doch anders?

Das ist auch mein Wissensstand.
Dann messe ich mal die BME Auslesedauer.

Johannes S. schrieb:
> Am I2C sind im Schaltplan keine Widerstände drin, hat das Modul die
> PullUp aktiviert?

Diese Module haben bereits interne Pullups.

von Gregor W. (gregor_w)


Lesenswert?

Also ich starte jetzt einen Test mit Sendeintervall 60 sec. OHNE TWI 
Interface, d.h. ich lese den BME gar nicht aus, sonder sende Fake-Random 
Werte. Ich melde mich dann nach ein Paar Tagen mit den Resultaten!

von Gregor W. (gregor_w)


Angehängte Dateien:

Lesenswert?

Hmmm, also leider hat das auch nichts gebracht. Der Spannungsabfall nach 
vier Tagen beträgt 0.2V (2.25 V auf 2.04 V).

Falls ihr noch andere Ideen habt, her damit. Ich bin mit meinem Latein 
am ende.

von Johannes S. (Gast)


Lesenswert?

schwierig. Dann müsste man einen 2. Logger bauen der die Stromaufnahme 
mitprotokolliert, irgendwann müsste der µC ja zu lange zu viel ziehen. 
Oder das Messgerät lange im Auge behalten.
Sind die Eneloops in Ordnung? Und auch keine Fälschungen? Du kannst die 
mit einem R mit 50 - 100 mA belasten und deinen Logger dranhängen um die 
Kapazität zu messen. AAA Eneloops haben doch eher 750 mA statt 1000 mA, 
nicht das das irgendwelche überalterte Standard NiMH sind. Frisch 
geladen sollten die mit >2,8 V starten, deine Diagramme gehen bei 2,4 V 
los. Stimmt die µC Messung mit dem Multimeter überein?

von Gregor W. (gregor_w)


Lesenswert?

Johannes S. schrieb:
> Sind die Eneloops in Ordnung?

Die sind neu. Aber wie weiter oben erwähnt, die "Entladekurve" ist auch 
bei Alkaline ähnlich.

Johannes S. schrieb:
> Frisch
> geladen sollten die mit >2,8 V starten

Sicher? Das sind AAA nicht AA. D.h. die Spannung ist 1,2V pro Zelle.

Johannes S. schrieb:
> Dann müsste man einen 2. Logger bauen der die Stromaufnahme
> mitprotokolliert, irgendwann müsste der µC ja zu lange zu viel ziehen.

Ja, so scheint es mir auch :(
Hab 'n INA219 bestellt. Ich halte euch auf den laufenden.

von Johannes S. (Gast)


Lesenswert?

Gregor W. schrieb:
> Sicher? Das sind AAA nicht AA. D.h. die Spannung ist 1,2V pro Zelle.

die Größe spielt keine Rolle, beides sind NiMH. Ganz voll und bei der 
geringen Last oder im Leerlauf müssten die 1,4 V anzeigen.
https://docs.rs-online.com/d9ae/0900766b812ff4cc.pdf

von Gregor W. (gregor_w)


Angehängte Dateien:

Lesenswert?

Ich habe eine Messschaltung mit einem Arduino Nano und INA219 laufen 
lassen.
Angeschlossen habe ich INA nach Anleitung 
(https://www.14core.com/wiring-the-i2c-ina219-zero-drift-bidirectional-currentpower-monitor-with-mcu/)

Zusätzlich ist der Arduino Nano mit USB mit meinem PC verbunden, damit 
ich über den seriellen Output die Messdaten loggen kann.

Ich messe 100x in der Sekunde, erstelle einen Sekundendurchschnitt und 
speichere den max. Wert und gebe diese aus.
Nach 3 Tagen (oder 284576 Messungen) sehe ich nichts auffälliges, im 
Anhang repräsentativ eine Stunde: Idle ca. 0 mA, beim Versenden ~6 mA 
pro Sekunde (ina219.png), der max. Wert liegt bei 28 mA , macht im 
Durchschnitt 0,16 mAh.

ABER: Nach dem Anschließen des INA, sinkt meine Spannung nicht mehr und 
bleibt seit Tagen bei 1.9V, siehe VCC_INA.png.

Habe ich jetzt bei der INA Schaltung was falsch gemacht und der Strom 
wird über USB gezogen, oder verbraucht meine Schaltung mit INA 
unerklärlicherweise endlich so wenig wie ich es erwartet habe?

von neuer PIC Freund (Gast)


Lesenswert?

Nur wenn sensorValuesChanged triggert, sendest und schläfst du. 
Ansonsten geht es nonstop über bme.read(). Sollte das Kerlchen nicht 
immer schlafen?

von Gregor W. (gregor_w)


Lesenswert?

Du hast recht, da ist die eine Klammer falsch. Da habe ich wohl 'n copy 
paste Fehler. Es muss natürlich:
1
//send the packet
2
    int loraState=lora.transmit(outBuffer, 6);
3
    if (loraState == 0) 
4
    {
5
      Serial.println("the packet was successfully transmitted");
6
    }
7
  }//sensor values changed
8
//go to sleep
9
    lora.sleep();
10
    for (unsigned long i=0; i<(SLEEPTIME_SEC/8); i++)
11
    {
12
      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);  
13
    }

heißen.

von Gregor Wegrzynek (Gast)


Lesenswert?

Ich verwende derzeit vom Ina219 nur den Vin+ und Vin-, alle anderen 
Pins, Usb ist getrennt.
Also besteht die Schaltung aus meinem lora node, Batterie und Ina219. 
Seit einer Woche bleibt die Spannung konstant, also frage ich mich was 
im Ina219 meinen Stromverbrauch gefixt hat?! Shunt, Dioden?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.