[Projet en cours] Sonde de température piscine en Wifi

Bonjour à tous,

Je suis nouveau en Arduino et je galère pas mal. Aussi je vous présente mon projet et mes galère en même temps :slight_smile:

But du projet :
Relever la température de la piscine de ma copropriété et l'envoyer sur le site que j'ai fait pour cette dernière. Les graphiques (courbes) de températures sont générés avec la librairie php pChart via des requêtes en base mySQL. Le transfert des données se fera en Wi-Fi via la puce de Roving Network.

Matériel du projet :

Les galères.
Je commence par la sonde DS18B20. Je n'arrive pas à la cabler correctement. J'ai déja réussi à faire un test fonctionnel avec un LM35. J'ai réussi à récupérer les données via le port COM et les envoyer sur mon site web.
J'ai cherché sur pas mal de forum et entre autre celui ci mais je n'arrive pas à trouver mon erreur. J'ai regardé ce post par exemple : Arduino Forum. En pj j'ai mis une photo de mon montage.

J'ai essayé le testeur de Artouste mais j'ai toujours du "END OF SCAN". avec rien comme info. J'ai aussi reregardé son plan ou le GND doit etre branché sur le 5V mais je comprends pas trop comment le cabler. :~

Dans un premier temps j'aimera un peu d'aide pour comprendre ce qui ne fonctionne pas avec ce cablage. MERCI à vous :blush:

Engel1st:
Je commence par la sonde DS18B20. Je n'arrive pas à la cabler correctement. J'ai déja réussi à faire un test fonctionnel avec un LM35. J'ai réussi à récupérer les données via le port COM et les envoyer sur mon site web.
J'ai cherché sur pas mal de forum et entre autre celui ci mais je n'arrive pas à trouver mon erreur. J'ai regardé ce post par exemple : Arduino Forum. En pj j'ai mis une photo de mon montage.

J'ai essayé le testeur de Artouste mais j'ai toujours du "END OF SCAN". avec rien comme info. J'ai aussi reregardé son plan ou le GND doit etre branché sur le 5V mais je comprends pas trop comment le cabler. :~

Dans un premier temps j'aimera un peu d'aide pour comprendre ce qui ne fonctionne pas avec ce cablage. MERCI à vous :blush:

bonjour
ta sonde sort 3 fils
Rouge
Noir
Blanc

tu relie ensemble noir et rouge que tu connecte au GND de l'arduino
tu relie Blanc sur digital8 de l'arduino
tu mets une resistance de 4.7kohm entre +5V arduino d'un coté et blanc/digital8 de l'autre
et tu retest avec le scanner 1wire

Salut Artouste,

Merci de ton aide. Alors soit j'ai un problème avec ma sonde soit je suis un blaireau.
Voilà une photo du montage en PJ.
j'ai donc le ground qui est branché sur le noir et le rouge.
j'ai une résistance qui est branchée sur le 5V + le blanc + le digital 8.
Toujours "END OF SCAN." dans le scanner. :cold_sweat:

Engel1st:
Salut Artouste,

Merci de ton aide. Alors soit j'ai un problème avec ma sonde soit je suis un blaireau.
Voilà une photo du montage en PJ.
j'ai donc le ground qui est branché sur le noir et le rouge.
j'ai une résistance qui est branchée sur le 5V + le blanc + le digital 8.
Toujours "END OF SCAN." dans le scanner. :cold_sweat:

à l'oeil le cablage semble correct, mais la photo n'est pas nette
tu es sur de la valeur de la resistance ? 4.7K ( jaune violet rouge) ?
jaune violet ça semble OK, mais rouge je ne distingue pas

Bonsoir Artouste,

Tu avais vu juste! Je suis un boulet au lieu d'une résistance de 4.7 Kiloohm j'avais pris 4.7 Ohm... Forcément ca ne fonctionnait pas bien...
Maintenant c'est nickel. J'ai soudé un jack et j'ai percé le boitier, désormais j'ai la sonde via un jack 3.5 ca marche nickel. J'attaque le Wifi now!

Engel1st:
Bonsoir Artouste,

Tu avais vu juste! Je suis un boulet au lieu d'une résistance de 4.7 Kiloohm j'avais pris 4.7 Ohm... Forcément ca ne fonctionnait pas bien...
Maintenant c'est nickel. J'ai soudé un jack et j'ai percé le boitier, désormais j'ai la sonde via un jack 3.5 ca marche nickel. J'attaque le Wifi now!

bonjour
tant mieux
ça fait partie des erreurs que tout le monde fait au moins une fois, tant que ce n'est pas destructif ce n'est pas grave 8)

Bonsoir,

J'ai repris l'exemple du WiFly_Webclient mais je bloque. Il ne me reste plus que l'envoie de données a effectuer mais après une soirée d'échec je cale!

Voilà mon code. J'ai remplacer le test de la recherche Google par le mien. Avant de passer la température en variable j'essaie en dur (ici 10) mais la commande ne semble pas être bien formée! Je seche! J'ai trouvé pas mal de forum en US ou DE mais rien qui m'a débloqué...
if (client.connect("www.xxxxx.fr", 80)) {

  • Serial.println("connected");*

  • if(getTemperature(&temp)) {*

  • Serial.println("GET /modules/InjectTempBD.php?Temperature=10 HTTP/1.1"); *

  • }*
    J'ai testé avec Serial.println ou Client.println c'est pareil... :cold_sweat:
    Merci

Bon ca avance pas mal :).

Maintenant le dernier problème au bout de quelques heures la board se plante et perd vraisemblablement l'IP. Une idée?

Voilà le code.

// ***** INCLUSION DES LIBRAIRIES NECESSAIRES *****
#include <OneWire.h> // 1-wire bus including DS18B20
#include <SPI.h> // Standard Arduino Library
#include <WiFly.h>
#include "Credentials.h"
// ***** DEFINITIONS DES VARIABLES *****
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 8 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
//byte server[] = { 85, 102, 118, 222 };
//byte server[] = { 231, 100, 24, 48 };
// ***** ON RECUPERE LA TEMPERATURE DE LA SONDE 1WIRE *****
boolean getTemperature(float *temp){
byte data[9], addr[8];

  • if (!ds.search(addr)) { // Recherche un module 1-Wire*

  • ds.reset_search(); // Réinitialise la recherche de module*

  • return false; // Retourne une erreur*

  • }*

  • if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue*

  • return false; // Si le message est corrompu on retourne une erreur*

  • if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20*

  • return false; // Si ce n'est pas le cas on retourne une erreur*

  • ds.reset(); // On reset le bus 1-Wire*

  • ds.select(addr); // On sélectionne le DS18B20*

  • ds.write(0x44, 1); // On lance une prise de mesure de température*

  • delay(800); // Et on attend la fin de la mesure*

  • ds.reset(); // On reset le bus 1-Wire*

  • ds.select(addr); // On sélectionne le DS18B20*

  • ds.write(0xBE); // On envoie une demande de lecture du scratchpad*

  • for (byte i = 0; i < 9; i++) // On lit le scratchpad*
    _ data = ds.read(); // Et on stock les octets reçus_

* // Calcul de la température en degré Celsius*
_ temp = ((data[1] << 8) | data[0]) * 0.0625;_
_
// Pas d'erreur*_
* return true;*
}
//WiFlyClient client("xxxx.fr", 80);
WiFlyClient client("xxx.fr", 80);
// ***** INITIALISATION DU SYSTEME *****
void setup() {

* Serial.begin(9600);*
* WiFly.setUart(&Serial);*
* WiFly.begin();*

* if (!WiFly.join(ssid, passphrase)) {*
* Serial.println("Association failed.");*
* while (1) {*
* // Hang on failure.*
* }*
* } *
// ***** Allez ! Roule Barracuda *****
* Serial.println("connecting...");*
* if (client.connect()) {*
* client.print("POST http://www.xxx.fr/InjectBD.php?Temperature=");*
* client.print(temp);*
* client.print(" HTTP/1.0\r\n");*
* client.println("Host: www.xxxx.fr");*
* client.println();*
* delay(1800000);*
* } else {*
* Serial.println("connection failed");*
* }*

}
void loop() {
* if (client.connect()) {*
* client.print("POST http://www.xxxx.fr/InjectBD.php?Temperature=");*
* client.print(temp);*
* client.print(" HTTP/1.0\r\n");*
* client.println("Host: www.xxx.fr");*
* client.println();*
* delay(1800000);*
* }*

* if (!client.connected()) {*
* Serial.println();*
* Serial.println("disconnecting.");*
* client.stop();*
* for(;;)*
* ;*
* }*
}
//#########################################################################################
// Red LED
// **Fast blinking, not connected to wireless network
// **OFF, Connected
//
// Yellow LED
// **With each blink it means its either sending or receiving data from Tx or Rx
// Green LED
// **ON Solid, connected over TCP
// * *Fast Blink, no IP address
// **Slow Blink, IP address OK
//#########################################################################################

bonjour,
si c'est comme moi pour des tests, ca ne plante pas, mais il suffit que le wifi déco et reco ou ne soit pas recu pendant une seconde, et hop, la connexion part en vrille.
tu arrives a le pingger ou non?
2 solutions, en étant certain que le module ne plante pas, mais un défaut de connexion.
si erreur retour pour le GET (retour différent de 200 OK)=> reboot de la carte
ou
reboot auto de la carte toutes les X mn ou heures.

infobarquee:
bonjour,
si c'est comme moi pour des tests, ca ne plante pas, mais il suffit que le wifi déco et reco ou ne soit pas recu pendant une seconde, et hop, la connexion part en vrille.
tu arrives a le pingger ou non?
2 solutions, en étant certain que le module ne plante pas, mais un défaut de connexion.
si erreur retour pour le GET (retour différent de 200 OK)=> reboot de la carte
ou
reboot auto de la carte toutes les X mn ou heures.

Salut infobarquee merci de ta réponse rapide.
Aurais-tu un code pour faire le reboot auto de la carte? Merci

void (*softReset) (void) = 0; //declare reset function @ address 0
softReset();

Merci j'ai rajouter ca dans mon code et réuplodé le tout. J'attends 16h15 pour tester :slight_smile:

Bonjour,

Faire un reboot logiciel en utilisant le vecteur de reset (adresse 0) est une mauvaise idée !
Ça laisse tout les registres dans leurs états actuels.
Tu risques donc de te retrouver avec un programme qui fait n'importe quoi.

Pour faire un reset propre :

#include <avr/wdt.h>

void reboot() {
  wdt_disable();  
  wdt_enable(WDTO_15MS);
  for(;;);
}

merci skywodd,
je connaissais pas cette méthode, ni les effets de celle donnée :wink:

skywodd:

#include <avr/wdt.h>

void reboot() {
  wdt_disable(); 
  wdt_enable(WDTO_15MS);
  for(;;);
}

Merci pour ce code mais que fait la boucle for(;;); ?

Google refuse de rechercher exactement ça, il cherche juste pour le mot clef for...

Viproz:
Merci pour ce code mais que fait la boucle for(;;); ?

C'est une boucle infini, elle ne fait rien justement.
Elle bloque indéfiniment le programme pour déclencher le watchdog après 15ms.