IZAR PULSE H3

Bonjour

Je voudrais dans un premier temps réussir à déclenché le counter++ du programme :

J'ai compteur d'eau DIEHL Metering C15FA compatible Ha + Ti (comme mentionné sous la roue voir photo):

J'ai récupéré un IZAR PULSE H3 3fils


Blanc = Pulse 1tour
Marron = GND
Vert = Sabotage

j'ai connecter à un Arduino Nano directement sur le cable fournie d'1m50 (pas de rallonge) :


avec ce programme :

const byte interruptPin2 = 2;
const byte interruptPin3 = 3;
int counter2 = 0;
int counter3 = 0;


void setup() {
  Serial.begin(9600);
  pinMode(interruptPin2, INPUT);
  pinMode(interruptPin3, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin2), blink2, CHANGE);
  attachInterrupt(digitalPinToInterrupt(interruptPin3), blink3, CHANGE);
}

void loop() {

}

void blink2() {

  counter2++ ;
  Serial.print("counter2 :");
  Serial.print(counter2);
  Serial.println(" ");

}

void blink3() {

  counter3++ ;
  Serial.print("counter3 :");
  Serial.print(counter3);
  Serial.println(" ");

}

J'ai mis la meme chose pour le sabotage et vert et le blanc.

J'ai fait quelques essais pas cela ne fonctionne pas , où est mon erreur ?

Bonsoir

Les fonctions blink2 et blink3 doivent être le plus rapides possible, enlever de ces fonctions les Serial.print, n'y laisser que les incrémentations de compteurs.

Faire cet affichage en dehors des fonctions d'interruption.
+Pourquoi 9600 bauds ? valeur débit 'historique' rarement justifiée de nos jours.

Avec CHANGE il y aura progression de 2 unités à chaque impulsion... sans compter les éventuels rebonds selon la technologie employée dans le module IZAR pour produire les impulsions.

Merci al1fch de la réponse, j'ai modifier le programme, j'ai mis en RISING, apparemment c'est des NPN dedans.

const byte interruptPin2 = 2;
const byte interruptPin3 = 3;
int counter2 = 0;
int counter3 = 0;
int oldCounter2, oldCounter3;


void setup()
{
  Serial.begin(115200);
  pinMode(interruptPin2, INPUT);
  pinMode(interruptPin3, INPUT);
  
  attachInterrupt(digitalPinToInterrupt(interruptPin2), blink2, RISING);
  attachInterrupt(digitalPinToInterrupt(interruptPin3), blink3, RISING);
}

void loop()
{

  if ( oldCounter2 != counter2 )
  {
    Serial.print("counter2 :");
    Serial.print(counter2);
    Serial.println(" ");
    oldCounter2 = counter2;
  }

  else
  {

  }

  if ( oldCounter3 != counter3 )
  {
    Serial.print("counter3 :");
    Serial.print(counter3);
    Serial.println(" ");
    oldCounter3 = counter3;
  }

  else
  {

  }



}



void blink2() 
{
  counter2++ ;
}

void blink3() 
{
  counter3++ ;
}

J'essayerais demain, le compteur est au fond du jardin dans une buse à 1m20 sous terre et le temps n'est pas propice à l'électronique :cold_sweat:.

Du coup ça fonctionne parfaitement sans aucune erreur avec un arduino depuis 15 jours
mais avec un ESP32 Wroom sur la pin GPIO4 ou autre il s'incréments par 4 ou + ou pas du tout...
Le code est différent avec les ESP ?

Oui, la gestion des interruptions a quelques particularités de codage sur ESP32

Voir les exemples fournis avec l'extention ESP32 pour IDE Arduino : catégorie ESP32/GPIO

Voir aussi dans le tutoriel suivant la partie sur l'interruption externe par le détecteur PIR

Où sont tes résistances de pull up ?
(les résistances de pull up internes aux=x GPIO de l'ESP32 sont très élevées, compter donne de sérieuces 'chances' de permettre au montage d'attraper des parasites)

Je ne vois pas la différence dans l'exemple du lien

  pinMode(motionSensor, INPUT_PULLUP);
  // Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
  attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);

Les pull up sont déclarés dans le setup:

const byte interruptPin2 = 2;
const byte interruptPin3 = 3;
int counter2 = 0;
int counter3 = 0;
int oldCounter2, oldCounter3;


void setup()
{
  Serial.begin(115200);
  pinMode(interruptPin2, INPUT);
  pinMode(interruptPin3, INPUT);
 
  attachInterrupt(digitalPinToInterrupt(interruptPin2), blink2, RISING);
  attachInterrupt(digitalPinToInterrupt(interruptPin3), blink3, RISING);
}

void loop()
{

  if ( oldCounter2 != counter2 )
  {
    Serial.print("counter2 :");
    Serial.print(counter2);
    Serial.println(" ");
    oldCounter2 = counter2;
  }

  else
  {

  }

  if ( oldCounter3 != counter3 )
  {
    Serial.print("counter3 :");
    Serial.print(counter3);
    Serial.println(" ");
    oldCounter3 = counter3;
  }

  else
  {

  }



}



void blink2()
{
  counter2++ ;
}

void blink3()
{
  counter3++ ;

}

Je vais mettre des résistances 10Kohms.

OK , je n'avais ap vu la ligne du code qui active les pull-up interne
Avec les ESP32 effe tivement mieux vaut 'assurer' à l'extérieur !

Dans le schéma du message initial on voit des résistances de 10k en 'pull down'.
Sont elles effectivement en place dans le montage ?
Le pont diviseur qu'elles forment avec les pull-up peut mettre trop bas le niveau haut

Le pull-up était interne à l'ESP32, je vais mettre une resistance de 10k

Mais la déclaration de l'attachinterrup est identique ?

Merci

J'essayerais demain, le compteur est au fond du jardin dans une buse à 1m20 sous terre et le temps n'est pas propice à l'électronique :cold_sweat:.

L'électronique risque de ne pas apprécier non plus l'humidité. Sans précautions (tropicalisation ou boîtier très étanche) le montage risque de fonctionner quelques mois, pas plus. De l'oxydation va commencer à se former sur toutes les soudures, jusqu'à ce que cela conduise suffisamment pour que cela ressemble à un court-circuit ou presque.

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