Aide Aide programmation Arduino

W

wika58

Compagnon
Bonjour à tous les usineurs intéressés Arduino,

Je crée ce post afin de pouvoir y poster des questions spécifiques de débutants (ou moins) en programmation C(++) pour nos microcontrôleurs Arduino.

Il est clair qu'il y a plein d'aides sur l'IDE Arduino, en ligne et sur des forums spécifiques.
Mais comme déjà mentionné plusieurs fois par différents membres, ici on se sent plus "en famille" et l'aide des "plus sachants" vers les "moins sachants" n'est plus à démontrer sur Unsinages.com 8-)

Le but de ce post n'est pas de demander de l'aide sur un projet complet mais sur une instruction spécifique, une librairie, ...

Et à nous d'avoir eu la décence d'avoir au moins fait qq recherches avant de venir poser sa question.

Une autre raison particulière à la création de ce post est que nous sommes pour le moment 3 membres (@tamilhaz @midodiy et moi) à suivre le MOOC diffusé par l'université de Lausanne sur les microcontrôleurs (orienté Arduino).
D'autre membres l'ont déjà suivi (@gégé62, ...).
Il existe depuis 2017.
Il est très bien fait. Réparti sur 6 semaines.
Et dans chaque semaine, il y a des vidéos de cours, des exos corrigés, des compléments de cours et un Quiz coté.
Il y a également un exo de fin de semaine qu'il faut programmé et soumettre pour une validation électronique.

Malheureusement pour la session qui a commencé à Noël 2023, ce système de soumission de l'exo de fin de semaine ne fonctionne pas. :spamafote:
J'ai essayé de contacter le site sur le forum du cours et par mail ou FB des profs mais aucune réponse...
Nous avons l'impression d'être dans une université fantôme.:smt022
Donc pas d'interaction avec les professeurs comme c'était possible par le passé au travers du forum du cours.

Et donc, si on pouvait avoir de l'aide des "sachants" de notre forum Usinages.com...
Et si d'autres membres veulent se joindre à nous pour suivre ce MOOC. Les inscriptions étaient normalement closent fin 2023, mais il semble qu'il est encore possible de s'inscrire et de suivre le cours.

D'avance merci à tous les intervenants et en particuliers aux "sachants" qui prendront un peu de leur temps pour nous aider. :smileJap:
 
G

gégé62

Compagnon
Malheureusement pour la session qui a commencé à Noël 2023, ce système de soumission de l'exo de fin de semaine ne fonctionne pas. :spamafote:
J'ai essayé de contacter le site sur le forum du cours et par mail ou FB des profs mais aucune réponse...
bonsoir,
juste une info, j'ai vu sur le site de Coursera une réponse que faisait Jean-Yves Rochat sur le forum coursera à un membre qui déjà "se plaignait" du problème, JYR disait qu'il était en train d'y travailler en remplaçant le serveur. Cela date de 4 mois.
 
W

wika58

Compagnon
Oui il.y a bien cette réponse.... la dernière des organisateurs... mais elle date de 4 mois... :rolleyes:
 
V

vibram

Compagnon
Salut,

Si les questions portent sur du code, tu peux demander à chatgpt. C'est pas sans faille mais généralement ça sort un truc potable. Disons que cela peut te faire gagner du temps plutôt que d attendre une réponse sur le forum
 
W

wika58

Compagnon
Merciiii...

Mais ce n'est pas des liens vers des sites... ou l'aide d'un machine dont je voulais parler...
Et encore moins de me lancer dans une CNC...

La raison de base de ce post est d'obtenir une aide specifique sur telle ou telle instruction sur laquelle on bloque lors de la comprehension d'un cours, tuto, exemple... ou lorsqu'on essaie d'ecrire un programme.

Je vais mettre qq exemples des questions que je me pose....
 
Dernière édition:
W

wika58

Compagnon
Un premier exemple est au sujet de la portée des variables.
J'ai bien compris que la variable peut être globale (si déclarée en tout début de programme) ou locale (si déclarée dans la boucle setup ou loop)..
Mais sur un Tuto, je vois qu'une variable locale "int i" dans la boucle Loop() peut être transformée en variable globale en lui mettant un "static int i".
A quoi ca sert et pourquoi ne pas déclarer le i en tout début... comme ça, il aurait une portée globale... :7hus5:
 
W

wika58

Compagnon
Second exemple d'aide attendue.

Pour un exercice du cours MOOC, il fallait programmer des lampes d'un parking indiquant si vide ou plein en fonction des passages aux barrières In et Out.

Dans le code que j'ai écrit, je ne voulais passer qu'une et une seule fois dans le IF qui testait le passage sur la barrière d'entrée.
J'ai donc crée un "flag" mis à 1 au premier passage et resetté quand le BP n'était pas appuyé.
Mais ça ne fonctionnait pas...
Quand j'appuyais sur le BP1, je passais plusieurs fois et le compteur de voiture en comptait une douzaine...

Après plus d'une demi-journée d'essais et l'aide d'un ami, j'ai compris mon problème. Je resettais trop vite le flag.
Et j'ai modifié mon code comme suit:
Pour cet exemple, plutôt que de faire un IF sur une condition composée (...&&...).
Est-ce que j'aurais mieux fait de faire deux IF imbriqués...


C'est ce genre de question que j'aimerais pouvoir poser ici... :smileJap:

Bon dimanche.
 
Dernière édition:
G

gégé62

Compagnon
Est-ce que j'aurais mieux fait de faire deux IF imbriqués...
Je pense que ton dernier sketch est logique, tu attends que le bouton soit relaché.
Matériellement ça doit correspondre à une certaine durée, donc je ne pense pas que des if imbriqués puissent fonctionner.
A prendre sous réserve....
 
G

gégé62

Compagnon
dans la condition if, il faut mettre ==

que veux-tu dire "le if ne veut pas s'éxécuter"
je pense qu'il s'exécute
tu n'as pas inversé le sens pour l'allumage des led, par exemple il faudrait mettre la pin à LOW ?
 
F

fredcoach

Compagnon
Arf, merci Gégé...ça marche!
Il y a une astuce pour éviter cette erreur très courante même chez les pros, c'est d'inverser les termes, la constante avant la variable.
pous1Pressed = false devient false = pous1Pressed
Le compilateur va signaler une erreur parce qu'on ne peut pas assigner une valeur à une constante alors que
false == pous1Pressed est valide et produit exactement le même code compilé que pous1Pressed == false
Juste une habitude à modifier.
 
M

midodiy

Compagnon
Pour que chacun comprenne, on a chaque semaine des exercices à faire.
2 poussoirs et 2 leds
Screenshot_2024-01-21-12-14-14-46_99c04817c0de5652397fc8b56c3b3817.jpg

La semaine dernière, c'était pour un parking, pous1 était une voiture qui rentre, pous2 pour une voiture qui sort. Led1 parking vide, Led2 parking plein.
Cette semaine, statistique de boutons poussoirs, on appuie n'importe comment sur pous1 et pous2, led1 s'allume si on on a appuyé plus de fois sur pous1, Led2 s'allume si plus d'appuis sur Pous2, les 2leds éteinte si égalité...
 
D

Dudulle

Compagnon
Je n'ai pas regardé ce cours, mais est ce que vous ecrivez un pseudocode avant de programmer en arduino ?
 
V

Vik'TheBike

Nouveau
Un premier exemple est au sujet de la portée des variables.
J'ai bien compris que la variable peut être globale (si déclarée en tout début de programme) ou locale (si déclarée dans la boucle setup ou loop)..
Mais sur un Tuto, je vois qu'une variable locale "int i" dans la boucle Loop() peut être transformée en variable globale en lui mettant un "static int i".
A quoi ca sert et pourquoi ne pas déclarer le i en tout début... comme ça, il aurait une portée globale... :7hus5:
Bonjour,

C'est un sujet qui pourrait faire l'objet d'un cour à lui seul, et il faudrait encore parler du linkage pour bien comprendre tous les enjeux.

Par définition, une variable globale est ... globale, sous-entendu à l'ensemble du programme.
Une variable statique n'aura de sens que dans le fichier dans lequel elle est déclarée.
Comme si je le présume tu n'as qu'un seul fichier C/CPP, ça ne fait pas grande différence pour toi.
 
M

midodiy

Compagnon
Je crois qu’il faut faire attention aux variables locales qui peuvent très bien avoir le même nom qu’une autre variable globale...et pas la même valeur!
Donc je dirais pour un petit prog, on déclare tout au début. Mais il paraît que c’est pas la bonne méthode, dans un prog long, il faut mettre la définition de la variable au plus prêt de l’endroit oû on l’utilise. C’est ce que l’on fait quand on ecrit:
for(int i=0, i<5, i++)
 
M

midodiy

Compagnon
Je crois qu’il faut faire attention aux variables locales qui peuvent très bien avoir le même nom qu’une autre variable globale...et pas la même valeur!
Donc je dirais pour un petit prog, on déclare tout au début. Mais il paraît que c’est pas la bonne méthode, dans un prog long, il faut mettre la définition de la variable au plus prêt de l’endroit oû on l’utilise. C’est ce que ’on fait quand on ecrit:
for(int i=0, i<5, i++)
est ce que vous ecrivez un pseudocode avant de programmer en arduino ?
Non. Direct en C arduino.
 
D

Dudulle

Compagnon
C'est une grave erreur, le passage par pseudocode peut sembler une perte de temps, mais elle permet d'optimiser l'algorithme et de mieux se structurer. je dirais que 99% des gens qui apprennent la programmation zappent cette étape, et 90% des erreurs de code proviennent de ça.
La bonne démarche est de bien poser le problème, définir la liste des entrées sorties, écrire le pseudocode, et seulement ensuite écrire la 1ere ligne de code.
 
F

fredcoach

Compagnon
C'est une grave erreur, le passage par pseudocode peut sembler une perte de temps, mais elle permet d'optimiser l'algorithme et de mieux se structurer. je dirais que 99% des gens qui apprennent la programmation zappent cette étape, et 90% des erreurs de code proviennent de ça.
La bonne démarche est de bien poser le problème, définir la liste des entrées sorties, écrire le pseudocode, et seulement ensuite écrire la 1ere ligne de code.
Oui, quand l'algorithme est complexe (en rapport du niveau du programmeur).
On peut aussi passer par un ordinogramme ou une autre représentation.
Après environ 45 ans de programmation, ça ne m'arrive plus que rarement mais cependant encore parfois dans les cas les plus complexes.
Mais pour un débutant ce devrait être presque systématique.
 
5

59JAG

Ouvrier
salut c est comme même pas très clair tes #define
#define Pous1On digitalRead (Pous1) == 0
#define Pous1Off digitalRead (Pous1) == 1
je l écrirai ainsi je trouve plus clair
#define Pous1 digitalRead (Pous1)
#define On 0
#define OFF 1
if(Pous1On){ devient if(Pous1==On){
 
J

jpbbricole

Compagnon
Bonjour Pat
peut être transformée en variable globale en lui mettant un "static int i"
Ca ne la rend pas globale, elle ne sera pas plus visible en dehors. Satic fait que quand tu quittes une fonction où cette variable static est déclarée , la valeur de cette variable est conservée, sinon au prochain passage dans cette fonction elle repart à. 0

Essaies ça avec la console à 115200:

Cordialement
jpbbricole
 
Dernière édition:
F

fredcoach

Compagnon
Bonjour Pat

Ca ne la rend pas globale, elle ne sera pas plus visible en dehors. Satic fait que quand tu quittes une fonction où cette variable static est déclarée , la valeur de cette variable est conservée, sinon au prochain passage dans cette fonction elle repart à. 0
Si toutes les fonctions qui s'appliquent à ton objet (par exemple un voyant ou une voiture) sont comprises dans le même fichier source, tu peux mettre aussi dans ce fichier les variables qu'elles utilisent sans risquer de conflit de nom avec des variables globales ou situées dans d'autres fichiers source.
C'est aussi pratique pour faire quelque chose comme de la programmation objet sans utiliser un langage objet comme C++
 
M

midodiy

Compagnon
d'optimiser l'algorithme et de mieux se structurer
Je fais pas souvent de la prog, je suis obligé de passer par un algorithme comme par exemple la commande de soudure par point
 
M

Mcar

Compagnon
Je suis autodidacte avec arduino et de son langage. donc je ne suis pas un pro , :mrgreen:
ça fait longtemps que j'ai laissé tombé les variables locales , je n'utilise que des variables globales déclarées en début de programme, même les variables de boucles
ça m'oblige a être structuré , de définir un peusdo organigramme qui lui m^me va me definir mes besoins en termes de variable bien sur mais aussi en termes de fonctions.
voici mon debut de code pour la gestion de mon ascenseur

 
D

Dudulle

Compagnon
Je fais pas souvent de la prog, je suis obligé de passer par un algorithme comme par exemple la commande de soudure par point
L'organigramme c'est une forme de pseudo code, mais on peut passer par une étape supplémentaire ou l'on pourra lister toutes les fonctions, boucles, conditions, variable en langage "naturel".
Logiquement une fois que l'on a fait ce travail la traduction en langage arduino n'est plus qu'une formalité, on pourrait d'ailleurs traduire dans n'importe quel langage aussi facilement.
Attention aussi à bien prendre en compte la particularité de l’Arduino, ou l'on a le code qui est balayé des dizaines de milliers de fois à la seconde, contrairement à un logigramme ou l'on valide les étapes une à une.
 

Sujets similaires

W
Réponses
122
Affichages
9 639
Philippe85
Philippe85
N
Réponses
3
Affichages
773
jpbbricole
J
lolo
Réponses
0
Affichages
408
lolo
D
Réponses
0
Affichages
224
dodochef
D
osiver
Réponses
14
Affichages
36 188
osiver
osiver
D
Général langage MMBASIC
Réponses
8
Affichages
879
Dudulle
D
P
Réponses
33
Affichages
16 160
wika58
W
T
Réponses
2
Affichages
25 533
Tristan l'apprenti
T
altitude
Réponses
21
Affichages
2 782
laboureau
laboureau
esloch
Réponses
0
Affichages
279
esloch
esloch
laurenttanguy
Réponses
0
Affichages
487
laurenttanguy
laurenttanguy
Haut