Étape 4: Firmware
Les tensions de la thermistance sont échantillonnées, converties en température et envoyées via Bluetooth à l’app de EvoThings en cours d’exécution sur le périphérique smartphone.
Pour convertir la tension à une valeur de résistance au sein de la fève, une simple équation linéaire est utilisée. La dérivation de l’équation est fournie sous forme d’image. Au lieu de convertir la valeur échantillonnée à tension, puisque tant l’ADC et la tension d’entrée sont référencés à la même tension de la batterie, nous pouvons utiliser la valeur de l’ADC au lieu de la tension. Pour l’ADC de haricot 10 bits, tension de la batterie pleine se traduira par une valeur d’ADC de 1023 pour nous d’utiliser cette valeur comme Vbat. La valeur réelle de la résistance de la cloison est une considération importante. Mesurer la valeur réelle de la résistance de diviseur de 100K et utiliser la valeur mesurée dans l’équation afin d’éviter une source inutile d’erreur en raison de la tolérance de la résistance.
Une fois que la résistance est calculée, la valeur de résistance convertie en température en utilisant l’équation de Steinhart-Hart. Cette équation est décrite en détail sur Wikipedia.
Parce que nous avons 2 sondes, il était logique pour encapsuler les fonctionnalités de la sonde dans une classe C++.
La classe encapsule les coefficients d’équation de Steinhart-Hart, la valeur de la résistance nominale diviseur et le port analogue auquel est reliée la thermistance. Une méthode unique, temperature(), valeur convertit l’ADC pour une valeur de résistance, puis utilise le Steinhart-Hart équation pour déterminer la température en Kelvin. La valeur de retour soustrait le zéro absolu (273.15K) de la température calculée pour fournir la valeur en degrés Celsius.
La puissance de la Lightblue Bean est évidente dans le fait que toutes les fonctionnalités Bluetooth sont essentiellement mis en œuvre en 1 ligne de code qui écrit les valeurs de température échantillonnés dans une zone de données scratch sur la mémoire de Bluetooth.
Bean.setScratchData(TEMPERATURE_SCRATCH_IDX, (uint8_t*)&temperature[0], 12);
Chaque valeur échantillonnée température est représentée par un flotteur qui occupe 4 octets. La zone de données gratter peut contenir 20 octets. Nous utilisons seulement 12 d'entre eux. Il y a 5 zones de données gratter afin que vous pourriez transférer jusqu'à 100 octets de données à l’aide de données gratter.
Le débit de base des événements est :
- Vérifier pour voir si nous avons une connexion Bluetooth
- Dans l’affirmative, déguster les températures et les écrire dans la zone zéro
- Dormir à 200ms et répéter le cycle.
Si ne pas connecté, le firmware met la puce ATMEGA328P de dormir pendant une longue période. Le cycle de sommeil est important pour conserver le pouvoir. La puce ATMEGA328P passe en mode de faible puissance et y reste jusqu'à interruption par le module Bluetooth LBM313. Le LBM313 va générer une interruption pour se réveiller le ATMEGA328P à la fin de la période de sommeil sollicitée, ou lorsqu’une connexion Bluetooth est présentée à la fève. Le WakeOnConnect est activée en appelant explicitement Bean.enableWakeOnConnect(true) pendant setup().
Il est important de noter que le firmware ne fonctionnera avec n’importe quelle application de client BLE. Tout ce que le client a besoin de faire est dépouiller les octets de la température de la Banque de données gratter et réassembler en variable, les nombres à virgule pour l’affichage ou le traitement. L’application cliente plus facile pour moi était d’utiliser EvoThings.