Incrémentation d'impulsions dans une rom

Bonjour à tous,

j'ai un petit projet iot en cours de réalisation, mais je bloque sur l'acquisition/stockage d'une "donnée".

En gros, j'ai un contact reed, petite ampoule qui se ferme quand un aimant est proche.

Le contact reed me permet de compter des impulsions.

Les impulsions doivent s'incrémenter, et se stocker dans une mémoire de très basse consommation car mon projet est alimenté par batterie (durée de vie : plusieurs années).

Tous les 24h, mon chip sort d'un mode "sommeil profond (deepsleep)" pour venir chercher le nombre d'impulsions totalisé sur 24h. Les impulsions sont ensuite envoyées sur un serveur local

Est-ce qu'il existe un chip qui me permet de venir totaliser et stocker mon nombre d'impulsion ?

Merci d'avance :slight_smile:

Bonjour sleve,

il te faut un "compteur binaire" comme le composant 4040 (CMOS) , une puce à 16 pattes qui ne consomme presque rien et coûte moins d'un euro :slight_smile:

Tu raccordes ton ampoule reed sur son entrée de comptage, et tu raccordes les (2...12) broches de sorties du 4040 sur des broches en entrées sur l'arduino. Tant qu'il dort, le compteur 4040 mémorise les impulsions qu'il voit arriver sur son entrée ; à son réveil, l'arduino lit les 2..12 broches du 4040, en détermine le nombre d'impulsion, remet à zéro le compteur 4040 en activant sa broche de "reset", et repart au dodo pour 24H.

Seulement si tu ne fais que cela, ça ne fonctionnera pas (ou alors pas, mais pas bien du tout :frowning: )

  1. il faudra impérativement filtrer les impulsions provenant de l'ampoule reed, afin de ne pas compter les rebonds de la lame au moment où l'aimant s'approche et s'éloigne (il faut un condensateur et une résistance),

  2. il faudra isoler les connexions en sortie du 4040 vers l'arduino, afin que le courant ne puisse pas passer du 4040 alimenté par pile, vers l'arduino qui pourrait être "consommateur" (à vérifier), et vider ta pile plus rapidement que prévu (un transistor pour chacune des connexions pourrait être nécessaire)

il doit y a voir une autre contrainte à contourner, mais je ne vois pas tout de suite.

Tu as combien d'impulsions par jour, et chaque impulsion dure combien de temps ?

sleve:
Bonjour à tous,

j'ai un petit projet iot en cours de réalisation, mais je bloque sur l'acquisition/stockage d'une "donnée".

En gros, j'ai un contact reed, petite ampoule qui se ferme quand un aimant est proche.

Le contact reed me permet de compter des impulsions.

Les impulsions doivent s'incrémenter, et se stocker dans une mémoire de très basse consommation car mon projet est alimenté par batterie (durée de vie : plusieurs années).

Tous les 24h, mon chip sort d'un mode "sommeil profond (deepsleep)" pour venir chercher le nombre d'impulsions totalisé sur 24h. Les impulsions sont ensuite envoyées sur un serveur local

Est-ce qu'il existe un chip qui me permet de venir totaliser et stocker mon nombre d'impulsion ?

Merci d'avance :slight_smile:

bonsoir
en compo simple "events counter" , il n'y a pas (plus) grand chose sur le marché.

-Il y avait encore il y a qq années le DS2423 en 1Wire mais qui n'est plus en production , c’était pourtant un compo bien sympa d'utilisation (j'en ai encore un peu en stock, mais je n'en cède pas :grin: )

-Le PCF8583 en I²C

  • Le DS1683

Ah oui.

Au moment où l'arduino se réveille, ses broches changent d'état et deviennent actives. La probabilité qu'il active la remise à zéro avant de pouvoir lire le nombre d'impulsion du 4040 est de 99,9% :slight_smile:

il faut encore :
3) trouver un mécanisme afin que le réveil de l'arduino n'efface pas prématurément la valeur de comptage
du 4040

il faut trouver comment faire une tringlerie pour éviter cette limitation...

  • J'ai déjà un filtre sur la reed pour éviter les rebonds

  • Pour les fréquences d'impulsions, je peux avoir du 3hz, il se peut aussi que l'aimant reste sur la reed, donc contact fermé pendant une longue période ( plusieurs heures ).

je vais regarder la datasheet de la 4040, et essayer de potasser les "binary counters" & "events counter"

Merci de m'avoir guidé, je reviens sur le topic si j'ai d'autres problèmes ( et il y en aura surement ^^ )

Bonjour,

le chip SN74LV8154 me semble super, facile à trouver et prix abordable. J'ai juste quelques questions avant de commander mes samples pour faire mes tests.

DATASHEET

D'après la datasheet, si je veux le mettre en 32bits, je dois relier CLKBEN et RCOA.

Pour lire ma donnée (nombre d'impulsions), je dois utiliser les sorties Y0->Y7, comme je n'ai que 8 sorties pour un chiffre 32 bits, je dois utiliser les inputs GAL GAU GBL GBAU.

‭‭11111111 + 11111111 + 11111111 + 11111111‬

cAHigh cALow cBHigh cBlow

Si je branche l'input GAL à la GND, je récupère cALow sur mes outputs Y0-Y7 ?

J'ai du mal à comprendre la différence entre CLKA et RCLK, si quelqu'un peut m'éclairer.

J'ai encore pas mal de questions, mais je préfère attendre quelques réponses avant d'aller plus loin

Merci :slight_smile:

Ok super, merci pour les explications pepe

Autre question :

Comment diminuer le nombre de pin qu'utilise le SN74LV8154 ?

Car en Input elle utilise déjà 6 pins : GAL GAU GBL GBAU RCLK CCLR

En Output j'ai 8 pins (Y0->y7), j'avais pensé à utiliser un encoder (8to3 priority) pour les sorties y0->y7

j'utilise une esp8266, je risque d'être trop limité avec le nombre de I/O de cette board ? Sinon je change et je bascule vers un ESP32. Je viens de voir qu'on peut utiliser des cartes d'extension, style : MCP23017

Yop,

le projet avance doucement mais sûrement, la partie wifi hotspot fonctionne, j'ai su ajouter des inputs/outputs avec le MCP23017 sur mon esp8266.

Le SN74LV8154 est branché aussi, mais j'ai une petite question.

(J'ai compris le fonctionnement du SN74LV8154)

Pour résumer je récupère cBHigh,cBLow,cAHigh et cALow

Pas de problème pour récupérer les données, mais y a t'il une fonction pour convertir cette série de 4 bytes en int (cette variable est mon nombre d'impulsions)

11111111 11111111 11111111 11111111
cBHigh cBLow cAHigh cALow

Bonsoir à tous,

Je n'arrive pas à faire fonctionner le SN74LV8154. J'ai vérifié mon branchement en faisant un debug avec une led pour être sure que mes connections soient bonnes, mais là je bloque :confused:

Donc pour la connection du chip je pense avoir fait comme dans la datasheet
Comme j'utilise le SN74LV8154 en 32 bits, CLKA et CLKB sont liées, pareil pour RCOA et CLKBEN.

• If only one counter is needed,connect the single pulse source to both CLKA and CLKB.
• Alsoc onnect CLKBENt o RCOA instead of ground

j'ai utilisé la capa pour l'alimentation comme dans la datasheet.

Voilà ma séquence pour lire mes bits, quand je simule une impulsion sur CLKA j'ai rien de logique sur mes sorties

  mcp.digitalWrite(8,HIGH); // Je bloque CCLR sur HIGH pour ne PAS reset le counter
  mcp.digitalWrite(13, HIGH); // RCLK à 1 pour "bloquer" l'état du counter
  delay(200);
  mcp.digitalWrite(9, LOW); //   GAL à 1
  mcp.digitalWrite(10, HIGH); // GAU à 0
  mcp.digitalWrite(11, HIGH); // GBL à 0
  mcp.digitalWrite(12, HIGH); // GBU à 0
  Serial.print("GAL:");
  delay(200);
  Serial.print(mcp.digitalRead(0));
  Serial.print(mcp.digitalRead(1));
  Serial.print(mcp.digitalRead(2));
  Serial.print(mcp.digitalRead(3));
  Serial.print(mcp.digitalRead(4));
  Serial.print(mcp.digitalRead(5));
  Serial.print(mcp.digitalRead(6));
  Serial.print(mcp.digitalRead(7));
  delay(200);
  mcp.digitalWrite(9, HIGH); // GAL à 0
  mcp.digitalWrite(10, LOW); // GAU à 1
  mcp.digitalWrite(11, HIGH); //GBL à 0
  mcp.digitalWrite(12, HIGH); //GBU à 0
  Serial.print("GAU:");
  delay(200);
  Serial.print(mcp.digitalRead(0));
  Serial.print(mcp.digitalRead(1));
  Serial.print(mcp.digitalRead(2));
  Serial.print(mcp.digitalRead(3));
  Serial.print(mcp.digitalRead(4));
  Serial.print(mcp.digitalRead(5));
  Serial.print(mcp.digitalRead(6));
  Serial.print(mcp.digitalRead(7));
  delay(200);
  mcp.digitalWrite(9, HIGH); // GAL à 0
  mcp.digitalWrite(10, HIGH); //GAU à 0
  mcp.digitalWrite(11, LOW); // GBL à 1
  mcp.digitalWrite(12, HIGH); //GBU à 0
  Serial.print("GBL:");
  delay(200);
  Serial.print(mcp.digitalRead(0));
  Serial.print(mcp.digitalRead(1));
  Serial.print(mcp.digitalRead(2));
  Serial.print(mcp.digitalRead(3));
  Serial.print(mcp.digitalRead(4));
  Serial.print(mcp.digitalRead(5));
  Serial.print(mcp.digitalRead(6));
  Serial.print(mcp.digitalRead(7));
  delay(200);
  mcp.digitalWrite(9, HIGH); // GAL à 0
  mcp.digitalWrite(10, HIGH); //GAU à 0
  mcp.digitalWrite(11, HIGH); //GBL à 0
  mcp.digitalWrite(12, LOW); // GBU à 1
  Serial.print("GBU:");
  delay(200);
  Serial.print(mcp.digitalRead(0));
  Serial.print(mcp.digitalRead(1));
  Serial.print(mcp.digitalRead(2));
  Serial.print(mcp.digitalRead(3));
  Serial.print(mcp.digitalRead(4));
  Serial.print(mcp.digitalRead(5));
  Serial.print(mcp.digitalRead(6));
  Serial.print(mcp.digitalRead(7));
  Serial.println(" ");
  mcp.digitalWrite(13, LOW); // RCLK à 0 => fin de la lecture des impulsions

Voilà un exemple de ce que j'ai en sortie, la séquence démarre, je touche avec mon doigt la sortie CLKA et puis je ne fais plus rien