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