Niveau 2 – Utiliser les liste n°2

MAISON «VIVANTE» n°2

ou

Éclairage aléatoire de plusieurs pièces d'un bâtiment

Nombre de visites :
2
L'icône ci-contre indique que nous allons utiliser CocoBLOCKLY, un équivalent de ARDUBLOCKLY, mais avec beaucoup plus de fonctions.
CocoBLOCKLY fonctionne « en ligne ».
PROJET
Dans ce nouveau programme, le but est de s'affranchir de la création et du remplissage fastidieux  des tables horaires.
Le but est aussi de voir s'il est possible de modifier le minimum de paramètres pour adapter le programme à un nombre différent de sorties.

 
 
 
VOICI LE PROGRAMME COMPLET
  • 1 seule liste qui contient les numéros des sorties de l'ARDUINO utilisées pour lesLED ;
     
  • 1 fonction de test pour capter l'état d'un contact sur l'entrée n°5 ;
     
  • ... dans laquelle une fonction «chronomètre» exécute la boucle de comptage à intervalle d'une «heure fictive» (ici, 4 secondes pour la phase de mise au point) ;
     
  • 1 boucle de comptage pour lire la liste des sorties et commander leur état, et cela quel que soit le nombre de sorties. 
Ben ! Te réjouis pas trop vite.
Y'a rien dans ton programme...
T'es sûr que ça fonctionne ?
Bien sûr !
Je vais t'expliquer...
 
 
La LISTE
 
La liste nommée «LISTE_SORTIES» contient les numéros des broches de sorties sur lesquelles seront connectées les 4 LED.
Ici ce sont les sorties 2, 3, 4 et 6, dans cet ordre.
Chaque n° de sortie est donc rangé à une position précise, appelée «index».
  • la sortie n°2 est à l'index «0» ;
  • la sortie n°3 est à l'index «1» ;
  • ...
  • la sortie n°6 est à l'index «3».
C'est grâce à cet index que le programme pourra connaître le numéro de chaque sortie des LED.


 
METTRE UNE SORTIE à «HIGH» ou «LOW»
de façon ALÉATOIRE
 
Dans le programme on a créé une variable «SORTIE_COURANTE» qui contiendra le numéro de la sortie en cours de traitement.
Cette sortie prendra soit la valeur «0», soit la valeur «1», c'est à dire «LOW» ou «HIGH», c'est à dire «éteinte» ou «allumée».
Ceci est obtenu grâce à la fonction «random integer from 0 to 2 is even» qui renvoie de façon aléatoire un nombre inférieur à 2, càd soit «0», soit «1».
La fonction «set digital pin # SORTIE_COURANTE» se charge d'appliquer ce résultat à la sortie en cours de traitement.
(le signe «#» signifie «n°» ).
⇒ la LED connectée sur «SORTIE_COURANTE» sera donc allumée ou éteinte suivant que la valeur aléatoire sera «1» ou «0».
 


 
PARCOURIR LA LISTE DES NUMÉROS DES SORTIES

 
Le processus doit être appliqué à chacune des sorties, c'est à dire aux numéros de sorties stockés dans la liste, de l'index «0» à l'index maxi.
 
Première fonction :
 
Cette fonction lit et renvoie le numéro de la première sortie stocké à l'index «0» dans la liste «LISTE_SORTIES».
(dans notre cas cette fonction vaut (ou «renvoie» ) la valeur «3».
Deuxième fonction :
 
Il faut connaître aussi la valeur maximale de l'index.
Dans le cas présent elle vaut «3», puis qu'il y a 4 numéros de sortie stockés dans la liste.
En effet, les valeurs d'index sont comptées à partir de «0».
 
Donc on pourrait se contenter, dans le cas présent, d'utiliser la fonction ci-contre pour obtenir le numéro de la sortie stocké dans à l'index «3» de la liste.
Mais... si la liste a une taille différente, l'index maxi sera différent !
(par exemple si on désire utiliser plus de 3 sorties).
 
 
J'explique :
  • la fonction ci-contre calcule la longueur de la liste, càd le nombre d'éléments qui y sont stockés, quel que soit le nombre de sorties utilisées, et quel que soient leurs numéros.
 
Dans le cas présent cette longueur vaut 4.
Aïe ! On a vu plus haut que l'index maxi vaut 3.
Qu'à cela ne tienne.
  • la fonction ci-contre soustrait «1» à la valeur de la taille de la liste et donne donc automatiquement la valeur maximale de l'index : 4 – 1 = 3. Gagné !
     
  • la fonction complexe  renvoie alors le numéro de la sortie stocké dans la dernière position de la liste c'est-à-dire à l'index «maxi».
 
 
Fonction complète de scrutation des numéros de sorties :
 
La boucle de comptage ci-dessous va donc parcourir la liste des sorties, de l'index «0» à l'index «maxi», et récupérer l'un après l'autre les numéros des sorties, quel que soit leur nombre.
 
 
... et la fonction qui attribue la valeur «LOW» ou «HIGH» :
 
«L'HEURE FICTIVE»
Ce groupe de blocs est le CŒUR du PROGRAMME
 
 
La boucle «count with...» est incluse dans une boucle de comptage de temps «Every 4 secondes»,
c'est-à-dire :
«toutes les 4 secondes, faire ce qui suit».
«Every x secondes» est la durée de «l'heure fictive».
En phase de mise au point je l'ai réglée à 4 secondes.
En utilisation normale ce temps sera réglé à votre convenance entre 1 et 10 minutes, c'est-à-dire entre 60 et 600. (mais on peut aller au delà).
 



 
Le TEST DU CONTACT MARCHE / ARRÊT

 
 

On pourrait se contenter du programme précédent. Il est parfaitement fonctionnel, mais le cycle d'éclairage est permanent.
Si par contre on désire activer ou désactiver le cycle pour éviter d'éclairer l'intérieur du bâtiment en plein jour (par exemple) :
  • on ajoute un contact sur une entrée de l'ARDUINO. Ici, on utilise l'entrée n°5 ;
  • on englobe la partie «CŒUR DU PROGRAMME» dans une fonction qui teste ce contact ;
  • on ajoute la partie du programme qui force la mise à «LOW» de toutes les sorties si le contact est ouvert.
 


 
MISE à «LOW» de TOUTES LES SORTIES
 
 

 
 
C'est ni plus, ni moins que le «cœur du programme» auquel on a retiré la fonction «random integer from...» pour la remplacer par une forçage à «LOW» de toutes les sorties.



 
... ET DE NOUVEAU LE PROGRAMME COMPLET
avec les commentaires.
LE CODE C++
(CLIC sur l'image pour agrandir)

Étonnant !
Ce programme paraît tout simple et pourtant il comprend environ 55 lignes de code.
Ce sont les boucles de comptage qui sont très volumineuses.
La fonction «boucle de comptage» en version BLOCKLY a été conçue pour être universelle : elle compte aussi bien en valeurs croissantes qu'en valeurs décroissantes sans qu'on ait à se soucier du signe de l'incrément.
 
D'autre part un contrôle de la cohérence des valeurs de début et de fin est effectué avant la boucle elle-même.
 
Cette préparation prend de la place.
 
Si on avait programmé ces boucles « en lignes de code », le code de ces 2 boucles tiendrait sur 2 lignes au lieu d'une vingtaine dans le cas présent.
 
Cela étant dit, le code généré par BLOCKLY est de la très belle programmation !

 
 

 
Et SI MAINTENANT ON VEUT AJOUTER 2 AUTRES SORTIES ?
Voilà ce qui change : 2 éléments de plus dans la liste des numéros de sorties.
 
Le reste du programme ne change absolument pas !
Pas mal, non ?
 
CONCLUSION
 
 
 
Ici encore, mieux vaut programmer cette petite application en BLOCKLY plutôt qu'en lignes de code !
 
Petit bémol : «l'heure fictive» est obligatoirement exprimée en secondes.
La fonction «Every x secondes» n'a pas de petite sœur exprimée en minutes.
Note concernant la fonction C++ « pinMode(..., INPUT) ; »
 
Au tout début du code généré en C++ par BLOCKLY, dans void setup(), on remarque l'instruction pinMode(5, INPUT) ;
 
Cette instruction teste l'état de l'entrée n°5 sur laquelle est connecté le contact.
 
Mais...
 
Lorsque le contact est ouvert, quel est l'état de cette entrée ? «0» ou «1» ?
Eh bien voilà une question intéressante.
Une entrée «en l'air», c'est à dire non reliée à un potentiel précis par le contact, risque fort de n'être ni à «0» ni à «1» !

 

 
Solutions :
 
 
  • soit on câble une résistance de 10 à 22 kΩ entre l'entrée n°5 et le «+5volts».
    Ainsi, lorsque le contact est ouvert, l'entrée n°5 est fixée à «+5V», càd au niveau logique «HIGH».
  •  soit on utilise une propriété de l'ARDUINO qui permet de connecter «en interne par le programme» une résistance entre l'entrée et le «+5volts».
 
Dans le langage électronique, ce type de résistance est appelée «résistance pullup».
Si donc on veut être rigoureux et ne pas avoir d'ennuis, avant de téléverser le programme, on complétera l'instruction
« pinMode(5, INPUT) ; » qui deviendra « pinMode(5, INPUT_PULLUP) ; »

 
 
 
Note concernant la fonction Blockly «Every ...seconds  ; »

 
Cette fonction est construite à partie de la fonction «milli()» du langage C++.
 
Son immense intérêt est que, contrairement à la fonction «wait » de Blockly, la fonction «Every ... seconds» n'est pas bloquante.
En effet, pendant toute la durée d'une fonction «wait» («delay() ; » en C++ ), aucune autre action ne peut être effectuée.
 
Dans le cas présent, si on utilisait la fonction «wait» pour la durée de l'heure fictive, on serait dans l'impossibilité d'arrêter le cycle immédiatement en actionnant le contact.
 
Pour que le cycle puisse s'arrêter :
  • il faudrait tout d'abord que le contact soit un switch à contact non fugitif.
  • ensuite l'arrêt du cycle n'interviendrait qu'à la fin de l'heure fictive en cours.


 
 
Notes concernant «PULLUP»
 
 
Certaines versions de Blockly Arduino proposent un bloc qui permet de sélectionner l'option «PULLUP».
 
C'est le cas de la version proposée par http://blockly-arduino.ac-rouen.fr/
   
Dommage qu'aucune de toutes ces versions ne propose la totalité des blocs existants.
 
Là ce serait vraiment génial !
 
Autre site (celui-là je l'aime bien) :
 
 http://greich.fr/BlocklyDuino/
  • le jeu de blocs est très complet ;
  • l'option «PULLUP» existe ;
  • le bloc «LISTE» génère un code correct, contrairement à CocoBLOCKLY ;
  • c'est en français !
  • infrarouge, servo, moteurs PaP.
 
Encore un :
 
https://code.makewitharduino.com/

 

 

© 2020 par Hubert SPERI – Créé avec Wix.com

WIX.png

Ce site ne contient aucun fichier avec des données personnelles et ne stocke aucune donnée personnelle lorsqu'on se connecte.

INYO_3.png
This site was designed with the
.com
website builder. Create your website today.
Start Now