Problème pour réaliser une sécurité temporelle

Bonjour,

Je suis sur un projet pour lequel j'utilise:

  • 1 Arduino Mega 2560
  • 1 écran tactile 4D System uLCD-43PT ou uLCD-70DT
  • 1 électronique propre comprenant en particulier un interrupteur à pédale, un relais de puissance (pour chauffer une résistance), un shunt (pour mesurer le courant de chauffage)

Pour mon processus, j'appuye sur une pédale (bouton poussoire), ce qui entraine le changement d'état du relais de puissance et donc le chauffage de la résistance.

Je voudrais ajouter une sécurité sur le fonctionnement, qui consite à stopper le chauffage si le temps de chauffage dépasse une valeur maximale (par exemple 10 secondes).

Après avoir regardé sur le forum et les tutoriels, je pensais pouvoir utiliser la fonction "pulseIn", mais cela ne fonctionne pas et je ne comprends pas pourquoi.

Voici la partie du code que j'ai faite pour cette sécurité (je n'ai pas mis tout le code pour ne vous inonder d'informations...) :

//Pédale (sur PIN 5 Arduino)
int buttonPin = 5;
int buttonState = 0;

//Relais de commande chauffage (sur PIN 3 Arduino)
const int relais = 3;

//définition du temps de chauffage (en milli secondes)
unsigned long Tps_chauffage;

//Temps de chauffage maximal 5s (en milli secondes)
const unsigned long Tps_chauf_max=5000;

void setup
{
// pedale est une entrée
pinMode(buttonPin, INPUT);

//initialisaton de la pedale
//buttonState = LOW;

// relais est une sortie
pinMode(relais, OUTPUT);

//initialisaton du relais
analogWrite(relais,0);
}

void loop
{
// lecture de l'état de la pédale:
buttonState = digitalRead(buttonPin);

Tps_chauffage = pulseIn(buttonPin, LOW);

//Si la pédale est appuyée, lancement du processus de chauffage
if (buttonState == LOW)
//on lance le chauffage
{
chauffage();
}

void chauffage()
{
if (buttonState == HIGH)
{
arret_chauffage();
}

else if (Echauf < Echauf_theor && START == 1)
{
//on lance le chauffage (on ferme le relais) tant que la pédale est appuyée, le bouton START appuyé et l'énergie de chauffage "Echauf_theor" choisie par l'utilisateur pas atteinte

analogWrite(relais,255);

if (Tps_chauffage > Tps_chauf_max && compteur > 1)
{
arret_chauffage();
}

}

}

Salut,

PulseIn() est utilisé pour mesuré une largeur d'impulsion, par un temps donné.

Pour faire ce que tu veux il faut utiliser millis() :

Je te remercie pour ta réponse.

En fait, j'ai également essayé avec millis(), mais cela ne fonctionne pas non plus.

Est-ce que vous comprenez pourquoi ?
Merci

Pour le code, j'ai mis :

unsigned long Debut_chauf;

const int Tps_chauf_max = 5000;

void setup
{
Debut_chauf = millis();
}

void loop
{
//Si la pédale est appuyée, lancement du processus de chauffage
if (buttonState == LOW)
{
Debut_chauf = 0; //mise à 0 de Debut_chauf au lancement du chauffage

chauffage();
}

void chauffage()
{
if (buttonState == HIGH)
{
arret_chauffage();
}

else if (Echauf < Echauf_theor && START == 1)
{
//on lance le chauffage (on ferme le relais) tant que la pédale est appuyée
analogWrite(relais,255);

if (millis()-Debut_chauf > Tps_chauf_max && compteur > 1)
{
arret_chauffage();
}
}

}

Oui c'est normal, visiblement t'as pas compris millis() xD

millis() renvoie le temps écoulé depuis le début du programme. Il faut donc le stocker dans une variable, et comparé millis() à cette référence. C'est exactement comme si tu mets des pâtes à cuire : tu regardes l'heure quand tu mets les pâtes à cuire, puis régulièrement tu regardes à nouveau l'heure pour voir si le temps écoulé correspond à la cuisson des pâtes, le temps écoulé étant l'heure actuelle - l'heure de départ.

Lis mon article normalement il y a tout expliqué.

PS : pense à utiliser les balises code pour poster du code (# dans le menu reply)

Bonjour,

Je te remercie pour ta réponse.

Effectivement, je ne suis pas très expérimenté pour rédiger du code et utiliser Arduino... donc il est possible que je n'ai pas bien compris la fonction millis().
Mais j'ai essayé de suivre ton exemple et je n'arrive pas à faire fonctionner cette sécurité sur la temporisation.
J'ai donc essayé pas mal de chose, mais rien ne fonctionne.

Est-ce que tu penses que cela pourrais venir du fait que j'utilise des fonctions ?

Est-ce que tu vois ce qui ne va pas dans mon code?

Je te remercie d'avance
Cordialement

number5defoly:
Bonjour,

Je te remercie pour ta réponse.

Effectivement, je ne suis pas très expérimenté pour rédiger du code et utiliser Arduino... donc il est possible que je n'ai pas bien compris la fonction millis().
Mais j'ai essayé de suivre ton exemple et je n'arrive pas à faire fonctionner cette sécurité sur la temporisation.
J'ai donc essayé pas mal de chose, mais rien ne fonctionne.

Est-ce que tu penses que cela pourrais venir du fait que j'utilise des fonctions ?

Est-ce que tu vois ce qui ne va pas dans mon code?

Je te remercie d'avance
Cordialement

bonjour
à tu pensé à verfier qu'une fois la condition de temps max est atteinte (desactivation) il te faut aussi verfier que l'inter repasse par l'ett inactif ,
sinon tu va juste "boucler"