Boucle est reatribution d'une variable

Bonjour , cela fais plusieurs jours que je test différente chose pour arriver à faire fonctionné mon programme et à faire marché un peut tous ensemble, mais je me heurte à un problème sur ma boucle Loop().

quand je lance le programme ma boucle fonctionne correctement. quand ma cellule détecte une présence cela active mon relais qui fais passé le 5V(arduino) sur ma Pin 7 avec une résistance Pull-Up. mais une fois la partie de la boucle lancé elle continue sur la même partie sans prendre en compte que la pin7 (CelulleOn) n’a plus de courant (HIGH) et es donc repassé en ( LOW ) si je me trompe pas .

Merci pour votre aide.

ps: mon Code es un peut en fouille , je suis novice en programmation arduino.

voici mon Code complet :

#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>

//definie les pin moteur et le setp pour le moteur
#define dirPin 9
#define stepPin 8
#define stepsPerRevolution 1600

//Pin des cellules etiquete
#define ETIQON 7
#define ETIQOFF 5

//etat des cellules
int CelulleOn = LOW;
int CelluleOFF = 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
  
};

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

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

//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 (void) {
  Serial2.begin(9600);
  
  // Nexion
  nexInit();
  
  //etiqueteuse
  pinMode (ETIQON, INPUT);
  pinMode (ETIQOFF, INPUT); 
  Serial.println("Cellule initialisé");

//etiqueteuse info - Nextion  
  b0.attachPop(b0PopCallback, &b0);
  b1.attachPop(b1PopCallback, &b1);
  //b2.attachPop(b2PopCallback, &b2);
  //b3.attachPop(b3PopCallback, &b3);
  h0.attachPop(h0PopCallback, &h0);
  //h1.attachPop(h1PopCallback, &h1);
  //h2.attachPop(h2PopCallback, &h2);

//moteur
// declaration des pins moteur
  pinMode(stepPin, OUTPUT); // pin en sortie
  pinMode(dirPin, OUTPUT); // pin en sortie  
}

void loop (void){

  //etiqueteuse info nexion
  nexLoop (nex_listen_list);

//presence d'un produit
  CelulleOn = digitalRead(ETIQON);
  if (CelulleOn == HIGH){
    Serial.println("Detection d'un flacon");
    //CelulleOn = LOW ;
    // Régle le sens de rotation dans le sens des aiguilles d'une montre: (hight : cw / low : CCW )
    // Faites tourner le moteur pas à pas d'un tour:
  for (int i = 0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepPin, LOW);
   delayMicroseconds(100);
 Serial.println("Etiquette envoyé");
 //delay ("25000");
//Serial.println(CelulleOn);
//while (1){};
  }
  }
    else
      Serial.println("ATTENTE---");
      //delay ("500");
    }

est-ce que vous pensez que faire    CelulleOn = LOW ;va mettre la pin à LOW ?

Bonjour , merci pour ta réponse , je vient d’éditer mon post j'ai commentait cette ligne dans le code Arduino c’était un test pour voir si cela resolvait mon problème .

Ce n'est pas cool de modifier un post après qu'un commentaire soit fait; Si quelqu'un vient lire le premier post il ne comprendra pas la discussion.

Votre Arduino pédale assez vite, qu'est-ce qui va faire qu'au prochain tour de loop CelulleOn ne sera pas HIGH. ? quel processus physique contrôle ce que voit la pin ETIQON?

  CelulleOn = digitalRead(ETIQON);
  if (CelulleOn == HIGH){

désoler pour l’édition du post je n’avais pas vue votre réponse , j’avais pas actualiser la page internet .

en faite ma cellule 24V active un relais qui fait passer le 5v(arduino) sur ma Pin7 . donc si rien ne passe devant la cellule le relais n’es pas activer .

quand je lance le programme et que je ne passe pas la main devant la cellule , j’ai bien ma boucle “Esle”

 else{
      Serial.println("ATTENTE---");

qui tourne comme il faut.

mais quand je passe la main la cellule détecte une présence et la partie “//presence d’un produit”

CelulleOn = digitalRead(ETIQON);
  if (CelulleOn == HIGH)
  {
    Serial.println("Detection d'un flacon");
    // Régle le sens de rotation dans le sens des aiguilles d'une montre: (hight : cw / low : CCW )
    // Faites tourner le moteur pas à pas d'un tour:
  for (int i = 0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepPin, LOW);
   delayMicroseconds(100);
 Serial.println("Etiquette envoyé");

Tourne en boucle , alors qu’il n’y a plus rien devant la cellule. et du coup mon moteur ne tourne pas comme il faut vue qu’il reçois la commande de tourné plusieurs fois d’affiler .

je sait pas si ça répond à votre question.

acidenitr0s:
désoler pour l’édition du post je n'avais pas vue votre réponse , j'avais pas actualiser la page internet .

un peu fouttage de gueule vu que vous écrivez

acidenitr0s:
Bonjour , merci pour ta réponse , je viens d’éditer mon post j'ai commenté cette ligne dans le code Arduino c’était un test pour voir si cela résolvait mon problème .

passons..

est-ce que votre moteur est capable de faire un tour (1600 steps) en un tiers de seconde ? c'est ce que fait votre boucle for si vous n'imprimez pas les 1600 "Etiquette envoyé".

Que voyez vous dans la console série ?

Moi, il y a quelquechose qui m'interpelle. Tu dis «en faite ma cellule 24V active un relais qui fait passer le 5v(arduino) sur ma Pin7» alors qu'au premier post tu parles de résistance de pullup. En toute logique il faudrait une résistance de pulldonwn.
Comment est cablée ton entrée?

il y à un quiproquo sur le début de notre message

Quote from: acidenitr0s on Today at 04:03 pm

désoler pour l'édition du post je n'avais pas vue votre réponse , j'avais pas actualiser la page internet .

un peu fouttage de gueule vu que vous écrivez

Quote from: acidenitr0s on Today at 03:49 pm

Bonjour , merci pour ta réponse , je viens d'éditer mon post j'ai commenté cette ligne dans le code Arduino c'était un test pour voir si cela résolvait mon problème .

votre message et ma correction de mon code ce sont croisé, mais effectivement , Passons.

J-M-L

Que voyez vous dans la console série ?

je suit chez moi , je vous donne le résultat demain au boulot.

kamill
oui c’était pour expliqué mon montage au niveau de ma détection. j'ai vais fais des essayé et je me suit rendu compte que j'avais des résultat parasite dans le moniteur série et quand j'ai rajouté la résistance je n'avais plus de problème de parasite .
je vous donnerais le câblage une fois au boulot .

Merci pour votre aide.

Bonjour,

J-M-L
voici ce que j'ai dans le moniteur série :
avant une détection :

et après détection : ( sa reste sur la boucle de détection )

kamill
voici mon branchement électrique :

et vous avez 1600 "étiquette envoyée" puisque le println() est dans la boucle for ?
est-ce que ça sert à quelque chose ?

le "neutre" est bien connecté au GND de l'Arduino ?

j’ai continué mais recherche et mais essais je suit arrivé à faire en sorte ( je pense ) à repasser en mode attente d’une nouvelle détection , voici le code.

void loop (void){
//presence d'un produit
  CelulleOn = digitalRead(ETIQON);
  if (CelulleOn != CelulleOnMemo){
    Serial.println("Detection d'un flacon");
    CelulleOnMemo = CelulleOn;
    if (CelulleOn == HIGH){
      CelulleOnMemo = !CelulleOnMemo;
      delay ("500");
    }
  }
  if (CelulleOn == HIGH){
    // Régle le sens de rotation dans le sens des aiguilles d'une montre: (hight : cw / low : CCW )
    digitalWrite(dirPin, HIGH);
    // Faites tourner le moteur pas à pas d'un tour:
  //for (int i = 0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepPin, LOW);
   delayMicroseconds(100);
 Serial.println("Etiquette envoyé");
 Serial.println(CelulleOn);
 Serial.println(CelulleOnMemo);
  }
    else{
      Serial.println("ATTENTE---");
      //delay ("500");
    }
}

sur ma console serie :


J-M-L

et vous avez 1600 “étiquette envoyée” puisque le println() est dans la boucle for ?

Normalement les 1600 (#define stepsPerRevolution 1600) ces 1 tour complet de mon moteur ( si je me suit pas trompe ).

Ne fais pas de copie d’écran du Moniteur STP.
Tu copies le texte dans le moniteur et tu les colles dans le message que tu rédiges.
Mets ce texte entre balises code </> c’est encore mieux

biggil:
Ne fais pas de copie d’écran du Moniteur STP.
Tu copies le texte dans le moniteur et tu les colles dans le message que tu rédiges.
Mets ce texte entre balises code </> c’es encore mieux

Bonjour biggil, pas de soucie.

par contre mon moteur ne veut pas tourné.
alors que si je lance ce code cela fonctionne .

//definie les pin moteur et le setp pour le moteur
#define dirPin 9
#define stepPin 8
#define stepsPerRevolution 1600

void setup() {
  // Declare pins as output:
  pinMode(stepPin, OUTPUT); // pin en sortie
  pinMode(dirPin, OUTPUT); // pin en sortie 
}

void loop() {
  // Réglez le sens de rotation dans le sens des aiguilles d'une montre: (hight : cw / low : CCW )
  digitalWrite(dirPin, HIGH);

  // Faites tourner le moteur pas à pas d'un tour:
  //for (int i = 0; i < stepsPerRevolution; i++) {
    // These four lines result in 1 step:
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(100);
  }

J-M-L
Le GND Arduino es relier :

  • driver moteur
  • et mes 2 resistances Pull-Up sur mais 2 relais
    mais pas au neutre du 24V de la machine.

où est le Serial.begin() ?

J-M-L
dans le Setup

void setup (void) {
  Serial2.begin(9600);

encore en exploration , je suit arrivé à faire fonctionné mon moteur avec ma cellule de détection avec le code suivant :
mon moteur tourne peut être pas à sa vitesse max, je sais pas trop si il me manque des paramètres:

#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 CelluleOFF = LOW;

void setup() {
  Serial.begin(9600);

  //vitesse moteur
  stepper.setSpeed(170);

  // 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("Capteur detection de presence");
}

void loop() {
  //Vérifie si presence etiquette
  CelulleOn = digitalRead(ETIQON);
  Serial.print("Detection d'un flacon");
  if (CelulleOn == HIGH) {
    // Faites tourner le moteur pas à pas d'un tour:
    for(int i=1; i<=NombPas; i++){ // sens horaire
      stepper.step(1); 
    }
  }
  else {    
    Serial.println("---ATTENTE---");     
  }
}

acidenitr0s:
J-M-L
dans le Setup

void setup (void) {

Serial2.begin(9600);

Serial2 oui Mais Serial ?

j’ai du oublier de le rajouter.

voici mon Code à l’instant T :

#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 CelluleOFF = 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
  
};

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

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

//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);
  b1.attachPop(b1PopCallback, &b1);
  //b2.attachPop(b2PopCallback, &b2);
  //b3.attachPop(b3PopCallback, &b3);
  h0.attachPop(h0PopCallback, &h0);
  //h1.attachPop(h1PopCallback, &h1);
  //h2.attachPop(h2PopCallback, &h2);

  //vitesse moteur
  stepper.setSpeed(150);

  // 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() {
  //Vérifie si presence etiquette
  CelulleOn = digitalRead(ETIQON);
  CelluleOFF = digitalRead(ETIQOFF);
  if (CelulleOn == HIGH) {
    Serial.println("Detection d'un flacon");
    // Faites tourner le moteur pas à pas d'un tour:
    for(int i=1; i<=NombPas; i++){ // sens horaire
      stepper.step(1); 
    }
  }
  else {        
    Serial.println("---ATTENTE---");     
  }
}

Comment faire pour que ma 2eme cellule arrête la distribution de l’étiquette (arrête le moteur ) , j’ai essayé plusieurs chose mais sans grand succès voir une perte de pas sur la rotation .

Merci

acidenitr0s:
kamill
voici mon branchement électrique :
![|500x304](https://zupimages.net/up/20/44/50v2.png[/quote]
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.)