Bonjour,
J'ai pratiquement terminé un régulateur pilotant une pompe à chaleur de piscine destinée à chauffer ma maison (en premier lieu un ballon tampon)
D'ailleurs un proto du contrôleur avait très bien marché l'hiver dernier. Codé à l'arrache suite à la hausse des granulés de bois.
L'idée est de publier sur mon site le nouveau montage (réalisé autour d'un ESP32 et d'un Arduino Nano).
Il est même en mesure d'évaluer le COP de la pompe à chaleur avec un débitmètre et une mesure de la consommation électrique active (des Watts).
Reste encore 2 problèmes (pas critiques, mais bon !)
J'utilise pour l'affichage un écran TFT TJCTM24024 sur port SPI basé sur le contrôleur ILI9341. Cet écran très répandu est tactile (SPI) et possède un lecteur de carte SD.
Par exemple : https://www.amazon.fr/ILI9341-%C3%89...4507426&sr=8-5
Je code sous Visual Studio Code=>Platform IO, en C++, Espressif 32 V5.3.0, avec les librairies classiques ESp32 et TFT_eSPI pour l'écran TFT
L'ESP32 héberge un serveur WEB qui est susceptible d'envoyer sur une page web le contenu de la carte SD ou de lister des fichiers.
La carte SD est câblée sur le SPI par défaut de l'ESP32, (Je sais qu'il y a une obligation de respecter la broche SS de l'ESP 32 avec la carte SD).
MOSI => Pin 23
MISO => Pin 19
CLK => Pin18
SS => Pin 5
Ma carte SD (15 Mo ici) est systématiquement bien détectée au boot et j'y accède en lecture / écriture sans aucun problème... sauf que :
Pb numéro 1 : Si je tente d'écrire plus de, (mettons) 500 octets sur la SD avec plusieurs file.print("xxxx"); sans faire de temps en temps un file.close() ou un file.flush(), rien n'est écrit sur la carte SD... => J'ai donc inséré des file.flush() dans mon code, mais bon... J'ai pas trouvé d'infos sur une limitation de la quantité max de données à écrire sans devoir flusher le fichier (d’ailleurs, ce n'est pas automatique, j'imagine que non ?)
Pb numéro 2 Plus embêtant!! : Parfois la carte n'est plus reconnue, même après des SD.begin(); SD.end();.... SD.begin();
=> En effectuant un appui sur le bouton RESET, de l'ESP32 tout remarche bien... jusqu’à un moment où la carte ne sera à nouveau plus reconnue. (Je précise bien qu'il n'y a pas besoin de couper le courant).
Partout dans mon code, avant chaque accès en lecture ou écriture de la carte SD, je fais :
Mais cela ne marche pas.Code:while (SD_busy == true); // Attente libération de la carte SD. SD_busy est une variable globale, un "sémaphore", variable accessible par le serveur Web qui lui aussi accède à la carte SD) SD_busy = true; // Ma fonction prends la ressource carte SD delay(100); SD.begin(PIN_SD_CS); // Accès à la carte... Taille_SD = SD.cardSize() / 1024; // Exemple : Mesure l'espace disque de la carte SD (ko) Espace_libre_SD = Taille_SD - (SD.usedBytes() / 1024); // Exemple : Mesure l'espace disque restant sur la carte SD (ko) SD.end(); // On ferme... SD_busy = false; // Libération de la ressource
Les réponses sur les différents forums ne sont pas claires, y a des solutions en envoyant des 0xFF sur le bus SPI mais ça ne semble pas fonctionner et réussi juste à planter mon écran TFT...
J'ai comme l'impression que personne ne maitrise trop les cartes SD ??
Merci de votre aide si vous avez une idée !
Matt
-----