j'ai développé un système à base d'arduino méga qui me permet de mesurer un certain nombre de températures dans la maison, de les stoker sur une carte SD (celle du shield ethernet), de les lire via internet (les températures instantanées où celles stockées sur la carte) et de piloter un chauffage via internet.
Tout fonctionne bien pendant qlq temps mais au bout de 2 à 10 jours, tout est planté. Le nombre de jours de fonctionnement est très variable. Même avec le bouton reset, pas moyen de relancer, il faut débrancher l'alim qlq secondes pour décoincer.
Je ne vois pas d'où vient le problème. Parasitage de la ligne d'alim ? parasitage des DS18B20 via leur câbles qui font jusquà 3 mètres ? Il y a 5 capteurs. Problème de mémoire RAM saturée ?
J'avais lu qu'on ne peut pas faire fonctionner l'internet en même temps que la carte SD du shield, ça ne semble pas poser de problème mais y a t il des précautions à prendre ?
Bref, je ne trouve pas de solution ....
Merci pour votre aide !
Trop gros pour passer entre balises de code.
Le voilà en attaché vite fait, si j'ai oublié qlq chose qui permet un accès à mon installation, merci de me faire signe ...
D'après le compte-rendu de compilation, le code utilise déjà 62% de la mémoire rien que pour les variables globales.
Ethernet et SD doivent déclarer de leur coté des buffers lors des transferts.
Les Strings sont connues pour fractionner la mémoire suite à des réallocations de buffer lorsque les chaines s'allongent.
Il n'est pas impossible que tu exploses la mémoire de temps en temps.
Pour le vérifier :
utiliser MemoryFree pour vérifier l'utilisation de la mémoire
vérifier à l'intérieur de ton code que les variables allouées dynamiquement ne renvoient pas un null (signe que l'allocation n'a pas pu se faire) pas toujours facile car beaucoup d'allocations sont faites à l'intérieur des librairies.
merci pour vos réponses et mes meilleurs pour 2014 !
Pour le moment j'ai initialisé des var qui ne l’étaient pas, j'ai ajouté la fct int freeRam () indiquée dans le lien de fdufnews.
La valeurs renvoyée est de 1003 octets en serveur et 960 en serveur+accès à la SD (avant fermeture du fichier sur SD).
Je vais laisser évoluer qlq jours pour voir comment ça tourne.
ok merci pour les conseils.
J'ai remarqué que quand c'est planté, le système réagit toujours à une requête faite au serveur (une led du shield ethernet réagit à l'envoi d'une commande via mon smartphone par exp). Mais il ne se passe rien d'autre. D'ailleurs la lecture de températures et leur stockage SD ne marchent plus dans ce cas. Donc c'est si planté que ça ...
Pour la version du compilateur, c'est l'arduino 1.02
des nouvelles : ce soir je viens de m’apercevoir que la mémoire disponible a baissé d'un seul coup de 1003 à 488 octet, après 4 jours et demi de fonctionnement ... ça a l'air de rester stable à 488.... étrange ! Encore un coup comme ça et ce sera planté à nouveau.
Bonjour,
Je tombe sur ce post par hasard, et je rencontre moi aussi sur des plantages réguliers pour ma part le bouton RESET permet de redemarrer l'atmega voici les points communs par rapport a mon projet:
Synchronisation sur un serveur NTP (EthernetUDP buggé ?)
Utilisation de Relais (je me demande si je devrais pas avoir deux alimentations une pour les relais une pour l'arduino)
Pour ma part je n'utilise plus de string et je vais tenter de surveiller la mémoire. Si tu trouves l'origine de tes problèmes je suis tres intéressé!!
J'utilise une carte IBoard Pro Model: IM120724002.
Je pense avoir une piste : la chaîne string qui reçoit les commandes du client peut devenir très longue
Par exp :
GET / HTTP/1.1 Host: ...* Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36 Accept-Encoding: gzip,deflate,sdch Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.ÿD> 85.12
Dernière le GET on peut en plus mettre des commandes pour faire faire qlq chose au serveur.
SI qlq'un envoie une commande très longue ça peut certainement aller jusqu'à la saturation mémoire de l'arduino.
Je vais donc stopper la lecture de cette chaîne après une 100ene de caractères pour empêcher qu'elle prenne trop de place en mémoire.
Pour les relais, j'en utilise 4 en même temps, avec l'alim de l'arduino seulement, pas de soucis à priori.
Pour les Bib NTP, je fais une synchro toutes les 3 heures depuis près d'un an, pas de soucis à priori.
Bonjour
je n'ai toujours pas trouvé le probleme, sans avoir copie sur toi mon code ressemble beaucoup au tiens, je suis tombe sur la meme conclusion que toi, je passe par une chaine de char limitée a 100 et je compte les cacateres pour ne jamais dépasser. Si ton serveur est ouvert sur l'extérieur je confirme il y a des petits malins qui attaquent en envoyant des chaine tres tres longue il faut donc limiter. Sinon si tu fais une synchro comme moi, j'ai une fonction qui calcule le time_t pour chaque changement d'heure (en calculant par rapport a la regle standard le dimanche de mars et octobre ) donc si tu es interesse redis moi
En ce moment je ne tiens pas plus de 2 jours l'ethernet plante...et je cherche toujours...