Arduino programme douteux

Bonjour,

Il m'est venu à l'esprit de réaliser un montage permettant de mesurer des distances à partir d'arduino.
Le problème est que malgré cela, mon programme ne fonctionne absolument pas ! :frowning:

int x = 0;
int y = 0;
const int moteur = 2;
const int opto = 3;
const int alpha = 4;
const int led = 5;
const int test = 6;

long temps = millis();

boolean running = false;

void setup() {
pinMode(moteur, OUTPUT);
pinMode(opto, OUTPUT);
pinMode(alpha, INPUT);
pinMode(led, OUTPUT);
pinMode(test, OUTPUT);
}

void loop() {
digitalWrite(test, HIGH);
digitalWrite(led, LOW);
digitalWrite(moteur, HIGH);
digitalWrite(opto, HIGH);
while(x < 10 )
{
if (digitalRead(alpha) == HIGH)
{
x = x + 1;
while(digitalRead(alpha) == HIGH)
{
delay(1);
}
}
else {}
}
x == 0;
y = temps;
y = y / 1000;
y = 3,1415926 * 1;
y = y * 3600;
digitalWrite(led, HIGH);
delay(2000);
digitalWrite(led, LOW);
}

Laissez moi expliquer :

x et y sont pour moi des variables, les autres sont des pins configurés.

J'appelle temps pour un chrono millis ( je ne sais même pas si cela fonctionne)

"test" est un pin me permettant d'envoyer du jus dans "alpha" qui serait normalement les données reçues par mon capteur.

"opto" et "moteur" sont les composants électroniques auxquels je met du jus (alpha serait donc la sortie data de l'optocoupleur, mais ici représenté par une led).

Je mets donc touts mes pins en sortie, sauf alpha, qui normalement doit en recevoir.

Je mets seulement le pin "led" en LOW, car c'est mon indicateur qui me dira si mon programme fonctionne bien.

Ensuite, tant que x < 10, j’attends que alpha reçois du jus, et quand c'est le cas, j'augmente x de 1.
J'attends par la suite que alpha ne reçois plus de jus :

while(digitalRead(alpha) == HIGH)
{
delay(1);
}

Et quand c'est le cas, la boucle se reproduit jusqu’à que x = 10.

Quand x = 10, je prend ma variable y et je lui met la valeur millis.
J'effectue des calculs, et j'allume le pin "led" 2secondes pour confirmer que mon programme fonctionne.

Voilà comment j'aimerai que mon programme fonctionne :slight_smile:
Dans la réalité ce n'est pas si simple :cry:
Mon moteur et mon optocoupleur sont représentés par des leds,
le pin "led" aussi . . . ..
Et alpha est juste un fil dont le pin "test" doit normalement y envoyer du jus.

Le problème est que mon pin "led" ne s'allume pas...
Aucun problème de branchement, je pense donc que cela vient du programme, et ça ne m'étonne pas, je suis débutant ^^'

J'ai beau chercher je ne trouve pas la panne :cry:

Pouvez-vous m'aider ?

bonjour,
déjà mets ton code entre balise </> code, plus lisible.

erreur 1

x == 0;

au lieu de x=0;
donc ca veut dire que tant que tu boucle et si ton alpha recoit rien, x = 0

que vient faire ceci dans le code, sauf si ca sert pour plus tard?

y = temps;
  y = y / 1000;
  y = 3,1415926 * 1;
  y = y * 3600;

pour voir ce qu'a x dans le ventre, mets un Serial.println(x);
en activant aussi la console via un Serial.begin(9600), dans le setup

qua,d on bug sur un truc, on debug par le serial avec la console :wink:

  y = temps;
  y = y / 1000;
  y = 3,1415926 * 1;
  y = y * 3600;

potentiellement problématique. temps est un long, y est un entier, il y a des divisions avec des flottants donc le résultat va être faux.
Au passage millis() retourne un unsigned long pas un long
Plusieurs solutions:

  • Tout mettre en unsigned long et faire les multiplications avant les divisions pour ne pas perdre en précision
  • Passer les variables utilisées dans le calcul en flottant

Cela dit, je ne pense pas que ce soit la source de ton problème actuel (mais sans doute celle d'un problème ultérieur)
La non remise à zéro de x devait empêcher d'entrer dans le while.
Il faut voir aussi que si tu utilises un fil pour simuler alpha tu risques d'avoir un comportement chaotique car la touche d'un fil génère pas mal de coupures et donc des fausses détections.

Bonjour,

Pour commencer merci beaucoup pour vos réponses et veuillez m’excuser pour ma réponse tardive (cours).

Oui, y viendra après, et merci de me faire remarquer que y est un entier. Je m'occupe de régler ça ^^'

Je ne comprends pas bien la "non remise à zéro". A la fin de mon programme, x == 0; ne fonctionne donc pas ?

Si je me souviens bien, Serial.Begin est une commande permettant d'afficher mes valeurs sur une console d'arduino ?

Si c'est cela, je met mon serial.print(x) au début de ma boucle while ?

Merci beaucoup de vos réponses :slight_smile:

serial.begin(9600); 9600 ou toutes les vitesses acceptées par la liaison série du moniteur
tu place ton serial.print(); ou tu veux, c'est toi qui a besoin de voir ce qui se passe dans ton prg
si tu veux surveiller x, tu mets ton serial apres une instruction modifiant sa valeur
si c'est alpha, tu fais de meme...
tu accedes au moniteur dans le menu "outils" de l'ide arduino. n'oublies pas de mettre la bonne vitesse en bas à droite du moniteur.

x==0 c'est l'opérateur logique d'égalité (qui retourne un booléen, vrai si x est nul, faux sinon)
x=0 c'est l'opérateur d'affectation (la valeur 0 est affectée à la variable x)