One-Wire

Les cartes Arduino, les platines

One-Wire

Message non lude eco3x » Sam 15 Sep 2012 18:23

Bonjour,
je souhaite faire un contrôle de température avec plusieurs sonde DS18B20.

j'ai récupéré une partie de programme qui fonctionne bien, mais pour passer d'une sonde à l'autre fais comme ceci :
je déclare mes sondes au début.
byte adrCh1[8] = {0x28, 0x29, 0xD9, 0xE2, 0x3, 0x0, 0x0, 0x39}; // adresse sonde chambre 1
byte adrCh2[8] = {0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23}; // adresse sonde chambre 2
byte adresse[8]; // pour la fonction capteurMesureTemp

puis dans la loop je les utilise une après l'autre dans une fonction:
for ( int i = 0; i < 8; i++) {
adresse[i] = adrCh2[i];
}
ma_tempetf=capteurMesureTemp(); // appel de la fonction de mesure - renvoie une valeur float

Cela fonctionne bien mais n'y a t il pas une méthode pour dire adresse=adrCh2 directement sans utiliser le "for..." ?
je débute merci pour votre aide.
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude SesechXP » Lun 17 Sep 2012 07:49

Salut,

Tu devrais pouvoir te passer de la copie de l'adresse de la sonde (adrCh1 ou adrch2) dans le tableau adresse. Mais difficile de t'en dire plus sans voir ton sketch complet ;)

++
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: One-Wire

Message non lude eco3x » Lun 17 Sep 2012 09:25

J'ai modifié mon code pour n'utiliser qu'un tableau pour toute mes adresses.

Code: Tout sélectionner
/ Lecture des sondes DS18B20 par Jerome PERRIN le 16/09/2012 version 1.1
#include <OneWire.h>
OneWire busOW(9); // bus One-Wire sur pin 9
  //  {0x28, 0x29, 0xD9, 0xE2, 0x3, 0x0, 0x0, 0x39}; // adresse sonde chambre 1
  //  {0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23}; // adresse sonde chambre 2, et autres...
  byte adresse[8]; // pour la fonction capteurMesureTemp
byte adres[64] = {0x28, 0x29, 0xD9, 0xE2, 0x3, 0x0, 0x0, 0x39,
0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23, 
0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23,
0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23,
0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23, 
0x28, 0x3D, 0x75, 0xE3, 0x3, 0x0, 0x0, 0x23, }; //liste des capteurs
char noms[] ="chambre1" "chambre2" "cuisine " "salon   " "sejour  " "s.d.bain";
void setup(void) {
  Serial.begin(9600);
 }
void loop(void) {
float ma_tempetf=0.0;
for ( int s = 0; s<6; s++) {  // 6 capteurs
  Serial.print ("Temperature ") ;
for ( int i = 0; i < 8; i++) {           // lecture adresse et nom des capteur 8 caracteres
    adresse[i] = adres[s*8+i];
    Serial.print (noms[s*8+i]); // pour vérifer l'adresse
 }
ma_tempetf=capteurMesureTemp(); // appel de la fonction de mesure - renvoie une valeur float
Serial.print(" = ");
Serial.print (ma_tempetf,2);
Serial.println (" Degres Celsius. ");


la fonction que j'utilise pour lise les sondes :

Code: Tout sélectionner
// XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX
// xxxxxxxxxxxxxxxxxxxxxx Copyright X. HINAULT - Créé le 11/04/2010 xxxxxxxxxxxxxxxxxxxxxxxxxxx
float capteurMesureTemp(void) { //fonction qui renvoie résultat float et ne reçoit rien
  int tempet=0; // variable pour resultat brute  de la mesure
  float tempetf=0.0; // variable pour resultat à virgule de la mesure
  byte data[12];
// Serial.println("**** Acquisition d'une mesure de la temperature **** ");
  // avant chaque nouvelle instruction, il faut :
  //    * initialiser le bus 1-wire
  //    * sélectionner le capteur
  //    * envoyer l'instruction
//--------- lancer une mesure --------
  busOW.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  busOW.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  busOW.write(0x44,1); // lance la mesure et alimente le capteur par la broche de donnée
//-------- pause d'une seconde -----
delay(1000);     // au moins 750 ms
           // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire
//---------- passer en mode LECTURE -------------
  busOW.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  busOW.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  busOW.write(0xBE,1); // passe en mode lecture de la RAM du capteur
// ----------- lire les 9 octets de la RAM (appelé Scratchpad) ----
for ( int i = 0; i < 9; i++) {           // 9 octets de RAM stockés dans 9 octets
    data[i] = busOW.read();             // lecture de l'octet de rang i stocké dans tableau data
  }
//----- caclul de la température mesurée (enfin!) ---------
data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
tempet=data[1]; // bits de poids fort
tempet=tempet<<8;
tempet=tempet+data[0]; // bits de poids faible
// --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20
tempetf=float(tempet)*6.25;
tempetf=tempetf/100.0;
return (tempetf);


je me pose la question s'il ne serait pas plus simple d’intégrer tout dans la fonction pour s'en servir après en fessant un serveur web ou sur Cosm...
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude eco3x » Mar 18 Sep 2012 13:30

J'avance sur mon projet,

j'utilise :
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>

jusque la tout fonctionne bien, j'affiche les températures sur le moniteur série et sur une page web.

pour améliorer ma page web je souhaite utiliser la carte SD, mais dé que je mets :
#include <SD.h> plus rien ne fonctionne, plus de moniteur série...
y a il conflit entre SPI et SD ??
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude SesechXP » Mar 18 Sep 2012 13:42

Salut,

Les bibliothèques SD et Ethernet utilisent toutes les deux le SPI. Donc oui il peut y avoir un conflit...
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: One-Wire

Message non lude eco3x » Jeu 20 Sep 2012 18:09

Bonjour,

je viens de tester plusieurs serveur web, Webserver, tinywebserver...
la plupart de ceux que je trouve sont obsolète, version trop ancienne...

quel est le plus récent et plus pratique pour utiliser des pages html (ou plutôt .htm car ça fonctionne en 8.3 sur la carte SD )
avez vous de bonnes adresses avec des exemples ?
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude subreptice » Ven 21 Sep 2012 00:05

Sur le wiki de Linuxedu, Rémi avait fait pas mal de boulot, il y a quelques temps ;
voici un code, mis à jour pour l'IDE 101, qui envoie une valeur analogique sur un serveur ou elle est convertie dans la page avant d'être affichée :
Code: Tout sélectionner
/*
Web Server Température avec LM35DZ
basé sur code du 18 Dec 2009 de David A. Mellis
modifié 4 Sep 2010 par Tom Igoe
et le 18 dec 2011 par linuxedu
*/

#include <SPI.h>
#include <Ethernet.h>

// Définir l'adresse MAC et l'IP de la carte
byte mac[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
byte ip[] = { 192,168,0,101 };

// Initialisation de la bibliothèque Ethernet server
// avec l4IP définie et le port (80 par défaut en HTTP)
EthernetServer server(80);

void setup()
{
// initialiser la connexion avec le terminal série
Serial.begin(9600);
// démarrage de la connection Ethernet connection et du serveur:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop()
{
// attente de clients (un navigateur web par exemple)
EthernetClient client = server.available();
if (client) {

    // une demande HTTP se termine par une ligne vide
    boolean currentLineIsBlank = true;
    while (client.connected()) {

        if (client.available()) {

            char c = client.read();
            // if you've gotten to the end of the line (received a newline
            // character) and the line is blank, the http request has ended,
            // so you can send a reply
            if (c == '\n' && currentLineIsBlank) {
            // Header HTTP usuel
            //
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();

            // renvoie la valeur de la tension de la pin analogique 0
            // et fait la conversion en celsius
            // le tout dans une page HTML5 !
            client.print("<!doctype html><html><head><meta charset='utf-8'/><title>Serveur de température Arduino</title>");
            // script qui réactualise la page toutes les 2000 mSec
            client.print("<script type='text/javascript'>function reFresh() {  location.reload(true) } window.setInterval('reFresh()',2000); </script>");
            client.print("</head><body><html>");
            client.print("<h1 style='font-family:verdana;'>Serveur de Température - Arduino</h1>");
            int analogChannel = 0; // On connecte la patte du milieu du LM35 sur la pin analogique 0
            float valeur = analogRead(analogChannel);
            float tension = valeur * 5.0 / 1024.0; // calcul de la tension. Arduino échantillone en 1024 les 5V.
            float temperature = tension * 100 ; // LM35 : 10mV par degré
            client.print("<p style='font-family:arial;color:red;font-size:20px;'>La temperature relevée sur l'entrée ");
            client.print(analogChannel);
            client.print(" est de : ");
            client.print(temperature);
            client.println(" °C.</p></body></html>");
           

        break;

    }

    if (c == '\n') {

    // you're starting a new line
    currentLineIsBlank = true;
    }
    else if (c != '\r') {

            // you've gotten a character on the current line
            currentLineIsBlank = false;

            }

        }

    }

    // on laisse du temps au navigateur web de recevoir les données
    delay(1000);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");

    }

}
subreptice
 
Messages: 58
Inscription: Mar 19 Juil 2011 18:04

Re: One-Wire

Message non lude eco3x » Ven 21 Sep 2012 09:12

Avec une version de "Tinywebserver" j'arrive à afficher mon site avec le CCS les images et tout super...

donc je pensais stocker les températures dans des fichiers sur la carte SD et les afficher dans des pages Html
mais si j'utilise les commandes SD.h ça ne fonctionne pas, impossible d’écrire ou lire la carte SD
alors que "Tinywebserver" utilise la Sd sans problème ?
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude subreptice » Ven 21 Sep 2012 09:29

Bonjour.

Avec un shield ethernet SD, on ne peut pas utiliser en même temps sa fonction ethernet et sa fonction SD, il y a un conflit de pin, il me semble. Ça serait pas le problème ?
Sur le site de Tinywebserver, on peut voir un shield ethernet, ET un shield SD.
subreptice
 
Messages: 58
Inscription: Mar 19 Juil 2011 18:04

Re: One-Wire

Message non lude eco3x » Ven 21 Sep 2012 13:06

en fait Tinywebserver utilise bien Ethernet et SD en même temps, avec un paramétrage...

Code: Tout sélectionner
/ pin 4 is the SPI select pin for the SDcard
const int SD_CS = 4;

// pin 10 is the SPI select pin for the Ethernet
const int ETHER_CS = 10;


il ne faut pas utiliser les instruction de SD.h pour écrire sur la carte, mais celle de Tinywebserver et cela fonctionne bien.

je n'ai plus qu'a travailler sur la page en Html et c'est bon
je mettrais le code ici une fois finalisé.
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude eco3x » Ven 21 Sep 2012 14:27

Voici ce que cela donne sur une petite tablette Androïde :

Image

je peux contrôler la température depuis tous les ordinateurs, téléphones, tablettes... de la maison

et exemple sur Pc :

Image
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude ludo10quad » Mer 24 Oct 2012 20:57

Bonjour,j'ai moi même développer une application sur arduino et DS18B20 et je voulais savoir jusqu'a quelle longueur on pouvait aller sur un bus One wire en mode parasite et en mode normale???

Merci d'avance
LT
ludo10quad
 
Messages: 3
Inscription: Mer 24 Oct 2012 20:41

Re: One-Wire

Message non lude Stéphane » Lun 29 Oct 2012 09:38

Bonjour,

pour cela rien de plus simple, notre ami google est là pour vous donner des indices : en voici 1, et 2 ! :)
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: One-Wire

Message non lude eco3x » Mar 12 Mar 2013 17:58

ludo10quad a écrit:Bonjour,j'ai moi même développer une application sur arduino et DS18B20 et je voulais savoir jusqu'a quelle longueur on pouvait aller sur un bus One wire en mode parasite et en mode normale???LT


réponse tardive, je viens de tester avec 100m de câble FTP cat5 et c'est OK.

Image
Arduino Uno Ethernet - Usb2 serial / Mega 2560 / Raspberry Pi
http://maisons.eco3x.fr
eco3x
 
Messages: 44
Inscription: Mer 16 Mai 2012 11:21
Localisation: Haute Saône

Re: One-Wire

Message non lude Bemolu » Mer 13 Mar 2013 21:33

eco3x a écrit: réponse tardive, je viens de tester avec 100m de câble FTP cat5 et c'est OK.
Image

Merci pour l'info, j'avais de vrais doutes sur des longueurs aussi grandes.
Bemolu
 
Messages: 63
Inscription: Mer 8 Fév 2012 21:19


Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 3 invités

cron