Quelle boucle utiliser ?

Salut à tous !

Alors, je vous présente mon projet (le premier, et oui je sais, j’y vais fort ^^)
C’est un distributeur automatique de croquette pour chien avec balance intégrée.

J’ai réussi à faire un code potable on va dire, sachant que je ne m’y connais pas du tout en C++.

Actuellement, je bloque sur une boucle while.

En gros, ça doit faire ça :
-lecture du poids, affichage du poids, avance moteur de tant de steps, etc … Jusqu’a arriver à un poids défini.
Le problème actuel est qu’il lit le poids une fois, mais c’est tout, le moteur tourne, s’arrête, tourne, etc …
(d’ailleurs si c’est possible d’afficher en temps réel le poids pesé, je ne sais pas comment faire)

Le bout de code en question :

void feed(){
scaled.tare();
float i = scaled.get_units();
while (i <= poids) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“poids = “);
lcd.print(i);
lcd.print(“0”);
lcd.print(” gr”);
myStepper.step(vis);
delay(200);

}
repasDonne ++;
}

Je vous met aussi le fichier complet. Si vous pouvez m’aider, ce serait avec un grand merci ! :smiley:
Bonne journée (ou soirée :wink: )

feeder.ino (2.71 KB)

Si vous exprimiez ça d’abord en français:

Si le moteur est de type “godet verseur” (on verse une dose à chaque fois)

Répéter:
  - verser une dose de croquettes
  - effectuer la pesée
  - afficher la pesée
Tant que la pesée est inférieure à la masse désirée

Si les croquettes sont distribuées à partir d’une vis sans fin alors c’est un peu différent

- lancer la vis sans fin
Répéter
  - effectuer la pesée
  - afficher la pesée
Tant que la pesée est inférieure à la masse désirée  
- arrêter la vis sans fin

Donc il faut lire la masse versée dans la boucle

Écrivez 3 petites fonctions verser(), (ou demarrer() / arreter() ) peser(), afficher() pour structurer le code et donnez un nom pertinent à vos variables

Est-ce que tu pourrait me faire un exemple de code ? Je sais pas comment mettre ça en place... Je vais essayer mais...

J-M-L:
Si vous exprimiez ça d’abord en français:

+10

pour bien débuter avec l’arduino, un bon point de départ c’est de lire les tutos d’eskimon

Voici où j’en suis :

void feed(){
int i = scaled.get_units();

do {
afficher();
peser();
avance;

}
while (i <= poids);
arret;
repasDonne ++;
}

void manualFeed(){

feed();
delay(200);

}

void peser() {

scaled.get_units();

}

void afficher() {

lcd.clear();
lcd.setCursor(0,0);
lcd.print(“poids = “);
lcd.print(scaled.get_units());
lcd.print(“0”);
lcd.print(” gr”);

}

problème =
Le poids ne s’affiche pas en temps réel, juste quand la vis arrête de tourner avant de recommancer.
Ensuite, il ne s’arrête pas une fois le poids atteint ou dépassé.
Merci pour votre aide =)

Bonjour Metalzoid,

Metalzoid:
Voici où j'en suis :

problème =
Le poids ne s'affiche pas en temps réel, juste quand la vis arrête de tourner avant de recommancer.
Ensuite, il ne s'arrête pas une fois le poids atteint ou dépassé.
Merci pour votre aide =)

Postez TOUT le code!

Cordialement,
bidouilleelec

Je joint le code en pièce jointe.
Merci =)

ps : pour l’affichage du poids en temps réel, ça règle le problème si je mets très peu de steps à la fois. Mais le problème est toujours présent. Ça ne s’arrête pas comme prévu.
J’ai essayé avec un while et un do / while.

ps2: J’aimerais aussi limiter le poids à 1 chiffre après la virgule, si possible =)

Merci =)

feeder.ino (2.83 KB)

Metalzoid:
Je joint le code en pièce jointe.

Je vois :

void feed() {
  int i = scaled.get_units();
  do {
    afficher();
    peser();
    avance;
  }  while  (i < poids);
  repasDonne ++;
}
//---------------------------
void manualFeed() {
  feed();
  delay(200);
}
//---------------------------
void peser() {
  scaled.get_units();
}
}

1/ “avance;” bizarre,bizarre?
2/ la fonction peser() ne modifie aucune variable

Cordialement,
bidouilleelec

Ca veut dire quoi ?
Je ne comprends pas ta réponse.

Qu'est-ce que je dois modifier ?

Metalzoid:
Ca veut dire quoi ?
Je ne comprends pas ta réponse.

Qu'est-ce que je dois modifier ?

1/ "avance;" bizarre,bizarre?
_avance() n'est pas défini dans votre code
_son appel est incorrect
Tel quel votre code n'est pas compilable.

2/ la fonction peser() ne modifie aucune variable
_donc elle ne sert à rien (probablement supprimée par le compilateur),

Cordialement,
bidouilleelec

bidouilleelec:
1/ "avance;" bizarre,bizarre?
_avance() n'est pas défini dans votre code
_son appel est incorrect
Tel quel votre code n'est pas compilable.

2/ la fonction peser() ne modifie aucune variable
_donc elle ne sert à rien (probablement supprimée par le compilateur),

Cordialement,
bidouilleelec

Tout en haut :

#define avance myStepper.step(vis);
#define arret myStepper.step(0);

Metalzoid:
Tout en haut :

OK pour avance 8)

Reste peser()

D'accord, il sert pas à grand chose.
Du coup, en fait, le seul problème est que le code ne s'arrête pas lors que le poids est atteint.
Une idée du pourquoi ?

C’est bon, j’ai trouvé le problème !

en fait, lorsque je déclarais i = scaled.get_units(); je ne sais pas pourquoi, mais il ne comparait pas le poids.
Par contre, au lieu de while (i < poids), j’ai mis :

while ((scaled.get_units()) < poids ), ça fonctionne correctement !! :smiley: :smiley: :smiley: Bozo il est content :’)

Merci pour votre aide en tout cas, mon projet est sur la bonne voie grâce à vous =)

Bonne soirée et à bientôt =)

et lisant la pesée dans le test du while, vous avez à l’affichage quelque chose de différent de ce qui est utilisé pour décider si vous bouclez ou pas.

On vous dit de mettre la pesée DANS la boucle, c’est à dire qu’il faut que la boucle modifie la variable appelée i (nom de variable complètement idiot soit dit en passant).

activerMoteur();
do {
  masse = scaled.get_units();
  afficherMasse(masse);
} while  (masse < masseAttendue);
eteindreMoteur();

Bien sûr que ça comparaît la valeur de i, le problème c'est que tu ne reactualisais pas la valeur de i avec le poids.

D'accord, j'ai enfin compris comment ça marche grâce à ton explication :slight_smile: j'avais mis i pour tester, je l'aurais modifié si ça fonctionnait ^^
En tout cas, ça fonctionne maintenant :slight_smile:
Ça fait exactement ce que je désire :slight_smile:

Bravo!

Des chose me chagrinent:
a) l'emploi de #define pour abrèger (?) l'écriture de fonctions, je ne suis pas le premier à être dérouté.... en plus, cette idée d'abrèger n'est vraiment pas ce qui se fait de mieux pour des fonctions appelées une seule fois.....
b) l'emploi de i pour désigner un poids (j'aurais mis ... poidsMesure, tout simplement: si on doit revenir sur du code dans 6 mois, autant ne pas trop se compliquer la vie)

A noter que lcd.print peut se faire informer du nombre de décimales sihaité :
ex lcd.print(poidsMesure, 1) affichera avec une décimale -confirmé par Printing floating point numbers to LCD - Syntax & Programs - Arduino Forum, poste 2.