Boucle est reatribution d'une variable

kamill:
Tel que je vois sur le schéma, les entrées sont en l'air quand les relais sont ouverts. Tu dois lire n'importe quoi sur ces entrées.

Bonjour , avant de rajouter mais résistance Pull-UP , je constaté des interférence sur le moniteur série ( activation double / activation sans détection ) et quand j'ai mis les résistances plus rien.

Bonjour , donc je suit arrivé à faire fonctionné le moteur avec un Top de ma cellule et un arrêt avec ma deuxième cellule.
voici mon Code :

#include "NexButton.h"
#include "NexText.h"
#include "NexNumber.h"
#include "NexSlider.h"
#include <Nextion.h>
#include <Arduino.h>
#include <Stepper.h>
#include <AccelStepper.h>
#include <SoftwareSerial.h>

//Pin des cellules etiquete
const int ETIQON = 7;
const int ETIQOFF = 5;

//definie les pin moteur et le setp pour le moteur
const int dirPin = 9; //DIR+
const int stepPin = 8; //PULL+
const int NombPas = 6400; //pas moteur - switch parametrer sur le driver sur 1600 STEPS ON/OFF/ON/ON
Stepper stepper(NombPas,8,9);

//etat des cellules
int CelulleOn= LOW;
int CelulleOFF = LOW;

//pin etiqueteuse ON/OFF
#define Etiq 12

//patie etiqueteuse/Nextion
//SoftwareSerial nextionSerial(17, 16);
#define nexSerial Serial2

//declaration des elements nextion - exemple :( page ID = 0, element ID= 1, name = "b0")
NexText t0 = NexText(1,1, "to");
NexButton b0 = NexButton(1, 2, "b0");
NexButton b1 = NexButton(1, 3, "b1");

NexText t1 = NexText(1,4, "t1");
NexText t5 = NexText(1,13, "t5");
NexSlider h0 = NexSlider(1,5, "h0");

NexText t2 = NexText(1,6, "t2");
NexText t6 = NexText(1,14, "t6");
NexSlider h1 = NexSlider(1,7, "h1");

NexText t3 = NexText(1,8, "t3");
NexButton b2 = NexButton(1, 9, "b2");
NexButton b3 = NexButton(1, 10, "b3");

NexText t4 = NexText(1,11, "t4");
NexText t7 = NexText(1,15, "t7");
NexSlider h2 = NexSlider(1,12, "h2");

//registre des boutons
NexTouch *nex_listen_list[]={
  &b0,&h0,
  &b1,&h1,
  &b2,&h2,
  &b3,
  NULL
  
};

//B0
//changement etat du bouton ON etiqueteuse
void b0PopCallback (void *ptr){
  b0.setText("-ON-");
  digitalWrite(Etiq, HIGH);
}

//B1
//changement etat du bouton OFF etiqueteuse
void b1PopCallback (void *ptr){
  b1.setText("-OFF-");
  digitalWrite(Etiq, LOW);
}

//H0
//changement du texte du slider retard etiq
void h0PopCallback (void *ptr) {
  uint32_t numberRE = 0;
  char temp[1] = {0};
  h0.getValue (&numberRE);
  utoa(numberRE, temp, 0);
  //analogWrite(2, numberRE); 
}

void setup() {
  //Serial.begin(9600);
  Serial2.begin(9600);
  
  // Nexion
  nexInit();

  //etiqueteuse info - Nextion  
  b0.attachPop(b0PopCallback, &b0); //bouton On Nexion
  b1.attachPop(b1PopCallback, &b1); //bouton Off Nexion
  //b2.attachPop(b2PopCallback, &b2);
  //b3.attachPop(b3PopCallback, &b3);
  h0.attachPop(h0PopCallback, &h0); // slide retard etiquette
  //h1.attachPop(h1PopCallback, &h1);
  //h2.attachPop(h2PopCallback, &h2);

  //vitesse moteur
  stepper.setSpeed(150); // vitesse du moteur en Dur
  //stepper.setSpeed(variant du bouton dans nexion); // vitesse moteur regler via Nexion

  // declaration des pins etiqueteuse
  pinMode(ETIQON, INPUT);  //entrer
  pinMode(ETIQOFF, INPUT); //entrer

  // declaration des pins moteur
  pinMode(dirPin, OUTPUT); // Sortie
  pinMode(stepPin, OUTPUT); // Sortie
  
  Serial.println("Cellule initialisé");
}

void loop() {
  CelulleOn = digitalRead(ETIQON);
   
 if (CelulleOn == HIGH){
  do{
    Serial.println("Detection d'un flacon");
    // Faites tourner le moteur pas à pas d'un tour:
    for (int i=1; i<=NombPas; i++){ // sens horaire
      digitalWrite(dirPin, HIGH);
      stepper.step(1);  // (1) nombre de tour du moteur PAP
      CelulleOFF = digitalRead(ETIQOFF); // lit l'etat de la cellule off
    }
  }
  while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
  delay (600);
 }      
    Serial.println("---ATTENTE---");
}

pouvez-vous m’aidez à clarifier mon code , je pense qu’il ne doit pas être dans les règle de l’art :slight_smile: .

j’ai un autre soucie au niveaux de ma boucle, quand un flacon passe devant ma cellule cela détecte un présence et me donne une étiquette, mais si le flacon reste devant il m’envoie encore un étiquette puis une autre ect… ( ces ce que mon code lui demande de faire) j’ai fais des essayé pour envoyé qu’une étiquette et attendre que la cellule repasse par l’état Low avant de pouvoir en redonné une mais je ne suit pas arrivé à le faire pour le moment .

Merci

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

je les vue hier , j'avais garder le lien . je vais essayé sa alors .
merci

votre souci sinon vient du faites que vous avez une boucle for qui contient la détection sur ETIQOFF

    for (int i=1; i<=NombPas; i++){ // sens horaire
      digitalWrite(dirPin, HIGH);
      stepper.step(1);  // (1) nombre de tour du moteur PAP
      CelulleOFF = digitalRead(ETIQOFF); // lit l'etat de la cellule off
    }

mais vous faites les “NombPas” quand même avant d’aller toucher le test suivant while (CelulleOFF == LOW);puisque la boucle for n’est jamais interrompue.

ce que vous voulez faire c’est un pas, vérifier si CelulleOFF est LOW, si oui vous arrêtez sinon vous continuez pour au max 1 tour complet => ça demande d’écrire la boucle différemment

bonjour , merci je vais essayé de revoir sa aussi . Sinon en passant par des fonction au lieu de le faire dans le "loop" serait pas mieux ?

acidenitr0s:
Sinon en passant par des fonctions au lieu de le faire dans le "loop" serait pas mieux ?

Ce serait plus lisible, mais l'important c'est de le faire fonctionner.

Que le code soit dans la loop ou réparti entre différentes fonctions c'est pas super important à ce stade - à l'exécution c'est "quasiment" pareil (au coût d'appel de fonctions près).

J'ai essayé de faire des modif mais sans trop de succès pour le moment, voici mon code:

void loop() {
  debut = millis();
  nexLoop (nex_listen_list);
  CelulleOn = digitalRead(ETIQGO); 
if (compteur < 1) {
    DistribEtiq();
} 
}

void DistribEtiq () {
  if (CelulleOn == HIGH && duree < 520) {
    duree =(millis() - debut<200);
    do { 
      CelulleOFF = digitalRead(ETIQSTOP);
      int Speed = VitEtiq; //vitesse moteur (1450)
      int MoteurSpeed = map(Speed, 0, 1023, 0, 100);
      MyMoteur.setSpeed(MoteurSpeed);
      MyMoteur.step(PasRevol / 100);
        }
      while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette . 
      compteur = compteur +1;
      fin = millis();
      duree = fin - debut;
      Serial.println(duree);
      Serial.println(compteur);
      compteur = 0;
      //while(!timeout && (digitalRead(CelulleOFF)== LOW)); {
      //timeout = (millis() - debut>3000); //attente de 3s
    }
    else {
      //Serial.println("pas de Distrib!!!!");              
    }
  }