Utilisation d'une mémoire externe

Bonjour,
Je travaille actuellement sur un projet de récolte de données à envoyer par sms( via arduino avec un module SIM900). Je dois pouvoir enregistrer ces données avant de les regrouper et les envoyer par SMS. Par exemple je dois mesurer un courant avec un capteur adéquat, je dois enregistrer la valeur obtenue et genre une minute après je dois lire cette valeur, y additionner une autre valeur et ensuite la réenregister ( au même emplacement je suppose afin de garder de la place) et ainsi de suite chaque minute jusqu'à arriver à une valeur désirée. Par la suite je dois pouvoir envoyer la valeur qui a été quantifiée. J'ai lu sur le forum que l'eeprom interne de l'arduino n'était pas prévue pour faire beaucoup d'enregistrement donc avec mon système je risque de rapidement la mettre à genoux. Une solution serait l'utilisation d'une eeprom externe ( une carte SD serait un peu gros ) mais je ne sais pas si elle est facilement programmable avec mon cahier des charges. Avez vous des conseils sur ce composant et sa programmation?

Un grand merci d'avance.

Bonjour,
Une eeprom en I2C fera certainement l'affaire.
@+

La mémoire vive de l'Arduino ne suffit pas, vu que tu réutilises le même emplacement mémoire ?
Ou c'est pour faire face aux coupures de courant de la carte ?

A te lire tu n'as besoin d'aucune mémoire supplémentaire, la RAM fait très bien l'affaire. Si maintenant il s'agit de maintenir ces données même si le courant vient à être coupé, il faut une mémoire morte. Vu que tu ne parles que d'une variable, et à raison d'un enregistrement par minute, effectivement le secteur d'EEPROM concerné sera statistiquement mort au bout de 70 jours.

Deux solutions :

J'ai fait une lib dessus : GitHub - battosai30/FRAM

Je déconseille l'EEPROM externe car la problématique de la durée de vie sera la même que pour l'interne du µC

Il existe des modules FRAM pour Arduino ou faut le bricoler soit même?

Tu les as acheté où les tiens?

En parlant de memoire.

Moi je bosse avec une Carte SD ( et carte MEGA2560 ), et je ne touve pas cela tres rapid !

Qui a deja observé ceci ?

Avantage de la SD est que l'on peut lire les donner sur un PC, et en stock quand meme un sacré paquet ( 2giga, pour ma carte )

Sinon, qu'elle alternative en cas de gros besoin de stockage ?
Mise a part balancer cela sur internet et de stocker cela sous forme de fichier ou base de données mySQL ( mais ca fait du dev dans l'arduino et sur le server internet ).

Tu veux stocker quoi pour plus de 2Go?

L'avantage de la SD c'est que la durée de vie est supérieure à l'EEPROM aussi

Nommam:
En parlant de memoire.

Moi je bosse avec une Carte SD ( et carte MEGA2560 ), et je ne touve pas cela tres rapid !

Qui a deja observé ceci ?

...

Bonjour Nomman
la "rapidité" etant une notion tres et particulirement relative, tu t'es trouvé coinçé par cette notion dans quel(s) contexte(s) ?
sous arduino ?

bha rien que le temp de d'ouvrir un fichier, de lire un simple Int ou Int[8], de refermer, ca doit bien prendre dans les 3secondes !
pour ecrire, je n'ai pas l'impression que cela aille plus vite !
Donc, j'en arrive a la conclusion, c'est l'ouverture des fichier qui est longue !

Pour le moment je n'utilise la SD que pour aller lire des valeurs pour l'init de mes programmes ( un genre de param.ini quoi )
Par la suite je vais datalogguer des infos, sous forme CSV.

Bon, ok j'ai du monde sur ma carte ( 6 capteurs de temparature DS18B20, 1 Servo, Un shield 2 ligne + bouton, une carte ethernet + SD, 2 sortie sur relais, et un RTC DS1307 ), c'est p'tre que j'ai deja trop chargé la mulle !

john_lenfr:
Tu veux stocker quoi pour plus de 2Go?

L'avantage de la SD c'est que la durée de vie est supérieure à l'EEPROM aussi

2giga me va tres bien !

Ben non moi je trouve pas :grin:

les DS18b20, la rtc et le 2ligne sont sur SDA et SCL
1 servo = 1 pin
Ethernet et SD pins SPI + 12+ 13+ 4
2 relais = 2 pins

Pas si chargé que ça :grin:

C'est presque comme moi:
http://johnlenfr.1s.fr/PHOTOS/Realisations/Electronique/arduino/2013-02-18RelaisBox/IMGP9459.jpg

Nommam:
bha rien que le temp de d'ouvrir un fichier, de lire un simple Int ou Int[8], de refermer, ca doit bien prendre dans les 3secondes !
pour ecrire, je n'ai pas l'impression que cela aille plus vite !
Donc, j'en arrive a la conclusion, c'est l'ouverture des fichier qui est longue !

Pour le moment je n'utilise la SD que pour aller lire des valeurs pour l'init de mes programmes ( un genre de param.ini quoi )
Par la suite je vais datalogguer des infos, sous forme CSV.

Bon, ok j'ai du monde sur ma carte ( 6 capteurs de temparature DS18B20, 1 Servo, Un shield 2 ligne + bouton, une carte ethernet + SD, 2 sortie sur relais, et un RTC DS1307 ), c'est p'tre que j'ai deja trop chargé la mulle !

Il faudrait que je retrouve (et avec quelle lib) , mais une fois la phase d'init (ouverture) passée
il me semble que l'ecriture sequentielle d'une simple valeur (et la lecture) etait acceptable dans l'environnement arduino .
evidemment si pour logger un simple byte acquis, tu "pisse" une ligne de 100 "ascii" ça peut coincer :grin:

john_lenfr:
Il existe des modules FRAM pour Arduino ou faut le bricoler soit même?

Tu les as acheté où les tiens?

Farnell. Moi je les utilises direct sur mes protos en CMS, je crois pas qu'elles existent en DIP mais il y a des adaptateurs SOIC - DIP

Ok, tout à l'heure je suis tombé là dessus en cherchant:
http://www.ebay.fr/itm/FM24CXX-FRAM-Board-FM24C04B-F-RAM-Serial-5V-Memory-Evaluation-Development-Module-/261006255458
Mais je me disais que t'avais peut-être une autre meilleure adresse :slight_smile:

J'ai pas trouvé chez dx, ça m'aurais arrangé pour grouper

Nan pas mieux. Après y'a pas besoin de composant externe, donc un soic-DIP et c'est réglé, à voir si tarifairement ça vaut le coup

Ouaip, je commande plus du tout chez Farnell donc je verrais si j'en ai réellement l'utilité dans mes projets.

Bonjour,
Concernant l'Eeprom interne, j'ai lu qu'on ne peut écrire environs que 100.000 et vu que j’écris environs toute les minutes, ça risque d'être court. Je fais cela afin de prévenir une perte de données due à une coupure d'alimentation.Sinon j'ai sous la main une Eeprom 24LC512 qui elle permet d'ecrire plus d'1 million de fois (un peu mieux, c'est déjà ça). Sinon j'ai lu sur des datasheet que les cartes SD mettaient du temps à être lue. Et en regardant les bibliothèques dans référence je n'ai pas trouvé comment relire une données bien précise sur la carte donc j'ai un peu cherché ailleurs.

B@tto: j'ai calculé que la FRAM pourrait travailler 1902587 années ( normalement ça serait assez) mais question, est il facile de lire et d'écrire au même endroit pour ensuite transmettre la données avant de l’effacer ( condensé de mon procédé).

Un grand merci pour vos conseils.

Avec ma lib l'utilisation est quasi identique qu'avec la lib EEPROM, donc très facile. La seule différence fondamentale c'est que la mémoire est organisée en deux page de 512 bytes, donc quand on écrit un byte il faut la page, l'adresse du byte et la valeur à y écrire. Idem en lecture sauf évidemment la donnée à écrire qui elle est retournée par la fonction

La valeur que je vais écrire sera un float surement. Je vais un peu regarder ta librairie, ça à l'air plutot interessant. Et en même temps je vais regarder pour programmer une Eeprom extérieure 24LC512 que j'ai sous a main pour voir ce que ça raconte aussi. Si vous avez une libraire pour ce composant ça m’intéresse.

Un grand merci.

Vu la façon dont tu décris les choses (mesure toutes les minutes, envois réguliers), y'aurait pas déjà une RTC type DS1307 dans ton système auquel cas elle contiendrait assez de NVRAM pour faire ce que tu souhaites ?

Sinon, bien que l'ajout d'une mémoire externe soit sans doute la solution la plus « facile », elle n'est sans doute pas nécessaire ici. Tu pourrais utiliser un double buffer circulaire[1] dans l'EEPROM. Si on suppose que ton EEPROM fait 1024 octets, en en réservant 512 pour le buffer de données (qui font 4 octets, donc 128 données possibles), et 128 octets pour le buffer de statut, cela te permettrait d'allonger la durée de vie de la mémoire à 100000x128=12,8 millions de cycles d'écriture, soit environ 24 ans en écrivant une fois par minute. Et il te reste encore 384 octets disponibles en EEPROM pour écrire autre chose.

Y'a même une note d'application d'Atmel pour expliquer ce genre de choses : http://www.atmel.com/Images/doc2526.pdf

[1] : Buffer circulaire — Wikipédia