ESP8266 & MS5540 : besoin d'aide

Portrait de ViRouF

Bonjour,

J'ai une carte WemoS D1 R1 basée sur un ESP8266 et un capteur baro MS5540, dans le but de mesurer la hauteur d'eau dans un puit... enfin surtout sa variation bref ... Je suis plus petit développeur que grand électronicien et là j'atteinds un peu mes limites je pense ... un peu d'aide me ferait le plus grand bien!

J'ai récupéré un tuto basé sur arduino que j'essaie d'adapter à l'ESP8266, et j'ai trouvé un fil intéressant qui reprend le code du tuto (moins les erreurs dans les convertions de bit) ici.

J'arrive bien à lire les word 1 à 4, qui semble correspondre en ordre de grandeur celles en exemple de la datasheet du MS5540. Les valeurs que j'ai sont toujours constantes, je considère que c'est bon sur cette partie.

Par contre je n'arrive pas à lire les valeurs  D1 et D2 (la pression et température), j'ai systématiquement 65535, soit 16 bits à 1 donc je me dis qu'il y a un problème ... et je pense que c'est lié à la conversion qui est mentionné dans la datasheet qui semble cadencé par une clock et c'est là que je suis perdu ...

Dans le code Arduino original, il y avait:

TCCR1B = (TCCR1B & 0xF8) | 1 ; //generates the MCKL signal

Mais ce registre (de ce que j'ai compris) n'existe pas sur esp8266 et je suppose que c'est la raison du mon problème. Mais je ne comprends pas pourquoi j'arriverais à lire des valeurs word1...word4 alors que D1 & D2 non ... Ne comprenant pas le but de cette ligne je ne sais pas l'adapter ... !

Autre chose que je ne comprends pas c'est le divider SPI et son influence réelle. Le MS5540 fonctionne à 500khz de ce que j'ai compris, et l'arduino à 16Mhz du coup dans le code original, il y avait un divider à 16. Fonctionnant à 80Mhz, j'ai mis un divider à 128 mais ça ne suffit pas pour descendre à 500khz ... est-ce un problème selon vous?

Enfin autre chose obscure pour moi que j'aimerai comprendre c'est la fonction resetsensor(). J'ai bien vu le paragraphe dans la datasheet à ce sujet mais je ne comprends pas comment on sait qu'il faut passer 0x15, 0x55 et 0x40 ... mystère complet !

void resetsensor() { //this function keeps the sketch a little shorter
  SPI.setDataMode(SPI_MODE0);
  SPI.transfer(0x15);
  SPI.transfer(0x55);
  SPI.transfer(0x40); 
}

L'ensemble de "mon" code est là : https://github.com/ViRouF/prof_puit/blob/main/prof_puit/prof_puit.ino

Merci de vos idées / explications pour faire avancer mon smilblick! :-)

V.

Portrait de Walter

Bonjour,
pas sûr de pouvoir t'apporter beaucoup d'aide.
d'après la documentation de la librairie SPI sur arduino.cc, il ne faut plus utiliser setClockDivider, mais passer par SPISettings qui prend directement la période de l'horloge.
En plus les constantes prédéfinies sont à priori uniquement pour les µC AVR.

TCCR1B est un "timer" qui va générer l'horloge en fonction de la valeur donnée, de mémoire je crois qu'il faut utiliser attachInterrupt avec l'ESP8266

Portrait de ViRouF

Bonjour Walter,

merci de ta réponse, je vais regarder attachInterrupt() et le SPISettings. A défaut je me résignerai à passer sur du 328 pour avancer sur ce projet...

Portrait de Louis.D

Bonjour  ViRouF.
Je ne sais pas comment tu vas t'y prendre pour mesurer la hauteur d'eau dans ton puits mais si c'est comme je le crois c'est à dire de mettre ton MS5540 au fond du puits je doute que ce soit la bonne solution à un moment ou un autre l'eau arrivera à pénétrer dans ta sonde et adieu tes mesures et la sonde par la même occasion.

Je te conseillerais plutôt de mettre ta sonde bien au sec dans un volume étanche avec un orifice auquel tu peux raccorder un tuyau capillaire souple ( diamètre 4 mm intérieur par exemple style tuyau de bulleur d'aquarium ) Ce tuyau muni à l'autre extrémité d'une crépine lestée suffisamment pour le faire couler au fond du puits. . Le tuyau ainsi utiliser pour transmettre la pression à ta sonde sera bien à l'abris quel que soit la hauteur d'eau. Si tu as la possibilité d'imprimer en 3D ce volume étanche et voire même une crépine contenant du coton tu auras un montage sûr avec la possibilité d'intervenir facilement sur l'électronique de la sonde de pression. Voilà ce que j'ai réalisé et cela fonctionne parfaitement et sans aucun risque de détérioration. Avec des fils qui trainent dans l'eau on n'est pas à l'abri d'un problème de pénétration d'eau.

Cerise sur le gâteau tu peux utiliser un capteur moins cher et plus facile à employer avec un module wifi. Tu peux même te payer le lux de mettre très facilement un afficheur LCD ou même OLED !!

Portrait de ViRouF

il me reste du gel spécial pour étanchéifier les raccords élec immergés, donc je ne suis pas trop inquiet de ce côté là. Pour ce qui est du tuyau pour remonter l'info de pression, c'est pas idiot j'avais regardé de ce côté mais j'avais préféré la solution capteur immergé pour sa simplicité étant donné que je ne suis pas inquiet pour l'étanchéité.

Portrait de Louis.D

Comme tu voudras !

Portrait de Jetfuzz

Hello.
j'ai une question con ! je  me trompe peut être , mais je plonge !!!
le capteur de pression est immergé.
hors d'après mes cours de plongé, la pression augmente d'un bar par 10 mètres d'eau.
mais il faut tenir compte de la pression athmosphérique qui elle varie.
donc si vous voulez mesurer une hauteur d'eau, il faut un deuxième capteur pour connaître la pression athmosphérique, et ainsi avoir la vrai mesure de la hauteur d"eau.
je pense que je suis juste, parce qu'on estime que la pression au niveaux zéro est de 1 bar, mais ce n'est pas toujours vrai !!
donc si tu veux être précis il faut déduire la pression athmosphérique de ta mesure.
et donc il faut soit deux capteurs, soit un capteur différentiel .

pas sur de mon truc, c'est a creuser !!

cordialement 

jetfuzz

Portrait de ViRouF

Tu as raison, il faut un second capteur mais c'est plus facile et je suis plongeur aussi :-)

Portrait de Jetfuzz

clin.jpg

Portrait de Louis.D

La différence de pression entre mes maxi et mini est très faible. De plus la réserve d'eau dans un puits n'est pas toujours la même car les drains qui alimentent le puits ne sont pas constant en fonction de la météo et le terrain au tour du puits est gorgé d'eau. Par temps très sec la vitesse de remplissage est très faible par rapport à un temps très humide. Alors c'est n'est pas la peine de chercher à obtenir un volume à 10 ou 20 litres près !

En général la variation maximum se situe vers 60 à 70 millibars entre l'été et l'hiver ce qui revient à 6 ou 7 cm d'erreur donc pas vraiment un problème sur 5 à 7 mètres de hauteur d'eau  700 cm <> 7 cm = 1% d'erreur !!!

Bien sur si c'est un puits de 2 mètres de hauteur d'eau cela fait 3.5 %.
Pour un puits de 1 mètre de diamètre cela représente une erreur maxi d'environ  55 litres. sur 1570 litres ! Je ne pense pas que ce soit très important !

Erreur | Les Électroniciens.com

Message d'erreur

  • Warning : Error while sending QUERY packet. PID=28647 dans DatabaseStatementBase->execute() (ligne 2227 dans /home/leselectnn/www/includes/database/database.inc).
  • Warning : Cannot modify header information - headers already sent by (output started at /home/leselectnn/www/includes/bootstrap.inc:1640) dans drupal_send_headers() (ligne 1499 dans /home/leselectnn/www/includes/bootstrap.inc).
  • PDOException : SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: SELECT 1 AS expression FROM {variable} variable WHERE ( (name = :db_condition_placeholder_0) ); Array ( [:db_condition_placeholder_0] => cron_last ) dans variable_set() (ligne 1258 dans /home/leselectnn/www/includes/bootstrap.inc).

Erreur

Le site Web a rencontré une erreur inattendue. Veuillez essayer de nouveau plus tard.

Uncaught exception thrown in shutdown function.

PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: DELETE FROM {semaphore} WHERE (value = :db_condition_placeholder_0) ; Array ( [:db_condition_placeholder_0] =&gt; 146690418662b663e06900b2.25859808 ) in lock_release_all() (line 269 of /home/leselectnn/www/includes/lock.inc).