PROJET:Arduino UNO+Shield Ethernet2+Capteur temperature DS18B20 V2 sur page HTML

Bonjour,

Je travail sur un projet dans lequel je dois afficher une température sur une page web, j'ai réussi à afficher une température sur une page via une adresse ip affecter au shield etc, mais maintenant j'aimerais afficher la vrai température ambiante car celle que j'ai actuellement est terriblement FAUSSE :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: ( vous verrez vous meme dans le screenshot en pièce jointe :wink: )

Et pour le code que j'utilise le voici, que dois-je modifier pour obtenir la VRAI temperature ? :

#include <OneWire.h>
#include <SPI.h> // bibliothèque de la liaison série
#include <Ethernet2.h> //Inclure la bibliothèque Ethernet
// Adresse MAC du shield l'adresse IP dépend de votre réseau local
byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x0A, 0x7D };
IPAddress ip(192,168,1,5); // à choisir sur votre réseau local – version adresse IP fixée
unsigned char mask[] = {255,255,255,0};
unsigned char gateway[] = {192,168,1,1};
int CAPTEUR_TEMP_PIN = 2; // adressage du capteur de temperature (PIN) //
int temp = 0; //définition de la variable entière (integer) //
float temperature = 0; // variable temperature en flottant //
float const_can = 0.0048828; // constante du convertisseur //
EthernetServer server(80); //Initialise le serveur Ethernet, port 80 par défaut pour HTTP
void setup()
{
 Ethernet.begin(mac,ip,gateway,mask); //Démarrer la connexion Ethernet et le serveur (version DHCP)
 server.begin();
 Serial.begin(9600); //Affichage écran du PC
 analogRead(CAPTEUR_TEMP_PIN);
 }
void loop()
{
 temp = analogRead(CAPTEUR_TEMP_PIN); // lecture du capteur de température //
 temperature = (((temp*const_can)*1000)-500)/10; //calcul//
 // Ecouter les clients entrants
 EthernetClient client = server.available();
 if (client) {
 Serial.println("new client");
 Serial.print("adresse IP: ");
 Serial.println(Ethernet.localIP());
 // Une requète HTTP terminée par une ligne vide
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 if (client.available()) {

 // Envoyer un header de résponse standard http
 client.println("HTTP/1.1 200 OK"); //C'est OK
 client.println();
 client.println("<!DOCTYPE html>");
 client.println("<html>"); //---- debut de la page HTML ---
 client.println("<head>"); // ---- Entete de la page HTML ----
 client.println("<meta content=\"utf-8\">");
 client.println("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-8859-1\">");
 client.println("<META HTTP-EQUIV=\"Content-Language\" CONTENT=\"fr-FX\">");
 client.println("<title>Connexion au Serveur Arduino</title>");
 client.println("</head>");
 client.print("<body style=background-color:black>");
 client.println();
 client.println("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1\">");
 client.println("<center>"); // pour centrer la page HTML
 client.println("<p style=\"color: white\">************************************************* 
 </p>");
 client.println("<h2 style=\"color: red\">Bienvenue sur ma page !</h2>");
 client.println("<p style=\"color: white\">************************************************* 
 </p>");
 client.println("
"); //saut de ligne
 // Sortir la valeur des mesures
 client.println("<p style=\"color: white\">");
 client.print("Temperature ambiante = ");
 client.print(temperature);
 client.print(" &degC");
 client.println("</center>"); // fin de la zone centrée
 client.println("</body>"); // fin du body
 client.println("</html>"); //---- fin de la page HTML
 break;
 }
 }
 }
 delay(1); // Laisser au navigateur web le temps de recevoir les données
 client.stop(); // Refermer la connexion:
}

bonjour,
quel type de capteur de température?

infobarquee:
bonjour,
quel type de capteur de température?

DS18B20 V2

pourquoi un nouveau post (donc l'ethernet fonctionne :wink:
si tu ne veux pas t'embeter tu utilise la librairie #include <DallasTemperature.h> et ses exemples
sinon ce tuto

je pense qu'il faudrait faire un peu plus d'effort dans tes recherches.
DS18B20 V2 sur le net donne des tas d'exemples et codes

tu verras la différence avec ton code où il manque pas mal de choses
dont une importante OneWire ds(CAPTEUR_TEMP_PIN);

rjnc38:
pourquoi un nouveau post (donc l'ethernet fonctionne :wink:
si tu ne veux pas t'embeter tu utilise la librairie #include <DallasTemperature.h> et ses exemples
sinon ce tuto

Oui exacte l'ethernet fonctionne enfin ;), et pour le tuto je le connais déja et il fonctionne mais j'aimerais inserer ça dans mon code je pense pouvoir le faire mais pas sûr :confused:

infobarquee:
je pense qu'il faudrait faire un peu plus d'effort dans tes recherches.
DS18B20 V2 sur le net donne des tas d'exemples et codes
Wiki Gravity:Terminal Sensor Adapter V2.0-DFRobot

tu verras la différence avec ton code où il manque pas mal de choses
dont une importante OneWire ds(CAPTEUR_TEMP_PIN);

Je connaissais déjà ce tuto aussi mais je dois le tester à nouveau car je ne m'en souviens plus si il fonctionne celui la

Je connaissais déjà ce tuto aussi mais je dois le tester à nouveau car je ne m'en souviens plus si il fonctionne celui la

si tu compares les deux codes, tu verras que c'est la même chose et rien a voir avec ton code.

RE;

Messieurs j'ai essayé vos deux code mais l'IDE m'affiche cette erreur :

" if (client) {

^

exit status 1
expected unqualified-id before 'if' "

1- active le mode verbose de l'ide
2- mets ton code entre balise code </>
3- mets les erreurs complètes
4- indente ton code pour plus de lisibilité

Et je rajouterait : tu laisses tomber provisoirement ton code serveur. Tu fais fonctionner ton capteur seul et quand les deux fonctionnent séparément et que tu as bien compris, tu les rassemble

infobarquee:
1- active le mode verbose de l'ide
2- mets ton code entre balise code </>
3- mets les erreurs complètes
4- indente ton code pour plus de lisibilité

Comment activer ce mode ?

rjnc38:
Et je rajouterait : tu laisses tomber provisoirement ton code serveur. Tu fais fonctionner ton capteur seul et quand les deux fonctionnent séparément et que tu as bien compris, tu les rassemble

J'ai deja essayé cela auparavant, les codes fonctionnent bien séparemment, puis lorsque je les rassemble Hop une ou plusieurs erreurs apparaissent.. Bon ce soir j'essayerai de vous envoyer les deux codes séparés qui fonctionnent, puis je vous enverrais le code 2 en 1

Comment activer ce mode ?

fichier=>préférence=>afficher les résultats détaillés compilation et téléversement

infobarquee:
fichier=>préférence=>afficher les résultats détaillés compilation et téléversement

Oui j'ai mis le mode c'est bon,

voici le code complet :

#include <OneWire.h>
#include <SPI.h> // bibliothèque de la liaison série
#include <Ethernet2.h> //Inclure la bibliothèque Ethernet
// Adresse MAC du shield l'adresse IP dépend de votre réseau local
byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x0A, 0x7D };
IPAddress ip(192,168,1,5); // à choisir sur votre réseau local – version adresse IP fixée
unsigned char mask[] = {255,255,255,0};
unsigned char gateway[] = {192,168,1,1};
int CAPTEUR_TEMP_PIN = A0; // adressage du capteur de temperature (PIN) //
int temp = 0; //définition de la variable entière (integer) //
float temperature = 0; // variable temperature en flottant //
float const_can = 0.0048828; // constante du convertisseur //
EthernetServer server(80); //Initialise le serveur Ethernet, port 80 par défaut pour HTTP
void setup()
{
 Ethernet.begin(mac,ip,gateway,mask); //Démarrer la connexion Ethernet et le serveur (version DHCP)
 server.begin();
 Serial.begin(9600); //Affichage écran du PC
 analogRead(CAPTEUR_TEMP_PIN);
 }
void loop()
{
 temp = analogRead(CAPTEUR_TEMP_PIN); // lecture du capteur de température //
 temperature = (((temp*const_can)*9)/5 )+19; //calcul//
 // Ecouter les clients entrants
 EthernetClient client = server.available();
 if (client) {
 Serial.println("new client");
 Serial.print("adresse IP: ");
 Serial.println(Ethernet.localIP());
 // Une requète HTTP terminée par une ligne vide
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 if (client.available()) {

 // Envoyer un header de résponse standard http
 client.println("HTTP/1.1 200 OK"); //C'est OK
 client.println();
 client.println("<!DOCTYPE html>");
 client.println("<html>"); //---- debut de la page HTML ---
 client.println("<head>"); // ---- Entete de la page HTML ----
 client.println("<meta content=\"utf-8\">");
 client.println("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-8859-1\">");
 client.println("<META HTTP-EQUIV=\"Content-Language\" CONTENT=\"fr-FX\">");
 client.println("<title>Connexion au Serveur Arduino</title>");
 client.println("</head>");
 client.print("<body style=background-color:black>");
 client.println();
 client.println("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1\">");
 client.println("<center>"); // pour centrer la page HTML
 client.println("<p style=\"color: white\">************************************************* 
 </p>");
 client.println("<h2 style=\"color: red\">Bienvenue sur ma page !</h2>");
 client.println("<p style=\"color: white\">************************************************* 
 </p>");
 client.println("
"); //saut de ligne
 // Sortir la valeur des mesures
 client.println("<p style=\"color: white\">");
 client.print("Temperature ambiante = ");
 client.print(temperature);
 client.print(" &degC");
 client.println("</center>"); // fin de la zone centrée
 client.println("</body>"); // fin du body
 client.println("</html>"); //---- fin de la page HTML
 break;
 }
 }
 }
 delay(1); // Laisser au navigateur web le temps de recevoir les données
 client.stop(); // Refermer la connexion:
}

Ma question dans ce code est Que faut il modifier pour obtenir la vrai température ambiante ? car là j'ai toujours 19°C et ça ne bouge pas, ce n'est pas la vrai température ça :confused:

déjà si tu suivais les indications qu'on te donne, ca serait bien.
tu suis le tuto donné en lien pour vérifier ta sonde temp.
une fois ca, tu intègre le résultat dans ta page.

infobarquee:
déjà si tu suivais les indications qu'on te donne, ca serait bien.
tu suis le tuto donné en lien pour vérifier ta sonde temp.
une fois ca, tu intègre le résultat dans ta page.

Je peux suivre y a pas de soucie pour ça mais ton code donné dans le lien me donne une erreur sur le premier mot déjà donc voilà quoi.

"" Arduinot_DS18B20_Web_Temperature:2: error: found ':' in nested-name-specifier, expected '::'

Insturciton:

^

Arduinot_DS18B20_Web_Temperature:2: error: 'Insturciton' does not name a type

Insturciton:

^

Arduinot_DS18B20_Web_Temperature:23: error: 'OneWire' does not name a type

OneWire ds(DS18S20_Pin); // on digital pin 2

^

C:\Users\Maison\Documents\Arduino\Arduinot_DS18B20_Web_Temperature\Arduinot_DS18B20_Web_Temperature.ino: In function 'float getTemp()':

Arduinot_DS18B20_Web_Temperature:44: error: 'ds' was not declared in this scope

if ( !ds.search(addr)) {

^

Arduinot_DS18B20_Web_Temperature:51: error: 'OneWire' has not been declared

if ( OneWire::crc8( addr, 7) != addr[7]) {

^

Arduinot_DS18B20_Web_Temperature:61: error: 'ds' was not declared in this scope

ds.reset();

^

exit status 1
found ':' in nested-name-specifier, expected '::' ""

franchement, tu attends quelque chose de tout cuit dans le bec. :smiling_imp:
l'ide te sors une erreur avec un mot bien précis Insturciton

si t'es pas capable de voir que c'est dans un commentaire en tout début du code exemple et de virer la partie entre /***** et *****/

faut vraiment arrêter de suite la programmation et faire des patés de sable dans la cours maternelle.

t'es quand même en Terminale STI2D Option SIN

BAC TECHNO STI2D SPECIALITÉ SYSTÈME D'INFORMATION ET NUMÉRIQUE (SIN)

Dans cette spécialité, les lycéens étudient les méthodes utilisées pour transmettre de l'information avec le numérique et particulièrement en électronique. À partir de projets, ils explorent toute la chaîne de l'information et proposent des améliorations tant sur l'acquisition des données que leur traitement ou leur restitution sous forme de son, d images...

Cette spécialité porte sur l’analyse et la création de solutions techniques relatives au traitement des flux d’information (voix données, images) dans les systèmes pluri techniques actuels qui comportent à la fois une gestion locale et à distance de l’information. Les supports privilégiés sont les systèmes de télécommunication, les réseaux informatiques, les produits pluri techniques et en particulier les produits multimédia. Les activités porteront sur le développement de systèmes virtuels, destinés à la conduite, au dialogue homme / machine, à la transmission et à la restitution de l’information.

infobarquee:
franchement, tu attends quelque chose de tout cuit dans le bec. :smiling_imp:
l'ide te sors une erreur avec un mot bien précis Insturciton

si t'es pas capable de voir que c'est dans un commentaire en tout début du code exemple et de virer la partie entre /***** et *****/

faut vraiment arrêter de suite la programmation et faire des patés de sable dans la cours maternelle.

t'es quand même en Terminale STI2D Option SIN

Mdrr sava monsieur l'expert que je sois en terminale STI2D SIN ou pas ça ne veux pas forcément dire que je dois absolument m'y connaitre dans le domaine des codes IDE haha, du moins, personnellement je connais la base et c'est assez je n'ai pas besoin d'avoir un niveau "avancée dans le domaine de l'IDE etc. (Pour le moment xD ).
Sinon je savais pas que le soucis dans ce code c'était TOUT le commentaire, moi je pensais seulement que le problème venait du mot "Inturciton" quoi.. xD

Enfin bref, le code fonctionne maintenant, donc coté capteur c'est OK, mais maintenant si j'intègre ce code là avec celui du shield pour afficher une page html etc etc, et bien je suis presque sûr que l'IDE m'indiquera une erreur au niveau du "If (client)" ou qlq chose comme ça, cependant je vais quand même vérifier s'il me donnera une erreur ou pas. S'il y a une erreur je l'indiquerais dans mon prochain poste ici.

Qlq nouvelles ! :slight_smile:

Le code a l'air de fonctionner, il y'avait qlq petites erreurs que j'ai pû résoudre en qlq min et puis hop maintenant l'IDE ne m'affiche aucune erreur ! :slight_smile:

Voici le code complet mis à niveau :

#include <OneWire.h>
#include <SPI.h> // bibliothèque de la liaison série
#include <Ethernet2.h> //Inclure la bibliothèque Ethernet
// Adresse MAC du shield l'adresse IP dépend de votre réseau local
byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x0A, 0x7D };
IPAddress ip(172,20,160,198); // à choisir sur votre réseau local – version adresse IP fixée
unsigned char mask[] = {255,255,0,0};
unsigned char gateway[] = {172,20,1,1};
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
   
//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2
EthernetServer server(80); //Initialise le serveur Ethernet, port 80 par défaut pour HTTP


void setup()
{
 Ethernet.begin(mac,ip,gateway,mask); //Démarrer la connexion Ethernet et le serveur (version DHCP)
 server.begin();
 Serial.begin(9600); //Affichage écran du PC
 }
void loop()
{
  float temperature = getTemp();
  Serial.println(temperature);
     
  delay(2000); //just here to slow down the output so it is easier to read
}  

float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius
   
  byte data[12];
  byte addr[8];
   
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      Serial.println("no more sensors on chain, reset search!");
      ds.reset_search();
      return -1000;
  }
   
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
   
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
   
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
   
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
   
     
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
     
  ds.reset_search();
     
  byte MSB = data[1];
  byte LSB = data[0];
   
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
     
  return TemperatureSum;
  
 // Ecouter les clients entrants
 EthernetClient client = server.available();
 if (client) {
 Serial.println("new client");
 Serial.print("adresse IP: ");
 Serial.println(Ethernet.localIP());
 // Une requète HTTP terminée par une ligne vide
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 if (client.available()) {

 // Envoyer un header de résponse standard http
 client.println("HTTP/1.1 200 OK"); //C'est OK
 client.println();
 client.println("<!DOCTYPE html>");
 client.println("<html>"); //---- debut de la page HTML ---
 client.println("<head>"); // ---- Entete de la page HTML ----
 client.println("<meta content=\"utf-8\">");
 client.println("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-8859-1\">");
 client.println("<META HTTP-EQUIV=\"Content-Language\" CONTENT=\"fr-FX\">");
 client.println("<title>Connexion au Serveur Arduino</title>");
 client.println("</head>");
 client.print("<body style=background-color:black>");
 client.println();
 client.println("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1\">");
 client.println("<center>"); // pour centrer la page HTML
 client.println("<p style=\"color: white\">************************************************* 
 </p>");
 client.println("<h2 style=\"color: red\">Bienvenue sur ma page !</h2>");
 client.println("<p style=\"color: white\">************************************************* 
 </p>");
 client.println("
"); //saut de ligne
 // Sortir la valeur des mesures
 client.println("<p style=\"color: white\">");
 client.print("Temperature ambiante = ");
 client.print(" &degC");
 client.println("</center>"); // fin de la zone centrée
 client.println("</body>"); // fin du body
 client.println("</html>"); //---- fin de la page HTML
 break;
 }
 }
 }
 delay(1); // Laisser au navigateur web le temps de recevoir les données
 client.stop(); // Refermer la connexion:
}

Seule petit bémole à présent :-\ :

Je suis actuellement au lycée et le problème c'est que ici je n'arrive pas à lancer la page, il me suffit de de taper l'IP du Shield sur le navigateur pour demander à l'arduino de me lancer la page, mais ici au lycée je n'y arrive pas pourtant chez moi cela marche du premier coup ! Qlqun aurait une solution sur cet infiimee problème ? :confused:

Mdrr sava monsieur l'expert que je sois en terminale STI2D SIN ou pas ça ne veux pas forcément dire que je dois absolument m'y connaitre dans le domaine des codes IDE haha, du moins, personnellement je connais la base et c'est assez je n'ai pas besoin d'avoir un niveau "avancée dans le domaine de l'IDE etc. (Pour le moment xD ).
Sinon je savais pas que le soucis dans ce code c'était TOUT le commentaire, moi je pensais seulement que le problème venait du mot "Inturciton" quoi.. xD

encore un pti rigolo qui croit avoir la science infuse et n'accepte absolument pas les remarques.
aucune recherche perso comme 80% de ceux qui arrivent sur le forum pour leur exam, ca promet pour le futur, par ocntre pour trouver des soluces de jeux ou faire du bébé piratage, ca y a du monde.

comme quoi tu n'a rien de rien appris/compris, car l'ide c'est simplement une appli visuelle et non un langage.
la programmation de l'arduino se fait en C++ et tu peux même créer tes applis via un éditeur de texte et uploader via une simple ligne de commande.
Donc tes commentaires de bas niveau, tu les gardes de coté si tu veux de l'aide.

Je suis actuellement au lycée et le problème c'est que ici je n'arrive pas à lancer la page, il me suffit de de taper l'IP du Shield sur le navigateur pour demander à l'arduino de me lancer la page, mais ici au lycée je n'y arrive pas pourtant chez moi cela marche du premier coup ! Qlqun aurait une solution sur cet infiimee problème ? :confused:

tu connais au moins la plage ip attribuée dans ton bahut?
demande à l'amdin réseau pour attribuer une ip fixe à ton shield et de laisser passer le parefeu.
chez toi, oui ca fonctionne, car aucune restriction, mais dans ton bahut, tu crois qu'ils vont te laisser amener un pc comme ca ou une carte pour faire n'importe quoi?

je connais une solution facile pour palier ca, mais je la donnerai pas, question de sécurité réseau pour ton bahut.

ca m'étonnerait aussi que tu affiche la temp sur ta page html avec ca

 client.println("<p style=\"color: white\">");
 client.print("Temperature ambiante = ");
 client.print(" &degC");

tu l'affiche simplement dans la console

  Serial.println(temperature);

infobarquee:
tu connais au moins la plage ip attribuée dans ton bahut?
demande à l'amdin réseau pour attribuer une ip fixe à ton shield et de laisser passer le parefeu.
chez toi, oui ca fonctionne, car aucune restriction, mais dans ton bahut, tu crois qu'ils vont te laisser amener un pc comme ca ou une carte pour faire n'importe quoi?

je connais une solution facile pour palier ca, mais je la donnerai pas, question de sécurité réseau pour ton bahut.

ca m'étonnerait aussi que tu affiche la temp sur ta page html avec ca

 client.println("<p style=\"color: white\">");

client.print("Temperature ambiante = ");
client.print(" &degC");




tu l'affiche simplement dans la console


Serial.println(temperature);

ça y est j'ai réussi à afficher la page html au lycée, c'était très simple j'ai juste changé la plage IP, il s'avère que je n'utilisais pas la bonne jusque mtn, c'est pour ça que ça fonctionnait pas, j'ai réglé moi meme le problème c'était vrm rien au final xD