Stap 4: Firmware
De thermistor spanningen worden bemonsterd, geconverteerd naar temperatuur en verstuurd via Bluetooth naar de EvoThings app draait op de smartphone.
Als u wilt de spanning omzetten in een weerstandswaarde binnen de Boon, wordt een eenvoudige lineaire vergelijking gebruikt. De afleiding van de vergelijking wordt geleverd als een afbeelding. In plaats van de bemonsterde waarde omzetten in spanning, omdat zowel de ADC als de ingangsspanning wordt verwezen naar de dezelfde accuspanning, kunnen we de ADC-waarde in plaats van de spanning gebruiken. Voor de 10 bits Bean ADC, zal volle batterijspanning resulteren in een ADC-waarde van 1023 zodat we deze waarde als Vbat gebruiken. De werkelijke waarde van de scheidingslijn weerstand is een belangrijke overweging. De werkelijke waarde van de 100K scheidingslijn weerstand meten en de gemeten waarde gebruiken in de vergelijking te vermijden van een niet onnodig oorzaak van fout als gevolg van de weerstand tolerantie.
Zodra de weerstandswaarde is berekend, wordt de weerstandswaarde geconverteerd naar temperatuur met behulp van de vergelijking Steinhart-Hart. Deze vergelijking wordt in detail beschreven op Wikipedia.
Omdat we 2 sondes hebben, is het zinvol om in te kapselen de functionaliteit van de sonde in een C++-klasse.
De klasse kapselt de Steinhart-Hart vergelijking coëfficiënten, de nominale scheidingslijn weerstandswaarde en de analoge poort waarop de thermistor wordt aangesloten. Een enkele methode, temperature(), zet de ADC waarde een weerstandswaarde en vervolgens gebruikt de Steinhart-Hart vergelijking om te bepalen van de temperatuur in Kelvin. De geretourneerde waarde wordt afgetrokken van absolute nulpunt (273.15K) van de berekende temperatuur om de waarde in Celsius te bieden.
De kracht van de Lightblue Bean is duidelijk in het feit dat alle Bluetooth functionaliteit in wezen in 1 regel code die de bemonsterde temperatuur waarden naar een kras gegevensgebied op de Bluetooth-geheugen schrijft wordt uitgevoerd.
Bean.setScratchData(TEMPERATURE_SCRATCH_IDX, (uint8_t*)&temperature[0], 12);
Elke bemonsterde temperatuur waarde wordt vertegenwoordigd door een float die 4 bytes in beslag. Het kras gegevensgebied kan 20 bytes bevatten. Wij zijn alleen met behulp van de 12 van hen. Er zijn 5 kras gegevensgebieden zodat u maximaal 100 bytes aan gegevens met behulp van kras gegevens kan overbrengen.
De elementaire stroom van gebeurtenissen is:
- Controleer om te zien of we een Bluetooth-verbinding
- Zo ja, proeven van temperaturen en ze schrijven op het kras gegevensgebied
- Slapen 200ms en herhaalt u de cyclus.
Als niet is aangesloten, zet de firmware de ATMEGA328P chip te slapen voor een lange tijd. De slaapcyclus is belangrijk voor het behoud van de macht. De ATMEGA328P-chip gaat in de modus voor laag stroomverbruik en blijft daar totdat onderbroken door de LBM313 Bluetooth-module. De LBM313 genereert een interrupt de ATMEGA328P aan het einde van de periode van de slaap verzocht, of wanneer een Bluetooth-verbinding wordt gemaakt met de boon uit slaapstand halen. De WakeOnConnect-functionaliteit is ingeschakeld door te bellen naar expliciet Bean.enableWakeOnConnect(true) tijdens Setup.
Het is belangrijk op te merken dat de firmware met een BLE-clienttoepassing werken zal. De client hoeft te doen is strippen van de bytes van de temperatuur van de kras-databank en monteer ze in floating point getallen voor weergave of voor verwerking. De eenvoudigste client app voor me was het gebruik van EvoThings.