Inhoudsopgave:
- Stap 1: Componentselectie
- Stap 2: constructie
- Stap 3: Code – Bibliotheek met laag vermogen-sensor, gebruikersinterface en Arduino-schets
- Stap 4: De voedingsstroom meten
- Stap 5: Totale voedingsstroom en levensduur van de batterij
- Stap 6: Alternatieven leveren – Solar Assist, Alleen batterij, Alleen zonne-energie
- Stap 7: Conclusie
Video: Easy Very Low Power BLE in Arduino Part 2 -- Temperatuur-/vochtigheidsmonitor -- Rev 3: 7 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:14
Update: 23 november 2020 – Eerste vervanging van 2 x AAA-batterijen sinds 15 januari 2019 dwz 22 maanden voor 2xAAA Alkaline Update: 7 april 2019 – Rev 3 van lp_BLE_TempHumidity, voegt datum-/tijdplots toe, met behulp van pfodApp V3.0.362+, en automatische beperking bij verzending gegevens
Update: 24 maart 2019 – Rev 2 van lp_BLE_TempHumidity, voegt meer plotopties toe en i2c_ClearBus
Deze instructable, A Very Low Power Temperature Humidity Monitor, is deel 2 van 3.
Deel 1 - Het bouwen van BLE-apparaten met een zeer laag vermogen gemakkelijk gemaakt met Arduino-covers om Arduino in te stellen voor het coderen van nRF52-apparaten met laag vermogen, de programmeermodule en het meten van de voedingsstroom. Het omvat ook gespecialiseerde timers en comparators met laag vermogen en debounced-ingangen en het gebruik van pfodApp om verbinding te maken met het nRF52-apparaat en het te bedienen.
Deel 2 - Een temperatuur-vochtigheidsmonitor met zeer laag vermogen, deze dekt het gebruik van een Redbear Nano V2-module en een Si7021-temperatuur- / vochtigheidssensor om een batterij met laag vermogen / zonnemonitor te bouwen. Het omvat ook het aanpassen van de Si7021-bibliotheek om een laag stroomverbruik te hebben, het afstemmen van het BLE-apparaat om het stroomverbruik van <25uA te verminderen en het ontwerpen van een aangepast temperatuur-/vochtigheidsdisplay voor uw mobiel.
Deel 3 - Een Redbear Nano V2-vervangingshoes die andere op nRF52 gebaseerde modules gebruikt in plaats van de Nano V2. Het omvat het selecteren van voedingscomponenten, constructie, het verwijderen van de programmeerbeveiliging van de nRF52-chip, het gebruik van NFC-pinnen als normale GPIO en het definiëren van een nieuw nRF52-bord in Arduino.
Deze instructable is een praktische toepassing van Part 1 Building Very Low Power BLE-apparaten, gemakkelijk gemaakt met Arduino door een Very Low Power BLE-temperatuur- en vochtigheidsmonitor te bouwen. De monitor werkt jarenlang op knoopcel- of 2 x AAA-batterijen, zelfs langer met zonne-ondersteuning. Deze tutorial behandelt het afstemmen van de BLE-parameters voor een laag stroomverbruik en hoe u uw apparaat van stroom kunt voorzien via batterij OF batterij + alleen zonne- of zonne-energie.
De monitor geeft niet alleen de huidige temperatuur en vochtigheid weer, maar slaat ook de laatste 36 uur van 10 minuten en de laatste 10 dagen uurmetingen op. Deze kunnen in kaart worden gebracht op uw Android-mobiel en de waarden worden opgeslagen in een logbestand. Er is geen Android-programmering vereist, pfodApp regelt dat allemaal. De Android-weergave en -grafiek worden volledig bestuurd door uw Arduino-schets, zodat u deze naar wens kunt aanpassen.
Een Redbear Nano V2-bord wordt gebruikt voor de nRF52832 BLE-component en een Sparkfun Si7021 breakout-bord wordt gebruikt voor de temperatuur- / vochtigheidssensor. Bij de Si7021 wordt een aangepaste low-power bibliotheek gebruikt. Een kleine PCB is ontworpen om de NanoV2 te bevatten en componenten te voeden. Omdat er echter geen opbouwcomponenten worden gebruikt, kunt u deze net zo gemakkelijk op veroboard bouwen. Er worden drie voedingsversies behandeld. i) Batterij plus zonne-ondersteuning, ii) Alleen batterij, iii) Alleen zonne-energie. De optie Solar Only heeft geen batterijopslag en werkt dus alleen als er wat licht is. Een felle kamerlamp of bureaulamp is voldoende.
Overzicht
Dit project heeft 4 relatieve onafhankelijke delen: -
- Componentselectie en constructie
- Code - Bibliotheek met laag vermogen-sensor, gebruikersinterface en Arduino-schets
- Voedingsstroom en levensduur van de batterij meten
- Leveringsalternatieven – Solar Assist, Alleen batterij, Alleen zonne-energie
Stap 1: Componentselectie
Componentselectie
Zoals vermeld in deel 1 – De truc om een echt energiezuinige oplossing te krijgen, is door meestal niets te doen, de stroom door externe pull-up/pull-down-weerstanden op ingangen te minimaliseren en geen extra componenten te gebruiken. Dit project zal elk van deze trucs gebruiken om een energiezuinige oplossing te krijgen.
De nRF52832-component
De nRF52832-chip kan werken met een voeding tussen 1,7 V en 3,6 V (absoluut max. spanning 3,9 V). Dit betekent dat u de chip rechtstreeks van stroom kunt voorzien via een knoopcel of 2 x AAA-batterijen. Het is echter verstandig om een spanningsregelaar toe te voegen om de chip te beschermen tegen overvolt. Aan deze extra component zijn stroomkosten verbonden, maar in het geval van het NanoV2-bord verbruikt de ingebouwde regelaar, TLV704, minder dan 5,5uA max, meestal slechts 3,4uA. Voor dit kleine extra stroomverbruik krijg je bescherming voor maximaal 24V voedingsingangen.
De Si7021-component
De Si7021-sensor zelf trekt doorgaans <1uA wanneer er geen meting wordt uitgevoerd, d.w.z. in stand-by, en tot 4 mA wanneer de gegevens worden verzonden via I2C. Aangezien we niet continu meten, is de 4mA geen significant deel van de gemiddelde voedingsstroom. Het meten van 30 seconden voegt minder dan 1uA toe aan de gemiddelde voedingsstroom, zie de voedingsstroommetingen hieronder.
Er zijn twee direct verkrijgbare Si7021 breakout boards. Een van Adafruit en een van Sparkfun. Een snelle blik op de twee boards leert je dat het Adafruit board veel meer componenten heeft dan het Sparkfun board, dus je zou geneigd zijn om voor het Sparkfun board te kiezen. Als we naar de schema's van elk bord kijken, zien we dat het Sparkfun-bord slechts de blote sensor en twee 4k7 pullup-weerstanden is, terwijl het Adafruit-bord een ingebouwde MIC5225-regelaar heeft die doorgaans 29uA trekt. Dit is significant wanneer de totale stroom voor de rest van het circuit <30uA is. Omdat we al een regelaar hebben voor de nRF52832-chip, is dit extra onderdeel niet nodig en kan de Si7021 worden gevoed vanuit die 3.3V-voeding. Dus dit project zal het Si7021 breakout board van Sparkfun gebruiken.
minimaliseer de stroom door externe pull-up/pull-down-weerstanden op ingangen
De 4K7 I2C pullup-weerstanden hebben geen bijzonder hoge waarde en zullen 0,7 mA verbruiken wanneer ze laag worden getrokken. Dit zou een probleem zijn als ze zich op een schakelaaringang bevonden die lange tijd geaard was. In dit project wordt de stroom door deze weerstanden echter geminimaliseerd door de I2C-interface slechts af en toe en voor een korte tijd te gebruiken. Meestal zijn de I2C-lijnen niet in gebruik en zijn ze hoog / tri-state, dus er vloeit geen stroom door deze weerstanden.
Stap 2: constructie
Het project is gebouwd op een kleine PCB, maar aangezien er geen SMD-componenten zijn, kan het net zo gemakkelijk worden gebouwd met vero-board. De PCB is vervaardigd door pcbcart.com van deze Gerber-bestanden, TempHumiditySensor_R1.zip. De PCB is algemeen genoeg om voor andere BLE-projecten te worden gebruikt.
Het schema is hierboven weergegeven. Hier is een pdf-versie.
Onderdelen lijst
Geschatte kosten per eenheid per december 2018, ~ US $ 62, exclusief verzendkosten en de programmeur van deel 1
- Redbear NanoV2 ~ US$17
- Sparkfun Si7021 breakout-bord ~ US $ 8
- 2 x 53mm x 30mm 0,15W 5V zonnecellen b.v. Overvliegen ~US$1.10
- 1 x PCB TempHumiditySensor_R1.zip ~US $ 25 voor 5 korting www.pcbcart.com OF Vero-bord (strip koper) b.v. Jaycar HP9540 ~AUD$5
- 2 x 1N5819 schottky-diodes b.v. Digikey 1N5819FSCT-ND ~US$1
- 1 x 470R 0,4W 1% weerstand b.v. Digikey BC3274CT-ND ~US$0,25
- 6 x 6-pins mannelijke koppennen, b.v. Sparkfun PRT-00116 ~US$1.5
- vrouw naar vrouw jumper b.v. Adafruit-ID: 1950 ~ US $ 2
- 3 mm x 12 mm nylon schroeven, b.v. Jaycar HP0140 ~AUD$3
- 3 mm x 12 mm nylon moeren, b.v. Jaycar HP0146 ~AUD$3
- Scotch permanente montagetape Cat 4010 b.v. van Amazon ~ US $ 6,6
- AAA x 2 batterijhouder, b.v. Sparkfun PRT-14219 ~US$1.5
- 2 x AAA 750mA Alkaline batterijen, b.v. Sparkfun PRT-09274 ~ US$ 1,0 Deze batterijen gaan >2 jaar mee. Energizer Alkaline Batterijen hebben een hogere capaciteit
- Plastic doos (ABS) 83 mm x 54 mm x 31 mm, b.v. Jaycar HB6005 ~AUD$3
- pfodApp ~US$10
- 1 x 22uF 63V Lage ESR-condensator (optioneel) b.v. Jaycar RE-6342 ~ AUD $ 0,5 of Digikey P5190-ND ~ US $ 0,25
De constructie is rechttoe rechtaan. De batterijhouder en de zonnecellen zijn met stevige dubbelzijdige tape aan de plastic doos bevestigd.
Let op de Gnd-verbindingsdraad van de CLK naar GND in het voltooide onderdeel. Dit wordt NA het programmeren geïnstalleerd om te voorkomen dat ruis op de CLK-ingang de nRF52-chip in een hoge stroom debug-modus activeert
Stap 3: Code – Bibliotheek met laag vermogen-sensor, gebruikersinterface en Arduino-schets
Download de zip-code, lp_BLE_TempHumidity_R3.zip, en pak deze uit in uw Arduino Sketches-map. U moet ook de bibliotheek lp_So7021 vanuit dit zipbestand installeren en ook de pfodParser-bibliotheek installeren.
Sensorbibliotheek voor laag vermogen, lp_Si7021
Zowel Adafruit als Sparkfun bieden ondersteuningsbibliotheken om toegang te krijgen tot de Si7021-sensor, maar beide bibliotheken zijn niet geschikt voor zeer laag stroomverbruik. Beide gebruiken een vertraging (25) in de code om het lezen van de sensor te vertragen terwijl deze zijn meting uitvoert. Zoals opgemerkt in deel 1 zijn vertragingen slecht. De Arduino-delay() houdt de microprocessor gewoon aan het werk terwijl hij wacht tot de vertraging is verstreken. Dit breekt de eerste regel van BLE met laag vermogen, doe meestal niets. De vervangende bibliotheek lp_Si7021 vervangt alle vertragingen door lp_timers die de microprocessor in de slaapstand zetten terwijl hij wacht tot de sensor klaar is met meten.
Hoeveel verschil maakt de bibliotheek lp_Si7021? Door de originele SparkFun Si7021-ondersteuningsbibliotheek te gebruiken en één meting per seconde te nemen zonder seriële afdrukken, trekt het gemiddelde van ~ 1,2 mA. Het vervangen van de Sparkfun-bibliotheek door de lp_Si7021-bibliotheek vermindert de gemiddelde stroom tot ~10uA, d.w.z. 100 keer minder. In dit project is de snelste meetsnelheid eens in de 30 seconden wanneer de mobiel is aangesloten, wat resulteert in een gemiddelde sensorstroom van minder dan 1uA. Als er geen BLE-verbinding is, is de meetsnelheid eens in de 10 minuten en is de gemiddelde voedingsstroom van de sensor verwaarloosbaar.
Gebruikersomgeving
Hierboven ziet u het hoofdscherm en een ingezoomde weergave van de 10-daagse geschiedenis per uur. Percelen kunnen met twee vingers in beide richtingen worden ingezoomd en gepand.
De gebruikersinterface is gecodeerd in de Arduino-schets en vervolgens verzonden naar pfodApp bij de eerste verbinding waar het in de cache wordt opgeslagen voor herhaald gebruik en updates. De grafische weergave is opgebouwd uit tekenprimitieven. Zie Aangepaste Arduino-besturingselementen voor Android voor een zelfstudie over hoe u uw eigen besturingselementen kunt bouwen. De Thermometer-, RHGauge- en Button-bestanden bevatten de tekenopdrachten voor die items.
Opmerking: Geen als dit scherm is ingebouwd in pfodApp. Het hele display wordt volledig bestuurd door de code in je Arduino-schets
De methode sendDrawing_z() in de schets lp_BLE_TempHumidity_R3.ino definieert de gebruikersinterface.
void sendDrawing_z() { dwgs.start(50, 60, dwgs. WHITE); // achtergrond is standaard WIT als deze wordt weggelaten, d.w.z. start (50, 60); parser.sendRefreshAndVersion(30000); // dwg elke 30sec opnieuw aanvragen. dit wordt genegeerd als er geen parserversie is ingesteld // raak bovenstaande knoppen aan om schermupdates te forceren dwgs.touchZone().cmd('u').size(50, 39).send(); dwgs.pushZero(35, 22, 1.5); // verplaats nul naar het midden van dwg naar 35, 22 en schaal met 1,5 keer rhGauge.draw(); // teken de controle dwgs.popZero(); dwgs.pushZero (18, 33); // verplaats nul naar het midden van dwg naar 18, 33 schaal is 1 (standaard) thermometer.draw(); // teken de controle dwgs.popZero();
dwgs.pushZero(12.5, 43, 0.7); // verplaats nul naar het midden van dwg naar 12,5, 43 en schaal met 0,7
hrs8PlotButton.draw(); // teken de controle dwgs.popZero(); dwgs.pushZero(37.5, 43, 0.7); // verplaats nul naar het midden van dwg naar 37,5, 43 en schaal met 0,7 dagen1PlotButton.draw(); // teken de controle dwgs.popZero();
dwgs.pushZero(12.5, 54, 0.7); // verplaats nul naar het midden van dwg naar 12,5, 54 en schaal met 0,7
days3PlotButton.draw(); // teken de controle dwgs.popZero(); dwgs.pushZero(37.5, 54, 0.7); // verplaats nul naar het midden van dwg naar 37,5, 54 en schaal met 0,7 dagen10PlotButton.draw(); // teken de controle dwgs.popZero(); dwgs.end(); }
De pushZero-opdrachten wijzigen de oorsprong en schaal voor het tekenen van het volgende onderdeel. Hiermee kunt u eenvoudig de grootte en positie van de knoppen en meters wijzigen.
Bij de eerste verbinding duurt het 5 of 6 seconden voordat de eerste weergave de ~800 bytes downloadt die de weergave definiëren. pfodApp slaat het scherm op in de cache, zodat toekomstige updates alleen de wijzigingen, meterposities en metingen hoeven te verzenden. Deze updates duren slechts een paar seconden om de 128 bytes te verzenden die nodig zijn om het scherm bij te werken.
Er zijn vijf (5) actieve aanraakzones gedefinieerd in het display. Elke knop heeft er een gedefinieerd in de draw()-methode, dus u kunt erop klikken om de respectieve plot te openen, en de bovenste helft van het scherm is geconfigureerd als de derde aanraakzone
dwgs.touchZone().cmd('u').size(50, 39).send();
Wanneer u op het scherm boven de knoppen klikt, wordt het 'u' dwg-commando naar uw schets gestuurd om een nieuwe meting en schermupdate te forceren. Normaal gesproken vinden updates slechts om de 30 seconden plaats wanneer ze zijn aangesloten. Elke klik of verversing van de tekening dwingt een nieuwe meting af. De reactie van de Arduino-schets naar pfodApp wordt uitgesteld totdat de nieuwe meting is voltooid (~25mS), zodat de laatste waarde in de update kan worden verzonden.
Arduino-schets
De Arduino-schets, lp_BLE_TempHumidity_R3.ino, is een verbeterde versie van de voorbeeldschets die in deel 1 wordt gebruikt. De schets lp_BLE_TempHumidity_R3.ino vervangt het menu met de bovenstaande tekening. Het voegt ook de lp_Si7021-sensorondersteuning en gegevensarrays toe om de historische metingen van 10 minuten en per uur op te slaan.
De belangrijkste complicatie in de lp_BLE_TempHumidity_R3.ino-schets is het verzenden van de plotgegevens. Terwijl de metingen worden gedaan, zorgt readRHResults() voor het verzamelen van de resultaten en het opslaan ervan in de historische arrays. De arrays zijn 120 lang, maar wanneer de gegevens worden verzonden, zijn de eerste 30 gegevenspunten voor een fijner tijdsinterval.
Er zijn een paar punten waar u op moet letten bij het verzenden van de 200 oneven plotpunten om weer te geven: -
- Elk gegevenspunt is ~ 25 bytes lang, in CSV-tekstindeling. Dus 150 punten is 3750 bytes aan data. De klasse lp_BLESerial heeft een buffer van 1536 bytes, waarvan 1024 groot genoeg is voor het grootste pfod-bericht. De overige 512 bytes zijn gereserveerd voor het verzenden van de gegevens. Zodra de historische gegevens de 512 bytes hebben opgevuld, wordt het verzenden van verdere gegevens uitgesteld totdat er ruimte in de buffer is.
- Om te voorkomen dat de plotgegevens de updates van het hoofdscherm vertragen, worden de plotgegevens alleen verzonden terwijl het plotscherm wordt weergegeven. Zodra de gebruiker terugschakelt naar het hoofdscherm, wordt het verzenden van de plotgegevens gepauzeerd. Het verzenden van de plotgegevens wordt hervat wanneer de gebruiker op de plotknop klikt om de plot opnieuw weer te geven.
- De historische plots beginnen bij 0 (nu) en gaan terug in de tijd. Als er geen nieuwe meting is geweest sinds de laatste plot werd weergegeven, worden de eerder gedownloade gegevens gewoon meteen weer weergegeven. Als er een nieuwe meting is, wordt deze toegevoegd aan de vorige plotgegevens.
- Wanneer de monitor voor het eerst wordt opgestart, zijn er geen historische meetwaarden en wordt 0 in de arrays opgeslagen als een ongeldige meetwaarde. Wanneer de plot wordt weergegeven, worden ongeldige metingen gewoon overgeslagen, wat resulteert in een kortere plot.
Celsius en Fahrenheit
De lp_BLE_TempHumidity_R3.ino-schets toont en plot de gegevens in Celsius. Om de resultaten naar Fahrenheit te converteren, vervangt u alle exemplaren van
parser.print(sensor. Temp_RawToFloat(..
met
parser.print(sensor. CtoF(sensor. Temp_RawToFloat(…
En vervang het unicode degC-symbool in Octal \342\204\203 door het degF-symbool \342\204\211
pfodApp geeft elke Unicode weer die u op uw mobiel kunt weergeven.
Zie Niet-ASCII-tekens gebruiken in Arduino voor meer informatie. Wijzig ook de MIN_C, MAX_C instellingen in Thermometer.h. Pas ten slotte de plotlimieten naar wens aan, b.v. verander |Temp C~32~8~deg C|
zeggen
|Temp F~90~14~deg F|
Stap 4: De voedingsstroom meten
Met behulp van de lp_Si7021-bibliotheek draagt zelfs het nemen van een temperatuur-/vochtigheidsmeting om de 10 seconden slechts ~1uA bij aan de gemiddelde voedingsstroom, dus de belangrijkste factor in de voedingsstroom en dus de levensduur van de batterij is de stroom die wordt gebruikt door de BLE-reclame en verbinding en gegevensoverdracht.
Sluit het temperatuur-/vochtigheidsbord aan op de programmer beschreven in deel 1 zoals hierboven weergegeven.
Als de zonnecellen en batterijen zijn losgekoppeld, zijn Vin en Gnd aangesloten op de Vdd en Gnd van de programmeur (de gele en groene draden) en zijn de SWCLK en SWDIO aangesloten op de Clk en SIO van het hoofdbord van de programmer (de blauwe en roze draden)
U kunt nu NanoV2 programmeren en de voedingsstroom meten zoals beschreven in deel 1.
Installeer de Si7021-bibliotheek met laag vermogen uit dit zipbestand, lp_Si7021.zip en installeer de pfodParser-bibliotheek en unzip lp_BLE_TempHumidity_R3.zip naar uw Arduino-schetsmap en programmeer het Temp/Humditiy-bord met lp_BLE_TempHumidity_R3.ino
Zoals hierboven vermeld, is de bijdrage van de sensor <1uA, gemiddeld, bij de hoogste meetsnelheid die in dit project wordt gebruikt, dus de BLE-advertentie- en verbindingsparameters zijn de bepalende factor voor de levensduur van de batterij.
De BLE-advertentie- en verbindingsparameters die het stroomverbruik beïnvloeden, zijn:-Tx Power, Advertising Interval, Max en Min Connection Intervals en Slave Latency.
Opmerking: Met behulp van de bovenstaande aansluitingen zijn er twee (2) regelaars in de voeding, één op het NanoV2-bord via Vin en de MAX8881 op de voeding van de programmeur. Dit betekent dat de gemeten voedingsstromen ~5uA hoger zullen zijn dan de werkelijke, vanwege de tweede regelaar. Onderstaande waarden zijn de gemeten stromen minus deze extra 5uA.
Tx Power
Tx Power-effecten leveren stroom zowel bij aansluiting als bij reclame (niet aangesloten). Dit project gebruikt de maximale vermogensinstelling (+4) en biedt het beste bereik en de grootste ruisimmuniteit voor de meest betrouwbare verbindingen. U kunt de methode lp_BLESerial setTxPower() gebruiken om de energie-instelling te wijzigen. Geldige waarden zijn, in toenemende macht, -40, -30, -20, -16, -12, -8, -4, 0 +4. U moet de methode lp_BLESerial begin() aanroepen VOORDAT u setTxPower() aanroept. Zie de lp_BLE_TempHumidity_R3.ino-schets.
Je kunt experimenteren met het verminderen van de Tx Power, maar het compromis is een korter bereik en meer uitval van verbindingen als gevolg van interferentie. In dit project wordt de Tx Power op zijn standaardwaarde gelaten, +4. Zoals u hieronder zult zien, is zelfs met deze instelling nog steeds een zeer lage voedingsstroom mogelijk.
Advertentie-interval
Voor een gegeven Tx Power, wanneer er geen verbinding is, stelt het advertentie-interval het gemiddelde stroomverbruik in. Het aanbevolen bereik is 500 tot 1000 mS. Hier werd 2000mS gebruikt. Het compromis is dat langere advertentie-intervallen betekenen dat het voor uw mobiel langzamer is om het apparaat te vinden en een verbinding tot stand te brengen. Intern zijn advertentie-intervallen ingesteld in veelvouden van 0,625 mS in het bereik van 20 mS tot 10,24 sec. De methode lp_BLESerial setAdvertisingInterval() neemt voor het gemak mS als argument. Voor +4 TxPower en 2000mS advertentie-interval was het stroomverbruik ~18uA. Voor een advertentie-interval van 1000 mS was het ~29uA. Rev 2 gebruikte een advertentie-interval van 2000 mS, maar dit resulteerde in trage verbindingen. Rev 3 is gewijzigd in advertentie-interval van 1000 mS om verbindingen sneller te maken.
Max en min verbindingsintervallen
Zodra een verbinding tot stand is gebracht, bepaalt het verbindingsinterval hoe vaak de mobiele telefoon contact maakt met het apparaat. Met de lp_BLESerial setConnectionInterval() kunt u de voorgestelde max en min instellen, maar de mobiele telefoon bepaalt wat het verbindingsinterval eigenlijk is. Voor het gemak zijn de argumenten voor setConnectionInterval() in mS, maar intern zijn de verbindingsintervallen in een veelvoud van 1,25 mS, in het bereik van 7,5 mS tot 4 sec.
De standaardinstelling is setConnectionInterval(100, 150), d.w.z. min 100mS tot max 150mS. Het verhogen van deze waarden vermindert de voedingsstroom terwijl aangesloten, maar het compromis is een langzamere overdracht van gegevens. Elke update van het scherm duurt ongeveer 7 BLE-berichten, terwijl een volledige 36 uur van 10 min metingen ongeveer 170 BLE-berichten kost. Dus het verhogen van de verbindingsintervallen vertraagt de schermupdates en de plotweergaven.
De klasse lp_BLESerial heeft een verzendbuffer van 1536 bytes en verzendt slechts één blok van 20 bytes uit deze buffer, elk maximaal verbindingsinterval om te voorkomen dat de BLE-link met gegevens wordt overspoeld. Ook bij het verzenden van plotgegevens, verzendt de schets alleen gegevens totdat 512 bytes wachten om te worden verzonden, en vertraagt dan het verzenden van meer gegevens totdat er gegevens zijn verzonden. Dit voorkomt dat de verzendbuffer volloopt. Deze beperking van de verzendingen maakt de gegevensoverdracht naar de mobiel betrouwbaar, maar is niet geoptimaliseerd voor maximale doorvoer.
In dit project zijn de verbindingsintervallen als standaardwaarden gelaten.
Slave latentie
Als er geen gegevens zijn om naar de mobiel te verzenden, kan het apparaat optioneel enkele verbindingsberichten van de mobiel negeren. Dit bespaart Tx Power en voedingsstroom. De Slave Latency-instelling is het aantal verbindingsberichten dat moet worden genegeerd. De standaardwaarde is 0. De methode lp_BLESerial setSlaveLatency() kan worden gebruikt om deze instelling te wijzigen.
De standaard Slave Latency van 0 gaf ~50uA voedingsstroom, waarbij de schermupdates om de 30 seconden werden genegeerd, maar inclusief de keepAlive-berichten om de 5 seconden. Het instellen van de Slave Latency op 2 gaf een gemiddelde aangesloten voedingsstroom van ~25uA. Een Slave Latency-instelling van 4 gaf ~20uA. Hogere instellingen leken de voedingsstroom niet te verminderen, dus werd een Slave Latency-instelling van 4 gebruikt.
Indien verbonden, vraagt pfodApp elke 30 seconden om een display-update. Dit dwingt een sensormeting af en stuurt gegevens terug om de grafische weergave bij te werken. Deze update resulteert in een extra ~66uA voor 2 sec per 30 sec. Dat is een gemiddelde van 4,4uA over de 30 seconden. Als je dit toevoegt aan de 20uA, krijg je een gemiddelde voedingsstroom van ~25uA
Stap 5: Totale voedingsstroom en levensduur van de batterij
Gebruik de bovenstaande instellingen, zoals ingesteld in lp_BLE_TempHumidity_R3.ino, de totale voedingsstroom bij aansluiting en update het scherm elke 30 seconden, ongeveer 25uA. Wanneer niet aangesloten, is het ongeveer 29uA.
Voor het berekenen van de levensduur van de batterij wordt uitgegaan van een continu stroomverbruik van ~29uA.
Verschillende batterijen hebben verschillende capaciteiten en spanningskenmerken. De batterijen die hier in aanmerking komen zijn CR2032 knoopcel, CR2450 (N) knoopcel, 2 x AAA Alkaline, 2 x AAA Lithium en LiPo.
Batterijoverzicht
Als u Solar Assist gebruikt, tel dan 50% op bij deze batterijduur (uitgaande van 8 uur per dag licht)
Opmerking: de 22uF LowESR-condensator (C1), naast de ingebouwde NanoV2 22uF-condensator, slaat de zonnecelstroom op en levert deze vervolgens voor de TX-stroompulsen. Anders levert de batterij een deel van de TX-stroom. Deze extra 22uF LowESR voegt ongeveer 10% toe aan de batterijstroom wanneer de zonnecel niet de voeding is, maar verlengt ook de levensduur van de batterij door de stijgende interne weerstand van de batterij te compenseren wanneer de batterij het einde van de levensduur bereikt. Onderstaande metingen zijn gedaan ZONDER de extra 22uF condensator.
CR2032 – 235mAHr – levensduur van de batterij 10 maandenCR2450 (N) – 650mAHr (540mAHr)– levensduur van de batterij 2,3 jaar (2 jaar)2 x AAA Alkaline – 1250mAHr – levensduur van de batterij 3,8 jaar2 x AAA Lithium – 1200mAhr – levensduur van de batterij 4,7 jaar LiPo oplaadbaar – niet aanbevolen vanwege de hoge zelfontlading.
CR2032
Deze knoopcel heeft een capaciteit van typisch 235mAhr (Energizer Battery), een nominale spanning van 3V en een gespecificeerde ontlaadspanning van 2V. Dit impliceert een batterijduur van 8100 uur of ~0,9 jaar. De interne celweerstand neemt echter toe naarmate de batterij het einde van zijn levensduur bereikt en dus mogelijk niet in staat is om de piek Tx-stroompulsen te leveren. Een grotere voedingscondensator kan worden gebruikt om dit effect te verminderen, maar zeg 10 maanden levensduur.
CR2450 (N)
Deze knoopcel heeft een capaciteit van typisch 620 mAh (540 mAh voor CR2450N), een nominale spanning van 3 V en een gespecificeerde ontlaadspanning van 2 V. Dit impliceert een batterijduur van 22, 400 uur of ~2jr 6m (18600hrs ~2jr 2m voor CR2450N). De interne celweerstand neemt echter toe naarmate de batterij het einde van zijn levensduur bereikt en dus mogelijk niet in staat is om de piek Tx-stroompulsen te leveren. Een grotere voedingscondensator kan worden gebruikt om dit effect te verminderen, maar zeg 2jr 4m (2jr N) levensduur.
Opmerking: De CR2450N-versie heeft een dikkere lip die onjuiste installatie in een CR2450N-houder helpt voorkomen. U kunt een CR2450N- en CR2450-cel in een CR2450-houder plaatsen, maar u kunt geen CR2450-cel in een CR2450N-houder plaatsen
2 x AAA-alkalinecellen
Deze accu's hebben een capaciteit van ongeveer 1250mAhr (Energizer Battery) voor zeer lage stromen, een nominale spanning van 2x1,5V = 3V en een gespecificeerde ontlaadspanning van 2x0,8V = 1,6V. Maar deze gespecificeerde ontlaadspanning is lager dan de bedrijfsspanning van de Si7021-sensor (1,9 V), dus de batterij kan slechts tot ~ 1 V elk worden gebruikt. Dit vermindert de capaciteit met ongeveer 10% tot 15%, d.w.z. ~1000mAHr.
Dit impliceert een batterijduur van 34, 500 uur of ~4jr. De interne celweerstand neemt echter toe naarmate de batterij het einde van zijn levensduur bereikt en dus mogelijk niet in staat is om de piek Tx-stroompulsen te leveren. Een grotere voedingscondensator kan worden gebruikt om dit effect te verminderen, maar zeg 3jr 10m levensduur. Opmerking Alkalinebatterijen hebben een zelfontlading van 2% tot 3% per jaar.
2 x AAA-lithiumcellen
Deze accu's hebben een capaciteit van ongeveer 1200mAhr (Energizer Battery), een nominale spanning van 2x1.7V = 3.4V, bij lage stromen, en een ontladen spanning van 2x1.4V = 2.4V. Dit impliceert een batterijduur van 41, 400 uur of 4 jaar 8m.
Oplaadbare LiPo-batterij
Deze accu's zijn er in verschillende capaciteiten van 100mAhr tot 2000mAhr, in platte formaten, en hebben een laadspanning van 4,2V en een ontlaadspanning van >2,7V. Ze hebben echter een hoge zelfontlading van 2%-3%/maand (d.w.z. 24% tot 36% per jaar) en zijn dus niet zo geschikt voor deze toepassing als de andere batterijen.
Stap 6: Alternatieven leveren – Solar Assist, Alleen batterij, Alleen zonne-energie
Batterij plus Solar Assist
Bovenstaande constructie maakt gebruik van de voeding Battery plus Solar Assist. Wanneer de zonnepanelen meer spanning genereren dan de batterijspanning, zullen de zonnecellen de monitor van stroom voorzien, waardoor de levensduur van de batterij wordt verlengd. Doorgaans kan de levensduur van de batterij met nog eens 50% worden verlengd.
De gebruikte zonnepanelen zijn klein, 50 mm x 30 mm, goedkoop, ~ $ 0,50 en laag stroomverbruik. Het zijn nominaal 5V-panelen, maar hebben volledig direct fel zonlicht nodig om 5V te genereren. In dit project zijn twee panelen in serie geschakeld, zodat het plaatsen van de monitor in de buurt van een raam, uit de directe zon, voldoende is om de batterij te vervangen. Zelfs een goed verlichte kamer, of een bureaulamp, is genoeg voor de zonnecellen om >3,3V bij >33uA op te wekken en het van de batterij over te nemen.
Er werd een eenvoudig testpaneel geconstrueerd om te bepalen waar de Temperatuur / Vochtigheidsmonitor kon worden geplaatst, uit de zon en toch op zonne-energie. Zoals je op de bovenstaande foto kunt zien, produceren de twee panelen die zijn aangesloten op een 100K-weerstand 5,64V over de 100K, d.w.z. 56uA stroom bij 5,64V. Dit is meer dan voldoende om de monitor van stroom te voorzien via de batterij. Elke spanningsmeting boven de nominale batterijspanning van 3V betekent dat de zonnecellen de monitor van stroom zullen voorzien in plaats van de batterij.
De twee diodes in het circuit van de temperatuur-vochtigheidsmonitor isoleren de zonnecellen en de batterijen van elkaar en voorkomen dat ze in omgekeerde polariteit worden aangesloten. De 10V 1W zener- en 470R-serieweerstand beschermt de ingebouwde regelaar van de NanoV2 tegen overspanning van twee zonnecellen in de volle zon, vooral als er 12V-cellen worden gebruikt in plaats van 5V-cellen. Bij normaal gebruik bij <5V trekt de 10V-zener slechts ~1uA.
Alleen batterij
Voor een voeding met alleen batterij laat u R1, D1 en D3 en de zonnecellen achterwege. U kunt D1 ook vervangen door een stuk draad als u geen beveiliging tegen omgekeerde polariteit wilt.
Alleen zonne-energie
Voor het voeden van de monitor met alleen zonnecellen, zonder batterij, is een ander voedingscircuit vereist. Het probleem is dat terwijl de monitor op 29uA werkt, de nRF52 bij het opstarten ~5mA trekt gedurende 0,32 sec. Het hierboven getoonde circuit (pdf-versie) houdt de MAX8881-regelaar uit totdat de ingangscondensatoren, 2 x 1000uF, opladen tot 4,04V. Vervolgens geeft de MAX6457 de MAX8881 SHDN-ingang vrij om de nRF52 (NanoV2) van stroom te voorzien. De 2 x 1000uF-condensatoren leveren de benodigde opstartstroom.
Hierdoor kan de monitor worden ingeschakeld zodra er voldoende zonne-energie is, zodat deze blijft werken op 29uA.
Stap 7: Conclusie
Deze tutorial heeft een temperatuur-vochtigheidsmonitor op batterijen / zonne-energie gepresenteerd als een voorbeeld van een zeer laag vermogen BLE-project in Arduino voor de nRF52832-chip. Voedingsstromen van ~29uA werden bereikt door de verbindingsparameters af te stemmen. Dit resulteerde in een CR2032 knoopcelbatterij met een levensduur van meer dan 10 maanden. Langer voor knoopcellen en batterijen met een hogere capaciteit. Het toevoegen van twee goedkope zonnecellen verlengde de levensduur van de batterij gemakkelijk met 50% of meer. Een helder kamerlicht of een bureaulamp is voldoende om de monitor van stroom te voorzien via de zonnecellen.
Er werd een speciaal stroomcircuit gepresenteerd om de monitor puur uit zonnecellen met een lage capaciteit te laten werken.
Met de gratis pfodDesigner kunt u menu's/submenu's ontwerpen, plotten tegen datum/tijd en gegevens loggen en vervolgens de Arduino-schets met laag vermogen voor u genereren. Hier werd een aangepaste interface gecodeerd met behulp van pfodApp-tekenprimitieven. Door verbinding te maken met pfodApp wordt de gebruikersinterface weergegeven en worden de metingen bijgewerkt terwijl de monitor ~29uA. gebruikt
Er is geen Android-programmering vereist. pfodApp regelt dat allemaal.