Quelques points important concernant le lgiciel, et en particulier le fait qu'il n'est pas possible de commander simultanément le servomoteur et l'écran LCD. |
-
Le logiciel est régulièrement mis à jour et le listing est publié ici: logiciel arduino commande du chauffage.
Serial ou SoftwareSerial?Pour communiquer avec un écran LCD il faut établir une communication sérielle. Il y a d'autres possibilités, mais c'est la communication sérielle qui demande le moins de ports: un seul (pour l'envoi des caractères).L'arduino a un port sériel hardware connecté au port numérique 1, mais il est aussi possible d'utiliser d'autres ports numériques avec la fonction include #include <SoftwareSerial.h>. Une des raisons pour utiliser un port softwareserial c'est qu'on peut communiquer avec plusieurs appareils. Une alternative c'est d'utiliser un commutateur CMOS qui envoie la ligne TX au display correspondant. Le port sériel software ne peut par contre pas travailler simultanément avec la commande su servomoteur. Les deux routines utilisent une fonction de retard et il semblerait que l'arduino n'ait qu'un seul timer (minuterie). Quand l'arduino est en train d'envoyer du texte à l'écran, la commande du servo-moteur est retardée et le moteur change continuellement de position. La solution est d'utiliser le port standard (qui est un port hardware qui dispose de son propre processeur), mais cette solution a également des inconvénients. Voyons toutes les possibilités:
Un exemple quand l'écran s'est mis au mauvais baud rate. T'as de la chance, ce problème peut être résolu assez facilement. Il faut modifier l'application pour travailler à la vitesse de l'écran (par exemple Serial.begin(2400) et tester toutes les vitesses jusqu'à l'obtention de texte normal. Il est alors possible de faire repasser l'écran à sa vitesse normale. Il faut ensuite remettre la vitesse normale dans l'application.
J'utilise une variable logique servodrive qui est mise sur 1 quand le moteur doit être commandé. Lors du passage de la boucle suivant, la position est modifiée puis la variable est remise sur 0. Tant que la variable est sur 1, il est interdit d'écrire à l'écran. Le servomoteur effectue des petits pas pour ne pas forcer le thermostat. Pour éviter que l'écran ne soit bloqué, j'alterne une écriture d'écran et une commande du servomoteur. J'utilise pour cela la variable logique blinker (qui a encore d'autres fonctions).
ConstantesLes numéros de ports sont indiqués comme des constantes. Il est ainsi possible de changer de port (par exemple port défectueux) en changeant la valeur de la constante.Je préfère limiter l'utilisation de constantes, surtout si elles ne sont utilisées que dans une partie de l'application. En cas d'applications complexes, on ne sait plus très bien ce qu'une constante représente.
VariablesJ'utilise des variables entières (int) sauf pour les variables qui représentent une valeur continue comme la température. Les températures sont lues en entier (0..1023) et puis converties en float pour calculer la moyenne et la dérivée.Certains paramètres sont en fait des valeurs entières avec deux chiffres décimaux. Quand elles doivent être utilisées pour des calculs, elles sont transformées en float. Pour visualiser les valeurs float, la procédure inverse est suivie. Attention: les variables définies en début de programme sont d'application partout (ce sont des variables globales). Les variables définies dans une routine ne sont disponible que localement, même dans loop(); Il vaut mieux utiliser des variables locales, on est ainsi sûr que le même nom n'est pas utilisé pour deux choses différentes. Les variables doivent être déclarées static, elles ne sont pas initialisées à 0 à l'entrée de la procédure, mais gardent leur valeur à chaque passage de la procédure. Des erreurs très difficiles à localiser peuvent ainsi être produites, parce qu'on croit qu'une variable a gardé la même valeur que celle reçue lors du passage de boucle précédent.
Routines généralesLes séries d'instructions pour écrire l'écran ou commander les leds sont définies comme routines et peuvent être utilisées partout dans l'application. Cela permet aussi de définir la fonction de bloquage de l'écriture à un seul endroit (ou à un nombre d'endroits imités).
Initialisation (setup)L'initialisation n'est effectuée qu'une seule fois après une remise à zéro. On configure les ports numériques (entrée ou sortie), on définit les tableaux, on lit les valeurs de l'EEPROM,...Pour donner une valeur de départ à une variable, on peut le faire plus aisément en attribuant la valeur lors de la définition de la variable.
Programme principal (loop)Après exécution du setup, le programme principal est effectué. Quand il est terminé, il est automatiquement relancé. Faites attention aux variables locales qui sont remises à zéro à chaque passage (sauf variable static). |
Publicités - Reklame