Comportement différent du capteur PIR quand alimentation USB ou jack

Bonjour,
Tout d'abord merci pour la mine d'information qu'on trouve sur ce forum.
Je me me permet ce message car je rencontre un problème dont je ne trouve pas la solution en faisant simplement une recherche (peut-être n'ai-je pas utilisé les bons mots clefs).

J'ai un capteur PIR branché sur un Shield Grove sur une carte Uno, la détection via ce capteur lance un décompte.
J'ai fait mon code que j'ai testé, tout fonctionne quand ma carte Uno est alimentée via USB.
Le décompte ne se lance pas quand on alimente la carte, il attend la détection puis se lance.

Par contre ce que je ne m'explique pas c'est que lorsque j'alimente ma carte via la prise jack (avec un transfo 12V 1A), le décompte se fait immédiatement comme si la détection était active. Hors je ne change rien, je change juste de mode d'alimentation... c'est un grand mystère pour moi.
Et si j'alimente la carte via le jack et que j'appuie sur le bouton reset, alors le fonctionnement est de nouveau normal.

Avez-vous une idée de ce qui peut fausser l'initialisation de la détection ?

#include <TM1637.h>
#include <EEPROM.h>

#define PIR_MOTION_SENSOR 2 // pin detection IR
int pirValue = false;

#define CLK 4 // pins pour l'affichage 4 digits
#define DIO 5
TM1637 tm1637(CLK, DIO);

unsigned long previousMillis = 0;
unsigned long previousMillisLED = 0;
const unsigned long BLINK_INTERVAL = 1000;

int score = 5000; // score de départ
int score_precedent; // score precedent
bool decompte = false;
bool fin = false;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(pirValue);
  
  // on recupere le score precedent dans l'EEPROM
  EEPROM.get(1, score_precedent);

  pinMode(PIR_MOTION_SENSOR, INPUT); // detection IR

  tm1637.init();
  tm1637.set(4); // BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}

void loop() {
  // put your main code here, to run repeatedly:
  // Récupére la valeur actuelle de millis()
  unsigned long currentMillis = millis();

  if (decompte) {
    // Affichage du decompte 5000 -1 toutes les secondes
    // Si BLINK_INTERVAL ou plus millisecondes se sont écoulés
    if(currentMillis - previousMillis >= BLINK_INTERVAL) {
      // Garde en mémoire la valeur actuelle de millis()
      previousMillis = currentMillis;
      // on affiche le score avant de le décrémenter
      tm1637.displayNum(score);
      score = score-1;
    }
  } else {
    // affichage du score precedent
    tm1637.displayNum(score_precedent);

    if(currentMillis - previousMillis < BLINK_INTERVAL/2) {
      tm1637.set(4); // BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    } else if (currentMillis - previousMillis <= BLINK_INTERVAL) {
      tm1637.set(0); // BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    } else {
      previousMillis = currentMillis;
    }

    pirValue = digitalRead(PIR_MOTION_SENSOR);
    if (pirValue) {
      decompte = true;
      Serial.println("Ok");
    }
  }
}

un PIR peut avoir besoin de jusqu'à une trentaine de secondes sans activité lors de son alimentation pour se calibrer.

Pendant cette periode les alertes ne sont pas forcément pertinentes

Merci pour votre réponse, je n'ai sans doute pas choisi le bon composant alors :confused:

Je suis en train de concevoir une boîte où il va falloir réaliser des manipulation à l'intérieur et déclencher un décompte quand une main pénètre dans cette boîte. Je pensais utiliser un capteur PIR pour y arriver, mais il va surement me falloir un autre type de capteur alors.

Par contre c'est vraiment très curieux que le comportement soit à ce point différent uniquement en changeant le type d'alimentation.

le souci est juste au boot, non.
Vous mettez un bout de code qui fait que pendant X secondes vous ignorez les détections.

Oui juste au boot, quand je fait un reset le comportement est normal. Le capteur doit s'être calibré entre le boot et le reset.

Je vais faire un test en ignorant les 30 première secondes et vérifier que ça fonctionne, merci.

oui le reset ne coupe pas le courant, donc le capteur reste "calibré".

millis() ne vous dira pas si vous venez d'un "cold boot" ou d'un reset (sur un ESP on pourrait savoir comment on a booté mais pas sur un UNO) mais par défaut vous pourriez dire que si une détection arrive alors que millis() (en absolu) est < x secondes, alors on l'ignore

Effectivement en ignorant les 30 premières secondes, le capteur ne fait plus de faux-positifs en étant alimenté avec le jack.
Merci pour votre aide.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.