Bonjour, alors voilà j'ai pour projet un mini frigo. Pour pouvoir gérer le fonctionnement du module Peltier j'ai besoin de connaître la température à l'intérieur du compartiment, j'utilise donc le capteur DS1820.
Pour le code j'ai utilisé la librairie Onewire que j'ai modifier. Lorsque j'implémente mon code j’obtiens ce résultat:
La température, en plus de ne pas être la bonne, ne varie pas.
Voici mon code :
#include <OneWire.h>
// initialisation des variables ici propre au capteur
const int DS1820_PIN=2; // ici je défini sur quel port de ma carte est branché la sortie du capteur
const int DS1820_ID=0x10; // ici c'est le début de la ROM du capteur qui permet d'observer si on a le bon type de composant
// déclaration de l'objet ds
OneWire ds(DS1820_PIN);
// défintion des variables globales
const int SERIAL_PORT=9600;
float celcius; // températiure en degrés celcius
// initialisation du port de commmunication
void setup(void) {
Serial.begin(SERIAL_PORT);
Serial.println("Initialtialisation programme") ; // commande pour observer le bon lancement du prog à l'odinateur
}
//----------------------------------------------------------------------------------------------------------------------Acquisiontion de la température-----------------------------------------------------------\\
// définition des variables locales de la fonction
void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];
float celsius;
//*--- recherche,vérification et validation de communication entre le capteur et la carte ---*\\
// recherche des capteur
// dans le cas où je n'ai plus de capteur
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
// Affichge de l'adresse du capteur (facultatif)
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
// Ici je vérifie que la transmission est bien passée
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// Maintenant il s'agit de vérifier si le type de capteur de température est correct en allant chercher le 1er bit de ROM
if (addr[0] != DS1820_ID){
Serial.println(" Chip = DS1820"); // l'équipement trouvé n'est pas un DS1820
return false ;
}
//*--- lecture et traitement numérique de la température ---*\\
// lecture est mémorisation de la température ( atttention il y a un temps de lecture qu'il faut accordé au capteur d'après la datasheet min : 200ms et max : 500ms)
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // début de la conversion Issue “Convert T” command datasheet voir memory function
delay(550); // normalement une valeur entre 200 et 500 ms est suffisante d'après la datasheet
// le capteur nous renvoit la valeur mémorisé
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad command. voir datasheet memory function
// on recoit un mot de 9 octets, on va alors les placer dans un tableau de données data
Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
// valeur reçue en hexa ( facultatif_pour le teste)
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// Convertir les données en la valuer actuelle de la température
celsius = ( (data[1] << 8) + data[0] )*0.0625;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
}
Il s'agit sans peut-être du fait que le composant est mort puisque sur le montage que l'on m'a donné le capteur était monté à l'envers.
JulTur:
Bonjour, alors voilà j'ai pour projet un mini frigo. Pour pouvoir gérer le fonctionnement du module Peltier j'ai besoin de connaître la température à l'intérieur du compartiment, j'utilise donc le capteur DS1820.
Pour le code j'ai utilisé la librairie Onewire que j'ai modifier. Lorsque j'implémente mon code j’obtiens ce résultat:
...
Il s'agit sans peut-être du fait que le composant est mort puisque sur le montage que l'on m'a donné le capteur était monté à l'envers.
Bonsoir
Ton capteur n'est à priori pas "mort" ;D puisque tu récupère l'adresse 1wire qui expose que c'est bien un DS1820 (ou DS18S20 ou DS1920 code famille 0x10)
Par contre la quasi totalité des codes T° "arduino" sont prévus pour de la gestion de DS18B20 (code famille 0x28)
J'ai du code dispo pour du 0x10 , mais pas sous la main avant demain soir
finalement si ! 8)
teste çà
ne pas oublier de changer le pin pour le1W
#include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(D8); // bus 1wire sur pin x ds(x) (ne pas oublier une resistance de 4.7K entre cette ligne et +5V)
void setup(void) {
Serial.begin(115200);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
byte crc;
if ( !ds.search(addr)) {
Serial.println("------------------ FIN DU SCAN ADRESSE---------------");
Serial.println();
Serial.println();
Serial.println(" DEBUT DU SCAN ADRESSE");
Serial.println(" FC <-- ADRESSE --> CK"); // FC Family Code , CK Cheksum
ds.reset_search();
delay(250);
return;
}
//Serial.print("ROM =");
for ( i = 0; i < 8; i++) {
Serial.write(' ');
if (addr[i] < 16) Serial.print("0");
Serial.print(addr[i], HEX);
}
Serial.print(" ");
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.print(" Chip = DS18S20 "); // or old DS1820 ou ds1920 ibutton
type_s = 1;
break;
case 0x28:
Serial.print(" Chip = DS18B20 ");
type_s = 0;
break;
case 0x22:
Serial.print(" Chip = DS1822 ");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
//ds.depower();
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
if (data[i] < 16) Serial.print("0");
Serial.print(data[i], HEX);
Serial.print(" ");
}
//Serial.print(" CRC=");
crc = OneWire::crc8(data, 8);
//if (crc<16) Serial.print("0");
//Serial.print(crc,HEX);
//Serial.print(" ");
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
//fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.println();
delay(250);
}