Spisu treści:

Łatwy BLE o bardzo niskim poborze mocy w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3: 7 kroków
Łatwy BLE o bardzo niskim poborze mocy w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3: 7 kroków

Wideo: Łatwy BLE o bardzo niskim poborze mocy w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3: 7 kroków

Wideo: Łatwy BLE o bardzo niskim poborze mocy w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3: 7 kroków
Wideo: Podstawy projektowania urządzeń IoT pod kątem niskiego poboru mocy (Low Power IoT Design) 2024, Listopad
Anonim
Łatwy bardzo niski pobór mocy BLE w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3
Łatwy bardzo niski pobór mocy BLE w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3
Łatwy bardzo niski pobór mocy BLE w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3
Łatwy bardzo niski pobór mocy BLE w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3
Łatwy bardzo niski pobór mocy BLE w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3
Łatwy bardzo niski pobór mocy BLE w Arduino Część 2 -- Monitor temperatury / wilgotności -- Rev 3

Aktualizacja: 23 listopada 2020 r. – Pierwsza wymiana baterii 2 x AAA od 15 stycznia 2019 r., tj. 22 miesiące na baterie alkaliczne 2 x AAA. Aktualizacja: 7 kwietnia 2019 r. – Wersja 3 lp_BLE_TempHumidity, dodaje wykresy daty/czasu, przy użyciu pfodApp V3.0.362+ i automatyczne dławienie podczas wysyłania dane

Aktualizacja: 24 marca 2019 – Rev 2 lp_BLE_TempHumidity, dodaje więcej opcji fabuły i i2c_ClearBus

Ten instruktażowy monitor wilgotności temperatury o bardzo niskiej mocy jest częścią 2 z 3.

Część 1 – Łatwe budowanie urządzeń BLE o bardzo niskim poborze mocy dzięki Arduino obejmuje konfigurację Arduino do kodowania urządzeń małej mocy nRF52, moduł programowania i pomiar prądu zasilania. Obejmuje również wyspecjalizowane zegary i komparatory małej mocy oraz wejścia debounce i używanie pfodApp do łączenia się z urządzeniem nRF52 i sterowania nim.

Część 2 – Monitor wilgotności temperatury o bardzo niskim poborze mocy, ten obejmuje użycie modułu Redbear Nano V2 i czujnika temperatury/wilgotności Si7021 do zbudowania baterii/monitora słonecznego o niskim poborze mocy. Obejmuje również modyfikację biblioteki Si7021 w celu zapewnienia niskiego poboru mocy, dostrojenie urządzenia BLE w celu zmniejszenia jego poboru prądu <25uA oraz zaprojektowanie niestandardowego wyświetlacza temperatury/wilgotności dla telefonu komórkowego.

Część 3 – Zamienne osłony Redbear Nano V2 wykorzystujące inne moduły oparte na nRF52 zamiast Nano V2. Obejmuje wybór komponentów zasilania, budowę, usunięcie ochrony programowania chipów nRF52, użycie pinów NFC jako normalnego GPIO i zdefiniowanie nowej płyty nRF52 w Arduino.

Ta instrukcja jest praktycznym zastosowaniem części 1 Budowanie urządzeń BLE o bardzo niskim poborze mocy, które stało się łatwe dzięki Arduino poprzez zbudowanie monitora temperatury i wilgotności BLE o bardzo niskim poborze mocy. Monitor będzie działał przez lata na bateriach Coin Cell lub 2 bateriach AAA, a nawet dłużej dzięki wspomaganiu słonecznemu. Ten samouczek obejmuje dostrajanie parametrów BLE pod kątem niskiego zużycia energii oraz sposób zasilania urządzenia z baterii LUB baterii + energii słonecznej LUB tylko słonecznej.

Oprócz wyświetlania aktualnej temperatury i wilgotności monitor przechowuje ostatnie 36 godzin 10-minutowych odczytów oraz ostatnie 10 dni odczytów godzinowych. Można je sporządzić na wykresie na telefonie komórkowym z systemem Android, a wartości zapisać w pliku dziennika. Nie jest wymagane programowanie na Androida, pfodApp obsługuje to wszystko. Wyświetlanie i wykresy w systemie Android są całkowicie kontrolowane przez szkic Arduino, dzięki czemu można go dostosować zgodnie z wymaganiami.

Płytka Redbear Nano V2 jest używana do komponentu nRF52832 BLE, a płytka rozdzielająca Sparkfun Si7021 jest używana do czujnika temperatury / wilgotności. Z Si7021 używana jest zmodyfikowana biblioteka małej mocy. Mała płytka PCB została zaprojektowana do przechowywania NanoV2 i komponentów zasilających. Ponieważ jednak nie ma żadnych elementów montowanych powierzchniowo, można je równie łatwo zbudować na płycie vero. Obejmuje trzy wersje zasilaczy. i) Akumulator plus wspomaganie solarne, ii) Tylko akumulator, iii) Tylko solarny. Opcja Solar Only nie ma żadnej baterii, więc będzie działać tylko wtedy, gdy będzie trochę światła. Wystarczy jasne światło w pomieszczeniu lub lampka biurkowa.

Zarys

Ten projekt ma 4 względne niezależne części:-

  1. Wybór i budowa komponentów
  2. Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino
  3. Pomiar prądu zasilania i żywotności baterii
  4. Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna

Krok 1: Wybór komponentów

Wybór komponentów

Jak wspomniano w części 1 – Sztuczka do uzyskania rozwiązania o naprawdę niskim poborze mocy polega na tym, aby przez większość czasu nic nie robić, minimalizować prąd przez zewnętrzne rezystory pull-up/pull-down na wejściach i nie mieć żadnych dodatkowych komponentów. Ten projekt wykorzysta każdą z tych sztuczek, aby uzyskać rozwiązanie o niskim poborze mocy.

Komponent nRF52832

Układ nRF52832 może działać przy zasilaniu od 1,7 V do 3,6 V (maksymalne napięcie absolutne 3,9 V). Oznacza to, że możesz zasilać chip bezpośrednio z baterii pastylkowej lub 2 baterii AAA. Rozsądne jest jednak dodanie regulatora napięcia, aby chronić układ przed nadmiernymi napięciami. Ten dodatkowy komponent wiąże się z kosztami energii, ale w przypadku płyty NanoV2 wbudowany regulator TLV704 zużywa mniej niż 5,5uA maks., zwykle tylko 3,4uA. Przy tym niewielkim dodatkowym zużyciu energii otrzymujesz ochronę dla wejść zasilania do 24 V.

Komponent Si7021

Sam czujnik Si7021 pobiera typowo <1uA, gdy nie wykonuje pomiaru, tj. W trybie czuwania, i do 4mA, gdy przesyła dane przez I2C. Ponieważ nie wykonujemy pomiarów w sposób ciągły, 4mA nie stanowi znaczącej części średniego prądu zasilania. Dokonanie odczytu przez 30 sekund dodaje mniej niż 1uA do średniego prądu zasilania, patrz pomiary prądu zasilania poniżej.

Istnieją dwie łatwo dostępne tablice zaciskowe Si7021. Jeden od Adafruit i jeden od Sparkfun. Szybki rzut oka na obie deski powie Ci, że deska Adafruit ma znacznie więcej komponentów niż deska Sparkfun, więc skłaniałbyś się do wyboru deski Sparkfun. Patrząc na schematy dla każdej płyty, widać, że płyta Sparkfun to tylko goły czujnik i dwa rezystory pullup 4k7, podczas gdy płyta Adafruit ma wbudowany regulator MIC5225, który zazwyczaj cały czas pobiera 29uA. Jest to istotne, gdy całkowity prąd dla reszty obwodu wynosi <30uA. Ponieważ mamy już regulator dla układu nRF52832, ten dodatkowy element nie jest potrzebny, a Si7021 może być zasilany z tego źródła 3.3V. Tak więc ten projekt będzie wykorzystywał tablicę zaciskową Si7021 firmy Sparkfun.

zminimalizować prąd poprzez zewnętrzne rezystory pull-up/pull-down na wejściach

Rezystory podciągające 4K7 I2C nie mają szczególnie wysokiej wartości i pobierają 0,7 mA przy niskim stanie. Byłby to problem, gdyby znajdowały się na wejściu przełącznika, które było uziemione przez długi czas. Jednak w tym projekcie prąd płynący przez te rezystory jest zminimalizowany tylko dzięki rzadkiemu korzystaniu z interfejsu I2C i tylko przez krótki czas. Przez większość czasu linie I2C nie są używane i są w stanie wysokim/trójstanowym, więc prąd nie przepływa przez te rezystory.

Krok 2: Budowa

Budowa
Budowa
Budowa
Budowa
Budowa
Budowa

Projekt zbudowany jest na małej płytce drukowanej, ale ponieważ nie ma elementów SMD, równie łatwo można go zbudować na płytce vero. Płytka została wyprodukowana przez pcbcart.com z tych plików Gerber, TempHumiditySensor_R1.zip Płytka jest na tyle ogólnego przeznaczenia, że można ją wykorzystać w innych projektach BLE.

Schemat pokazano powyżej. Oto wersja pdf.

Lista części

Przybliżony koszt jednostkowy według stanu na grudzień 2018 r., ~62 USD, z wyłączeniem wysyłki i programatora z części 1

  • Redbear NanoV2 ~ 17 USD
  • Sparkfun Si7021 tabliczka zaciskowa ~8 USD
  • 2 x 53mm x 30mm 0.15W 5V ogniwa słoneczne m.in. Przelot ~ 1,10 USD
  • 1 x PCB TempHumiditySensor_R1.zip ~ 25 USD za 5 zniżki www.pcbcart.com LUB płytka Vero (taśma miedziana) np. Jaycar HP9540 ~5zł
  • 2 x diody Schottky'ego 1N5819 m.in. Digikey 1N5819FSCT-ND ~US$1
  • 1 x 470R 0,4W 1% rezystor np. Digikey BC3274CT-ND ~0,25 USD
  • 6 x 6-pinowe męskie wtyki listwowe np. Sparkfun PRT-00116 ~ 1,5 USD
  • sweter damski/żeński, np. Identyfikator Adafruit: 1950 ~ 2 USD
  • Śruby nylonowe 3mm x 12mm, m.in. Jaycar HP0140 ~3zł
  • Nakrętki nylonowe 3mm x 12mm, m.in. Jaycar HP0146 ~3zł
  • Taśma klejąca do trwałego montażu Cat 4010 m.in. od Amazon ~ 6,6 USD
  • Uchwyt na baterie AAA x 2, m.in. Sparkfun PRT-14219 ~ 1,5 USD
  • 2 x baterie alkaliczne AAA 750mA, m.in. Sparkfun PRT-09274 ~ 1,0 USD Te baterie powinny trwać > 2 lata. Baterie alkaliczne Energizer mają większą pojemność
  • Pudełko plastikowe (ABS) 83mm x 54mm x 31mm, np. Jaycar HB6005 ~3zł
  • pfodApp ~ 10 USD
  • 1 x kondensator o niskiej esr 22uF 63V (opcjonalnie) np. Jaycar RE-6342 ~0,5 USD lub Digikey P5190-ND ~0,25 USD

Konstrukcja jest prosta. Uchwyt baterii i ogniwa słoneczne są przymocowane do plastikowego pudełka za pomocą wytrzymałej taśmy dwustronnej.

Zwróć uwagę na przewód łączący Gnd z CLK do GND w gotowej części. Jest on instalowany PO zaprogramowaniu, aby zapobiec sytuacji, w której szum na wejściu CLK powoduje przełączenie układu nRF52 w tryb debugowania z wysokim prądem

Krok 3: Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino

Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino
Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino
Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino
Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino
Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino
Kod – Biblioteka czujników niskiego poboru mocy, interfejs użytkownika i szkic Arduino

Pobierz spakowany kod lp_BLE_TempHumidity_R3.zip i rozpakuj go do katalogu Arduino Sketches. Musisz również zainstalować bibliotekę lp_So7021 z tego pliku zip, a także zainstalować bibliotekę pfodParser.

Biblioteka czujników małej mocy, lp_Si7021

Zarówno Adafruit, jak i Sparkfun zapewniają biblioteki wsparcia umożliwiające dostęp do czujnika Si7021, jednak obie te biblioteki nie nadają się do bardzo niskiego zużycia energii. Oba używają opóźnienia (25) w kodzie, aby opóźnić odczyt czujnika podczas wykonywania pomiaru. Jak zauważono w części 1, opóźnienia są złe. Arduino delay() po prostu utrzymuje działanie mikroprocesora przy użyciu zasilania, podczas gdy czeka na przekroczenie limitu czasu opóźnienia. To łamie pierwszą zasadę BLE małej mocy, przez większość czasu nie rób nic. Zastępcza biblioteka lp_Si7021, zastępuje wszystkie opóźnienia lp_timerami, które usypiają mikroprocesor w oczekiwaniu na zakończenie pomiaru przez czujnik.

Jaką różnicę robi biblioteka lp_Si7021? Korzystając z oryginalnej biblioteki obsługi SparkFun Si7021 i wykonując jeden odczyt na sekundę bez żadnych wydruków szeregowych, pobiera średnio ~1,2 mA. Zastąpienie biblioteki Sparkfun biblioteką lp_Si7021 zmniejsza średni prąd do ~10uA, czyli 100 razy mniej. W tym projekcie najszybsza prędkość pomiaru występuje raz na 30 sekund, gdy telefon komórkowy jest podłączony, co skutkuje średnim prądem czujnika mniejszym niż 1uA. W przypadku braku połączenia BLE szybkość pomiaru wynosi raz na 10 minut, a średni prąd zasilania czujnika jest znikomy.

Interfejs użytkownika

Powyżej znajduje się ekran główny i powiększony widok 10-dniowej historii godzinowej. Wykresy można powiększać i przesuwać w obu kierunkach za pomocą dwóch palców.

Interfejs użytkownika jest kodowany w szkicu Arduino, a następnie wysyłany do pfodApp przy pierwszym połączeniu, gdzie jest buforowany do wielokrotnego użycia i aktualizacji. Wyświetlacz graficzny jest zbudowany z prymitywów rysunkowych. Zobacz Custom Arduino Controls for Android, aby zapoznać się z samouczkiem dotyczącym tworzenia własnych kontrolek. Pliki Thermometer, RHGauge i Button zawierają polecenia rysowania dla tych elementów.

Uwaga: Brak, jeśli ten wyświetlacz jest wbudowany w pfodApp. Cały wyświetlacz jest całkowicie kontrolowany przez kod w twoim szkicu Arduino

Metoda sendDrawing_z() w szkicu lp_BLE_TempHumidity_R3.ino definiuje interfejs użytkownika.

void sendDrawing_z() { dwgs.start(50, 60, dwgs. WHITE); // tło jest domyślnie BIAŁE, jeśli pominięte, tj. start(50, 60); parser.sendRefreshAndVersion(30000); // ponowne żądanie dwg co 30sek. jest to ignorowane, jeśli nie ustawiono wersji parsera // dotknij powyższych przycisków, aby wymusić aktualizacje wyświetlania dwgs.touchZone().cmd('u').size(50, 39).send(); dwgs.pushZero(35, 22, 1,5); // przesuń zero do środka dwg do 35, 22 i przeskaluj 1,5 raza rhGauge.draw(); // narysuj kontrolkę dwgs.popZero(); dwgs.pushZero(18, 33); // przesuń zero na środek dwg do 18, 33 skala to 1 (domyślnie) thermometer.draw(); // narysuj kontrolkę dwgs.popZero();

dwgs.pushZero(12,5, 43, 0,7); // przesuń zero do środka rysunku do 12,5, 43 i przeskaluj o 0,7

hrs8PlotButton.draw(); // narysuj kontrolkę dwgs.popZero(); dwgs.pushZero(37,5, 43, 0,7); // przesuń zero na środek dwg do 37,5, 43 i skaluj o 0,7 dni1PlotButton.draw(); // narysuj kontrolkę dwgs.popZero();

dwgs.pushZero(12,5, 54, 0,7); // przesuń zero do środka rysunku do 12,5, 54 i przeskaluj o 0,7

dni3PlotButton.draw(); // narysuj kontrolkę dwgs.popZero(); dwgs.pushZero(37,5, 54, 0,7); // przesuń zero na środek dwg do 37,5, 54 i skaluj o 0,7 days10PlotButton.draw(); // narysuj kontrolkę dwgs.popZero(); dwgs.end(); }

Polecenia pushZero zmieniają początek i skalowanie do rysowania następnego komponentu. Pozwala to na łatwą zmianę rozmiaru i położenia przycisków i wskaźników.

Przy pierwszym połączeniu początkowe wyświetlenie zajmuje 5 lub 6 sekund, aby pobrać ~800 bajtów, które definiują wyświetlanie. pfodApp buforuje wyświetlacz, więc przyszłe aktualizacje będą tylko wysyłać zmiany, pozycje mierników i odczyty. Te aktualizacje zajmują tylko kilka sekund, aby wysłać 128 bajtów potrzebnych do aktualizacji wyświetlacza.

Na wyświetlaczu jest zdefiniowanych pięć (5) aktywnych stref dotykowych. Każdy przycisk ma jeden zdefiniowany w swojej metodzie draw(), więc możesz go kliknąć, aby otworzyć odpowiedni wykres, a górna połowa ekranu jest skonfigurowana jako trzecia strefa dotyku

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

Po kliknięciu ekranu nad przyciskami polecenie 'u' dwg jest wysyłane do szkicu, aby wymusić nowy pomiar i aktualizację ekranu. Zwykle po połączeniu aktualizacje następują tylko co 30 sekund. Każde kliknięcie lub odświeżenie rysunku wymusza nowy pomiar. Odpowiedź ze szkicu Arduino na pfodApp jest opóźniona do momentu zakończenia nowego pomiaru (~25mS), aby w aktualizacji można było przesłać najnowszą wartość.

Szkic Arduino

Szkic Arduino, lp_BLE_TempHumidity_R3.ino, jest rozszerzoną wersją przykładowego szkicu użytego w Części 1. Szkic lp_BLE_TempHumidity_R3.ino zastępuje menu pokazanym powyżej rysunkiem. Dodaje również obsługę czujnika lp_Si7021 i macierze danych do przechowywania 10-minutowych i godzinowych pomiarów historycznych.

Główną komplikacją w szkicu lp_BLE_TempHumidity_R3.ino jest obsługa wysyłania danych wykresu. W miarę wykonywania pomiarów readRHResults() zajmuje się zbieraniem wyników i zapisywaniem ich w tablicach historycznych. Tablice mają długość 120, ale gdy dane są przesyłane, pierwsze 30 punktów danych jest w dokładniejszych odstępach czasu.

Jest kilka punktów, o które należy zadbać podczas wysyłania 200 nieparzystych punktów wykresu do wyświetlenia: -

  1. Każdy punkt danych ma długość ~25 bajtów, w formacie tekstowym CSV. Tak więc 150 punktów to 3750 bajtów danych. Klasa lp_BLESerial ma 1536 bajtowy bufor, z czego 1024 jest wystarczająco duży dla największej wiadomości pfod. Pozostałe 512 bajtów jest zarezerwowane do przesyłania danych. Gdy dane historyczne zapełnią 512 bajtów, wysyłanie dalszych danych jest opóźniane do momentu, gdy w buforze znajdzie się miejsce.
  2. Aby dane wykresu nie spowalniały aktualizacji głównego wyświetlacza, dane wykresu są wysyłane tylko wtedy, gdy wyświetlany jest ekran wykresu. Gdy użytkownik przełączy się z powrotem do ekranu głównego, wysyłanie danych wykresu zostaje wstrzymane. Wysyłanie danych wykresu jest wznawiane, gdy użytkownik kliknie przycisk wykresu, aby ponownie wyświetlić wykres.
  3. Historyczne wątki zaczynają się od 0 (obecnie) i cofają się w czasie. Jeśli nie było żadnego nowego pomiaru od czasu wyświetlenia ostatniego wykresu, poprzednie dane, które zostały już pobrane, są natychmiast ponownie wyświetlane. Jeśli istnieje nowy pomiar, jest on dodawany do poprzedniego wykresu.
  4. Kiedy monitor jest włączany po raz pierwszy, nie ma żadnych historycznych odczytów, a 0 jest przechowywane w tablicach jako nieprawidłowy odczyt. Gdy wykres jest wyświetlany, nieprawidłowe odczyty są po prostu pomijane, co skutkuje krótszym wykresem.

Celsjusza i Fahrenheita

Szkic lp_BLE_TempHumidity_R3.ino wyświetla i kreśli dane w stopniach Celsjusza. Aby przekonwertować wyniki na stopnie Fahrenheita, zastąp wszystkie wystąpienia

parser.print(czujnik. Temp_RawToFloat(..

z

parser.print(czujnik. CtoF(czujnik. Temp_RawToFloat(…

I zastąp symbol degC unicode w ósemkowym \342\204\203 symbolem degF \342\204\211

pfodApp wyświetli dowolny kod Unicode, który można wyświetlić na telefonie komórkowym.

Zobacz Używanie znaków spoza ASCII w Arduino, aby uzyskać więcej informacji. Zmień również ustawienia MIN_C, MAX_C w Thermometer.h. Na koniec dostosuj granice fabuły, jak chcesz, np. Zmień |Temp C~32~8~st C|

powiedzieć

|Temp F~90~14~stopni F|

Krok 4: Pomiar prądu zasilania

Pomiar prądu zasilania
Pomiar prądu zasilania

Korzystając z biblioteki lp_Si7021, nawet pomiar temperatury/wilgotności co 10 sekund przyczynia się tylko do ~1uA średniego prądu zasilania, więc głównym czynnikiem w prądzie zasilania, a co za tym idzie żywotności baterii, jest prąd używany przez reklamę BLE oraz połączenie i transmisję danych.

Podłącz płytkę temperatury/wilgotności do programatora opisanego w części 1, jak pokazano powyżej.

Przy odłączonych ogniwach słonecznych i bateriach, Vin i Gnd są podłączone do Vdd i Gnd programatora (przewody żółty i zielony), a SWCLK i SWDIO są podłączone do Clk i SIO na płycie głównej programatora (przewody niebieski i różowy)

Możesz teraz zaprogramować NanoV2 i zmierzyć prąd zasilania, jak opisano w części 1.

Zainstaluj bibliotekę Si7021 o małej mocy z tego pliku zip, lp_Si7021.zip i zainstaluj bibliotekę pfodParser i rozpakuj lp_BLE_TempHumidity_R3.zip do katalogu szkiców Arduino i zaprogramuj płytę Temp/Humditiy za pomocą lp_BLE_TempHumidity_R3.ino

Jak wspomniano powyżej wkład czujnika wynosi <1uA, średni, przy najwyższej szybkości pomiaru stosowanej w tym projekcie, więc parametry reklamy BLE i połączenia są czynnikiem decydującym o żywotności baterii.

Parametry reklamowania i połączenia BLE, które wpływają na zużycie prądu, to: - Moc Tx, Interwał reklamowy, Maks. i min. interwał połączenia oraz Opóźnienie urządzenia podrzędnego.

Uwaga: Korzystając z powyższych połączeń, w zasilaniu znajdują się dwa (2) regulatory, jeden na płytce NanoV2 przez Vin i MAX8881 na zasilaniu programatora. Oznacza to, że zmierzone prądy zasilania będą o ~5uA wyższe niż rzeczywiste, ze względu na drugi regulator. Wartości podane poniżej to zmierzone prądy minus to dodatkowe 5uA.

Moc nadajnika

Efekty Tx Power dostarczają prąd zarówno po podłączeniu, jak i podczas reklam (niepodłączonych). Ten projekt wykorzystuje maksymalne ustawienie mocy (+4) i zapewnia najlepszy zasięg oraz największą odporność na zakłócenia dla najbardziej niezawodnych połączeń. Do zmiany ustawienia mocy można użyć metody lp_BLESerial setTxPower(). Prawidłowe wartości to, w rosnącej mocy, -40, -30, -20, -16, -12, -8, -4, 0 +4. Musisz wywołać metodę begin() lp_BLESerial PRZED wywołaniem setTxPower(). Zobacz szkic lp_BLE_TempHumidity_R3.ino.

Możesz eksperymentować ze zmniejszaniem mocy Tx, ale kompromisem jest krótszy zasięg i więcej przerw w połączeniu z powodu zakłóceń. W tym projekcie Tx Power jest pozostawiony domyślnie, +4. Jak zobaczysz poniżej, nawet przy tym ustawieniu nadal możliwe są bardzo niskie prądy zasilania.

Interwał reklamowy

Dla danej mocy Tx, gdy nie ma połączenia, Interwał reklamowy ustala średni pobór prądu. Zalecany zakres to 500 do 1000mS. Tutaj użyto 2000mS. Kompromis polega na tym, że dłuższe interwały reklamowe oznaczają, że telefon komórkowy wolniej odnajduje urządzenie i nawiązuje połączenie. Wewnętrznie interwały reklam są ustawione jako wielokrotności 0,625mS w zakresie od 20mS do 10,24s. Dla wygody metoda lp_BLESerial setAdvertisingInterval() przyjmuje jako argument mS. Dla interwału reklamowego +4 TxPower i 2000mS pobór prądu wynosił ~18uA. Dla interwału reklamowego 1000mS było to ~29uA. Wersja 2 używała interwału reklamowego 2000mS, ale spowodowało to powolne połączenia. Rev 3 zmieniono na interwał reklamowy 1000mS, aby przyspieszyć połączenia.

Maksymalne i minimalne odstępy między połączeniami

Po nawiązaniu połączenia interwał połączenia określa, jak często telefon komórkowy kontaktuje się z urządzeniem. Funkcja lp_BLESerial setConnectionInterval() umożliwia ustawienie sugerowanych wartości maksymalnych i minimalnych, jednak telefon komórkowy kontroluje rzeczywisty interwał połączenia. Dla wygody argumenty setConnectionInterval() są w ms, ale wewnętrznie interwały połączeń są wielokrotnością 1,25ms, w zakresie 7,5ms do 4sek.

Domyślnym ustawieniem jest setConnectionInterval(100, 150) tj. min 100mS do max 150mS. Zwiększenie tych wartości zmniejsza prąd zasilania podczas połączenia, ale kompromisem jest wolniejsza transmisja danych. Każda aktualizacja ekranu zajmuje około 7 komunikatów BLE, podczas gdy pełne 36 godzin pomiaru 10-minutowego zajmuje około 170 komunikatów BLE. Tak więc zwiększenie interwałów połączeń spowalnia aktualizacje ekranu i wyświetlanie wykresu.

Klasa lp_BLESerial ma 1536 bajtowy bufor wysyłania i wysyła tylko jeden blok 20 bajtów z tego bufora, każdy maksymalny interwał połączenia, aby zapobiec zalaniu łącza BLE danymi. Również podczas wysyłania danych wykresu, szkic wysyła dane tylko do czasu oczekiwania na wysłanie 512 bajtów, a następnie opóźnia wysyłanie większej ilości danych do momentu wysłania niektórych danych. Pozwala to uniknąć zalewania bufora wysyłania. To dławienie wysyłek sprawia, że transmisja danych do telefonu komórkowego jest niezawodna, ale nie jest zoptymalizowana pod kątem maksymalnej przepustowości.

W tym projekcie odstępy połączeń zostały pozostawione jako wartości domyślne.

Opóźnienie niewolników

Gdy nie ma danych do wysłania na telefon komórkowy, urządzenie może opcjonalnie zignorować niektóre komunikaty o połączeniu z telefonu komórkowego. Oszczędza to moc nadajnika i prąd zasilania. Ustawienie Slave Latency to liczba komunikatów o połączeniu do zignorowania. Wartość domyślna to 0. Do zmiany tego ustawienia można użyć metody lp_BLESerial setSlaveLatency().

Domyślna latencja Slave 0 dawała ~50uA prądu zasilania, ignorując aktualizacje ekranu co 30 sekund, ale włączając komunikaty keepAlive bardzo 5 sekund. Ustawienie opóźnienia Slave na 2 dało średni podłączony prąd zasilania ~25uA. Ustawienie opóźnienia Slave na 4 dało ~20uA. Wyższe ustawienia nie wydawały się zmniejszać prądu zasilania, więc zastosowano ustawienie opóźnienia Slave na 4.

Po podłączeniu co 30 sekund pfodApp żąda aktualizacji wyświetlacza. Wymusza to pomiar czujnika i odsyła dane w celu aktualizacji wyświetlacza graficznego. Ta aktualizacja skutkuje dodatkowym ~66uA przez 2 sekundy co 30 sekund. To średnio 4,4uA w ciągu 30 sekund. Dodanie tego do 20uA daje średni prąd zasilania połączenia ~25uA

Krok 5: Całkowity prąd zasilania i żywotność baterii

Używając powyższych ustawień, jak ustawiono w lp_BLE_TempHumidity_R3.ino, całkowity prąd zasilania po podłączeniu i aktualizowanie wyświetlacza co 30 sekund, około 25uA. Gdy nie jest podłączony, wynosi około 29uA.

Do obliczenia żywotności baterii zakłada się ciągły pobór prądu ~29uA.

Różne akumulatory mają różne pojemności i charakterystyki napięciowe. Rozważane tutaj baterie to bateria pastylkowa CR2032, bateria pastylkowa CR2450 (N), 2 x AAA Alkaline, 2 x AAA Lithium i LiPo.

Podsumowanie baterii

Jeśli korzystasz z Solar Assist, dodaj 50% do tych wartości żywotności baterii (zakładając, że światło dzienne wynosi 8 godzin)

Uwaga: Kondensator 22uF LowESR (C1), oprócz wbudowanego kondensatora NanoV2 22uF, przechowuje prąd ogniwa słonecznego, a następnie dostarcza go do impulsów prądowych TX. W przeciwnym razie bateria dostarcza część prądu TX. Ten dodatkowy LowESR o wartości 22uF dodaje około 10% do prądu akumulatora, gdy ogniwo słoneczne nie jest zasilane, ale także wydłuża żywotność akumulatora, kompensując rosnącą rezystancję wewnętrzną akumulatora, gdy akumulator zbliża się do końca życia. Poniższe pomiary zostały wykonane BEZ dodatkowego kondensatora 22uF.

CR2032 – 235 mAHr – żywotność baterii 10 miesięcy CR2450 (N) – 650 mAHr (540 mAHr) – żywotność baterii 2,3 lat (2 lata) 2 x AAA alkaliczne – 1250 mAHr – żywotność baterii 3,8 lat 2 x AAA litowe – 1200 mAHr – żywotność baterii 4,7 lat Akumulator LiPo – nie zalecane ze względu na wysokie samorozładowanie.

CR2032

To ogniwo pastylkowe ma pojemność typową 235 mAHr (akumulator energetyczny), napięcie nominalne 3 V i określone napięcie rozładowania 2 V. Oznacza to żywotność baterii 8100 godzin lub ~ 0,9 roku. Jednak wewnętrzna rezystancja ogniwa wzrasta wraz ze zbliżaniem się do końca żywotności baterii i może nie być w stanie zapewnić szczytowych impulsów prądu Tx. Można zastosować większy kondensator zasilający, aby zmniejszyć ten efekt, ale powiedzmy 10 miesięcy życia.

CR2450 (N)

Ta bateria pastylkowa ma pojemność typową 620 mAHr (540 mAHr dla CR2450N), napięcie nominalne 3 V i określone napięcie rozładowania 2 V. Oznacza to żywotność baterii 22, 400 godzin lub ~2 lata 6 m (18600 godzin ~ 2 lata 2 m dla CR2450N). Jednak wewnętrzna rezystancja ogniwa wzrasta wraz ze zbliżaniem się do końca żywotności baterii i może nie być w stanie zapewnić szczytowych impulsów prądu Tx. W celu zmniejszenia tego efektu można użyć większego kondensatora zasilającego, ale powiedzmy, że żywotność wynosi 2 lata 4 m (2 lata N).

Uwaga: Wersja CR2450N ma grubszą krawędź, która zapobiega nieprawidłowej instalacji w uchwycie CR2450N. Do uchwytu CR2450 można włożyć ogniwo CR2450N i CR2450, ale nie można włożyć ogniwa CR2450 do uchwytu CR2450N

2 x baterie alkaliczne AAA

Akumulatory te mają pojemność około 1250 mAHr (Energizer Battery) dla bardzo niskich prądów, napięcie nominalne 2x1,5V = 3V i określone napięcie rozładowania 2x0,8V = 1,6V. Ale to określone napięcie rozładowania jest niższe niż napięcie robocze czujnika Si7021 (1,9 V), więc akumulator może być używany tylko do ~1 V każdy. Zmniejsza to pojemność o około 10% do 15%, tj. ~1000 mAHr.

Oznacza to żywotność baterii 34, 500 godzin lub ~ 4 lata. Jednak wewnętrzna rezystancja ogniwa wzrasta wraz ze zbliżaniem się do końca żywotności baterii i może nie być w stanie zapewnić szczytowych impulsów prądu Tx. W celu zmniejszenia tego efektu można użyć większego kondensatora zasilającego, ale powiedzmy, że żywotność 3 lata 10m. Uwaga Baterie alkaliczne mają samorozładowanie od 2% do 3% rocznie.

2 x ogniwa litowe AAA

Akumulatory te mają pojemność około 1200 mAHr (Energizer Battery), napięcie nominalne 2x1,7V = 3,4V, przy niskich prądach i napięcie rozładowania 2x1,4V = 2,4V. Oznacza to żywotność baterii 41, 400 godzin lub 4 lata 8m.

Akumulator LiPo

Akumulatory te mają różne pojemności od 100 mAHr do 2000 mAHr, w płaskich formatach i mają napięcie ładowania 4,2 V i napięcie rozładowania > 2,7 V. Jednak charakteryzują się wysokim samorozładowaniem wynoszącym 2%-3%/miesiąc (tj. 24% do 36% rocznie) i dlatego nie są tak odpowiednie do tego zastosowania jak inne akumulatory.

Krok 6: Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna

Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna
Alternatywy zasilania - wspomaganie słoneczne, tylko bateria, tylko energia słoneczna

Bateria plus Solar Assist

Powyższa konstrukcja wykorzystuje zasilanie Battery plus Solar Assist. Gdy panele słoneczne generują napięcie wyższe niż napięcie akumulatora, ogniwa słoneczne zasilają monitor, wydłużając w ten sposób żywotność akumulatora. Zazwyczaj żywotność baterii można przedłużyć o kolejne 50%.

Zastosowane panele słoneczne są małe, 50 mm x 30 mm, tanie, ~ 0,50 USD i mają niską moc. Są to nominalnie panele 5V, ale potrzebują pełnego bezpośredniego, jasnego światła słonecznego, aby wygenerować 5V. W tym projekcie dwa panele są połączone szeregowo tak, że umieszczenie monitora w pobliżu okna, z dala od bezpośredniego światła słonecznego, wystarczy do wymiany zasilania z baterii. Nawet dobrze oświetlone pomieszczenie lub lampa biurkowa wystarczy, aby ogniwa słoneczne wygenerowały >3,3V przy >33uA i przejęły kontrolę nad akumulatorem.

Skonstruowano prosty panel testowy, aby określić, gdzie można umieścić monitor temperatury/wilgotności, poza słońcem i nadal być zasilany energią słoneczną. Jak widać na powyższym zdjęciu, dwa panele podłączone do rezystora 100K wytwarzają 5,64V na 100K, tj. 56uA prądu przy 5,64V. Jest to więcej niż wystarczające przejęcie zasilania monitora z akumulatora. Każdy odczyt napięcia powyżej nominalnego napięcia akumulatora wynoszącego 3 V oznacza, że ogniwa słoneczne będą zasilać monitor zamiast akumulatora.

Dwie diody w obwodzie monitora temperatury i wilgotności izolują ogniwa słoneczne i baterie od siebie i zabezpieczają przed podłączeniem ich w odwrotnej polaryzacji. Rezystor Zenera 10 V 1 W i rezystor serii 470R chroni wbudowany regulator NanoV2 przed przepięciem z dwóch ogniw słonecznych w pełnym słońcu, szczególnie jeśli zamiast 5 V używane są ogniwa 12 V. Podczas normalnej pracy przy <5V, 10V Zener pobiera tylko ~1uA.

Tylko bateria

W przypadku zasilania tylko z baterii, po prostu pomiń R1, D1 i D3 oraz ogniwa słoneczne. Możesz również zastąpić D1 kawałkiem drutu, jeśli nie chcesz ochrony przed odwrotną polaryzacją.

Tylko słoneczne

Zasilanie monitora wyłącznie z ogniw słonecznych, bez baterii, wymaga innego obwodu zasilania. Problem polega na tym, że podczas gdy monitor będzie działał na 29uA, po włączeniu nRF52 pobiera ~5mA przez 0,32 sekundy. Powyższy obwód (wersja pdf) utrzymuje wyłączony regulator MAX8881 do momentu, aż kondensatory wejściowe, 2 x 1000uF, naładują się do 4,04V. Następnie MAX6457 zwalnia wejście SHDN MAX8881 do zasilania nRF52 (NanoV2). Kondensatory 2 x 1000uF dostarczają niezbędny prąd rozruchowy.

Dzięki temu monitor włącza się, gdy tylko jest wystarczająca ilość energii słonecznej, aby działał przy 29uA.

Krok 7: Wniosek

W tym samouczku przedstawiono monitor temperatury i wilgotności zasilany bateriami / energią słoneczną jako przykład projektu BLE o bardzo niskim poborze mocy w Arduino dla układu nRF52832. Prądy zasilania ~29uA osiągane poprzez dostrajanie parametrów połączenia. Dzięki temu żywotność baterii pastylkowej CR2032 przekroczyła 10 miesięcy. Dłuższy dla ogniw i baterii pastylkowych o większej pojemności. Dodanie dwóch tanich ogniw słonecznych z łatwością wydłużyło żywotność baterii o 50% lub więcej. Do zasilania monitora z ogniw słonecznych wystarczy jasne światło w pomieszczeniu lub lampa biurkowa.

Zaprezentowano specjalny obwód zasilania, aby monitor mógł być zasilany wyłącznie z ogniw słonecznych o małej pojemności.

Bezpłatny pfodDesigner umożliwia projektowanie menu/podmenu, wykresy z datą/godziną i danymi dziennika, a następnie generowanie szkicu Arduino o niskim poborze mocy. Tutaj niestandardowy interfejs został zakodowany przy użyciu prymitywów rysowania pfodApp. Połączenie z pfodApp wyświetla interfejs użytkownika i aktualizuje odczyty, gdy monitor używa ~29uA

Nie jest wymagane żadne programowanie na Androida. pfodApp obsługuje to wszystko.