Bonsoir
J'ai rédigé un tutoriel pour débuter dans Arduino : https://nboulaire.developpez.com/tut...ation-arduino/
Merci pour vos commentaires et bonne lecture !
Bonsoir
J'ai rédigé un tutoriel pour débuter dans Arduino : https://nboulaire.developpez.com/tut...ation-arduino/
Merci pour vos commentaires et bonne lecture !
Merci pour cette contribution
Je suis partisan d’apprendre très tôt à respecter une cohérence de type et de ne pas dépendre de promotions automatiques cachées par le langage et d’éviter les valeurs magiques parsemées dans le code. Quand vous proposez de faireca me choque donc un peu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 { boolean etatBouton = digitalRead(2); if (etatBouton == 1)
un booléen est vrai ou faux, la fonction digitalRead ne retourne pas vrai ou faux mais un concept d’état de la tension sur cette pin avec HIGH ou LOW représenté par un entier de type int.
Je proposerais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 const byte pinBouton = 2; int etatBouton = digitalRead(pinBouton); if (etatBouton == HIGH)
Bonjour Jay M,
Merci de ta remarque, très pertinente : je modifierai le type de etatBouton ainsi que le test du if.
Merci
et j'ai vu que vous traitez de cela dans la partie "Amélioration de la lisibilité du code d’un programme" (et la notion de const est aussi importante car elle permet au compilateur de faire des optimisations.)
j'ai repéré quelques autres améliorations:
* Quand vous parlez de--> map() travaille uniquement en entier donc vous auriez dans tension uniquement un entier de 0 à 5 (et 5 uniquement si vous avez obtenu 1023 pile) même si vous stockez le résultat dans un nombre décimal.la ligne 31, on convertit en fait une valeur d’une échelle (qui va de 0 à 1023) en une valeur dans une autre échelle (qui va de 0 V à 5 V). Au lieu de faire un produit en croix, on peut utiliser une instruction Arduino qui fait la même chose :
où valeur est la valeur à convertir, limite_inf_1 et limite_sup_1 sont les limites de la 1re échelle dans laquelle est mesurée la valeur (dans notre cas 0 et 1023), limite_inf_2 et limite_sup_2 sont les limites de la nouvelle échelle (dans notre cas 0 et 5 V) → la ligne 31 pourrait donc s’écrire de manière équivalente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part map(valeur, limite_inf_1, limite_sup_1, limite_inf_2, limite_sup_2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part float tension = map(valeurTemp, 0, 1023, 0, 5);
* dans "Les précautions pour éviter de détruire la carte Arduino voire plus", vous ditesou encorela résistance d’un fil est quasi nulle (mettons 0,1 W pour le calcul)--> il ne s'agit pas de Watts mais d'Ohm bien sûr (peut-être le symbole ("Ω") ne s'affiche-t-il pas bien ?)La valeur minimale est de 125 W, mais il vaut mieux prévoir un peu plus et opter pour une résistance de 220 W.
* je vous suggère aussi de prendre 115200 (voir plus) comme débit par défaut pour le port Série. il n'y a plus aucune raison d'aller à 9600 bauds comme au temps des premier arduino. en fait aller lentement risque de générer certains bugs de timing dans les programme car un appel à print devient bloquant dès que vous avez plus de 64 octets à émettre en attente.
bravo et merci encore pour ce partage !
Ah oui, c'est juste : j'ajouterai une petite précision.
J'ai corrigé une partie des symboles qui restaient mais apparemment pas tous : j'ai effectivement un souci lors de l'exportation (que je passe par la police symbol ou par l'insertion d'un caractère spécial) qui n'affiche pas les lettres grecques.
En pratique, j'opte désormais pour 115200 mais comme j'ai repris certaines anciennes versions de mes programmes, j'avoue ne pas avoir fait la mise à jour le débit.
Merci
Plus de raison de ne pas s'y mettre, merci pour ce cours
bonsoir monsieur,
tout d'abord merci beaucoup pour votre cours qui m'a permis d'acquérir vraiment rapidement les bases d'arduino
j'ai une petite question : à quoi sert l'opération:
float valeurTension = valeurCapteur * 5.0 / 1023.0; dans le programme de mesure de lumisoté avec une photo-résistance, je me doute qu'il s'agit d'une conversion avec le binaire mais je n'arrive pas à savoir exactement quoi
merci d'avance et bonne soirée.
Bonjour @cilodix
Lorsque vous faites une lecture de la sortie du convertisseur analogique vers numérique (ADC) par la fonction analogRead() vous effectuez un échantillonnage de la tension présentée sur la broche choisie, par exemple A0. Cette valeur numérique est entre 0 et 1023 car l’échantillonnage se fait sur 10 bits sur un UNO.
Ensuite on peut choisir quelle est la référence de tension pour l’ADC, c’est à dire avec quelle tension maximale il fait son échantillonnage par la fonction analogReference(). Si on ne dit rien, par défaut ce sera 5 volts sur un UNO.
Donc quand la lecture de l’ADC dit 0 c’est qu’on avait 0 Volt sur la broche et quand la lecture de l’ADC dit 1023 c’est qu’on avait 5 Volt sur la broche et entre les deux c’est une droite.
Une formule qui permet de passer donc de la valeur numérique lue vers la tension est la fonction affine Y = aX+ b passant par ces deux points (0,0) et (1023,5).
Comme on passe par l’origine b=0 et la pente c’est 5.0 / 1023.0 d’où la formule(Il y a un débat entre les puristes pour savoir s’il vaut mieux diviser par 1024 ou 1023. Mon point de vue c’est que les deux donnent une évaluation possible de la valeur d’origine puisqu’on a échantilloné. Chaque valeur numérique corrrespond en réalité à toute une plage de tension d’origine et on n’a pas une fonction affine mais une fonction en escalier discontinue par morceaux). La division par 1023 est sympathique car elle donne un joli 5V tout rond si vous lisez 1023 donc c’est ce que je préfère, mais faut bien se souvenir que la valeur calculée a une incertitude d’environ 5mV.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part valeurCapteur * 5.0 / 1023.0;
Partager