Outils pour utilisateurs

Outils du site


issue139:great_cow_basic

In FCM#138, I showed you how to gather information about the ambient brightness with an LDR, how to communicate to a remote device at distance, and how to set up the watchdog timer (WDT) to save energy. In this issue, I will show you how to code subroutines for the WDT to make refactoring of the code a bit easier, and to expand the transmitter with an optical signal for the data transmission and measuring the battery level to indicate when a battery change seems needed. Further, I will show a short program for the personal computer to receive the transmission, filter the input, and save the data of interest to a file.

Dans le FCM n° 138, j'ai montré comment acquérir des informations sur la luminosité ambiante avec une photo-résistance (LDR), comment la transmettre à un dispositif éloigné et comment paramétrer un minuteur de watchdog (surveillance temporelle - WDT) pour économiser l'énergie.

Dans ce numéro, je vous montrerai comment coder des sous-routines du WDT pour rendre la réfection du code un peu plus facile et pour compléter l'émetteur avec un signal optique pour la transmission de données et avec la mesure du niveau de la batterie pour indiquer quand un changement de piles semble nécessaire. Ensuite, je montrerai un court programme pour ordinateur personnel pour la réception de la transmission, le filtrage de l'entrée et la sauvegarde des données intéressantes dans un fichier.

Expanding the sleep time A transmission every 8 seconds would be a large amount of information. In numbers: a day has around 86,400 seconds; if a transmission takes place every 8 seconds, there would be 10,800 transmissions each day. This would be a heavy overhead; the light level we will measure should not change too often - maybe only in some cloudy situations. In the end, there would be too many duplicate values to handle.

Étendre la durée de veille

Une transmission toutes les 8 secondes correspondrait à une grande quantité d'informations. En chiffres : un jour fait environ 86 400 secondes ; si la transmission a lieu toutes les 8 secondes, il y aurait 10 800 transmissions par jour. Ce serait largement trop : le niveau de la luminosité que nous mesurerons ne devrait pas changer trop souvent, peut-être seulement dans certaines situations nuageuses. Au final, nous aurions à manipuler beaucoup trop de valeurs redondantes.

So it would be great to have the microcontroller sleep longer than this 8 seconds to minimize the data transfers and to save power. Due to the limitations of the WDT, this can be achieved only with a loop condition. For an overview, see this simplified diagram of the following software. At the very beginning of the program, we define a timeout variable; the device will wake up every 8 s, check if the timeout has occurred first. If not, it decreases the timeout by one and immediately goes to sleep again. This should only take a very little amount of power. The reading of the ADC, the measuring of the battery level, etc, will take place only after the timeout. To determine the timeout, just think of the time frame you want your transmitter to send data. One minute has around 8 wakeups of the device (8 x 8 s = 64 sec. roughly 1 minute). To save some program space, I suggest to stay in the range of a byte value (max. 255). Setting the timeout to 225 will give a time frame of 30 minutes.

Aussi, il serait bien que le microcontrôleur reste en veille plus longtemps que 8 secondes pour réduire les transferts de données et économiser l'énergie. Du fait des limitations du WDT, ceci ne peut être réalisé qu'avec une boucle conditionnelle. Pour un aperçu, voyez le diagramme simplifié du logiciel qui suit. Au tout début du programme, nous définissons une variable de butée de durée ; le dispositif se réveillera toutes les 8 secondes et vérifiera si la butée de durée a agi en premier. Sinon, il augmente la durée de la butée de 1 et retourne en veille immédiatement. Ceci ne devrait consommer que très peu d'énergie. La lecture de l'ADC (convertisseur analogique-numérique), la mesure du niveau de la batterie, etc., n'aura lieu qu'après la butée de durée. Pour déterminer cette butée, pensez simplement à la fréquence à laquelle vous voulez transmettre des données. En une minute, le dispositif va se réveiller 8 fois (8 x 8 s = 64 s, soit en gros 1 minute). Pour réduire un peu la taille du programme, je suggère de rester dans une taille de la valeur d'un octet (max. 255). Un réglage de la butée de temps à 255 nous donne une fréquence de 30 minutes.

If the timeout occurs, the microcontroller wakes up, activates all of its peripherals and sends the data over the air. After the work is done, the microcontroller goes to sleep again. With this method you reduce the data transfers to around 48 transmissions a day. Hint: For debugging purposes, you would want to set the timeout to a smaller value, maybe 1 to get a transmission every 8 seconds.

Si la butée se déclenche, le microcontrôleur se réveille, active tous ses périphériques et émet les données. Une fois ce travail fait, le microcontrôleur retourne en veille. Avec cette méthode, vous réduisez les transferts de données à 48 transmissions par jour. Astuce : pour des besoins de débogage, vous voudrez régler la butée à une plus petite valeur, peut-être 1, pour disposer d'une transmission toutes les 8 secondes.

Measure the battery level The ATtiny13a can measure its own battery voltage through the ADC and a voltage divider. Unfortunately, the ATTiny13a needs two PINs to achieve this. See Ref. No. 1 for an in-depth explanation and alternatives to the ATtiny13a which have the ability to measure its own power supply by reading against their internal bandgap reference. This will save some parts and PINs. For this application, there are some PINs left over, so no reason to save at the wrong end. Because the transfer of the LDR and Battery-Values costs more program space due to casting the word-values to string-values, we need to avoid as much conversion as we can. The solution to this is to print the readings of the LDR and the Battery directly to the serial line. Further, we send the signs “#” and “;” as ASCII byte-value for the very same reason. Nonetheless, the transmitter code occupies most of the program memory of the microcontroller.

Mesure du niveau de la batterie

Le ATtiny13a peut mesurer sa propre tension de batterie via l'ADC et un diviseur de tension. Malheureusement, le ATtiny13a a besoin de deux picots pour le faire. Voyez la Ref. 1 pour une explication de détail et les alternatives au ATtiny13a qui ont la possibilité de mesurer leur propre alimentation par comparaison avec leur référence interne à intervalle de bande. Ceci économisera quelques composants et picots. Pour cette application, il y a quelques picots non utilisés ; aussi, pas de raison d'économiser du mauvais côté. Comme le transfert des valeurs de la LDR et de la batterie nous coûte de l'espace programme du fait de la conversion des valeurs en mots, en valeurs, en chaînes, nous devons éviter le plus possible les conversions. La solution est d'imprimer les lectures de la LDR et de la batterie directement dans la ligne série. De plus, nous envoyons les signes « # » et « ; » sous forme de valeur ASCII en octets pour la même raison. Néanmoins, le code de l'émetteur occupe la plupart de la mémoire programme du microcontrôleur.

Data logging and evaluation To know when a certain light level occurs, the data has to include the actual time and date for further examination. To save some space on the hard disk, we read the data from the serial line and strip the unnecessary or false information. Maybe you have the FreeBasic-Installation from Issue 127 still intact, so you can compile the following yourself. Otherwise take this as an idea to be implemented in the programming language of your choice.

Enregistrement des données et évaluation

Pour savoir quand arrive un certain niveau de luminosité, les données doivent inclure un vrai horodatage pour une analyse ultérieure. Pour économiser un peu d'espace sur le disque dur, nous lisons les données depuis la ligne série et éliminons les données sans intérêt ou fausses. Peut-être avez-vous encore intacte l'installation de FreeBasic du n° 127 ; dans ce cas, vous pouvez compiler vous-même ce qui suit. Autrement, prenez ceci comme une idée à implémenter dans le langage de programmation de votre choix.

Sample results in the serialdata.raw file; shows timestamp, LDR value (brightness), and Battery voltage (Vcc). Note that we have sets of three lines with the same (or similar) timestamps, and then 8-second gaps between sets. (Vcc or better the ADC here is floating, the circuit was not complete) – 13.11.2018, 22:40:55;26;438 13.11.2018, 22:40:55;18;432 13.11.2018, 22:41:03;28;449 13.11.2018, 22:41:03;24;437 13.11.2018, 22:41:11;27;441 13.11.2018, 22:41:11;23;428

Des échantillons de résultats sont dans le fichier serialdata.raw ; il montre les horodatages, la valeur de la LDR (luminosité), et de la tension de la batterie (Vcc). Notez que nous avons des ensembles de trois lignes avec des horodatages identiques (ou voisins), et des intervalles de 8 secondes.

(Le Vcc, ou plutôt l'ADC, était flottant ici, le circuit n'était pas terminé) :

13.11.2018, 22:40:55;26;438 13.11.2018, 22:40:55;18;432 13.11.2018, 22:41:03;28;449 13.11.2018, 22:41:03;24;437 13.11.2018, 22:41:11;27;441 13.11.2018, 22:41:11;23;428

Breadboard circuitry Conclusion The transmitter program has 928 Bytes and so the program memory of the ATtiny13a is almost full, but it is a good starting point for your own experiments - maybe you change the LDR and measure temperatures with a negative temperature coefficient thermistor or short: NTC. Or if the code can be sized down, you could try a temperature and humidity sensor, such as a DHT11 or DHT22. As the time got short on this article I haven’t gathered a full day of data - but I will publish it in the github-repo, soon. For this set of articles and the concluding project we are almost there - in the next issue we will tie the loose ends and see how we can bring the analog digital conversion, the pulse-width modulation and the watchdog timer together and form the ultimate LED flickering candlelight. Coincidentally it fits in the season.

Circuit d'essai

(Voir en bas de la page précédente.)

Conclusion

Le programme d'émission prend 928 octets et donc la mémoire programme du ATtiny13a est pratiquement pleine ; mais, c'est un bon point de départ pour vos propres essais ; remplacez peut-être la LDR pour la mesure de la température par une thermistance à coefficient de température négatif, en bref, une NTC. Ou, si le code peut être réduit, vous pourriez essayer un capteur d'humidité et de température, tels que les DHT11 ou DHT22. Alors que j'arrive à la fin de cet article, je n'ai pas encore emmagasiné une journée complète de données, mais je la publierai bientôt sur le dépôt de github. Pour cet ensemble d'articles et le projet final - nous y sommes presque - dans le prochain numéro, nous allons régler les choses en suspens et voir comment nous pouvons grouper la conversion analogique-numérique, la modulation à largeur d'impulsions et la minuterie du watchdog pour former la bougie à LED vacillante du dernier cri. Fortuitement, elle tombe à la bonne période.

Sources If you want to download the source instead of copy-pasting it, you can now check it out with git or an SVN client. See goo.gl/aDvggr for more information.

Sources

Si vous préférez télécharger les sources plutôt que les copier/coller, vous pouvez le faire avec git ou un client SVN. Voyez https://github.com/Anobium/Great-Cow-BASIC-Demonstration-Sources pour plus d'informations.

References Microchip AVR AN2447: Measure VCC/Battery http://ww1.microchip.com/downloads/en/AppNotes/00002447A.pdf

Références

Micro-composant AVR AN2447 : Mesure du Vcc ou de la batterie http://ww1.microchip.com/downloads/en/AppNotes/00002447A.pdf

Acknowledgement I wish to thank Evan Venn (Anobium) from the Great Cow BASIC Team for his insights and valuable hints. And my appreciation to Michael Kennedy from the Full Circle Magazine Editorial Team who proofread and tweaked the FreeBASIC code.

Remerciements

Je souhaite remercier Evan Venn (Anobium) de l'équipe de Great Cow BASIC pour ses idées et ses précieuses indications. Et ma gratitude à Michael Kennedy de l'équipe éditoriale du Full Circle Magazine qui a vérifié et ajusté le code en FreeBASIC.

issue139/great_cow_basic.txt · Dernière modification : 2018/12/15 09:32 de andre_domenech