Icone_CocoBlockly.png
Maison_vivante.jpg
Nombre de visites :
Compteur de visites
MAISON «VIVANTE» n°2

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

Le programme est développé avec ARDUBLOCKLY, version
«in line» accessible ici :
https://ardublockly.embeddedlog.com/demo/#
 
Date de création : 27/01/2021

Dernière modification : 08/12/2021

Download_1.png
00:00 / 00:16
Nombre de visites :
7

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
ECLAIRAGE_MAISON_8.png
  • 1 seule liste qui contient les numéros des sorties de l'ARDUINO utilisées pour les LED ;
     
  • 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. 
confused-smiley.png
Ben ! Te réjouis pas trop vite.
Y'a rien dans ton programme...
T'es sûr que ça fonctionne ?
informatik.gif
Bien sûr !
Je vais t'expliquer...
LA LISTE
ECLAIRAGE_MAISON_8a.png
 
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
ECLAIRAGE_MAISON_8c.png
 
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».
 


 
APPLIQUER CETTE FONCTION ALÉATOIRE SUCCESSIVEMENT À CHACUNE DES SORTIES DE LA LISTE_SORTIES
 
Il faut traiter successivement chacune des sorties dont les numéros sont stockés dans la liste, de l'index «0» à l'index maxi.

Ce traitement s'effectue grâce à une boucle de comptage décrite plus bas.
Cette boucle a besoin de connaître :
  • le numéro de la sortie situé à l'index «0» de la liste ;
  • le numéro de la sortie situé au dernier index de la liste ;

 
Récupérer le numéro de la première sortie, celui situé à l'index «0» de la liste «LISTE_SORTIES» :
 
ECLAIRAGE_MAISON_8e.png
 
Avec la LISTE_SORTIES ci-dessus, cette fonction vaut (ou «renvoie» ) la valeur «3», qui est effectivement le premier numéro de sortie inscrit dans la liste.



Récupérer le numéro de la dernière sortie, celui situé à l'index maxi de la liste «LISTE_SORTIES» :
 
Il suffit de connaître le numéro maxi de l'index de la liste.
Une instruction fait cela automatiquement pour nous : «get item at [the length of LISTE_SORTIES – 1]»

⇒ dans notre cas, cette instruction prendra la valeur «3».

On inclut cette double instruction en lieu et place de la valeur «0» de la fonction :
«from LISTE_SORTIES get item at [..]»
 
ECLAIRAGE_MAISON_8d.png
 
Ainsi construite, cette instruction restera valable quel que soit le nombre de sorties présentes dans LISTE_SORTIES

Mais au fait, pourquoi «the length of LISTE_SORTIES [– 1] ?
 
 
J'explique :
voyante.gif
  • 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.
ECLAIRAGE_MAISON_8p.png
 
Dans le cas de la liste ci-dessus cette longueur vaut 4.

Aïe ! On a vu plus haut que l'index maxi vaut 3.

Qu'à cela ne tienne : on inclut «the length of...» dans une instruction mathématique qui permet d'effectuer – dans notre cas – une soustraction :

 
  • 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».
ECLAIRAGE_MAISON_8r.png
ECLAIRAGE_MAISON_8d.png
Fonction complète de scrutation des numéros de sorties :
La boucle de comptage ci-dessous va donc parcourir LISTE_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.
 
ECLAIRAGE_MAISON_8k.png
 

Et bien entendu, à chaque tour, l'instruction contenue dans la boucle va attribuer de façon aléatoire la valeur «LOW» ou «HIGH» à la sortie correspondante grâce à l'instruction ci-dessous :
 
ECLAIRAGE_MAISON_8c.png
«L'HEURE FICTIVE»
Ce groupe de blocs est le CŒUR du PROGRAMME
 
 
ECLAIRAGE_MAISON_8g.png
 
La boucle «count with...» est incluse dans une boucle de comptage de temps «Every 4 secondes» (bloc de couleur jaune, englobant la boucle de comptage), 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
ECLAIRAGE_MAISON_8f.png
 

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.
    (else...)
MISE à «LOW» de TOUTES LES SORTIES
ECLAIRAGE_MAISON_8b.png
 
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.
ECLAIRAGE_MAISON_8m.png
LE CODE C++
ECLAIRAGE_MAISON_8h.png
ECLAIRAGE_MAISON_8j.png

(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 automatique prend de la place.
 
Si on avait programmé nous-même 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 ?
ECLAIRAGE_MAISON_8s.png
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 ?
bravo.gif
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) ; »
ECLAIRAGE_MAISON_8t.png
 
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» ?
Emoticone_doute.jpg
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, directement dans le texte en C++ :
« 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/
   
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/
   
ECLAIRAGE_MAISON_8u.png
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/

Réalisations avec BLOCKLY