Bonjour ,
j'aimerais savoir si l'instruction goto peux renvoyer à une étiquette se situant avant elle, ou dois elle se
situer impérativement après elle?
merci a vous
Bonjour ,
j'aimerais savoir si l'instruction goto peux renvoyer à une étiquette se situant avant elle, ou dois elle se
situer impérativement après elle?
merci a vous
Un programme bien structuré évite le GOTO.
Une fonction peut être définie où on veut dans le code, elle est appelée là où on en a besoin.
Bonjour,
Comme le dit Christian_R l'utilisation de goto est fortement déconseillée.
Pour répondre à la question, bien sur goto peut renvoyer à une étiquette en avant. Il suffit d'essayer pour avoir la réponse.
J'aimerais et j'ai bien compris qu'en Language C. c'est une instruction un peu tabou
mais je débute en programmation et j'ai des test a effectuer sur les résultats de trois photodiodes qui sont des variables analogique.
j'aimerais bien me servir d'un switch case qui me simplifierai la vie. mais voila
mon problème avec le switch case c'est que cela n'accepte que des entiers, et dans mon code je travaille
vue mon niveau qu'avec analogread et comparateur > < && .
dans mon programme un des test consiste vérifier que les 3 flacons A,B,C sont bien en place " analogread <500 "
puis on dois utiliser le flacon A " analogread >500 " tout en vérifiant que l'on a pas fais une erreur en prenant soit le flacon B ou C
et continuer ce test tant que ce n'est pas le flacon A que l'on a utilisé afin de pouvoir sortir de ce test.
donc pour moi le goto qui suit des condition if ou while et qui renvoie a une étiquette TEST 1 sachant qu'il y en aura un deuxième se prête bien a se genre de test. mais j'ai bien compris que ce n'est pas le top en Language C
mon test se résumerai comme cela
TEST1 :
myGLCD.print(" utilisez flacon A ")
while (PhotoResBVal > 500) afficher un message d'erreur
while (PhotoResCVal > 500) afficher un message d'erreur
if (PhotoResAVal < 500 && PhotoResBVal < 500 && PhotoResCVal < 500) affiche utilisez flacon A
else goto TEST1
while (PhotoResAVal > 500) affiche flacon A en cours d'utilisation
j'espère que mon cheminement est clair, donc tant que les trois flacons ne sont pas sur leurs base et que ce n'est pas le flacon A que l'on utilise on dois rester dans la boucle de test et en sortir seulement quand c'est bien le flacon A que l'on a pris et que les deux sont sur leur base.
cordialement a tous
seb
Salut
On trouve des goto à foison dans les meilleurs kernels, y compris OpenBDS.
Cette allergie aux goto date de trente ans, de l'époque de la programmation dite structurée. C'est complètement dépassé.
Exemple:
int
getc(struct clist *clp)
{
int c = -1;
int s;
// COUPE LES INTERRUPTIONS
s = spltty();
if (clp->c_cc == 0)
goto out;
c = *clp->c_cf & 0xff;
*clp->c_cf = 0;
if (clp->c_cq) {
if (isset(clp->c_cq, clp->c_cf - clp->c_cs))
c |= TTY_QUOTE;
clrbit(clp->c_cq, clp->c_cf - clp->c_cs);
}
if (++clp->c_cf == clp->c_ce)
clp->c_cf = clp->c_cs;
if (--clp->c_cc == 0)
clp->c_cf = clp->c_cl = NULL;
out:
// RETABLIT LES INTERRUPTIONS
splx(s);
return c;
}
Ce genre de code permet de rétablir une situation normale en fin de fonction, y compris dans les cas anormaux, ici rétablir les interruptions dans une routine du kernel.
Tu peux utiliser cette technique dans certains cas bien mesurés.
// ceci n'est pas du C, c'est juste pour expliquer
fonction()
{
e = ouverture_fichier()
si e != 0 goto end
e = écriture_fichier("blabla")
si e != 0 goto error
e = écriture_fichier("tutu")
si e != 0 goto error
e = écriture_fichier("toto")
si e != 0 goto error
error:
fermeture_fichier()
end
return (e)
}
En cas d'erreur, avec un goto, on ne répète pas fermeture_fichier(), et le goto permet de ne pas oublier de fermer le fichier.
Et c'est parfaitement lisible.
Cette technique est à utiliser sans gourmandise, de manière localisée.
Par contre si tu te sers de goto pour traiter des problématiques applicatives, c'est franchement cochon et illisible.
@+
Bonjour Goldoseb
c'est une instruction un peu tabou
On peut toujours remplacer un goto par des tests, appels de fonction.
Cordialement,
bidouilleelec
Cette partie
TEST1 :
myGLCD.print(" utilisez flacon A ")
while (PhotoResBVal > 500) afficher un message d'erreur
while (PhotoResCVal > 500) afficher un message d'erreur
if (PhotoResAVal < 500 && PhotoResBVal < 500 && PhotoResCVal < 500) affiche utilisez flacon A
else goto TEST1
Peut-être remplacée par un while sur le complément au denier test
while(PhotoResAVal > 500 || PhotoResBVal > 500 || PhotoResCVal > 500){
if (PhotoResBVal > 500) afficher un message d'erreur
if (PhotoResCVal > 500) afficher un message d'erreur
if (PhotoResAVal < 500 && PhotoResBVal < 500 && PhotoResCVal < 500) affiche utilisez flacon A
}
while (PhotoResAVal > 500) affiche flacon A en cours d'utilisation
Merci a tous pour vos commentaires
je vais compiler tous cela et je devrais m'en sortir
encore une fois merci
Sébastien
Slt,
karma j'ai compiler ton code mais cela ne donne pas le résultat attendu
j'ai du mal m'expliquer
donc j'ai compilé un code qui fonction bien mais lorsque je veux recommence le code pour l'utilisation du deuxième flacon. ca fais n'importe quoi. ????
//-------------------------------------------- application du primer 1 --------------------------------------------------------//
testa: // Etiquette du retour du GOTO.
if (analogRead(PhotoResM) >500) // On test que n'as pas retiré la piéce du montage.
{
digitalWrite(rgbAvert, HIGH);
digitalWrite(rgbArouge, LOW);
digitalWrite(rgbMrouge, HIGH);
digitalWrite(rgbMvert, HIGH);
digitalWrite(rgbMvert, LOW);
}
if (analogRead(PhotoResB) >500) // On test que n'as pas pris le mauvais flacon " 2 ".
{
digitalWrite(rgbBrouge, HIGH); // Etein la led RGB rouge du flacon 2.
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbBvert, HIGH); // Etein la led RGB verte du flacon 2.
digitalWrite(rgbBvert, LOW); // Allume la led RGB vert du flacon 2.
digitalWrite(rgbAvert, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbArouge, LOW); // Allume la led RGB vert du flacon 1.
}
if (analogRead(PhotoResM) <500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
// Si et seulement si les deux flacon sont en place tout comme les piéce.
{
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB rouge du flacon 2.
digitalWrite(rgbAbleu, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbAvert, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB rouge de la piece.
digitalWrite(rgbArouge, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbBvert, HIGH); // Etein la led RGB rouge du flacon 2.
}
else // Si un ou les deux flacon ou la piéce ne sont pas en place fais cela.
{
goto testa;
}
while (analogRead(PhotoResA) >500) // Tant que le flacon 1 n'est pas sur sa base fais cela.
{
digitalWrite(rgbAvert, HIGH); // Etein la led RGB verte du flacon 1.
digitalWrite(rgbAbleu, LOW); // Allume la led RGB bleu du flacon 1.
}
//-------------------------------------------- application du primer 2 --------------------------------------------------------//
testb: // Etiquette du retour du GOTO.
if (analogRead(PhotoResM) >500) // On test que n'as pas retiré la piéce du montage.
{
digitalWrite(rgbAvert, HIGH); // Etein la led RGB verte du flacon 1.
digitalWrite(rgbArouge, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbMrouge, HIGH); // Etein la led RGB rouge de la piéce.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB verte dde la piece.
digitalWrite(rgbMvert, LOW); // Allume la led RGB verte de la piece.
digitalWrite(rgbBvert, HIGH); // Allume la led RGB verte de la piece.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB verte de la piece.
}
if (analogRead(PhotoResA) >500) // On test que l'opérateur n'as pas pris le mauvais flacon " 1 ".
{
digitalWrite(rgbArouge, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbAvert, HIGH); // Etein la led RGB verte du flacon 1.
digitalWrite(rgbAvert, LOW); // Allume la led RGB vert du flacon 1.
digitalWrite(rgbBvert, HIGH); // Etein la led RGB rouge du flacon 2.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB vert du flacon 2.
}
if (analogRead(PhotoResM) <500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
// Si et seulement si les deux flacon sont en place tout comme les piéce.
{
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbArouge, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbBbleu, HIGH); // Etein la led RGB bleu du flacon 2.
digitalWrite(rgbBvert, LOW); // Allume la led RGB rouge du flacon 2.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB rouge de la piece.
digitalWrite(rgbBrouge, HIGH); // Etein la led RGB rouge du flacon 2.
digitalWrite(rgbAvert, HIGH); // Etein la led RGB rouge du flacon 1.
}
else // Si un ou les deux flacon ou la piéce ne sont pas en place fais cela.
{
goto testb;
}
while (analogRead(PhotoResB) >500) // Tant que le flacon 2 n'est pas sur sa base fais cela.
{
digitalWrite(rgbBvert, HIGH); // Etein la led RGB verte du flacon 2.
digitalWrite(rgbBbleu, LOW); // Allume la led RGB bleu du flacon 2.
}
}
donc quand j'upload seulement la première parti application du primaire 1. => ok
des que j'upload les deux donc primaire 1 suivi de primaire 2. => NOK tout se mélange on dirait
en fait il marche très bien chaqun séparément !!!!
et pourtant je pense que j'utilise bien les deux goto
si quelqu'un y comprend QQCH
Bonjour goldoseb,
0/ (karma c'est le bisou qu'on peut envoyer à un gentil membre dont on a apprécié les propos). Pas son pseudo.
1/ Ce serait mieux de poster l'intégralité [mais tout] de votre code (surtout avec des goto , malgré tout gérable avec modération).
Cordialement,
bidouilleelec
re,
Malgré tout mon écran me dit :
if (analogRead(PhotoResM) <500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
Je suis surpris que ce soit compilable !
Cordialement,
bidouilleelec
Avant de nous montrer son code je pense qu'il serait plus efficace de nous présenter un synoptique, organigramme, grafcet ou même une description textuelle claire de l'algorithme que goldoseb veut mettre en place.
L'analyse d'un code boiteux ne donne pas toujours une bonne vision de l'attendu.
bonjour, et merci.
Donc voici le code entier en entier. je ne met que la parti affichage LED je ne mets pas les lignes concernant le TFT ni la parti SON .
c'est la parti d'un autre code qui fonctionne , et que je veux remplacer par une partie qui gère les erreurs de choix de flacons.
les flacons sont détecté par des photo barrières " laser + photorésistante "
ce programme commence avec le postulat que tous les flacons sont sur leur bases et donc que la lecture analogique des trois photo résistance est basse. " <500 "
donc :
photoresM <500. detection de la piece
photoresA <500. détection du flacon A
photoresB <500. détection du flacon B
donc SI les flacon sont en place et la pièce aussi, un écran nous indique que l'on dois prendre le flacon A et une LED verte s'allume.
a ce moment le programme dois vérifier que l'on ne prend pas le flacon B ni que l'on retire la piece. autrement il y a un affichage qui nous indique l'erreurs.
puis si on a pas fais d'erreur on prends le flacon A et le programme nous indique que l'on est en cour d'utilisation de ce flacon,
Dans mon code cela donne pour la partie SETUP
//------------------- Déclaration des modules et bibliothèques TFT LCD 3,2", OLED , MP3 ----------------------//
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(18, 19); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
#include <UTFT.h>
// ------------------------------- Déclaration des polices d'écritures ----------------------------------------//
extern uint8_t GroteskBold16x32[];
extern uint8_t GroteskBold32x64[];
extern uint8_t SmallFont[];
extern uint8_t SevenSegNumFont[];
UTFT myGLCD(CTE32_R2, 38, 39, 40, 41);
// ---------------------------- Définition des couleurs (mot clé en anglais) ---------------------------------//
#define BLACK 0x0000 // noir
#define BLUE 0x001F // Bleu
#define RED 0xF800 // Rouge
#define GREEN 0x07E0 // Vert
#define CYAN 0x07FF // Cyan
#define MAGENTA 0xF81F // Magenta
#define YELLOW 0xFFE0 // Jaune
#define WHITE 0xFFFF // Blanc
//--------------- constantes qui ne changerons pas, pour association objets et broches arduino ----------------//
const int rgbArouge= 17; // déclaration de la broche led RGB ROUGE A.
const int rgbAvert= 20; // déclaration de la broche led RGB VERT A.
const int rgbAbleu= 21; // déclaration de la broche led RGB BLEU A.
int PhotoResA = A8; // déclaration de la broche de la PHOTORESISTANCE A.
int PhotoResAVal; // création d'une constante pour la valeur lue sur la PHOTORESISTANCE A.
const int rgbBrouge= 14; // déclaration de la broche led RGB ROUGE B.
const int rgbBvert= 15; // déclaration de la broche led RGB VERT B.
const int rgbBbleu= 16; // déclaration de la broche led RGB BLEU B
int PhotoResB = A9; // déclaration de la broche de la PHOTORESISTANCE B.
int PhotoResBVal; // création d'une constante pour la valeur lue sur la PHOTORESISTANCE B.
const int rgbMrouge= 10; // déclaration de la broche led RGB ROUGE M.
const int rgbMvert= 9; // déclaration de la broche led RGB VERT M.
const int rgbMbleu= 8; // déclaration de la broche led RGB BLEU M.
int PhotoResM = A10; // déclaration de la broche de la PHOTORESISTANCE M.
int PhotoResMVal; // création d'une constante pour la valeur lue sur la PHOTORESISTANCE M.
dans le post suivant je vais vous mettre la première partie du code , car le code est trop long pour le mettre ne entier.
voici la partie du code qui gère les erreurs.
oups voici la fin du SETUP
//------------------------------------------- DEBUT DU PROGRAMME -----------------------------------------------//
void setup() // ---------- Partie du programme qui ne sera éxécuté qu'une seule fois ---------------------------//
{
myGLCD.InitLCD(); // Alumage de l'ecran TFT.
myGLCD.setBackColor(WHITE); // Definition d'un fond BLANC sur l'ecran TFT.
Serial1.begin(9600); // Démarage du port de communication Serial1 à la vitesse de 9600 bauds.
myDFPlayer.begin(Serial1); // Démarage du port de communication Serial1 du DFPlayer.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
pinMode (rgbArouge, OUTPUT); // initialisé la broche RGBArougePin comme une sortie.
pinMode(rgbAvert, OUTPUT); // initialisé la broche RGBAvertPin comme une sortie.
pinMode(rgbAbleu ,OUTPUT); // initialisé la broche RGBAbleuPin comme une sortie.
pinMode(rgbBrouge, OUTPUT); // initialisé la broche RGBBrougePin comme une sortie.
pinMode(rgbBvert, OUTPUT); // initialisé la broche RGBBvertPin comme une sortie.
pinMode(rgbBbleu, OUTPUT); // initialisé la broche RGBBvertPin comme une sortie.
pinMode(rgbMrouge, OUTPUT); // initialisé la broche RGBMrougePin comme une sortie.
pinMode(rgbMvert, OUTPUT); // initialisé la broche RGBMvertPin comme une sortie.
pinMode(rgbBbleu, OUTPUT); // initialisé la broche RGBBbleuPin comme une sortie.
digitalWrite(rgbArouge, HIGH); // mettre la led RGB A rouge à l'etat bas
digitalWrite(rgbAvert, HIGH); // mettre la led RGB A vert à l'etat bas
digitalWrite(rgbAbleu, HIGH); // mettre la led RGB A bleu à l'etat bas
digitalWrite(rgbBrouge, HIGH); // mettre la led RGB B rouge à l'etat bas
digitalWrite(rgbBvert, HIGH); // mettre la led RGB B vert à l'etat bas
digitalWrite(rgbBbleu, HIGH); // mettre la led RGB B bleu à l'etat bas
digitalWrite(rgbMrouge, HIGH); // mettre la led RGB M rouge à l'etat bas
digitalWrite(rgbMvert, HIGH); // mettre la led RGB M vert à l'etat bas
digitalWrite(rgbMbleu, HIGH); // mettre la led RGB M bleu à l'etat bas
}
donc cette fois dans le prochain post il y auras bien la parti test , comme je fais plusieurs post je vous mets les code en entier. avec toutes les partis affichage, LED, et le son. et toutes les annotation.
donc comme promis voici la partie test:
void loop() {
//--------------- fin des tests de présence et début de la routine d'aplication avec contrôle des erreurs ---------------------//
//-------------------------------------------- application du primer 1 --------------------------------------------------------//
testa: // Etiquette du retour du GOTO.
if (analogRead(PhotoResM) >500) // On test que l'opérateur n'as pas retiré la piéce du montage.
{
digitalWrite(rgbAvert, HIGH); // Etein la led RGB verte du flacon 1.
digitalWrite(rgbArouge, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbMrouge, HIGH); // Etein la led RGB rouge de la piéce.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB verte dde la piece.
digitalWrite(rgbMvert, LOW); // Allume la led RGB verte de la piece.
myGLCD.setBackColor(RED); // Fond de lettre en rouge.
myGLCD.fillScr(RED); // Remplissage de l'ecran TFT en rouge.
myGLCD.setFont(GroteskBold32x64); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("ERREUR", CENTER, 30); // Ecrire "..." le centrer horizontalement et sur la ligne No 30.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("REDEPOSEZ PIECE", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myGLCD.print("SUR MONTAGE", CENTER, 180); // Ecrire "..." le centrer horizontalement et sur la ligne No 180.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (15); // Lire la piste MP3 No 15 " Erreur redéposez piece sur montage ".
delay(5000); // Attendre 5000 ms.
}
if (analogRead(PhotoResB) >500) // On test que l'opérateur n'as pas pris le mauvais flacon " 2 ".
{
digitalWrite(rgbBrouge, HIGH); // Etein la led RGB rouge du flacon 2.
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbBvert, HIGH); // Etein la led RGB verte du flacon 2.
digitalWrite(rgbBvert, LOW); // Allume la led RGB vert du flacon 2.
digitalWrite(rgbAvert, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbArouge, LOW); // Allume la led RGB vert du flacon 1.
myGLCD.setBackColor(RED); // Fond de lettre en rouge.
myGLCD.fillScr(RED); // Remplissage de l'ecran TFT en rouge.
myGLCD.setFont(GroteskBold32x64); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("ERREUR", CENTER, 30); // Ecrire "..." le centrer horizontalement et sur la ligne No 30.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("DEPOSEZ FLACON 2", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myGLCD.print("SUR SA BASE", CENTER, 180); // Ecrire "..." le centrer horizontalement et sur la ligne No 180.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (17); // Lire la piste MP3 No 17 " Déposez flacon 2 sur sa base ".
delay(5000); // Attendre 5000 ms.
}
if (analogRead(PhotoResM) <500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
// Si et seulement si les deux flacon sont en place tout comme les piéce.
{
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB rouge du flacon 2.
digitalWrite(rgbAbleu, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbAvert, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB rouge de la piece.
digitalWrite(rgbArouge, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbBvert, HIGH); // Etein la led RGB rouge du flacon 2.
myGLCD.setBackColor(WHITE); // Fond de lettre en blanc.
myGLCD.fillScr(WHITE); // Remplissage de l'ecran TFT en BLANC.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(BLACK); // Déclaration de la couleur de la police d'écriture en noir.
myGLCD.print("UTILISEZ LE", CENTER, 80); // Ecrire "..." le centrer horizontalement et sur la ligne No 80.
myGLCD.print("FLACON 1", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (19); // Lire la piste MP3 No 19 " Déposez flacon 2 sur sa base ".
delay(5000); // Attendre 5000 ms.
}
else // Si un ou les deux flacon ou la piéce ne sont pas en place fais cela.
{
goto testa; // Retour à l'etiquette TEST1.
}
donc quand j'upload ces trois parties le programme fonction comme attendu et gère bien les erreurs
tant qu'il y en as et quand enfin on fais ce que l'on devrait faire, cad utiliser le flacon A on arrive bien jusqu'as la fin du programme ou l'on nous indique que le flacon A est en utilisation .
les chose se complique après. dans le prochain post. ou je rajoute une deuxième partie pour gérer les erreur mais sur le flacon B
testb: // Etiquette du retour du GOTO.
if (analogRead(PhotoResM) >500) // On test que l'opérateur n'as pas retiré la piéce du montage.
{
digitalWrite(rgbAvert, HIGH); // Etein la led RGB verte du flacon 1.
digitalWrite(rgbArouge, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbMrouge, HIGH); // Etein la led RGB rouge de la piéce.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB verte dde la piece.
digitalWrite(rgbMvert, LOW); // Allume la led RGB verte de la piece.
digitalWrite(rgbBvert, HIGH); // Allume la led RGB verte de la piece.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB verte de la piece.
myGLCD.setBackColor(RED); // Fond de lettre en rouge.
myGLCD.fillScr(RED); // Remplissage de l'ecran TFT en rouge.
myGLCD.setFont(GroteskBold32x64); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("ERREUR", CENTER, 30); // Ecrire "..." le centrer horizontalement et sur la ligne No 30.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("REDEPOSEZ PIECE", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myGLCD.print("SUR MONTAGE", CENTER, 180); // Ecrire "..." le centrer horizontalement et sur la ligne No 180.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (23); // Lire la piste MP3 No 23 " Erreur redéposez piece sur montage ".
delay(5000); // Attendre 5000 ms.
}
if (analogRead(PhotoResA) >500) // On test que l'opérateur n'as pas pris le mauvais flacon " 1 ".
{
digitalWrite(rgbArouge, HIGH); // Etein la led RGB rouge du flacon 1.
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbAvert, HIGH); // Etein la led RGB verte du flacon 1.
digitalWrite(rgbAvert, LOW); // Allume la led RGB vert du flacon 1.
digitalWrite(rgbBvert, HIGH); // Etein la led RGB rouge du flacon 2.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB vert du flacon 2.
myGLCD.setBackColor(RED); // Fond de lettre en rouge.
myGLCD.fillScr(RED); // Remplissage de l'ecran TFT en rouge.
myGLCD.setFont(GroteskBold32x64); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("ERREUR", CENTER, 30); // Ecrire "..." le centrer horizontalement et sur la ligne No 30.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(WHITE); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("DEPOSEZ FLACON 1", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myGLCD.print("SUR SA BASE", CENTER, 180); // Ecrire "..." le centrer horizontalement et sur la ligne No 180.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (25); // Lire la piste MP3 No 25 " Déposez flacon 1 sur sa base ".
delay(5000); // Attendre 5000 ms.
}
if (analogRead(PhotoResM) <500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
// Si et seulement si les deux flacon sont en place tout comme les piéce.
{
digitalWrite(rgbMrouge, LOW); // Allume la led RGB rouge de la piece.
digitalWrite(rgbArouge, LOW); // Allume la led RGB rouge du flacon 1.
digitalWrite(rgbBbleu, HIGH); // Etein la led RGB bleu du flacon 2.
digitalWrite(rgbBvert, LOW); // Allume la led RGB rouge du flacon 2.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB rouge de la piece.
digitalWrite(rgbBrouge, HIGH); // Etein la led RGB rouge du flacon 2.
digitalWrite(rgbAvert, HIGH); // Etein la led RGB rouge du flacon 1.
myGLCD.setBackColor(WHITE); // Fond de lettre en blanc.
myGLCD.fillScr(WHITE); // Remplissage de l'ecran TFT en BLANC.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(BLACK); // Déclaration de la couleur de la police d'écriture en noir.
myGLCD.print("UTILISEZ LE", CENTER, 80); // Ecrire "..." le centrer horizontalement et sur la ligne No 80.
myGLCD.print("FLACON 2", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (27); // Lire la piste MP3 No 27 " Utilisez le flacon 2 ".
delay(5000); // Attendre 5000 ms.
}
else // Si un ou les deux flacon ou la piéce ne sont pas en place fais cela.
{
goto testb; // Retour à l'etiquette TEST2.
}
while (analogRead(PhotoResB) >500) // Tant que le flacon 2 n'est pas sur sa base fais cela.
{
digitalWrite(rgbBvert, HIGH); // Etein la led RGB verte du flacon 2.
digitalWrite(rgbBbleu, LOW); // Allume la led RGB bleu du flacon 2.
myGLCD.setBackColor(WHITE); // Fond de lettre en blanc.
myGLCD.fillScr(WHITE); // Remplissage de l'ecran TFT en BLANC.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(BLACK); // Déclaration de la couleur de la police d'écriture en noir.
myGLCD.print("FLACON 2", CENTER, 80); // Ecrire "..." le centrer horizontalement et sur la ligne No 80.
myGLCD.print("EN UTILISATION", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (29); // Lire la piste MP3 No 29 " Flacon 2 en utilisation ".
delay(5000); // Attendre 5000 ms.
}
dans la dernière partie je mets la partie ou l'on demande retirer et de changer de piece
voici la fin du programme.
c'est dommage que l'on ne puisse pas mettre le code en entier d'un seul coup.
while (analogRead(PhotoResM) <500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
// tant que la lecture des photo-diodes de presence des flacons 1, 2 est basse et seulement si la lecture de la photo-diode de presence piece M est basse alors fais ceci
{
digitalWrite(rgbAvert, HIGH); // Etein la led RGB A vert.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB M vert.
digitalWrite(rgbMrouge, HIGH); // Etein la led RGB M rouge.
digitalWrite(rgbArouge, LOW); // Allume la led RGB A rouge.
digitalWrite(rgbBrouge, LOW); // Allume la led RGB B rouge.
digitalWrite(rgbMvert, HIGH); // Etein la led RGB M vert.
delay(200); // Attend 200 ms.
digitalWrite(rgbMvert, LOW); // Allume la led RGB M vert.
delay(200); // Attend 200 ms
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (31); // Lire la piste MP3 No 31 " Retirer la piece du montage "
delay(5000); // Attendre 5000 ms.
}
PhotoResAVal = analogRead(PhotoResA); // On récupère la valeur de la Photorésistance de la base du flacon 1.
delay(15); // Temps de réponse de la photo diode.
PhotoResBVal = analogRead(PhotoResB); // On récupère la valeur de la Photorésistance de la base du flacon 2.
delay(15); // Temps de réponse de la photo diode.
PhotoResMVal = analogRead(PhotoResM); // On récupère la valeur de la Photorésistance de la base du flacon M.
delay(15); // Temps de réponse de la photo diode.
myGLCD.clrScr(); // on efface l'écran au début
myGLCD.setBackColor(WHITE);
myGLCD.fillScr(WHITE); // Remplissage de l'ecran TFT en BLANC.
myGLCD.setFont(GroteskBold16x32); // Déclaration de la police d'écriture à utiliser.
myGLCD.setColor(BLACK); // Déclaration de la couleur de la police d'écriture en BLANC.
myGLCD.print("DEPOSEZ UNE", CENTER, 80); // Ecrire "..." le centrer horizontalement et sur la ligne No 80.
myGLCD.print("NOUVELLE PIECE", CENTER, 130); // Ecrire "..." le centrer horizontalement et sur la ligne No 130.
while ( analogRead(PhotoResM) >500 && analogRead(PhotoResA) <500 && analogRead(PhotoResB) <500 )
// tant que la lecture du capteur de presence flacon 1, 2 est basse
// et si et seulement si la lecture de presence piece M est haute alors fais ceci :
{
digitalWrite(rgbMvert, HIGH); // Etein la led RGB M vert.
delay(200); // Attend 200 ms
digitalWrite(rgbMvert, LOW); // Etein la led RGB M bleu.
delay(200); // Attend 200 ms
myDFPlayer.volume(10); // Définition du volume sonore du DFPlayer ( de 0 à 30 )
myDFPlayer.play (32); // Lire la piste MP3 No 25 " Déposez une nouvelle pièce sur le montage "
delay(5000); // Attendre 5000 ms.
}
}
//-------------- Fin de la boucle du programme principale et retour pour nouvelle boucle de manière infinie ---------------
j'espère que vous arriverez a m'aider a comprendre pourquoi lorsque je rajoute la deuxième parti de test ca part en vrille, car je vous le dis quand je fais tourner la parti 1 seul ou la partie deux seul ca fonctionne a merveille.
cordialement.
seb
On t'avait prévenu :
Un programme bien structuré évite le GOTO.
Par contre si tu te sers de goto pour traiter des problématiques applicatives, c'est franchement cochon et illisible.
J'espère que tu te rends compte que lire un code de ce genre est une vraie galère.
Quand à le tester, on n'y pense même pas, vu la débauche de matériel à mettre en œuvre.
Ce genre d'application se prêterait tellement bien à l'utilisation d'une machine à états.
En dernier recours, utilise Serial.println() et la console pour visualiser ce qui se passe.
@+
Slt,
je te promet j'ai lu et relu ton post sur les machine a état
et comme je te l'ai dis je ne sais pas comment transformer la lecture de mes photo diode en état
true or false autrement j'aurais deja fais un switch case qui serait plus simple a gérer pour moi
pour le moment je n'utilise que la lecture analogique de mes diode c'est pour cela que j'utilise porte logique du style. while (analogRead(PhotoResM) <500 && analogRead(PhotoResA)
si tu as une idee a me soumetre pour transforme ces lecture analogique en état 1 ou 0 assez facilement je suis preneur, je ne demande pas un code tout fais , je veux pouvoir comprendre et le réutiliser par la suite.
mais je cale, si a la place des photo diode j'avais des interrupteurs je pense que ce serait plus facile , car au depart j'avais des capteur IR avec renvoie de signal. 1 ou 0. et cela me convenait , mais voila dans mon montage le rayonnement IR se reflétait partout et du coup je ne pouvais plus rien régler meme a la sensibilité min j'avais un renvoie positif.
cordialement seb.
je te promet j'ai lu et relu ton post sur les machine a état
Ce n'est pas de moi, tu dois confondre.
Qu'est ce qui t'empêche de positionner un booléen lorsque la tension lue sur la photorésistance dépasse une certaine valeur ?
Une tension qui dépasse une certaine valeur ou descend en dessous d'une certaine valeur est un événement.
Ensuite tu peux parfaitement fabriquer une machine à états avec des switch imbriqués si cela te chante, ou un moteur un peu plus élaboré.
switch (état) :
case ETAT1:
switch(evenement):
case EVENT1:
decision1_1();
case EVENT2:
decision1_2();
// et ainsi de suite
Tu comprendras vite les avantages d'une machine à états.
@+