Problème PIR sensor

Bonsoir

J'ai un petit souci avec un détecteur de mouvement récalcitrant.

A la base, j'utilise ce type de détecteur en association avec un écran LCD, pour l'allumer ou l'éteindre de manière automatique.

Mais il se passe quelque chose d'assez curieux : à chaque allumage ou extinction du rétro éclairage de l'écran, la sortie du détecteur de mouvement passe à HIGH, alors que rien de bouge alentour.

L'écran est un bête LCD 4x20 caractères à commande I2C (interface intégrée à base de PCF8574).

Le PIR est branché sur le 5V & GND de l'arduino (comme le LCD). La sortie OUT du PIR vers une pin de l'arduino SDA & SCL du LCD vers ceux de l'arduino

Cablage et logiciel réduits à leur plus simple expression pour mettre en évidence le problème. Rien à creuser côté logiciel. La pin arduino associée au capteur est juste en INPUT, sans tirage. Résistances de tirage de 4k7 sur SDA & SCL. Alim par sortie USB du PC.

Si je remplace le détecteur de mouvement par un autre modèle identique, le problème disparaît. C'est donc bien le détecteur lui-même qui est en cause.

Vous allez me dire que le problème est réglé, mais ce qui me turlupine, c'est que je ne comprends pas la cause possible de son dysfonctionnement.

L'allumage / extinction du rétro éclairage LCD entraînerait des parasites sur le 5V de l'arduino, au point de faire réagir un PIR sensor plus sensible que ces petites frères ?

Voyez-vous une autre explication ?

Ci-dessous les acteurs de l'énigme (photos exactes des modèles utilisés)

|500x500|500x414 |500x500 |500x500

Le code :

  • blink du rétro-éclairage (allumé 10 secondes / éteint 10 secondes)
  • répercussion de la sortie du détecteur de mouvement vers la led13 de la carte mega
#include <Arduino.h>
#include <Wire.h>

const uint8_t PIN_DETECTEUR_PIR = 40;
const uint8_t PIN_PIR_LED_TEMOIN = 13;

/************************************************************************************************************/
//Primitives I2C

void initialiserI2C()
{
  Wire.begin();
}

void ecrireI2C(uint8_t id_composant, uint8_t valeur)
{
  Wire.beginTransmission(id_composant);
  Wire.write(valeur);
  Wire.endTransmission();
}

/************************************************************************************************************/
//Primitives Ecran LCD I2C

const uint8_t ID_LCDI2C = 0b00100111;

void transmettreLCDI2C(uint8_t valeur, uint8_t masque)
{
  static uint8_t sortie_PCF8574 = 255;

  sortie_PCF8574 = (valeur & masque) | (sortie_PCF8574 & (~masque));
  ecrireI2C(ID_LCDI2C, sortie_PCF8574);
}

void impulsionEnableLCDI2C(uint8_t valeur)
{
  transmettreLCDI2C(valeur & 0b11111011, 0b11110111); delayMicroseconds(1);
  transmettreLCDI2C(valeur | 0b00000100, 0b11110111); delayMicroseconds(1);
  transmettreLCDI2C(valeur & 0b11111011, 0b11110111); delayMicroseconds(50);
}

void envoyerCommandeLCDI2C(uint8_t valeur)
{
  impulsionEnableLCDI2C(valeur & 0b11110000);
  impulsionEnableLCDI2C((valeur & 15) << 4);
}

void envoyerDonneeLCDI2C(uint8_t valeur)
{
  impulsionEnableLCDI2C((valeur & B11110000) | 0b00000001);
  impulsionEnableLCDI2C(((valeur & 15) << 4) | 0b00000001);
}

void initialiserLCDI2C()
{
  transmettreLCDI2C(0,255);
  delayMicroseconds(50000);

  impulsionEnableLCDI2C(0x30);
  delayMicroseconds(4500);

  impulsionEnableLCDI2C(0x30);
  delayMicroseconds(150);
  impulsionEnableLCDI2C(0x30);

  impulsionEnableLCDI2C(0x20);

  envoyerCommandeLCDI2C(0x20 | 0x08);
  envoyerCommandeLCDI2C(0x08 | 0x04);
  envoyerCommandeLCDI2C(0x01);
  delayMicroseconds(2000);

  envoyerCommandeLCDI2C(0x04 | 0x02 | 0x00);
  delay(10);
}

/************************************************************************************************************/
//Primitives Ecran LCD

void initialiserLCD()
{
  initialiserLCDI2C();
}

void allumerLCD()
{
  envoyerCommandeLCDI2C(0b00001100);
  transmettreLCDI2C(0b00001000,0b00001000);
}

void eteindreLCD()
{
  transmettreLCDI2C(0b00000000,0b00001000);
  envoyerCommandeLCDI2C(0b00001000);
}

void gererLCD()
{
  static uint32_t ref_millis = 0;
  static bool ecranAllume = false;
  
  if (millis() - ref_millis >= 10000UL)
  {
    if (ecranAllume)
      eteindreLCD();
    else
      allumerLCD();
    ref_millis += 10000UL;
    ecranAllume = !ecranAllume;
  }
}

/************************************************************************************************************/
//Gestion PIR

void initialiserPIR()
{
  pinMode(PIN_DETECTEUR_PIR, INPUT);
  pinMode(PIN_PIR_LED_TEMOIN, OUTPUT);
}

void gererPIR()
{
  digitalWrite(PIN_PIR_LED_TEMOIN, digitalRead(PIN_DETECTEUR_PIR));
}

/************************************************************************************************************/
//Fonctions principales

void setup()
{
  initialiserPIR();
  initialiserI2C();
  initialiserLCD();
}

void loop()
{
  gererLCD();
  gererPIR();
}

bonjour,
déjà eu ce soucis avec ce type de PIR et ses deux molettes.
on trouvait avant les même avec un seul potar et il n’y avait pas de soucis.
il faut jouer sans cesse sur les deux pour arriver à un équilibre précaire.

après, tenir compte aussi de la qualité de fabrication qui peut être plus ou moins bonne, il y a des rebus qui passent en maille.
pour être certain, utilise juste avec le code de base ce PIR, tu verras que ca varie énormément avec des rebonds.

Bonjour

Merci pour la réponse. Oui j'en ai acheté une petite dizaine dans les 1€50 pièce. Alors à ce prix, s'il y en a un ou deux foireux dans le lot, ce n'est pas bien grave. Leur sort est vite réglé. Je vais essayer de jouer avec les potars.

En fait, ce qui m'inquiète plus, c'est l'écran LCD. Je me dis que le PIR susceptible est peut-être un révélateur de perturbations sur ma ligne 5V ou GND lorsque j'éteins le rétroéclairage du LCD.

C'est un symptôme que je n'aime pas du tout, car je risque d'avoir des problèmes ailleurs sur d'autres composants.

Je vais tâcher de creuser l'affaire, en mesurant le courant/tension du LCD.

Le problème, c'est que sans oscillo je suis toujours limite pour descendre les diagnostics au niveau électrique. J'ai repoussé l'achat jusqu'ici, mais je sens que le gros barbu habillé en rouge sur son traineau va bientôt finir par s'occuper de mon cas.