Chrono qui s'envole (ne revient pas à zéro)

Bonjour,

Dans mon projet j'ai besoin de mesurer le temps de l'état 1 d'un signal qui peut varier de 1ms à 5ms pour en déduire une température.

Pour le moment je simule un signal fixe avec 3ms d'état à 1 et 5ms d'état à 0.

mon code:

const int PIN_SIGNAL_1 = 13;
boolean flag_h = true;
byte etatBroche = LOW;
unsigned long etat_haut = 0;

void setup()
{
  pinMode(PIN_SIGNAL_1, INPUT);
  digitalWrite (PIN_SIGNAL_1, etatBroche);
Serial.begin(115200);
}

void loop()
{
  float temps_1 = 0;
  float temper = 0;

if ((digitalRead(PIN_SIGNAL_1)) && (flag_h == true)) {
    etat_haut = millis();
    flag_h = false;
  }
  if ((!digitalRead(PIN_SIGNAL_1)) && (flag_h == false)) {
    etat_haut = millis() - etat_haut;
    flag_h = true;
  }
   temps_1 = etat_haut;
  temper = (125-(41.25*(5-temps_1)));
  etat_haut = millis(); temps_1 = 0;

Serial.print("temps:");Serial.print(temps_1);Serial.print("ms");
Serial.print("temp:");Serial.print(temper);Serial.println("C");
}

ce qu'il ce passe c'est que j'ai "temps_1" qui ne cesse de s’incrémenter et donc "temper" (le résultat) grimpe.

Pour temps je passe temps_1 à 0 à la fin de ma boucle.

là je ne comprend rien.

ps: je suis débutant en "C" et arduino je m'y suis mis il y a 3 jours.

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

Bonjour,

Ton programme est presque bon, simplement le calcul et l'affichage ne sont pas faits au bon endroit. Ils doivent être faits à la fin de la mesure du temps.

void loop()
{
  if ((digitalRead(PIN_SIGNAL_1)) && (flag_h == true)) {
    etat_haut = millis();
    flag_h = false;
  }
  if ((!digitalRead(PIN_SIGNAL_1)) && (flag_h == false)) {
    etat_haut = millis() - etat_haut;
    flag_h = true;
    float temper = (125 - (41.25 * (5 - etat_haut)));

    Serial.print("temps:"); Serial.print(etat_haut); Serial.print("ms");
    Serial.print("   temp:"); Serial.print(temper); Serial.println("C");
  }
}

Plusieurs remarques:

  • si la période est de 5ms tu vas avoir une perte de résolution énorme en utilisant millis(), utilises micros()
  • il existe la fonction pulsein() pour mesurer la durée d'une impulsion
  • si tu affiches chaque 5ms ça risque fortement de perturber le programme.
  • je ne vois pas ce que tu veux faire avec ça: digitalWrite (PIN_SIGNAL_1, etatBroche);

kamill:

  • si la période est de 5ms tu vas avoir une perte de résolution énorme en utilisant millis(), utilises micros()

Oui pour micros(), j’ai tester sur millis() avant de demander de l’aide.

kamill:

  • il existe la fonction pulsein() pour mesurer la durée d’une impulsion

pulsein() oui fonctionne bien mais j’ai besoin d’aller vite et pulsein() me bloque la suite même avec un timeout de 10ms.

kamill:

  • si tu affiches chaque 5ms ça risque fortement de perturber le programme.

l’affichage c’était pour voire ce qu’il ce passe et ne restera pas.

kamill:

  • je ne vois pas ce que tu veux faire avec ça: digitalWrite (PIN_SIGNAL_1, etatBroche);

c’est que je force l’entrée à LOW à l’allumage (enfin ce que j’ai crue comprendre).

J-M-L:
c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

C’est très intéressent mais je doit être très neuneu je n’arrive pas l’appliquer pour mon cas.
En tout cas je le garde sous le coude on ne sais jamais.

hello
j'ai du mal à te suivre dans ton calcul de la température

float temper = (125 - (41.25 * (5 - etat_haut)));

pour un étathaut de1ms par exemple

float temper = (125 - (41.25 * (5 - 1)));

float temper = (125 - (41.25 * (4)));

float temper = (125 - (165)));

float temper = -40 ?????

dfgh:
hello
j'ai du mal à te suivre dans ton calcul de la température

float temper = (125 - (41.25 * (5 - etat_haut)));

pour un étathaut de1ms par exemple

float temper = (125 - (41.25 * (5 - 1)));

float temper = (125 - (41.25 * (4)));

float temper = (125 - (165)));

float temper = -40 ?????

oui le capteur me donne un signal PWM de 1 à 5 ms qui donne une plage de -40 à +125 °C et aussi une fréquence de 50 à 150 Hz pour 0 à 100%

le capteur https://www.driftshop.fr/skin/manuel-aem-30-2200-2201.pdf

Comme je l'ai dit dans un autre poste j'ai déjà réaliser ce projet avec un raspberry et node-red mais il y a un mais, le raspberry met trop de temps à tous démarrer et j'ai eue envie d'apprendre une autre façon de programmer.