jhonnyy:
il est possible que la lecture est des problème ? ex:parasite sur le ds18b20?
le code de getTemperatuer() le prévoit.
Si ce n'est pas toi qui l'a codé ainsi, quelqu'un d'autre a été prévoyant.
En programmation, tant desktop que embarqué, IL FAUT TOUJOURS PREVOIR LE PIRE
Dans ton cas tu va commander un chauffage.
Imagine que tu lises une fois une température inférieure à 10°. Tu vas donc allumer le chauffage. Et puis pendant la chauffe, un problème arrive sur la liaison avec leDS. S'il n'est pas sur la carte mais déporté par exemple, on peut imaginer que le fil se débranche ou ait été rongé par une souris (véridique). Ton code actuel va continuer à raisonner sur la dernière lecture de temp qui confirme qu'il faut continuer à chauffer.
Je ne sais ce que tu chauffe mais si c'est pour une couveuse à canard comme Infobarquee, il est presque sûr de récupérer en fin de journée les margrets cuits à point (or ca se mange plutôt rosé le canard ;)).
Donc il faut considérer les erreurs possibles vis à vis des risques possible et agir en conséquence.
pose toi la question : si je n'ai plus la température quel est le mode de fonctionnement dégrader que je dois appliquer :
- couper le chauffage
- le laisser en route en permanence
- appliquer un "PWM" de sécurité genre 1 minute en marche poru 2 minutes arrêté,
- sonner une corne de brume pour appeler les gardes côtes ....
Est il possible de loguer les erreur sur le serial ou la carte sd
Bien sur.
A ajouter dans la boucle. Tu peux logguer les lecture valides ainsi que les erreurs.
Il y a une partie qui est encore flou
j'ai un shield sd et network il bloque combien de ports ?
Comme je le dit dans ma signature la dessous : READ THAT FUCKING SCHEMATIC (cloné de la phrase de Linus Torvald : Read That Fucking Code qui incite les gens à lire le code Open Source pour être sur de savoir ce qu'il fait).
Si ton shield c'est le shield officiel Arduino tu trouveras le schéma sur la page consacré ici.
On voit que les broches suivantes sont utilisées :
- D4 : chip-select de la carte SD
- D10 : chip-select du chip Ethernet W5100
- D11, D12, D23 : interface SPI (respectivement MISO, MOSI et SCLK). Celles-ci sont difficile à voir sur le schéma car pour une raison incompréhensible, le shield Ethernet ne va pas les prendre sur le connecteur shield J1 mais sur le connecteur ISP. Ceci rend le shield Ethernet incompatible avec toute carte compatible qui ne respecte pas exactement l'emplacement du connecteur ICSP !
Donc ca te laisse pas mal d'IO pour ta sonde de température, ta commande de relai (a bouger de la broche D13 maintenant car celle-ci est utilisé par le bus SPI)
De plus comment afficher sur le web ou le port série si le relais est allumé ou non ? une variable à crée sur la parti de comparaison ?
et l'affiché sur la partie web mais je suis vraiment pas sur!!!
Dans le code que je t'ai renvoyé, j'ai déjà créé une variable chauffageOn qui trace cette information. Je m'en sert pour savoir si je doit comparer la température "< tmin" ou "> tmax". Tu peux l'utiliser aussi à l'extérieur.
Pour le port série, un Serial.print() bien placé fera l'affaire.
Pour la page web, il faut que le contenu de ta page contienne une partie dynamique qui dépend de la valeur de certaines variables.
Attention, par défaut, pour que l'affichage dans le navigateur web soit mis à jour il faut que le navigateur redemande la page.
Si tu veux que cela soit affiché automatiquement, il faut donc que le navigateur fasse la demande automatiquement d'un rafraîchissement de la page sans que l'utilisateur presse F5.
Pour un rafraichissement de toute la page, il suffit d'ajouter dans l'entête de ta page :
<header>
<meta http-equiv="refresh" content="30" />
</header>
La valeur donne la période de rafraîchissement en seconde.
Comme tu ne mesures la température que toute les minutes, ça ne sert à rien de rafraîchir plus vite.
Après pour avoir un rafraîchissement plus léger, tu peux faire du JavaScript et du HTML Dynamique pour éviter l'effet de remise à zéro de la page.
Sinon, ton dernier code commence a devenir lourd.
Ne laisse plus tout dans la fonction loop() mais découpe en sous fonctions qui deviennent maintenable et lisibles.
Une fonction qui dépasse 50 lignes de code (y compris les lignes blanches et les commentaires) devient illisibles.
On se perd dans les indentations, quand on lit la fin on ne sais plus ce que fait le début , ....
Découpe ton code par exemple :
void loop()
{
tache_lecture _temperature();
tache_gestion chauffage();
tache_ethernet();
}
Tu t'y retrouveras mieux, tu pourras plus facilement debugguer chaque partie individuellement.
Définis clairement les interfaces entre les taches c'est à dire les variables globales qui vont transporter l'information d'une tâche à l'autre.
J'ai donné à plusieurs personnes sur le forum déjà des exemples sur comment découper des tâches en machines d'état non bloquantes.
En attendant que j'écrive un Tuto sur le sujet, regarde mes réponses par exemple ici : http://arduino.cc/forum/index.php/topic,102491.0.html
En plus quand tu auras des problèmes et que tu feras appel à communauté,; tu auras plus facilement des réponses sur un code simple, localisé à un problème, que si tu nous balance 500 lignes de code en disant "çà marche pas".
A+