Probléme de sortie?

Bonjour, j'ai un petit problème depuis que j'ai ajouté un relais qui pilote l'alimentation de mes cellules en 24V.

le matériel utilisé :

  • Arduino mega 2550
  • écran tactile Nextion
  • relais voie 5V
  • 2 cellules 24V

Problème :
quand je lance mon étiqueteuse des flacon passe devant une cellule qui lui délivre une étiquette et une 2eme cellule indique à l’étiqueteuse l'arrêt. Quand le convoyeur est arrêté par un flacon en travers et qu'il y a un flacon devant la cellule de l'étiqueteuse, le moteur délivre une étiquette sans s'arrêter.

Donc mon problème commence l’opératrice éteint l'étiqueteuse via un bouton on/off sur l'ecran tactile, cela fonctionne mais quand ont veut relancer cela marche plus , le programme bug/freeze.

voici mon code :

#include <Arduino.h>
#include <Nextion.h>
#include <NexButton.h>
#include <NexDualStateButton.h>
#include <Stepper.h>
#include <AccelStepper.h>
#include <SPI.h> //bibliotheque pour carte SD
#include <SD.h> //bibliotheque pour carte SD

//broche CS carte SD
const byte SDCARD_CS_PIN = 53;
File T10; //Nom du fichier de sauvegarde sur la carte SD

//Pin celulle Start/Stop etiquette
const int ETIQGO = 7;
const int ETIQSTOP = 5;

//Pin etiqueteuse On/OFF
int ETIQONOFF = 12;

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

//variable utilisé pour le NEXTION
uint32_t ValeurReadSD = ValeurReadSD; //Variable pour la Lecture de la valeur sauvegarder dans la SD
uint32_t VitEtiq = 0; //Variable pour la vitesse etiquette
uint32_t clicSaveSD = 0; //Variable pour la sauvegarde sur SD

//definie les pin moteur et le setp pour le moteur
const int dirPin = 8;
const int stepPin = 9;
const int PasRevol = 6400;//pas moteur - switch parametrer sur le driver sur 1600 STEPS ON/OFF/ON/ON (defaut=6400)
Stepper MyMoteur(PasRevol, 8, 9);
int StepCount = 0;

//declaration des elements nextion - exemple :( page ID = 0, element ID= 1, name = "b0")
//-----------------------
NexNumber vitet = NexNumber(1, 15, "vitet"); //Valeur Vit. Etiq.
//-----------------------
NexButton b1 = NexButton(1, 16, "b1"); //bouton validation valeur Vit. etiq.
//-----------------------
NexButton b2 = NexButton(1, 18, "b2"); //bouton ON etiq.
NexButton b3 = NexButton(1, 19, "b3"); //bouton OFF etiq.
//-----------------------

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

//B1
//bouton validation valeur Vit. etiquette
//bouton sauvegarde valeur Vit. etiquette
void b1PopCallback (void *ptr) {
  char temp[5] = {0};
  vitet.getValue(&VitEtiq);
  utoa(VitEtiq, temp, 0);

  //Supprime le fichier sur SD avant enregistrement
  if (SD.exists("T10.txt")) {
    if (!SD.remove("T10.txt")) {
      Serial.println("Erreur suppression fichier");
    }
  }      //Ecriture de la valeur VitEtiq sur SD
  if (clicSaveSD == 0) { // If dual state button is equal to 1 (meaning is ON)...
    T10 = SD.open("T10.txt", FILE_WRITE); // open "file.txt" to write data
    if (T10) {
      T10.println(VitEtiq); // write number to file
      T10.close(); // close file
    } else { // Since the dual state button is OFF...
      Serial.println("pas d'enregistrement");
    }
  }
}

//B2
//bouton ON Etiq.
void b2PopCallback (void *ptr) {
  digitalWrite(ETIQONOFF, HIGH);  // Turn ON internal LED
}

//B3
//bouton OFF Etiq.
void b3PopCallback (void *ptr) {
  digitalWrite(ETIQONOFF, LOW);  // Turn OFF internal LED
}

void ReadDisFile(String NomFich)
{
  // 1. Réouverture du fichier
  T10 = SD.open("T10.txt");
  if (T10)
  {
    // 2. Lecture & Affichage du contenu du fichier
    while ((ValeurReadSD = T10.read()) != -1){
      VitEtiq = ValeurReadSD;
      Serial.println(ValeurReadSD);
    }
    // 3. Fermeture du fichier
    T10.close();
  } else
  {
    Serial.println("Erreur d'ouverture du fichier " + T10);
  }
  Serial.println("\n\n");
}

void setup(void) {

  //info console
  Serial.begin(9600); //retour moniteur serie arduino
  Serial2.begin(9600); //retour moniteur serie Nextion

  ReadDisFile;

  // Nexion
  nexInit();
  b1.attachPop(b1PopCallback, &VitEtiq);// bouton validation valeur Vit. Etiq. + sauvegarde valeur
  b2.attachPop(b2PopCallback);// bouton ON
  b3.attachPop(b3PopCallback);//bouton OFF

  // declaration des pins etiqueteuse
  pinMode (ETIQONOFF, OUTPUT); //Sortie
  pinMode(ETIQGO, INPUT);  //entrer
  pinMode(ETIQSTOP, INPUT); //entrer

  pinMode(dirPin, OUTPUT); //Sortie
  pinMode(stepPin, OUTPUT); //Sortie

  //Initialisation port SPI
  pinMode(53, OUTPUT); //Sortie
}

void loop() {
  nexLoop (nex_listen_list);
  DistribEtiq();
  CelulleOn = digitalRead(ETIQGO);
}

void DistribEtiq () {
  if (CelulleOn == HIGH) {
    do {
      CelulleOFF = digitalRead(ETIQSTOP);
      //Serial.println("Detection d'un flacon");
      int Speed = VitEtiq; //vitesse moteur (1450)
      int MoteurSpeed = map(Speed, 0, 1023, 0, 100);
      (MoteurSpeed > 0);
      MyMoteur.setSpeed(MoteurSpeed);
      MyMoteur.step(PasRevol / 100);
    }
    while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
  }
}

Merci pour votre aide

la SD n'est pas initialisée ?

dans le setup() cette ligne de code n'appellera pas la fonction

  ReadDisFile;

cette ligne de code là ne sert à rien, vous n'avez pas oublier un if ?

      (MoteurSpeed > 0);

inversez éventuellement ces 2 lignes semblerait plus logique

  DistribEtiq();
  CelulleOn = digitalRead(ETIQGO);

puisque DistribEtiq() dépend de CelulleOn

lal boucle

    do {
      CelulleOFF = digitalRead(ETIQSTOP);
      ...
    }  while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .

peut être bloquante de manière infinie si ETIQSTOP ne repasse pas à LOW

hello
dans ton code, rajoute la declaration d'un BP:
const int reset_erreur = 50;//*** 50 ou autre ************************BP_reset_erreur rajouté
pinMode(reset_erreur,INPUT); //entrer//***************************rajouté

et la fonction distrib_etiquette devient:

void DistribEtiq ()
{
  if (CelulleOn == HIGH)
  { unsigned long tempo_secu = 200;//modifier selon le temps necessaire pour 1 etiquette
    unsigned long deb_etiq = millis();
    do
    {
      CelulleOFF = digitalRead(ETIQSTOP);              //Serial.println("Detection d'un flacon");
      int Speed = VitEtiq; //vitesse moteur (1450)
      int MoteurSpeed = map(Speed, 0, 1023, 0, 100);
      if (MoteurSpeed > 0) 
      {
        MyMoteur.setSpeed(MoteurSpeed);
      }
      MyMoteur.step(PasRevol / 100);
      if ((millis() - deb_etiq) > tempo_secu) 
      {
        while (digitalRead(reset_erreur) == LOW) 
        {
          ;
        }
      }
    }
    while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
  }
}

si le temps alloué est dépassé, le prg va rester dans une boucle sans fin en attendant d'appui sur le BP reset erreur

Bonjour et merci pour votre aide.

J-M-L :

au début mon "SETUP" étais comme ceci: (celui-ci et peut être mieux ?)

void setup(void) {

  //info console
  Serial.begin(9600); //retour moniteur serie arduino
  Serial2.begin(9600); //retour moniteur serie Nextion

  // Nexion
  nexInit();
  b1.attachPop(b1PopCallback, &VitEtiq);// bouton validation valeur Vit. Etiq. + sauvegarde valeur
  b2.attachPop(b2PopCallback);// bouton ON
  b3.attachPop(b3PopCallback);//bouton OFF

  // declaration des pins etiqueteuse
  pinMode (ETIQONOFF, OUTPUT); //Sortie
  pinMode(ETIQGO, INPUT);  //entrer
  pinMode(ETIQSTOP, INPUT); //entrer

  pinMode(dirPin, OUTPUT); //Sortie
  pinMode(stepPin, OUTPUT); //Sortie

  //Initialisation port SPI
  pinMode(53, OUTPUT); //Sortie

  //Initialisation SD
  Serial.println("Ini.. SD");
  if (!SD.begin(SDCARD_CS_PIN)) {
    Serial.println("FAIL");
  }
  Serial.println("SD OK");
  // verificatrion si le ficheir est ouvert correctement
  File T10 = SD.open("T10.txt");
  if (!T10) {
    // Erreur d'ouverture du fichier
    Serial.println("Impossible d'ouvrir le fichier");
  }
  //Lecture du contenu carte SD
  T10 = SD.open("T10.txt", FILE_READ); // open "file.txt" to read data
  if (T10) {
    char ValeurReadSD;
    while ((ValeurReadSD = T10.read()) != -1) { // this while loop reads data stored in "file.txt" and prints it to serial monitor
      VitEtiq = ValeurReadSD;
    }
    T10.close();
  }
}

cette ligne de code là ne sert à rien, vous n'avez pas oublier un if ?

      (MoteurSpeed > 0);

je ne pense pas :roll_eyes: mon moteur fais ce que je voulais , peut être enlever effectivement cette ligne.

inversez éventuellement ces 2 lignes semblerait plus logique

  DistribEtiq();
  CelulleOn = digitalRead(ETIQGO);

il me semble que j'avais déjà fais ceci et j'ai eu des soucies, je vais retester.

pour ma boucle "ETIQSTOP" j'ai 2 cellules l'une qui donne le départ de l'étiquette et l'autre qui stop l'étiquette quand il y à le creux entre les 2 étiquettes.je doit donc attendre que la cellule détecte ce creux pour arrêter le moteur. ( suivant notre production la taille des étiquettes change)

DFGH :
Merci pour t'on retour. je ne peut pas ajouter de "taille/délais" pour la longueur de l'étiquette, celle-ci change en fonction de la production à faire.

le compilateur l'a virée, c'est juste une comparaison mais vous ne faites rien du résultat...

vous ouvrez 2 fois le fichier

File T10 = SD.open("T10.txt");
  if (!T10) {
    // Erreur d'ouverture du fichier
    Serial.println("Impossible d'ouvrir le fichier");
  }
  //Lecture du contenu carte SD
  T10 = SD.open("T10.txt", FILE_READ); // open "file.txt" to read data

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

peut devenir
unsigned long tempo secu = map(digitalRead(A0),0,1023,10,1000);//10 ms à 1 seconde par exemple
après avoir mis en place un potentiometre.

J-M-L :
J'ai enlever les 2 lignes inutile (moteur et SD) , je n'es pas eu le temps de faire des test encore.
Merci pour le lien de ton tuto, je l'avait regarder pour partir éventuellement sur cette construction pour mon projet mais le trouvent un peut complexe je suit partie sur sa.

DFGH:
je peut pas passé par un potentiomètre(problème machine/disposition) et au niveau de l’opératrice cela poserais aussi problème. mais je garde cette méthode pour un autre projet ou si je ne trouve pas de solution. merci

pour rappelle mon problème et que si le convoyeur s’arrête avec un flacon devant la cellule le moteur tourne en continue et que si l’opératrice éteint étiqueteuse et la rallume cela fais planter le programme.

Merci encore pour votre aide.

postez le nouveau code

Bonjour voici le code :

#include <Arduino.h>
#include <Nextion.h>
#include <NexButton.h>
#include <NexDualStateButton.h>
#include <Stepper.h>
#include <AccelStepper.h>
#include <SPI.h> //bibliotheque pour carte SD
#include <SD.h> //bibliotheque pour carte SD

//broche CS carte SD
const byte SDCARD_CS_PIN = 53;
File T10; //Nom du fichier de sauvegade sur la carte SD

//Pin celulle Start/Stop etiquette
const int ETIQGO = 7;
const int ETIQSTOP = 5;

//Pin etiqueteuse On/OFF
int ETIQONOFF = 12;

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

//variable utilisé pour le NEXTION
uint32_t ValeurReadSD = ValeurReadSD; //Variable pour la Lecture de la valeur sauvegarder dans la SD
uint32_t VitEtiq = 0; //Variable pour la vitesse etiquette
uint32_t clicSaveSD = 0; //Variable pour la sauvegarde sur SD

//definie les pin moteur et le setp pour le moteur
const int dirPin = 8;
const int stepPin = 9;
const int PasRevol = 6400;//pas moteur - switch parametrer sur le driver sur 1600 STEPS ON/OFF/ON/ON (defaut=6400)
Stepper MyMoteur(PasRevol, 8, 9);
int StepCount = 0;

//declaration des elements nextion - exemple :( page ID = 0, element ID= 1, name = "b0")
//-----------------------
NexNumber vitet = NexNumber(1, 15, "vitet"); //Valeur Vit. Etiq.
//-----------------------
NexButton b1 = NexButton(1, 16, "b1"); //bouton validation valeur Vit. etiq.
//-----------------------
NexButton b2 = NexButton(1, 18, "b2"); //bouton ON etiq.
NexButton b3 = NexButton(1, 19, "b3"); //bouton OFF etiq.
//-----------------------

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

//B1
//bouton validation valeur Vit. etiquette
//bouton sauvegarde valeur Vit. etiquette
void b1PopCallback (void *ptr) {  
  char temp[5] = {0};
  vitet.getValue(&VitEtiq);
  utoa(VitEtiq, temp, 0);

  //Supprime le fichier sur SD avant enregistrement
  if (SD.exists("T10.txt")) {
    if (!SD.remove("T10.txt")) {
      Serial.println("Erreur suppression fichier");
    }
  }      //Ecriture de la valeur VitEtiq sur SD
  if (clicSaveSD == 0) { // If dual state button is equal to 1 (meaning is ON)...
    T10 = SD.open("T10.txt", FILE_WRITE); // open "file.txt" to write data
    if (T10) {
      T10.println(VitEtiq); // write number to file
      T10.close(); // close file
    } else { // Since the dual state button is OFF...
      Serial.println("pas d'enregistrement");
    }
  }
}

//B2
//bouton ON Etiq.
void b2PopCallback (void *ptr) {
  digitalWrite(ETIQONOFF, HIGH);  // Turn ON internal LED
}

//B3
//bouton OFF Etiq.
void b3PopCallback (void *ptr) {
  digitalWrite(ETIQONOFF, LOW);  // Turn OFF internal LED
}

void setup(void) {

  //info console
  Serial.begin(9600); //retour moniteur serie arduino
  Serial2.begin(9600); //retour moniteur serie Nextion

    //Initialisation port SPI
  pinMode(53, OUTPUT); //Sortie
    //Initialisation SD
  Serial.println("Ini.. SD");
  if (!SD.begin(SDCARD_CS_PIN)) {
    Serial.println("FAIL");
  }
  Serial.println("SD OK");
  // verificatrion si le ficheir est ouvert correctement
  T10 = SD.open("T10.txt", FILE_READ); // open "file.txt" to read data
  if (!T10) {
    // Erreur d'ouverture du fichier
    Serial.println("Impossible d'ouvrir le fichier");
  }
  if (T10) {
    char ValeurReadSD;
    while ((ValeurReadSD = T10.read()) != -1) { // this while loop reads data stored in "file.txt" and prints it to serial monitor
      VitEtiq = ValeurReadSD;
      //Serial.print(ValeurReadSD);
    }
    T10.close();
  }

  // Nexion
  nexInit();
  b1.attachPop(b1PopCallback, &VitEtiq);// bouton validation valeur Vit. Etiq. + sauvegarde valeur
  b2.attachPop(b2PopCallback);// bouton ON
  b3.attachPop(b3PopCallback);//bouton OFF

  // declaration des pins etiqueteuse
  pinMode (ETIQONOFF, OUTPUT); //Sortie
  pinMode(ETIQGO, INPUT);  //entrer
  pinMode(ETIQSTOP, INPUT); //entrer

  pinMode(dirPin, OUTPUT); //Sortie
  pinMode(stepPin, OUTPUT); //Sortie
}

void loop() {
  nexLoop (nex_listen_list);
  CelulleOn = digitalRead(ETIQGO);  
  DistribEtiq();
}

void DistribEtiq () {
  if (CelulleOn == HIGH) {
    do {
      CelulleOFF = digitalRead(ETIQSTOP);
      //Serial.println("Detection d'un flacon");
      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 .
  }
}

qu'attendez vous de cela:

    char ValeurReadSD;
    while ((ValeurReadSD = T10.read()) != -1) { // this while loop reads data stored in "file.txt" and prints it to serial monitor
      VitEtiq = ValeurReadSD;
      //Serial.print(ValeurReadSD);
    }

est-ce que VitEtiq est stockée en binaire dans le fichier ?

l’opératrice éteint l'étiqueteuse via un bouton on/off sur l'ecran tactile

c'est quel bouton? pour qu'il soit pris en compte il faut que le code revienne à la loop() ce qui n'est pas le cas si vous restez coincé dans votre do/while