[ Arduino 703] [TP] Supervision avec un LCD

Cher(e)s lecteur(e)s, savez-vous qu’il est toujours aussi difficile de faire une introduction et une conclusion pour chaque chapitre ? C’est pourquoi je n’ai choisi ici que de dire ceci : amusez-vous bien avec les LCD ! 😀

Consigne

Dans ce TP, on se propose de mettre en place un système de supervision, comme on pourrait en retrouver dans un milieu industriel (en plus simple ici bien sur) ou dans d’autres applications. Le but sera d’afficher des informations sur l’écran LCD en fonction d’évènements qui se passent dans le milieu extérieur. Ce monde extérieur sera représenté par les composants suivants :

  • Deux boutons, qui pourraient représenter par exemple deux barrières infrarouges donc le signal passe de 1 à 0 lorsque un objet passe devant.
  • Deux potentiomètres. Un sert de « consigne » et est réglé par l’utilisateur. L’autre représentera un capteur (mais comme vous n’avez pas forcément lu la partie sur les capteurs (et qu’elle n’est pas rédigée à l’heure de la validation de cette partie), ce capteur sera représenté par un autre potentiomètre). A titre d’exemple, sur la vidéo à la suite vous verrez un potentiomètre rotatif qui représentera la consigne et un autre sous forme de glissière qui sera le capteur.
  • Enfin, une LED rouge nous permettra de faire une alarme visuelle. Elle sera normalement éteinte mais si la valeur du capteur dépasse celle de la consigne alors elle s’allumera.

Comportement de l’écran

L’écran que j’utilise ne propose que 2 lignes et 16 colonnes. Il n’est donc pas possible d’afficher toute les informations de manière lisible en même temps. On se propose donc de faire un affichage alterné entre deux interface. Chaque interface sera affiché pendant cinq secondes à tour de rôle. La première affichera l’état des boutons. On pourra par exemple lire :

La seconde interface affichera la valeur de la consigne et celle du capteur. On aura par exemple :

(Sur la vidéo vous verrez « gauche / droite » pour symboliser les deux potentiomètres, chacun fait comme il veut). 😛 Enfin, bien que l’information « consigne/capteur » ne s’affiche que toutes les 5 secondes, l’alarme (la LED rouge), elle, doit-être visible à tout moment si la valeur du capteur dépasse celle de la consigne. En effet, imaginez que cette alarme représentera une pression trop élevée, ce serait dommage que tout explose à cause d’un affichage 5 secondes sur 10 ! 😛 Je pense avoir fait le tour de mes attentes ! Je vous souhaite un bon courage, prenez votre temps, faites un beau schéma/montage/code et à bientôt pour la correction !

Correction !

Le montage

Vous en avez l’habitude maintenant, je vais vous présenter le schéma puis ensuite le code. Pour le schéma, je n’ai pas des milliers de commentaires à faire. Parmi les choses sur lesquelles il faut être attentif se trouvent :

  • Des condensateurs de filtrage pour éviter les rebonds parasites créés par les boutons
  • Mettre les potentiomètres sur des entrées analogiques
  • Brancher la LED dans le bon sens et ne pas oublier sa résistance de limitation de courant

Et en cas de doute, voici le schéma (qui est un peu fouillis par endroit, j’en suis désolé) !

Le code

Là encore, je vais reprendre le même schéma de fonctionnement que d’habitude en vous présentant tout d’abord les variables globales utilisées, puis les initialisations pour continuer avec quelques fonctions utiles et la boucle principale.

Les variables utilisées

Dans ce TP, beaucoup de variables vont être déclarées. En effet, il en faut déjà 5 pour les entrées/sorties (2 boutons, 2 potentiomètres, 1 LED), j’utilise aussi deux tableaux pour contenir et préparer les messages à afficher sur la première et deuxième ligne. Enfin, j’en utilise 4 pour contenir les mesures faites et 4 autres servant de mémoire pour ces mesures. Ah et j’oubliais, il me faut aussi une variable contenant le temps écoulé et une servant à savoir sur quel « interface » nous sommes en train d’écrire. Voici un petit tableau résumant tout cela ainsi que le type des variables.

Secret: Réponse SelectionnerAfficher

Le setup

Maintenant que les présentations sont faites, nous allons passer à toutes les initialisations. Le setup n’aura que peu de choses à faire puisqu’il suffira de régler les broches en entrées/sorties et de mettre en marche l’écran LCD.

Secret: Réponse SelectionnerAfficher

Quelques fonctions utiles

Afin de bien séparer notre code en morceaux logiques, nous allons écrire plusieurs fonctions, qui ont toutes un rôle particulier. La première d’entre toute sera celle chargée de faire le relevé des valeurs. Son objectif sera de faire les conversions analogiques et de regarder l’état des entrées numériques. Elle stockera bien entendu chacune des mesures dans la variable concernée.

Secret: Réponse SelectionnerAfficher
Ensuite, deux fonctions vont nous permettre de déterminer si oui ou non il faut mettre à jour l’écran. En effet, afin d’éviter un phénomène de scintillement qui se produit si on envoi des données sans arrêt, on préfère écrire sur l’écran que si nécessaire. Pour décider si l’on doit mettre à jour les « phrases » concernant les boutons, il suffit de vérifier l’état « ancien » et l’état courant de chaque bouton. Si l’état est différent, notre fonction renvoie true, sinon elle renvoie false. Une même fonction sera codée pour les valeurs analogiques. Cependant, comme les valeurs lues par le convertisseur de la carte Arduino ne sont pas toujours très stable (je rappel que le convertisseur offre plus ou moins deux bits de précision, soit 20mV de précision otale), on va faire une petite opération. Cette opération consiste à regarder si la valeur absolue de la différence entre la valeur courante et la valeur ancienne est supérieure à deux unités. Si c’est le cas on renvoi true sinon false.
Secret: Réponse SelectionnerAfficher
Une dernière fonction nous servira à faire la mise à jour de l’écran. Elle va préparer les deux chaines de caractères (celle du haut et celle du bas) et va ensuite les envoyer successivement sur l’écran. Pour écrire dans les chaines, on vérifiera la valeur de la variable ecran pour savoir si on doit écrire les valeurs des potentiomètres ou celles des boutons. L’envoi à l’écran se fait simplement avec print() comme vu antérieurement. On notera le clear() de l’écran avant de faire les mises à jour. En effet, sans cela les valeurs pourrait se chevaucher (essayer d’écrire un OFF puis un ON, sans clear(), cela vous fera un « ONF » à la fin). 😉
Secret: Réponse SelectionnerAfficher

La boucle principale

Nous voici enfin au cœur du programme, la boucle principale. Cette dernière est relativement légère, grâce aux fonctions permettant de repartir le code en unité logique. La boucle principale n’a plus qu’à les utiliser à bon escient et dans le bon ordre ( 😛 ) pour faire son travail. Dans l’ordre il nous faudra donc :

  • Récupérer toutes les données (faire les conversions etc…)
  • Selon l’interface courante, afficher soit les états des boutons soit les valeurs des potentiomètres si ils/elles ont changé(e)s
  • Tester les valeurs des potentiomètres pour déclencher l’alarme ou non
  • Enfin, si 5 secondes se sont écoulées, changer d’interface et mettre à jour l’écran

Simple non ? On ne le dira jamais assez, un code bien séparé est toujours plus facile à comprendre et à retoucher si nécessaire ! 🙂 Aller, comme vous êtes sages, voici le code de cette boucle (qui va de paire avec les fonctions expliquées précédemment) :

Secret: Réponse SelectionnerAfficher

Programme complet

Voici enfin le code complet. Vous pourrez le copier/coller et l’essayer pour comparer si vous voulez. Attention cependant à déclarer les bonnes broches en fonction de votre montage (notamment pour le LCD).

Secret: Réponse SelectionnerAfficher

Que diriez-vous si je vous proposais d’utiliser des écrans LCD graphique ? Mmm ?

11 commentaires

  1. Bonjour
    je suis débutante je viens de découvrir l’arduino y’a pas longtemps
    j’ai essayé de faire le montage mais ça ne marche pas l’écran ne veut même pas d’allumer !!!
    je voulais savoir comment as tu calculer la valuer des condos ? moi j’ai pris 10nF

  2. Bonjour,
    J’essaye d’afficher un hygromètre sur un écran LCD avec le min, max et moyenne du %HR cependant j’ai toujours un bug au bout d’un certain temps sur l’écran. Le programme fonctionne très bien puisqu’il poursuit mais l’écran affiche des caractères bizarre.
    Mon programme d’affichage est le suivant:

    //lecture du capteur HR
    void lecture_capteur_HR()
    {
    HR_prec=capteur_HR;
    Volt_capteur_HR=analogRead(0); // Volt_capteur_HR est un float
    Volt_capteur_HR= Volt_capteur_HR*5/1024;
    //changement d’echelle V=>%HR
    capteur_HR=((Volt_capteur_HR-0.8)*100/3.27)-7; // capteur_HR est un int
    moyenne();
    lcd.clear();
    delay(1);
    lcd.setCursor (0,0);
    lcd.print(« lim: mo: i: co »);
    lcd.setCursor (0,1);
    lcd.print (min_HR);
    lcd.print ( » « );
    lcd.print(max_HR);
    lcd.print( » « );
    lcd.print(moyenne_HR);
    lcd.print( » « );
    lcd.print(capteur_HR);
    lcd.print( » « );
    lcd.print(consigne);
    }

Laisser un commentaire