Aide Arduino + carte SD

  • Auteur de la discussion ALSABRICOL
  • Date de début
A

ALSABRICOL

Ouvrier
Bonsoir,

Je suis à mon premier projet à base d'un Arduino. Cela me prend beaucoup de temps mais me passionne. Je veux contrôler le fonctionne d'une pompe d'un puits.

J'ai réussi à afficher sur un écran LCD, entre autre, le débit instantané, le débit cumulé, la durée de fonctionnement de la pompe et le nombre de cycles. Tout cela est OK (en mode simulation pour le moment).

J'aimerais utiliser une carte SD pour sauvegarder les différentes valeurs (débit, durée, ...) et surtout pouvoir les lire et continuer à les incrémenter après une coupure de courant. Grace aux différentes tutos sur internet j'arrive à écrire et à lire du texte sur la carte SD.

Ma question y a t-il moyen de sauvegarder et de récupérer des variables sur la carte SD. Je n'ai rien trouvé malgré mes longues recherches. Faut il en conclure que ce n'est pas réalisable ?
 
V

vince_007

Compagnon
Ben faut transformer tes variables en textes pour écrire puis les reconvertir à la lecture.
En langage C standard, c'est printf() ou sprintf() pour passer en texte et scanf() ou sscanf() pour passer en chiffre.
 
A

ALSABRICOL

Ouvrier
Merci pour vos réponses.

Ben faut transformer tes variables en textes pour écrire puis les reconvertir à la lecture.
En langage C standard, c'est printf() ou sprintf() pour passer en texte et scanf() ou sscanf() pour passer en chiffre.

J'ai fait une recherche ce n'est pas simple de mettre en oeuvre, de plus es ce applicable en langage Arduino ?

pour ton premier projet, tu commence fort!!

Quand je dis premier projet, j'entends première application utile. J'ai déjà fait un peu d'Arduino auparavant, mais que des fonctions basiques pour l'apprentissage. Il me faut une utilité pour persévérer.

Par curosité, quel est le but de ton projet?

J'ai un puits avec une pompe, à chaque fois que j'ai 0,5 m d'eau je mets la pompe en route, 2 capteurs immergés me commandent la pompe. Cela a bien fonctionné jusqu'au jour ou le capteur du bas est resté à l'état 1 alors qu'il n'y avait plus d'eau. Résultat pompe HS. Le système fonctionnait avec un relais, un compteur horaire et un compteur pour le nombre de cycles.
Je veux rajouter plusieurs sécurités (temps enveloppe, capteur de débit, ...) je me suis dit qu'avec Arduino c'est plus facilement réalisable. En plus avec un LCD je peux afficher des messages d'erreur et des grandeurs.
Le programme fonctionne mais je perds les infos en cas de coupure de courant. Je pourrais mettre, pour l'Arduino, une batterie pour son alimentation en cas de coupure du secteur. J'aimerais plutôt utiliser une carte SD si c'est possible.


Je suis allé voir, c'est l'exemple classique d'enregistrement des températures et autres grandeurs. Pour ce soir j'arrête je reprendrai la lecture demain.

Bonne fin de soirée
 
V

vince_007

Compagnon
Arduino c'est du langage C ou C++, oui les fonctions standard fonctionne, il faut inclure stdio.h et string.h

Les fonctions que je te cite sont des fonctions de débutant, tu vise peut être un peu haut pour commencer.
 
V

vres

Compagnon
Dernière édition:
J

jpbbricole

Compagnon
Bonjour ALSABRICOL
J'ai fait une recherche ce n'est pas simple de mettre en oeuvre, de plus es ce applicable en langage Arduino ?

Pour résumer et te donner quelques pistes de recherches.
Pour transformer une variable numérique (int boolean, word, long, float etc.), c’est la fonction String(nomDeLaVariableNumérique)

Pour faire l’inverse, ce sont les fonctions intrinsèque à String qui font le boulot :

String variableString = "4567.75";
int variableIntDeString = variableString.toInt();
float variableFloatDeString = variableString.toFloat();

Il y a encore beaucoup de fonctions avec nomDeLaVarialbeString. (suivi d'un point)

Petit bout de programme pour illustrer



Cordialement

Jpbbricole
 
L

lion10

Compagnon
Bonjour
Je pourrais mettre, pour l'Arduino, une batterie pour son alimentation en cas de coupure du secteur. J'aimerais plutôt utiliser une carte SD si c'est possible.
Que ce soit dans une carte à mémoire ou sur une eeprom ou mémoire flash vous pourrez y stocker des données qui résisteront à une coupure de courant.
Cependant si vous voulez quelque chose de fiable il vous faudra avoir une réserve d'énergie tampon (batterie, capacité de sauvegarde bien dimensionnée) pour parer à une coupure de tension en pleine écriture.

Vous pourriez vous passer de carte sd et lever le risque de mauvais contact en utilisant l'électronique embarquée d'origine de la carte.
https://www.carnetdumaker.net/artic...emoire-eeprom-avec-une-carte-arduino-genuino/

Concernant votre mesure de débit pourriez vous montrer quel type de capteur utilisez vous et la section de votre tuyau, j’ai plutôt vu des petits capteurs que j’imagine mal relier à un gros tuyau de pompe immergée comme cela à l’air d’être le cas ici
cdlt lion10
 
A

ALSABRICOL

Ouvrier
Bonjour à tous,

Merci pour vos différentes pistes. Je vais commencer à lire ces différentes solutions ce soir, il y a de quoi m'occuper un certain temps.

Quand tu dis "récupérer", c'est bien pour les relire sur un PC par exemple ou seulement pour une sauvegarde en cas de coupure de courant ?

Plus précisément voila ce que j'aimerais faire :
J'ai une variable 'int Comp1" qui s'incrémente à chaque cycle. J'affiche sur l'écran LCD "Nombre de cycle : " suivi de la valeur contenu dans int Comp1.
A chaque réinitialisation de l'Arduino la valeur repart à 0. Donc pour mon installation de pompage qui est alimentée par le secteur je vais perdre les valeurs à chaque disparition de l'alimentation. Pour les autres variables que j'aimerais sauvegarder il y va de même.
Mon idée serait d'écrire la valeur de "int Comp1" sur la carte SD.
Si Arduino se réinitialise je voudrais récupérer cette valeur sur la carte SD pendant le setup pour contineur de l'incrémenter à chaque cycle de pompage.
Dans la boucle j'écris cette valeur sur la carte SD après chaque cycle de pompage ou bien 1 ou 2 fois par 24 heures.

J'ai souvent lu qu' il n'y a pas de limite dans ce que l'on pouvait faire avec Arduino. Mais bien sur mon projet n'est pas évident pour débuter.

Concernant votre mesure de débit pourriez vous montrer quel type de capteur utilisez vous et la section de votre tuyau, j’ai plutôt vu des petits capteurs que j’imagine mal relier à un gros tuyau de pompe immergée comme cela à l’air d’être le cas ici

Je développerai ce soir.

Bonne après midi à tous
 
J

jpbbricole

Compagnon
Bonjour les mordus !

Que ce soit dans une carte à mémoire ou sur une eeprom ou mémoire flash vous pourrez y stocker des données qui résisteront à une coupure de courant.
Oui, mais attention avec l’écriture dans EEPROM, il y a un nombre d’écriture maximum ! ~10000 cycles, si on écrit souvent….

Plus précisément voila ce que j'aimerais faire :
Pour ton besoin, il faut écrire tes variables, dans un fichier, en les convertissant en chaîne de caractère comme expliqué ici, et ce au rythme désiré.
Ensuite, à chaque redémarrage de l’Arduino, il faut aller lire ces variables, dans le même ordre, en les convertissant dans leur type d’origine.
J’ai « commis » un petit bout de programme pour t’expliquer tout ça, c’est une adaption d’un autre programme que j’avais développé à l’époque, il y a, peut être des restes !

Attention à adapter le paramètre

#define sdCardCsPin 9 // Chip Select du lecteur de carte SD

à ton matériel.

A ta disposition pour d’éventuelles questions
Cordialement
Jpbbricole
 
V

vres

Compagnon
Mon idée serait d'écrire la valeur de "int Comp1" sur la carte SD.
Si Arduino se réinitialise je voudrais récupérer cette valeur sur la carte SD pendant le setup pour contineur de l'incrémenter à chaque cycle de pompage.
Dans la boucle j'écris cette valeur sur la carte SD après chaque cycle de pompage ou bien 1 ou 2 fois par 24 heures.

J'ai souvent lu qu' il n'y a pas de limite dans ce que l'on pouvait faire avec Arduino. Mais bien sur mon projet n'est pas évident pour débuter.

Dans ce cas si tu n'as pas besoin d'accéder au données il n'y a pas besoin de convertir en texte, on peut faire une sauvegarde en binaire . C'est vraiment le plus simple.


Je n'ai pas fait de test, je n'ai pas de carte SD.
 
J

jpbbricole

Compagnon
Salut CNCSERV
Dans ce cas si tu n'as pas besoin d'accéder au données il n'y a pas besoin de convertir en texte, on peut faire une sauvegarde en binaire . C'est vraiment le plus simple.
C'est vrai que ta méthode avec structure fait moins bricole que la mienne, c'est super je n'y n'était pas arrivé avec cette méthode, j'ai une carte SD et j'adapte mon exemple en fonction du tiens.

Cordialement
jpbbricole
 
A

ALSABRICOL

Ouvrier
Bonsoir,

Concernant votre mesure de débit pourriez vous montrer quel type de capteur utilisez vous et la section de votre tuyau, j’ai plutôt vu des petits capteurs que j’imagine mal relier à un gros tuyau de pompe immergée comme cela à l’air d’être le cas ici
cdlt lion10

Je pense mettre ce type de capteur.

https://www.ebay.fr/itm/292180098627?ul_noapp=true

J'utilise une pompe de surface. Au début j'avais une pompe immergée mais après 2 passages en SAV j'ai abandonné et mis une pompe de surface. Pour les essais et la mise au point du programme j'utilise le même type de capteur en 1/2 pouce en soufflant dedans.
 
A

ALSABRICOL

Ouvrier
jpbbricole,
CNCSERV,

Merci pour votre aide. Je pense que j'ai affaire à deux "PRO" d'Arduino.

Il me faudra bien le week end pour assimiler toutes ces nouvelles fonctions.
Je vous tiens au courant de mes avancés.

Bonne soirée
 
R

rentemplan

Apprenti
Bonsoir @ALSABRICOL
J'ai pour le travail j'ai mis en place ce type de compteurs pour du gaz
Sur le carte s.d. est inscrit la configuration du compteur qui est lu à chaque démarrage de l'arduino ainsi que les indexs de comptage des compteurs il transmet les valeurs à serveur web mais il test la connexion au serveur avant l'envoie si pas de connexion il écrit les valeurs sur la carte s.d. quand la connexion reviens l'auduino reprend les index de la carte s.d. pour les transmettre au serveur web
Si cela t'intéresse je jeux te transmettre les sketchs
Cordialement
 
A

ALSABRICOL

Ouvrier
Bonjour rentemplan,

Merci pour ta proposition.
Ton descriptif semble correspondre à mon projet.
Je veux bien que tu me transmettes les skecths.
Il y aura certainement des parties qui pourraient me servir.
 
R

rentemplan

Apprenti
voila les fichiers
 

Fichiers joints

  • compteur.zip
    3.9 Mo · Affichages: 115
A

ALSABRICOL

Ouvrier
Bonsoir retemplan,

Merci pour ce partage.
J'ai ouvert le sketch, je vais essayer de le simplifier pour n'en garder que ce qui est nécessaire pour mon application.

Par exemple la partie : void WriteSD() // Fonction d'écriture sur carte SD si echec d'envois

J'ai de quoi passer quelques soirées.
 
R

rentemplan

Apprenti
Bonsoir @ALSABRICOL
Je t' est pas donné trop d'explication mais le montage est fait avec un sheild combo Ethernet et carte s.d. et un sheild horloge rtc pour l'heurodatage.
À la mise en route , l'arduino lit sa config sur la carte s.d. et commence compter les impulsions du compteur.
le compteur génère les puls par un contact sec
Les données sont traitées dans une bdd c'est dans cette bdd que sont traitées les ratios des compteurs (puls par m3) ensuite les données sont affichées dans un graphique sur une page web
Voilà pour le gros des explications.
 
A

ALSABRICOL

Ouvrier
Bonsoir,

Merci pour ces explications.
Je n'aurai pas besoin de toutes les fonctions.
Ce soir j'ai réussi à écrire sur la carte SD la valeur du compteur du nombre de mise en route.
Prochaine étape lire et réutiliser de la dernière valeur du compteur.
 
A

ALSABRICOL

Ouvrier
Bonsoir,

J'ai réussi à faire fonctionner un programme qui réponde à mes attentes.

J'ai commencé par étudier le programme de rentemplan et supprimer ce qui ne me servirait pas (combo Ethernet et un sheild horloge rtc pour l'heurodatage, ...) car il correspondait le plus à ce que je voulais.
J'ai compris la "philosophie", j'arrivais à lire la valeur de la variable sauvegardée sur la carte SD mais je n'arrivais pas à réutiliser cette valeur. Certainement une histoire de "string" non maitrisée.

Je suis donc passé au programme de jpbbricole. Même traitement : suppression de ce qui me paraissait inutile pour mon application (float variableFloat; unsigned long variableUnsLong; boolean variableBoolean, ...).
Par contre je n'ai pas compris toute la "philosophie" (struct, string, ...) mais après pas mal de tâtonnements j'ai réussi. A chaque remise sous tension je récupère bien la dernière valeur de mon compteur et il continue de s'incrémenter à chaque remise en route de la pompe.

Encore merci à CNCSERV, jpbbricole, rentemplan, pour leur aide.

Suite des opérations : intégrer ce bout de programme au programme qui gère la mise en route de la pompe et l'affichage sur LCD.

PS : Si cela intéresse quelqu'un je peux partager le programme.

A+
 
A

ALSABRICOL

Ouvrier
Bonsoir et tous mes voeux pour la nouvelle année,

Quelques nouvelles de mon projet.
Le programme fonctionne correctement selon mon cahier des charges.
J'ai donc procédé à l'implantation du matériel dans un coffret et réaliser le câblage.

7 janv 2019 (2).JPG


Mais bien sur il y a un hic !
J'ai mis un contacteur dans le coffret pour alimenter le moteur de la pompe (230 V).
Sans avoir raccordé le moteur, rien que le fait d'enclencher le contacteur l'afficheur est parasité.
En mettant un antiparisite aux bornes de la bobine du relais le phénomène apparait plus que 1 fois sur 5 enclenchements.

7 janv 2019 (3).JPG


Le câblage non encore finalisé.

7 janv 2019 (5).JPG


Es ce que le fait de sortir le contacteur va résoudre le problème ? Mais il y aura toujours 2 conducteurs qui vont rentrer dans le coffret pour alimenter la bobine du contacteur en 230 V.
 
J

JMe87

Apprenti
Bonjour,
tres belle realisation, face avant tres pro. Chapeau
Pour ton probleme, remplace relais et contacteur par un relais statique, si possible place a l'exterieur de ton boitier.
Modele 40A pour moins de 4 € sur Aliexpress.
Jacques
 
T

tronix

Compagnon
Bonjour,

c'est beau à l'extérieur, beaucoup moins à l'intérieur (désolé...), il y a beaucoup trop de filasse. Les cartes sont reliées entre elles, donc y compris par le 0V, mais cette masse est très mauvaise en hautes fréquences. D'autre part, les signaux interconnectés, en particulier l'I2C ou le SPI, le sont sur des longueurs trop grandes sans précautions, alors que ce sont des bus pas faits pour de la liaison inter cartes. Il faudrait au moins des drivers adaptés.
Donc, refaire le câblage avec des fils le plus court possible. Torsadés ou en câble blindé. Et soigner la masse. Un petit fil a une impédance élevée face à des parasites, c'est un peu comme si le fil n'existait pas. Une tresse de masse, courte, entre les carte, peut arranger les choses. Et faire suivre les fils de connexion au plus près de cette tresse, donc avec la même longueur et en les attachant ensemble, pour avoir une surface de boucle très faible. Et éviter les boucles de masse.
Sortir le contacteur peut arranger les choses, mais le problème vient d'abord d'un mauvais câblage. C'est donc par là qu'il faut commencer, et un contacteur ne doit pas perturber. Le déplacer ne ferait que masquer temporairement le défaut.
 
Dernière édition:
J

jpbbricole

Compagnon
Bonsoir ALSABRICOL
Sans avoir raccordé le moteur, rien que le fait d'enclencher le contacteur l'afficheur est parasité.
Sur le bus i2C, as-tu mis des résistances de polarisation sur les signaux SDA et SCL comme indiqué dans ces exemples, perso, je mets, en général, 1,5k.

Cordialement
jpbbricole
 
A

ALSABRICOL

Ouvrier
Bonsoir,
Merci pour vos interventions.

beaucoup moins à l'intérieur (désolé...), il y a beaucoup trop de filasse.

Effectivement mon câblage est "merdique", je me doutais bien qu'il serait source problème.
Je vais donc en premier essayer d'arranger la chose en appliquant tes conseils.

as-tu mis des résistances de polarisation

Je n'ai pas mis de résistances, mais je vais le faire.

remplace relais et contacteur par un relais statique

J'y ai pensé mais je n'en avais pas. Je vais en commander et si nécessaire je ferais l'échange.

Comme je l'ai dit c'est mon premier projet à base d'Arduino. Je découvre cette technologie avec les problèmes du débutant, par exemple ce soir j'ai galéré pour installer le logiciel et les librairies sur un PC portable.

A suivre
 
A

albatros_del_sur

Compagnon
Bonsoir,
Contacteur ou relais statique, même combat. Comme dit par @tronix il faut revoir le câblage plus court, mais aussi bien séparer les courants forts des faibles . Une cloison de séparation à l'intérieur du coffret en tôle fine fera office de blindage si elle est bien reliée à la masse. Les blindages ne doivent être reliés qu'à une extrémité pour éviter les boucles d'induction pouvant récupérer des champs magnétiques parasites.
 
A

ALSABRICOL

Ouvrier
Bonjour,

Alors j'ai refait au mieux le câblage.
Plus de problème sans brancher de moteur. J'ai donc essayé en branchant un aspirateur pour simuler le moteur de la pompe. Affichage du LCD satisfaisant.
Je réalise un montage avec une pompe 12 V pour calibrer le capteur de débit. Cette pompe 12 V est alimentée par un chargeur de batterie que je branche sur mon coffret. Catastrophe, le LCD est parasité voir carrément bloqué, aucun affichage et ceci lors de l'enclenchement ou de la coupure du contacteur. Je remets mon aspirateur en parallèle avec le chargeur et voila que mon LCD fonctionne à nouveau.
Conclusion : phénomène imprévisible, ingérable, ...........
J'ai quand même calibré le capteur de débit et vérifier le reste du fonctionnement. Pour le moment j'en reste là en attendant le printemps pour une installation en situation. Je risque encore d'avoir des surprises car les longueurs de câble ne seront pas les mêmes que sur mon établi.

La suite au printemps.
 
Dernière édition:

Sujets similaires

Dudulle
Général langage MMBASIC
Réponses
14
Affichages
2 240
greg_elec
greg_elec
T
Réponses
2
Affichages
49 221
Tristan l'apprenti
T
osiver
Réponses
14
Affichages
60 226
osiver
osiver
Charly 57
Réponses
20
Affichages
59 674
diiity
D
R
Réponses
13
Affichages
3 745
rd35520
R
JCS
Réponses
54
Affichages
12 910
jpbbricole
J
Loulou
Réponses
11
Affichages
2 604
wika58
wika58
J
Réponses
113
Affichages
25 050
sabeldom
S
L
Réponses
2
Affichages
1 836
ladolDéjeune
L
J
Réponses
9
Affichages
2 271
jpbbricole
J
Haut