Inhaltsverzeichnis:

Einfaches BLE mit sehr geringem Stromverbrauch in Arduino Teil 2 - Temperatur- / Feuchtigkeitsmonitor - Rev 3: 7 Schritte
Einfaches BLE mit sehr geringem Stromverbrauch in Arduino Teil 2 - Temperatur- / Feuchtigkeitsmonitor - Rev 3: 7 Schritte

Video: Einfaches BLE mit sehr geringem Stromverbrauch in Arduino Teil 2 - Temperatur- / Feuchtigkeitsmonitor - Rev 3: 7 Schritte

Video: Einfaches BLE mit sehr geringem Stromverbrauch in Arduino Teil 2 - Temperatur- / Feuchtigkeitsmonitor - Rev 3: 7 Schritte
Video: DIY BMS v2.0 - Einfach, günstig, wireless, erweiterbar & komplett erklärt 2024, November
Anonim
Easy Very Low Power BLE in Arduino Teil 2 – Temperatur-/Feuchtigkeitsmonitor – Rev 3
Easy Very Low Power BLE in Arduino Teil 2 – Temperatur-/Feuchtigkeitsmonitor – Rev 3
Easy Very Low Power BLE in Arduino Teil 2 – Temperatur-/Feuchtigkeitsmonitor – Rev 3
Easy Very Low Power BLE in Arduino Teil 2 – Temperatur-/Feuchtigkeitsmonitor – Rev 3
Easy Very Low Power BLE in Arduino Teil 2 – Temperatur-/Feuchtigkeitsmonitor – Rev 3
Easy Very Low Power BLE in Arduino Teil 2 – Temperatur-/Feuchtigkeitsmonitor – Rev 3

Update: 23. November 2020 – Erster Austausch von 2 x AAA-Batterien seit 15. Januar 2019 dh 22 Monate für 2x AAA AlkalineUpdate: 7. April 2019 – Rev 3 von lp_BLE_TempHumidity, fügt Datum/Uhrzeit-Plots mit pfodApp V3.0.362+ hinzu und automatische Drosselung beim Senden Daten

Update: 24. März 2019 – Rev 2 von lp_BLE_TempHumidity, fügt weitere Plotoptionen und i2c_ClearBus hinzu

Dieses anweisbare, ein Temperatur-Feuchtigkeitsmonitor mit sehr geringer Leistung, ist Teil 2 von 3.

Teil 1 – Mit Arduino leicht gemachte BLE-Geräte mit sehr geringem Stromverbrauch erstellen: Das Einrichten von Arduino für die Codierung von nRF52-Geräten mit geringem Stromverbrauch, das Programmiermodul und das Messen des Versorgungsstroms. Es umfasst auch spezialisierte Low-Power-Timer und Komparatoren sowie entprellte Eingänge und die Verwendung von pfodApp zum Verbinden und Steuern des nRF52-Geräts.

Teil 2 – Ein Temperatur-Feuchtigkeitsmonitor mit sehr niedrigem Stromverbrauch, dieser umfasst die Verwendung eines Redbear Nano V2-Moduls und eines Si7021-Temperatur- / Feuchtigkeitssensors, um einen Batterie- / Solarmonitor mit niedrigem Stromverbrauch zu bauen. Es umfasst auch die Modifikation der Si7021-Bibliothek auf einen niedrigen Stromverbrauch, die Abstimmung des BLE-Geräts, um seinen Stromverbrauch von <25uA zu reduzieren, und das Entwerfen einer benutzerdefinierten Temperatur-/Feuchtigkeitsanzeige für Ihr Mobiltelefon.

Teil 3 – Ein Redbear Nano V2 Ersatzabdeckungen mit anderen nRF52-basierten Modulen anstelle des Nano V2. Es umfasst die Auswahl von Versorgungskomponenten, den Aufbau, das Entfernen des nRF52-Chip-Programmierschutzes, die Verwendung von NFC-Pins als normalen GPIO und die Definition einer neuen nRF52-Platine in Arduino.

Dieses anweisbare ist eine praktische Anwendung von Teil 1 Bau von BLE-Geräten mit sehr geringem Stromverbrauch, die mit Arduino einfach gemacht werden, indem ein BLE-Temperatur- und Feuchtigkeitsmonitor mit sehr geringem Stromverbrauch gebaut wird. Der Monitor läuft jahrelang mit einer Knopfzelle oder 2 x AAA-Batterien, mit Solarunterstützung sogar noch länger. Dieses Tutorial behandelt die Abstimmung der BLE-Parameter für einen geringen Stromverbrauch und wie Sie Ihr Gerät nur mit Batterie ODER Batterie + Solar ODER Solar versorgen.

Der Monitor zeigt nicht nur die aktuelle Temperatur und Luftfeuchtigkeit an, sondern speichert auch die letzten 36 Stunden von 10 Minuten-Messwerten und die letzten 10 Tage von stündlichen Messwerten. Diese können auf Ihrem Android-Handy grafisch dargestellt und die Werte in einer Protokolldatei gespeichert werden. Es ist keine Android-Programmierung erforderlich, pfodApp übernimmt all das. Die Android-Anzeige und -Diagramme werden vollständig von Ihrer Arduino-Skizze gesteuert, sodass Sie sie nach Bedarf anpassen können.

Für die nRF52832 BLE Komponente wird ein Redbear Nano V2 Board verwendet und für den Temperatur-/Feuchtigkeitssensor wird ein Sparkfun Si7021 Breakout Board verwendet. Beim Si7021 wird eine modifizierte Low-Power-Bibliothek verwendet. Eine kleine Platine wurde entwickelt, um den NanoV2 aufzunehmen und Komponenten zu versorgen. Da jedoch keine oberflächenmontierten Komponenten verwendet werden, können Sie diese genauso einfach auf Vero-Board aufbauen. Es werden drei Netzteilvarianten abgedeckt. i) Batterie plus Solarunterstützung, ii) Nur Batterie, iii) Nur Solar. Die Option Solar Only hat keinen Batteriespeicher und läuft daher nur bei Lichteinfall. Ein helles Raumlicht oder eine Schreibtischlampe ist ausreichend.

Umriss

Dieses Projekt besteht aus 4 relativ unabhängigen Teilen:-

  1. Komponentenauswahl und Konstruktion
  2. Code – Low Power Sensor Library, User Interface und Arduino Sketch
  3. Messen von Versorgungsstrom und Batterielebensdauer
  4. Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar

Schritt 1: Komponentenauswahl

Komponentenauswahl

Wie in Teil 1 erwähnt – Der Trick zu einer wirklich stromsparenden Lösung besteht darin, die meiste Zeit nichts zu tun, den Strom durch externe Pull-Up/Pull-Down-Widerstände an den Eingängen zu minimieren und keine zusätzlichen Komponenten zu verwenden. Dieses Projekt wird jeden dieser Tricks verwenden, um eine Lösung mit geringem Stromverbrauch zu erhalten.

Die nRF52832-Komponente

Der nRF52832-Chip kann mit einer Stromversorgung zwischen 1,7 V und 3,6 V (absolute maximale Spannung 3,9 V) betrieben werden. Dies bedeutet, dass Sie den Chip direkt über eine Knopfzelle oder 2 x AAA-Batterien mit Strom versorgen können. Es ist jedoch ratsam, einen Spannungsregler hinzuzufügen, um den Chip vor Überspannungen zu schützen. Diese zusätzliche Komponente ist mit Stromkosten verbunden, aber im Fall der NanoV2-Platine verbraucht der integrierte Regler TLV704 weniger als 5,5 uA max, typischerweise nur 3,4 uA. Für diesen kleinen zusätzlichen Stromverbrauch erhalten Sie Schutz für bis zu 24V-Versorgungseingänge.

Die Si7021-Komponente

Der Si7021-Sensor selbst verbraucht typischerweise <1uA, wenn keine Messung durchgeführt wird, also im Standby, und bis zu 4mA, wenn die Daten über I2C übertragen werden. Da wir nicht ständig messen, sind die 4 mA kein wesentlicher Teil des durchschnittlichen Versorgungsstroms. Wenn Sie alle 30 Sekunden eine Messung durchführen, wird der durchschnittliche Versorgungsstrom um weniger als 1uA erhöht, siehe die untenstehenden Versorgungsstrommessungen.

Es gibt zwei leicht verfügbare Si7021-Breakout-Boards. Eine von Adafruit und eine von Sparkfun. Ein kurzer Blick auf die beiden Boards zeigt Ihnen, dass das Adafruit-Board viel mehr Komponenten hat als das Sparkfun-Board, Sie würden also geneigt sein, das Sparkfun-Board zu wählen. Ein Blick auf die Schaltpläne für jedes Board zeigt, dass das Sparkfun-Board nur der nackte Sensor und zwei 4k7-Pullup-Widerstände ist, während das Adafruit-Board einen integrierten MIC5225-Regler hat, der normalerweise 29uA die ganze Zeit zieht. Dies ist von Bedeutung, wenn der Gesamtstrom für den Rest des Stromkreises <30uA beträgt. Da wir bereits einen Regler für den nRF52832-Chip haben, wird diese zusätzliche Komponente nicht benötigt und der Si7021 kann mit dieser 3,3-V-Versorgung versorgt werden. In diesem Projekt wird also das Breakout-Board Si7021 von Sparkfun verwendet.

Minimieren Sie den Strom durch externe Pull-Up/Pull-Down-Widerstände an den Eingängen

Die 4K7 I2C-Pullup-Widerstände haben keinen besonders hohen Wert und ziehen 0,7 mA, wenn sie niedrig gezogen werden. Dies wäre ein Problem, wenn sie sich an einem Schalteingang befinden, der für längere Zeit geerdet ist. In diesem Projekt wird jedoch der Strom durch diese Widerstände minimiert, indem die I2C-Schnittstelle nur selten und nur für kurze Zeit verwendet wird. Die I2C-Leitungen werden meistens nicht verwendet und sind High / Tri-State, sodass kein Strom durch diese Widerstände fließt.

Schritt 2: Konstruktion

Konstruktion
Konstruktion
Konstruktion
Konstruktion
Konstruktion
Konstruktion

Das Projekt ist auf einer kleinen Platine aufgebaut, aber da es keine SMD-Bauteile gibt, kann es genauso einfach mit Vero-Board gebaut werden. Die Platine wurde von pcbcart.com aus diesen Gerber-Dateien hergestellt, TempHumiditySensor_R1.zip Die Platine ist universell genug, um für andere BLE-Projekte verwendet zu werden.

Der Schaltplan ist oben gezeigt. Hier ist eine pdf-Version.

Liste der Einzelteile

Ungefähre Kosten pro Einheit, Stand Dezember 2018, ~62 US-Dollar, ohne Versand und Programmierer aus Teil 1

  • Rotbär NanoV2 ~ 17€
  • Sparkfun Si7021 Breakout-Board ~8 US$
  • 2 x 53mm x 30mm 0,15W 5V Solarzellen z. B. Überfliegen ~1,10 $
  • 1 x PCB TempHumiditySensor_R1.zip ~US $ 25 für 5 Rabatt auf www.pcbcart.com ODER Vero-Platine (Kupferstreifen) z. B. Jaycar HP9540 ~AUD$5
  • 2 x 1N5819 Schottky-Dioden z. B. Digikey 1N5819FSCT-ND ~€1
  • 1 x 470R 0,4W 1% Widerstand z. B. Digikey BC3274CT-ND ~0,25 $
  • 6 x 6-polige Stiftleisten, z. B. Funkenspaß PRT-00116 ~US$1.5
  • weiblich zu weiblich Jumper z. B. Adafruit-ID: 1950 ~2 US$
  • 3mm x 12mm Nylonschrauben, z. B. Jaycar HP0140 ~AUD$3
  • 3mm x 12mm Nylonmuttern, z. B. Jaycar HP0146 ~AUD$3
  • Scotch Permanent-Montageband Cat 4010 z. B. von Amazon ~6,6 $
  • AAA x 2 Batteriehalter, z. B. Funkenspaß PRT-14219 ~US$1.5
  • 2 x AAA 750mA Alkaline Batterien, z. B. Sparkfun PRT-09274 ~US$1.0 Diese Batterien sollten >2 Jahre halten. Energizer Alkaline Batterien haben eine höhere Kapazität
  • Kunststoffbox (ABS) 83mm x 54mm x 31mm, z. B. Jaycar HB6005 ~AUD$3
  • pfodApp ~€10
  • 1 x 22uF 63V Low ESR Kondensator (optional) z. B. Jaycar RE-6342 ~0,5 AUD oder Digikey P5190-ND ~0,25 USD

Der Aufbau ist geradlinig. Der Batteriehalter und die Solarzellen werden mit robustem doppelseitigem Klebeband an der Kunststoffbox befestigt.

Beachten Sie die Gnd-Verbindungsleitung vom CLK zu GND im fertigen Teil. Dies wird NACH der Programmierung installiert, um zu verhindern, dass Rauschen am CLK-Eingang den nRF52-Chip in einen Hochstrom-Debug-Modus auslöst

Schritt 3: Code – Low Power Sensor Library, User Interface und Arduino Sketch

Code – Low Power Sensor Library, User Interface und Arduino Sketch
Code – Low Power Sensor Library, User Interface und Arduino Sketch
Code – Low Power Sensor Library, User Interface und Arduino Sketch
Code – Low Power Sensor Library, User Interface und Arduino Sketch
Code – Low Power Sensor Library, User Interface und Arduino Sketch
Code – Low Power Sensor Library, User Interface und Arduino Sketch

Laden Sie den gezippten Code lp_BLE_TempHumidity_R3.zip herunter und entpacken Sie ihn in Ihr Arduino Sketches-Verzeichnis. Sie müssen auch die Bibliothek lp_So7021 aus dieser ZIP-Datei installieren und auch die pfodParser-Bibliothek installieren.

Low-Power-Sensorbibliothek, lp_Si7021

Sowohl Adafruit als auch Sparkfun bieten Unterstützungsbibliotheken für den Zugriff auf den Si7021-Sensor, jedoch sind diese beiden Bibliotheken für einen sehr geringen Stromverbrauch ungeeignet. Beide verwenden eine Verzögerung (25) im Code, um das Lesen des Sensors während der Messung zu verzögern. Wie in Teil 1 erwähnt, sind Verzögerungen böse. Das Arduino delay () hält den Mikroprozessor nur mit Strom am Laufen, während er auf das Timeout der Verzögerung wartet. Dies bricht die erste Regel des Low-Power-BLE, tun Sie die meiste Zeit nichts. Die Ersatzbibliothek lp_Si7021 ersetzt alle Verzögerungen durch lp_timer, die den Mikroprozessor in den Ruhezustand versetzen, während er darauf wartet, dass der Sensor seine Messung beendet.

Wie viel Unterschied macht die Bibliothek lp_Si7021? Bei Verwendung der ursprünglichen SparkFun Si7021-Unterstützungsbibliothek und einer Messung pro Sekunde ohne serielle Drucke werden im Durchschnitt ~ 1,2 mA verbraucht. Das Ersetzen der Sparkfun-Bibliothek durch die lp_Si7021-Bibliothek reduziert den durchschnittlichen Strom auf ~10uA, d.h. 100-mal weniger. In diesem Projekt ist die schnellste Messrate einmal alle 30 Sekunden, wenn das Mobiltelefon angeschlossen ist, was zu einem durchschnittlichen Sensorstrom von weniger als 1uA führt. Wenn keine BLE-Verbindung besteht, beträgt die Messrate alle 10 Minuten und der durchschnittliche Sensorversorgungsstrom ist vernachlässigbar.

Benutzeroberfläche

Oben sehen Sie die Hauptbildschirmanzeige und eine vergrößerte Ansicht des 10-Tage-Stundenverlaufs. Plots können mit zwei Fingern in beide Richtungen gezoomt und geschwenkt werden.

Die Benutzeroberfläche wird in der Arduino-Skizze codiert und dann bei der ersten Verbindung an pfodApp gesendet, wo sie für wiederholte Verwendung und Aktualisierungen zwischengespeichert wird. Die grafische Anzeige wird aus Zeichnungsprimitiven aufgebaut. Eine Anleitung zum Erstellen eigener Steuerelemente finden Sie unter Benutzerdefinierte Arduino-Steuerelemente für Android. Die Thermometer-, RHGauge- und Button-Dateien enthalten die Zeichenbefehle für diese Elemente.

Hinweis: Keine, wenn diese Anzeige in pfodApp integriert ist. Die gesamte Anzeige wird vollständig durch den Code in Ihrer Arduino-Skizze gesteuert

Die Methode sendDrawing_z() in der Skizze lp_BLE_TempHumidity_R3.ino definiert die Benutzeroberfläche.

Void sendDrawing_z() { dwgs.start (50, 60, dwgs. WHITE); // Der Hintergrund ist standardmäßig WEISS, wenn er weggelassen wird, d.h. start(50, 60); parser.sendRefreshAndVersion(30000); // dwg alle 30 Sek. neu anfordern. dies wird ignoriert, wenn keine Parser-Version gesetzt ist // Berühren Sie die oberen Schaltflächen, um Anzeigeaktualisierungen zu erzwingen dwgs.touchZone().cmd('u').size(50, 39).send(); dwgs.pushZero(35, 22, 1.5); // Null in die Mitte von dwg auf 35, 22 verschieben und um das 1,5-fache skalieren rhGauge.draw (); // das Steuerelement zeichnen dwgs.popZero(); dwgs.pushZero(18, 33); // Null in die Mitte von DWG auf 18 verschieben, 33 Skala ist 1 (Standard) thermometer.draw (); // das Steuerelement zeichnen dwgs.popZero();

dwgs.pushZero(12,5, 43, 0,7); // Verschieben Sie die Null in die Mitte von dwg auf 12,5, 43 und skalieren Sie um 0,7

hrs8PlotButton.draw(); // das Steuerelement zeichnen dwgs.popZero(); dwgs.pushZero(37,5, 43, 0,7); // Null in die Mitte von dwg auf 37.5, 43 verschieben und um 0.7 skalieren. days1PlotButton.draw(); // das Steuerelement zeichnen dwgs.popZero();

dwgs.pushZero(12.5, 54, 0.7); // Verschieben Sie die Null in die Mitte von dwg auf 12,5, 54 und skalieren Sie um 0,7

days3PlotButton.draw(); // das Steuerelement zeichnen dwgs.popZero(); dwgs.pushZero(37,5, 54, 0,7); // Null in die Mitte von dwg auf 37.5, 54 verschieben und um 0.7 skalieren. days10PlotButton.draw(); // das Steuerelement zeichnen dwgs.popZero(); dwgs.end(); }

Die pushZero-Befehle ändern den Ursprung und die Skalierung zum Zeichnen des nächsten Bauteils. Auf diese Weise können Sie die Größe und Position der Tasten und Anzeigen ganz einfach ändern.

Bei der ersten Verbindung dauert die anfängliche Anzeige 5 oder 6 Sekunden, um die ~800 Bytes herunterzuladen, die die Anzeige definieren. pfodApp speichert die Anzeige im Cache, sodass zukünftige Updates nur die Änderungen, Messgerätpositionen und Messwerte senden müssen. Diese Updates benötigen nur ein paar Sekunden, um die 128 Bytes zu senden, die zum Aktualisieren der Anzeige erforderlich sind.

Im Display sind fünf (5) aktive Berührungszonen definiert. Für jede Schaltfläche ist eine in ihrer draw()-Methode definiert, sodass Sie darauf klicken können, um den entsprechenden Plot zu öffnen, und die obere Hälfte des Bildschirms ist als dritte Berührungszone konfiguriert

dwgs.touchZone().cmd('u').size(50, 39).send();

Wenn Sie auf den Bildschirm über den Schaltflächen klicken, wird der 'u' dwg-Befehl an Ihre Skizze gesendet, um eine neue Messung und Bildschirmaktualisierung zu erzwingen. Normalerweise erfolgen Updates nur alle 30 Sekunden, wenn eine Verbindung besteht. Jeder Klick oder jede Aktualisierung der Zeichnung erzwingt eine neue Messung. Die Antwort vom Arduino-Sketch an pfodApp wird verzögert, bis die neue Messung abgeschlossen ist (~25mS), damit der neueste Wert im Update gesendet werden kann.

Arduino-Skizze

Die Arduino-Skizze, lp_BLE_TempHumidity_R3.ino, ist eine erweiterte Version der in Teil 1 verwendeten Beispielskizze. Die Skizze lp_BLE_TempHumidity_R3.ino ersetzt das Menü durch die oben gezeigte Zeichnung. Es fügt auch die Sensorunterstützung lp_Si7021 und Daten-Arrays hinzu, um die 10-Minuten- und stündlichen historischen Messungen zu speichern.

Die Hauptkomplikation in der Skizze lp_BLE_TempHumidity_R3.ino besteht darin, das Senden der Plotdaten zu handhaben. Während die Messungen durchgeführt werden, übernimmt readRHresults() das Sammeln der Ergebnisse und das Speichern in den historischen Arrays. Die Arrays sind 120 lang, aber wenn die Daten gesendet werden, liegen die ersten 30 Datenpunkte in einem feineren Zeitintervall.

Beim Senden der 200 ungeraden Plotpunkte zur Anzeige sind einige Punkte zu beachten:

  1. Jeder Datenpunkt ist im CSV-Textformat ~25 Byte lang. 150 Punkte sind also 3750 Byte Daten. Die Klasse lp_BLESerial verfügt über einen Puffer von 1536 Byte, von dem 1024 groß genug für die größte pfod-Nachricht sind. Die anderen 512 Byte sind für das Senden der Daten reserviert. Sobald die historischen Daten die 512 Bytes gefüllt haben, wird das Senden weiterer Daten verzögert, bis im Puffer Platz ist.
  2. Um zu vermeiden, dass die Plotdaten die Aktualisierungen der Hauptanzeige verlangsamen, werden die Plotdaten nur gesendet, während der Plotbildschirm angezeigt wird. Sobald der Benutzer zum Hauptbildschirm zurückwechselt, wird das Senden der Plotdaten angehalten. Das Senden der Plotdaten wird fortgesetzt, wenn der Benutzer auf die Plot-Schaltfläche klickt, um den Plot erneut anzuzeigen.
  3. Die historischen Plots beginnen bei 0 (jetzt) und gehen zeitlich rückwärts. Wenn seit Anzeige des letzten Plots keine neue Messung erfolgt ist, werden die bereits heruntergeladenen vorherigen Daten einfach sofort wieder angezeigt. Wenn es eine neue Messung gibt, wird diese zu den vorherigen Plotdaten hinzugefügt.
  4. Beim ersten Einschalten des Monitors sind keine historischen Messwerte vorhanden und 0 wird als ungültiger Messwert in den Arrays gespeichert. Wenn der Plot angezeigt wird, werden ungültige Messwerte einfach übersprungen, was zu einem kürzeren Plot führt.

Celsius und Fahrenheit

Die Skizze lp_BLE_TempHumidity_R3.ino zeigt die Daten in Celsius an und zeichnet sie auf. Um die Ergebnisse in Fahrenheit umzuwandeln, ersetzen Sie alle Vorkommen von

parser.print(sensor. Temp_RawToFloat(..

mit

parser.print(sensor. CtoF(sensor. Temp_RawToFloat(…

Und ersetzen Sie das Unicode-GradC-Symbol in Octal \342\204\203 durch das GradF-Symbol \342\204\211

pfodApp zeigt jeden Unicode an, den Sie auf Ihrem Handy anzeigen können.

Weitere Informationen finden Sie unter Verwenden von Nicht-ASCII-Zeichen in Arduino. Ändern Sie auch die Einstellungen MIN_C, MAX_C in Thermometer.h. Passen Sie abschließend die Plotgrenzen nach Ihren Wünschen an, z. B. ändern |Temp C~32~8~Grad C|

sagen

|Temp F~90~14~Grad F|

Schritt 4: Messen des Versorgungsstroms

Messen des Versorgungsstroms
Messen des Versorgungsstroms

Bei Verwendung der lp_Si7021-Bibliothek trägt selbst eine Temperatur- / Feuchtigkeitsmessung alle 10 Sekunden nur ~ 1uA zum durchschnittlichen Versorgungsstrom bei, daher ist der Hauptfaktor für den Versorgungsstrom und damit die Batterielebensdauer der Strom, der von der BLE-Werbung und Verbindung und Datenübertragung verwendet wird.

Verbinden Sie die Temperatur-/Feuchtigkeitsplatine wie oben gezeigt mit dem in Teil 1 beschriebenen Programmiergerät.

Wenn die Solarzellen und Batterien nicht angeschlossen sind, werden Vin und Gnd mit den Vdd und Gnd des Programmierers (die gelben und grünen Leitungen) verbunden und die SWCLK und SWDIO werden mit den Clk und SIO der Programmierer-Headerplatine (die blauen und rosa Leitungen) verbunden.

Sie können nun NanoV2 programmieren und den Versorgungsstrom messen, wie in Teil 1 beschrieben.

Installieren Sie die Low-Power-Si7021-Bibliothek aus dieser Zip-Datei, lp_Si7021.zip und installieren Sie die pfodParser-Bibliothek und entpacken Sie lp_BLE_TempHumidity_R3.zip in Ihr Arduino-Skizzenverzeichnis und programmieren Sie das Temp/Humditiy-Board mit lp_BLE_TempHumidity_R3.ino

Wie oben erwähnt, beträgt der Beitrag des Sensors <1uA, durchschnittlich, bei der höchsten in diesem Projekt verwendeten Messrate, daher sind die BLE-Werbung und die Verbindungsparameter der bestimmende Faktor für die Batterielebensdauer.

Die BLE-Werbungs- und Verbindungsparameter, die den Stromverbrauch beeinflussen, sind: – Sendeleistung, Werbeintervall, maximale und minimale Verbindungsintervalle und Slave-Latenz.

Hinweis: Bei Verwendung der obigen Anschlüsse befinden sich zwei (2) Regler in der Versorgung, einer auf der NanoV2-Platine über Vin und der MAX8881 auf der Versorgung des Programmierers. Dies bedeutet, dass die gemessenen Versorgungsströme aufgrund des zweiten Reglers ~5uA höher sind als tatsächlich. Die unten angegebenen Werte sind die gemessenen Ströme abzüglich dieser zusätzlichen 5uA.

Sendeleistung

Tx Power-Effekte liefern Strom sowohl im angeschlossenen als auch im werblichen Zustand (nicht angeschlossen). Dieses Projekt verwendet die maximale Leistungseinstellung (+4) und bietet die beste Reichweite und die größte Störfestigkeit für die zuverlässigsten Verbindungen. Mit der Methode lp_BLESerial setTxPower() können Sie die Energieeinstellung ändern. Gültige Werte sind in steigender Potenz -40, -30, -20, -16, -12, -8, -4, 0 +4. Sie müssen die Methode lp_BLESerial begin() aufrufen, BEVOR Sie setTxPower() aufrufen. Siehe die Skizze lp_BLE_TempHumidity_R3.ino.

Sie können mit der Reduzierung der Tx-Leistung experimentieren, aber der Kompromiss besteht in einer kürzeren Reichweite und mehr Verbindungsabbrüchen aufgrund von Interferenzen. In diesem Projekt wird die Tx Power auf den Standardwert +4 belassen. Wie Sie unten sehen werden, sind auch bei dieser Einstellung noch sehr geringe Versorgungsströme möglich.

Werbeintervall

Für eine bestimmte Sendeleistung legt das Werbeintervall den durchschnittlichen Stromverbrauch fest, wenn keine Verbindung besteht. Der empfohlene Bereich beträgt 500 bis 1000 mS. Hier wurden 2000mS verwendet. Der Kompromiss besteht darin, dass längere Werbeintervalle dazu führen, dass Ihr Handy das Gerät langsamer findet und eine Verbindung aufbaut. Intern werden Werbeintervalle in Vielfachen von 0,625mS im Bereich von 20mS bis 10,24sec eingestellt. Die lp_BLESerial setAdvertisingInterval()-Methode verwendet aus Gründen der Einfachheit mS als Argument. Bei +4 TxPower und 2000mS Werbeintervall betrug die Stromaufnahme ~18uA. Bei einem Werbeintervall von 1000 mS waren es ~29 uA. Rev 2 verwendete ein Werbeintervall von 2000 ms, was jedoch zu langsamen Verbindungen führte. Rev 3 wurde auf 1000 ms Werbeintervall geändert, um Verbindungen schneller zu machen.

Max. und Min. Verbindungsintervalle

Sobald eine Verbindung hergestellt ist, bestimmt das Verbindungsintervall, wie oft das Mobiltelefon das Gerät kontaktiert. Mit lp_BLESerial setConnectionInterval() können Sie die vorgeschlagenen Höchst- und Mindestwerte festlegen, das Mobiltelefon steuert jedoch das tatsächliche Verbindungsintervall. Der Einfachheit halber sind die Argumente für setConnectionInterval() in ms angegeben, aber intern sind die Verbindungsintervalle ein Vielfaches von 1,25 ms im Bereich von 7,5 ms bis 4 s.

Die Standardeinstellung ist setConnectionInterval(100, 150), d.h. min 100mS bis max 150mS. Eine Erhöhung dieser Werte reduziert den Versorgungsstrom im angeschlossenen Zustand, der Kompromiss besteht jedoch in einer langsameren Datenübertragung. Jede Aktualisierung des Bildschirms erfordert etwa 7 BLE-Meldungen, während eine Messung von vollen 36 Stunden und 10 Minuten etwa 170 BLE-Meldungen erfordert. Das Erhöhen der Verbindungsintervalle verlangsamt die Bildschirmaktualisierungen und die Plotanzeigen.

Die Klasse lp_BLESerial hat einen Sendepuffer von 1536 Byte und sendet nur einen Block von 20 Byte aus diesem Puffer, jedes maximale Verbindungsintervall, um zu verhindern, dass die BLE-Verbindung mit Daten überflutet wird. Auch beim Senden von Plotdaten sendet die Skizze nur Daten, bis 512 Byte auf das Senden warten, und verzögert dann das Senden weiterer Daten, bis einige Daten gesendet wurden. Dadurch wird ein Überfluten des Sendepuffers vermieden. Diese Drosselung der Sends macht die Datenübertragung zum Handy zuverlässig, aber sie ist nicht auf maximalen Durchsatz optimiert.

In diesem Projekt wurden die Verbindungsintervalle als Standardwerte belassen.

Slave-Latenz

Wenn keine Daten an das Mobiltelefon zu senden sind, kann das Gerät optional einige der Verbindungsnachrichten vom Mobiltelefon ignorieren. Dies spart Tx Power und Versorgungsstrom. Die Einstellung für die Slave-Latenz ist die Anzahl der zu ignorierenden Verbindungsnachrichten. Der Standardwert ist 0. Die Methode lp_BLESerial setSlaveLatency() kann verwendet werden, um diese Einstellung zu ändern.

Die Standard-Slave-Latenz von 0 ergab ~50uA Versorgungsstrom, wobei die Bildschirmaktualisierungen alle 30 Sekunden ignoriert wurden, aber die KeepAlive-Nachrichten alle 5 Sekunden eingeschlossen wurden. Das Einstellen der Slave-Latenz auf 2 ergab einen durchschnittlichen angeschlossenen Versorgungsstrom von ~25uA. Eine Slave-Latenz-Einstellung von 4 ergab ~20uA. Höhere Einstellungen schienen den Versorgungsstrom nicht zu reduzieren, daher wurde eine Slave-Latenz-Einstellung von 4 verwendet.

Wenn eine Verbindung hergestellt ist, fordert pfodApp alle 30 Sekunden ein Display-Update an. Dies erzwingt eine Sensormessung und sendet Daten zurück, um die grafische Anzeige zu aktualisieren. Dieses Update führt zu zusätzlichen ~66uA für 2 Sekunden alle 30 Sekunden. Das sind durchschnittlich 4,4 uA über die 30 Sekunden. Addiert man dies zu den 20uA, ergibt sich ein durchschnittlicher Anschluss-Versorgungsstrom von ~25uA

Schritt 5: Gesamtversorgungsstrom und Batterielebensdauer

Verwenden Sie die obigen Einstellungen, wie in lp_BLE_TempHumidity_R3.ino eingestellt, den Gesamtversorgungsstrom im angeschlossenen Zustand und aktualisieren Sie die Anzeige alle 30 Sekunden, ungefähr 25uA. Wenn es nicht angeschlossen ist, beträgt es ungefähr 29uA.

Für die Berechnung der Batterielebensdauer wird eine kontinuierliche Stromaufnahme von ~29uA angenommen.

Verschiedene Batterien haben unterschiedliche Kapazitäten und Spannungseigenschaften. Die hier betrachteten Batterien sind CR2032 Knopfzelle, CR2450 (N) Knopfzelle, 2 x AAA Alkaline, 2 x AAA Lithium und LiPo.

Batterieübersicht

Wenn Sie Solar Assist verwenden, addieren Sie 50 % zu diesen Batterielebensdauerwerten (unter der Annahme von 8 Stunden Licht pro Tag)

Hinweis: Der 22uF LowESR Kondensator (C1) speichert zusätzlich zum Onboard NanoV2 22uF Kondensator den Solarzellenstrom und liefert ihn dann für die TX Stromimpulse. Andernfalls liefert die Batterie einen Teil des Sendestroms. Dieser zusätzliche 22uF LowESR erhöht den Batteriestrom um etwa 10 %, wenn die Solarzelle nicht die Versorgung übernimmt, verlängert aber auch die Batterielebensdauer, indem sie den steigenden Batterieinnenwiderstand kompensiert, wenn die Batterie das Ende der Lebensdauer erreicht. Die folgenden Messungen wurden OHNE den zusätzlichen 22uF-Kondensator durchgeführt.

CR2032 – 235 mAHr – Batterielebensdauer 10 MonateCR2450 (N) – 650 mAHr (540 mAHr) – Batterielebensdauer 2,3 Jahre (2 Jahre)2 x AAA Alkaline – 1250 mAHr – Batterielebensdauer 3,8 Jahre2 x AAA Lithium – 1200 mAHr – Batterielebensdauer 4,7 JahreLiPo wiederaufladbar – nicht empfohlen durch hohe Selbstentladung.

CR2032

Diese Knopfzelle hat eine Kapazität von typischerweise 235mAHr (Energizer Battery), eine Nennspannung von 3V und eine spezifizierte Entladespannung von 2V. Dies impliziert eine Akkulaufzeit von 8100 Stunden oder ~0,9 Jahren. Der innere Zellenwiderstand erhöht sich jedoch, wenn die Batterie das Ende der Lebensdauer erreicht und kann daher die Spitzen-Tx-Stromimpulse möglicherweise nicht liefern. Ein größerer Versorgungskondensator kann verwendet werden, um diesen Effekt zu reduzieren, aber sagen wir 10 Monate Lebensdauer.

CR2450 (N)

Diese Knopfzelle hat eine Kapazität von typischerweise 620 mAHr (540 mAHr für CR2450N), eine Nennspannung von 3 V und eine spezifizierte Entladespannung von 2 V. Dies bedeutet eine Batterielebensdauer von 22, 400 Stunden oder ~2 Jahre 6 Minuten (18600 Stunden ~ 2 Jahre 2 Minuten für CR2450N). Der innere Zellenwiderstand erhöht sich jedoch, wenn die Batterie das Ende der Lebensdauer erreicht und kann daher möglicherweise nicht die Spitzen-Tx-Stromimpulse liefern. Ein größerer Versorgungskondensator kann verwendet werden, um diesen Effekt zu reduzieren, aber sagen wir 2 Jahre 4 m (2 Jahre N) Lebensdauer.

Hinweis: Die CR2450N-Version hat eine dickere Lippe, die eine falsche Installation in einem CR2450N-Halter verhindert. Sie können eine CR2450N- und CR2450-Zelle in einen CR2450-Halter einsetzen, jedoch keine CR2450-Zelle in einen CR2450N-Halter

2 x AAA Alkaline-Zellen

Diese Batterien haben eine Kapazität von ca. 1250mAHr (Energizer Battery) für sehr kleine Ströme, eine Nennspannung von 2x1,5V = 3V und eine spezifizierte Entladespannung von 2x0,8V = 1,6V. Diese angegebene Entladespannung ist jedoch geringer als die Betriebsspannung des Si7021-Sensors (1,9 V), sodass die Batterie jeweils nur bis zu ~ 1 V verwendet werden kann. Dies reduziert die Kapazität um etwa 10 bis 15 %, d. h. ~1000 mAHr.

Dies bedeutet eine Akkulaufzeit von 34, 500 Stunden oder ~ 4 Jahren. Der innere Zellenwiderstand erhöht sich jedoch, wenn die Batterie das Ende der Lebensdauer erreicht und kann daher die Spitzen-Tx-Stromimpulse möglicherweise nicht liefern. Ein größerer Versorgungskondensator kann verwendet werden, um diesen Effekt zu reduzieren, aber sagen wir 3 Jahre 10 m Lebensdauer. Hinweis Alkaline-Batterien haben eine Selbstentladung von 2 % bis 3 % pro Jahr.

2 x AAA Lithiumzellen

Diese Batterien haben eine Kapazität von ca. 1200mAHr (Energizer Battery), eine Nennspannung von 2x1,7V = 3,4V, bei kleinen Strömen und eine Entladespannung von 2x1,4V = 2,4V. Dies bedeutet eine Batterielebensdauer von 41, 400 Stunden oder 4 Jahre 8 Minuten.

LiPo-Akku

Diese Batterien sind in verschiedenen Kapazitäten von 100 mAHr bis 2000 mAHr in flachen Formaten erhältlich und haben eine Ladespannung von 4,2 V und eine Entladespannung von > 2,7 V. Sie haben jedoch eine hohe Selbstentladung von 2 % - 3 %/Monat (d. h. 24 % bis 36 % pro Jahr) und sind daher für diese Anwendung nicht so geeignet wie die anderen Batterien.

Schritt 6: Versorgungsalternativen – Solar Assist, nur Batterie, nur Solar

Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar
Versorgungsalternativen – Solar Assist, Nur Batterie, Nur Solar

Batterie plus Solar Assist

Die obige Konstruktion verwendet die Batterie plus Solar Assist-Versorgung. Wenn die Sonnenkollektoren mehr Spannung als die Batteriespannung erzeugen, versorgen die Solarzellen den Monitor mit Strom und verlängern so die Batterielebensdauer. Typischerweise kann die Akkulaufzeit um weitere 50 % verlängert werden.

Die verwendeten Solarmodule sind klein, 50 mm x 30 mm, billig, ~ 0,50 $ und haben einen geringen Stromverbrauch. Sie sind nominell 5V-Panels, benötigen jedoch volles direktes helles Sonnenlicht, um 5V zu erzeugen. Bei diesem Projekt werden zwei Panels in Reihe geschaltet, so dass die Platzierung des Monitors in der Nähe eines Fensters ohne direkte Sonneneinstrahlung ausreicht, um die Batterieleistung zu ersetzen. Selbst ein gut beleuchteter Raum oder eine Schreibtischlampe reicht aus, damit die Solarzellen >3,3V bei >33uA erzeugen und von der Batterie übernehmen.

Ein einfaches Testpanel wurde konstruiert, um zu bestimmen, wo der Temperatur- / Feuchtigkeitsmonitor außerhalb der Sonne platziert werden kann und trotzdem solarbetrieben wird. Wie Sie auf dem Foto oben sehen können, erzeugen die beiden an einen 100K-Widerstand angeschlossenen Panels 5,64V über die 100K, d.h. 56uA Strom bei 5,64V. Dies ist mehr als ausreichend, um die Stromversorgung des Monitors aus der Batterie zu übernehmen. Jeder Spannungswert über der nominalen Batteriespannung von 3 V bedeutet, dass die Solarzellen den Monitor anstelle der Batterie mit Strom versorgen.

Die beiden Dioden in der Temperatur-Feuchte-Monitor-Schaltung isolieren die Solarzellen und die Batterien voneinander und schützen vor Verpolung. Der 10V 1W Zener- und 470R-Serienwiderstand schützt den On-Board-Regler des NanoV2 vor Überspannung von zwei Solarzellen in voller Sonne, insbesondere wenn 12V-Zellen anstelle von 5V-Zellen verwendet werden. Im Normalbetrieb bei <5V zieht der 10V-Zener nur ~1uA.

Nur Batterie

Für eine reine Batterieversorgung lassen Sie einfach R1, D1 und D3 und die Solarzellen weg. Sie können D1 auch durch ein Stück Draht ersetzen, wenn Sie keinen Verpolungsschutz wünschen.

Nur Solar

Die Stromversorgung des Monitors ausschließlich über Solarzellen ohne Batterie erfordert einen anderen Stromversorgungskreis. Das Problem ist, dass der Monitor zwar mit 29uA betrieben wird, der nRF52 beim Einschalten jedoch ~5 mA für 0,32 Sekunden verbraucht. Die oben gezeigte Schaltung (pdf-Version) hält den MAX8881-Regler ausgeschaltet, bis sich die Eingangskondensatoren, 2 x 1000uF, auf 4,04V aufladen. Dann gibt der MAX6457 den SHDN-Eingang des MAX8881 frei, um den nRF52 (NanoV2) hochzufahren. Die 2 x 1000uF-Kondensatoren liefern den erforderlichen Anlaufstrom.

Dadurch wird der Monitor eingeschaltet, sobald genügend Solarstrom vorhanden ist, und halten Sie ihn bei 29uA.

Schritt 7: Fazit

In diesem Tutorial wurde ein batterie-/solarbetriebener Temperatur-Feuchtigkeitsmonitor als Beispiel für ein BLE-Projekt mit sehr geringem Stromverbrauch in Arduino für den nRF52832-Chip vorgestellt. Versorgungsströme von ~29uA wurden durch Abstimmung der Verbindungsparameter erreicht. Dies führte zu einer Lebensdauer der CR2032-Knopfzellenbatterie von mehr als 10 Monaten. Länger für Knopfzellen und Batterien mit höherer Kapazität. Das Hinzufügen von zwei billigen Solarzellen verlängerte die Batterielebensdauer leicht um 50% oder mehr. Ein helles Raumlicht oder eine Schreibtischlampe reicht aus, um den Monitor aus den Solarzellen zu versorgen.

Ein spezieller Stromkreis wurde vorgestellt, damit der Monitor ausschließlich mit Solarzellen geringer Kapazität betrieben werden kann.

Mit dem kostenlosen pfodDesigner können Sie Menüs / Untermenüs entwerfen, gegen Datum / Uhrzeit und Protokolldaten zeichnen und dann die Arduino-Skizze mit geringem Stromverbrauch für Sie generieren. Hier wurde eine benutzerdefinierte Schnittstelle mit pfodApp-Zeichnungsprimitiven codiert. Beim Verbinden mit pfodApp wird die Benutzeroberfläche angezeigt und die Messwerte aktualisiert, während der Monitor ~29uA. verwendet

Es ist keine Android-Programmierung erforderlich. pfodApp übernimmt all das.

Empfohlen: