@ artouste
bonsoir,
tu as raison, par habitude j'ai toujours mis 1.8k, j'ai testé 20K pour un gars qui ne semblait pas avoir un grand jeu de valeurs à dispo.
oui en 3 fils
-127 c'est pas une T°, ça veut dire erreur de lecture...
ok mais quelqu'un peut il me dire d'ou peut provenir cette erreur: code, conflit de matériel ou autre, car là je suis bloqué.
merci de votre aide
mauvais contact ?
les raccordements se font sur bornier à vis, les pistes du circuit imprimé sont ok,.......
Les deux sondes me donnent presque les mêmes erreurs :
-
une sonde donne continuellement -127° avec la librairie Dallas et avec une autre librairie One-wire c'est aléatoire 25° ou -127°
-
l'autre sonde me donne plus souvent la bonne température (une fois sur cinq) et -127°,
voilà, je continue à chercher de mon côté
partant du principe que nous sommes partis sur le hard directement, j'ai voulu regarder ton prg
celui que tu nous as posté ne se compile pas, il est incomplet ( manque des déclarations)
oui je sais mais j'ai du supprimer pas mal de choses car je dépassais les 9000 caractères....
1ére partie du code
#include <DallasTemperature.h>
#include <OneWire.h>
#include <config.h>
#include <ds3231.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define ONE_WIRE_BUS 19 // Data wire is plugged into port 19 on the Arduino
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
LiquidCrystal_I2C lcd(0x27,20,4);
// Variables et broches pour les élairages PP, Sec et Leds Bleues et blanches
const int EclPP = 51; // pilote le relais 1-1 de l'éclairage PrinciPal
const int EclSec = 52; // pilote le relais 1-2 de l'éclairage Secondaire
const int EclLed = 49; // pilote le relais 2-1 du transfo 15V
const int BPEclPP = 25; // Allume ou éteint l'éclairage PP en manuel
const int BPEclSec = 26; // Allume ou éteint l'éclairage Sec en manuel
const int LedEclSec = 28; // pilote la led verte de l'éclairage Secondaire
const int LedEclPP = 29; // pilote la led verte de l'éclairage PrinciPal
const int LedEclLedBleue = 32; // pilote la led verte de l'éclairage bleu
const int LedEclLedBlanche = 33; // pilote la led verte de l'éclairage blanc
const int LedBleue = 4; // sortie PWM pour led bleue
const int LedBlanche = 5; //sortie PWM pour led blanche
int valupLedBleue = 0; int valdownLedBleue = 0; // valeur d'intensité croissante/décroissante des leds bleues
int valupLedBlanche = 0; int valdownLedBlanche = 0; // valeur d'intensité croissante/décroissante des leds blanches
boolean a; //Statut éclairage principal
boolean b; //statut éclairage secondaire
boolean c; // statut éclairage leds bleues
boolean d; // statut éclairage leds blanches
// Variables et broches pour l'aération
const int LedAir = 27; // pilote la Led verte de l'aération
const int Aeration = 53; // pilote le relais 1-3 de l'Aération
// Variables et broches pour le chauffage
const int LedChauffage = 31; // pilote la led verte du chauffage
const int LedAlarmeChauffage = 30; // pilote la led rouge de l'alarme Température haute
const int Chauffage = 50; // pilote le relais 1-4 du chauffage (en NC)
// Variables et broches pour la RTC DS3231
struct ts t; // Pour DS3231
float TempRTC; // variable Température RTC
// Variables et broches pour la mesure de température d'eau
// const int DS18B20 = 19; // broche entrée du signal de la sonde de température
float TemperatureEau; // variable de stockage de la température de l'eau
// Variables et broches pour l'indication de niveau d'eau
int Niveau = A6; // assigne la pin 6 à l'entrée du signal sonde de niveau
int SondeNiveau; // variable de stockage lecture sonde
int Sonde; // Moyenne pour les leds
//int somme; // Somme du tableau
int NHH = 40; // pilote la led rouge niveau trés haut
int NH = 41; // pilote la led orange niveau haut
int NN = 42; // pilote la led verte niveau normal
int NB = 43; // pilote la led orange niveau bas
int NBB = 44; //pilote la led rouge niveau trés bas
// Variables pour le programme
int dateheure; // variable date_heure contient l'heure actuelle
int dateminute; // variable date_minute contient la minute actuelle
int HProg; // variable Heure pour programme: Hx100 + minutes
void setup()
{
pinMode(EclPP, OUTPUT); pinMode(LedEclPP, OUTPUT);
pinMode(EclSec, OUTPUT); pinMode(LedEclSec, OUTPUT);
pinMode(Aeration, OUTPUT); pinMode(LedAir, OUTPUT);
pinMode(Chauffage, OUTPUT); pinMode(LedChauffage, OUTPUT); pinMode(LedAlarmeChauffage, OUTPUT);
pinMode(EclLed, OUTPUT); pinMode(LedBleue, OUTPUT); pinMode(LedBlanche, OUTPUT);
pinMode(LedEclLedBleue, OUTPUT); pinMode(LedEclLedBlanche, OUTPUT);
pinMode(BPEclSec, OUTPUT); pinMode(BPEclPP, OUTPUT);
//pinMode(DS18B20, INPUT);
pinMode(Niveau, INPUT); pinMode(NHH, OUTPUT); pinMode(NH, OUTPUT); pinMode(NN, OUTPUT); pinMode(NB, OUTPUT); pinMode(NBB, OUTPUT);
analogWrite(LedBleue, 0); analogWrite(LedBlanche, 0); // initialise les leds bleues et blanches à 0
a=0; b=0; c=0; d=0; // initialise à 0 les BP
lcd.begin();
lcd.clear();
Wire.begin();
sensors.begin();
DS3231_init(DS3231_INTCN);
Serial.begin(9600);
}
void loop()
{
// Affichage de la date et de l'heure en alternance sur la premiére ligne du lcd
{
DS3231_get(&t);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
switch (t.wday) {
case 1:
lcd.print("Lun");
break;
case 2:
lcd.print("Mar");
break;
case 3:
lcd.print("Mer");
break;
case 4:
lcd.print("Jeu");
break;
case 5:
lcd.print("Ven");
break;
case 6:
lcd.print("Sam");
break;
case 7:
lcd.print("Dim");
break;
}
lcd.print(" ");
lcd.print(t.mday);
lcd.print(" ");
switch (t.mon) {
case 1:
lcd.print("janvier");
break;
case 2:
lcd.print("fevrier");
break;
case 3:
lcd.print("mars");
break;
case 4:
lcd.print("avril");
break;
case 5:
lcd.print("mai");
break;
case 6:
lcd.print("juin");
break;
case 7:
lcd.print("juillet");
break;
case 8:
lcd.print("aout");
break;
case 9:
lcd.print("septemb");
break;
case 10:
lcd.print("octobre");
break;
case 11:
lcd.print("novembr");
break;
case 12:
lcd.print("decembr");
break;
}
lcd.print(" ");
lcd.print(t.year);
delay(4000);
// Affichage de l'heure
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(6,0);
lcd.print(t.hour);
lcd.print(":");
if ((t.min) < 10)
{
lcd.print("0");
}
lcd.print(t.min);
delay(5000);
}
// Calcul HProg
{
dateheure = t.hour; // variable date_heure contient l'heure actuelle
dateminute = t.min; // variable date_minute contient la minute actuelle
HProg = (dateheure*100) + dateminute;
}
// AERATION
lcd.setCursor(0,2);
if (HProg >= 700 && HProg <= 2230)// Si il est entre 7h00 et 22h00
{
digitalWrite(Aeration, LOW); digitalWrite(LedAir, HIGH); // démarrer l'aération et allumer la led "Air"
lcd.print("Air:OK");
}
else // Si il est entre 22h30 et 7h00
{
digitalWrite(Aeration, HIGH); digitalWrite(LedAir, LOW);// sinon arreter l'aération et éteindre la led "Air"
lcd.print("Air:NO");
}
2éme partie du code
// ECLAIRAGE PRINCIPAL PP
lcd.setCursor(0,1);
lcd.print("Eclair. PP:");
if (HProg >= 1600 && HProg <= 2000)// Si il est + de 16h00 et - de 20h00
{
digitalWrite(EclPP, LOW); digitalWrite(LedEclPP, HIGH); lcd.print("OK"); // Allume l'éclairage PrinciPal et sa led verte
a == 1;// écriture en sortie (broche 51) d'un état BAS
}
else // Si il est entre 20h00 et 16h00
{
digitalWrite(EclPP, HIGH); digitalWrite(LedEclPP, LOW); lcd.print("NO"); // Eteint l'éclairage PrinciPal et sa led verte
a == 0;// écriture en sortie (broche 51) d'un état HAUT
}
// ECLAIRAGE SECONDAIRE Sec
lcd.setCursor(13,1);
lcd.print(" Sec:");
if (HProg >= 1330 && HProg <= 1602)// Si il est + de 12h00 et - de 16h02
{
digitalWrite(EclSec, LOW); digitalWrite(LedEclSec, HIGH); lcd.print("OK"); // Allume l'éclairage Seconcdaire et sa led verte
b = "1"; // écriture en sortie (broche 52) d'un état BAS
}
else if (HProg >= 1945 && HProg <= 2130 )// Si il est + de 19h45 et - de 21h30
{
digitalWrite(EclSec, LOW); digitalWrite(LedEclSec, HIGH); lcd.print("OK"); // Allume l'éclairage Seconcdaire et sa led verte
b = "1"; // écriture en sortie (broche 52) d'un état BAS
}
else // Si il est + de 21h30
{
digitalWrite(EclSec, HIGH);digitalWrite(LedEclSec,LOW); lcd.print("NO"); // Eteint l'éclairage Secondaire et sa led verte
b = "0"; // écriture en sortie (broche 52) d'un état HAUT
}
// ECLAIRAGE LED BLEUES ET BLANCHES
// GESTION DU TRANSFO 15V
if (HProg >= 1058 && HProg <= 1402)
{
digitalWrite(EclLed, LOW); // alimente le relais 2-1 du transfo 15V
}
else if (HProg >= 1958 && HProg <= 2232)
{
digitalWrite(EclLed, LOW); // alimente le relais 2-1 du transfo 15V
}
else
{
digitalWrite(EclLed, HIGH); // coupe le relais 2-1 du 15v
}
// ECLAIRAGE LED BLEUES ET BLANCHES
valupLedBleue = (map (t.min, 0, 30, 0, 255)); // allumage des leds bleues sur 30 minutes
valupLedBlanche = (map (t.min, 0, 59, 0, 255)); // allumage des leds bleues sur 59 minutes
valdownLedBleue = (map (t.min, 0, 30, 255, 0)); // extinction des leds bleues sur 30 minutes
valdownLedBlanche = (map (t.min, 0, 59, 255, 0)); // extinction des leds bleues sur 59 minutes
// LE MATIN
//LED BLEUE
{
if (HProg >= 1100 && HProg <= 1130) // Si il est 11h00
{
analogWrite(LedBleue, valupLedBleue * 0.8); digitalWrite(32, HIGH); c = 1; // Allumage progressif de l'éclairage Led Bleue et sa led témoin
}
else if (HProg > 1130 && HProg <= 1230)
{
analogWrite(LedBleue, 255); c = 1; digitalWrite(32, HIGH);
}
else if (HProg > 1230 && HProg <= 1302)// Si il est 12h31
{
analogWrite(LedBleue, valdownLedBleue * 0.8); // Extinction progressif de l'éclairage Led Bleue
}
else if (HProg > 1300 && HProg <= 2059)
{
digitalWrite(LedEclLedBleue, LOW); c = 0; // Eteint la led témoin
}
//LED BLANCHE
if (HProg >= 1130 && HProg <= 1230) // Si il est entre 11h30 et 12h30
{
analogWrite(LedBlanche, valupLedBlanche * 0.8); digitalWrite(33, HIGH); d = 1; // Allumage progressif de l'éclairage Led Blanche et sa led témoin
}
else if (HProg > 1230 && HProg <= 1300)// Si il est entre 12h30 et 13h00
{
analogWrite(LedBlanche, 255); digitalWrite(33, HIGH); d = 1;
}
else if (HProg > 1300 && HProg <= 1400)
{
analogWrite(LedBlanche, valdownLedBlanche * 0.8); d = 1; // Extinction progressif de l'éclairage Led Blanche
}
else if (HProg > 1400 && HProg <= 2059)
{
digitalWrite(LedEclLedBlanche, LOW); // Extinction de la led témoin Led Blanche
d = 0; // écriture en sortie d'un état BAS
}
}
// LE SOIR
//LED BLEUE
if (HProg >= 2100 && HProg <= 2130) // Si il est 21h00
{
analogWrite(LedBleue, valupLedBleue * 0.8); digitalWrite(LedEclLedBleue, HIGH); c = 1; // Allumage progressif de l'éclairage Led Bleue
}
else if (HProg > 2100 && HProg <= 2200) // Si il est entre 20h00 et 22h00
{
analogWrite(LedBleue, 255); c = 1; digitalWrite(32,HIGH);
}
else if (HProg > 2200 && HProg <= 2230)
{
analogWrite(LedBleue, valdownLedBleue * 0.8); // progressive des leds bleues
}
else if (HProg > 2230 && HProg <= 2359) // Si il est entre 22h30 et minuit
{
digitalWrite(32, LOW); c = 0; // Extinction de la led témoin Led Bleue et écriture en sortie d'un état BAS
}
else if (HProg > 0 && HProg <= 1059) // Si il est entre minuit et 11h00
{
digitalWrite(32, LOW); c = 0; // Extinction de la led témoin Led Bleue et écriture en sortie d'un état BAS
}
3 éme et dernière partie
//LED BLANCHE
if (HProg >= 2000 && HProg <2100)
{
analogWrite(LedBlanche, valupLedBlanche * 0.8); digitalWrite(LedEclLedBlanche, HIGH); // Allumage progressif de l'éclairage Led Blanche
d = 1; // écriture en sortie d'un état HAUT
}
else if (HProg >= 2100 && HProg <2200) // Si il est entre 21h00 et 22h00
{
analogWrite(LedBlanche, valdownLedBlanche * 0.8); // Extinction de l'éclairage Led Blanche
}
else if (HProg > 2200 && HProg <= 2359) // Si il est entre 22h00 et minuit
{
digitalWrite(LedEclLedBlanche, LOW); // Extinction de la led témoin Led Blanche
d = 0; // écriture en sortie d'un état BAS
}
else if (HProg >= 0 && HProg <= 1059) // Si il est entre minuit et 11h00
{
digitalWrite(LedEclLedBlanche, LOW); // Extinction de la led témoin Led Blanche
d = 0; // écriture en sortie d'un état BAS
}
// ALLUMAGE MANUEL
// GESTION DU CHAUFFAGE
// ***** Le relais du chauffage est câblé en NC (inverse des autres relais)*********
{
lcd.setCursor(7,2);
lcd.print("Chauff:OK");
digitalWrite(LedChauffage, HIGH); digitalWrite(Chauffage, HIGH); digitalWrite(LedAlarmeChauffage, LOW);// Allume la led verte du chauffage, éteint la led rouge de l'alarme et laisse le relais en NC
if (TemperatureEau > 25.5) // si la température est supérieure à 25.5°
{
digitalWrite(Chauffage, LOW); digitalWrite(LedChauffage, LOW); digitalWrite(LedAlarmeChauffage, HIGH); // Eteint la led verte du chauffage, allume la led rouge de l'alarme et passe le relais en NO
lcd.setCursor(0,2);
lcd.print(" ");
lcd.print(" ALARME TEMPERATURE");
lcd.setCursor(0,3);
lcd.print(" ");
lcd.print(" HAUTE : T > 25,5");
lcd.print((char)223), ("C");
delay(3000);
}
}
// GESTION DU NIVEAU D'EAU
{
{
SondeNiveau = 0; int i = 0;
for (int i = 0; i < 5 ; i++)
{
SondeNiveau = analogRead(Niveau);
//Serial.println(SondeNiveau);
SondeNiveau += SondeNiveau;
//Serial.println(SondeNiveau);
delay(300);
}
Sonde = (SondeNiveau / 5);
Serial.println(Sonde); " ";
}
digitalWrite(NBB, LOW); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);
if (Sonde < 500)
{
digitalWrite(NBB, HIGH); // allume la led rouge du niveau très bas
}
else if (Sonde >= 500 && Sonde <515)
{
digitalWrite(NB, HIGH); digitalWrite(NBB, LOW); // allume la led orange du niveau bas et éteint la rouge du niveau très bas
}
else if (Sonde >= 515 && Sonde < 530)
{
digitalWrite(NN, HIGH); digitalWrite(NBB, LOW); digitalWrite(NB, LOW); // allume la led verte du niveau normal et éteint les leds des niveaux inférieurs
}
else if (Sonde >= 530 && Sonde < 545)
{
digitalWrite(NH, HIGH); digitalWrite(NBB, LOW); digitalWrite(NB, LOW); digitalWrite(NN, LOW); // allume la led orange du niveau bas et éteint les leds des niveaux inférieurs
}
else if (Sonde >= 545 && Sonde < 750)
{
digitalWrite(NHH, HIGH); digitalWrite(NBB, LOW); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW); // allume la led rouge du niveau bas et éteint les leds des niveaux inférieurs
}
delay(100);
}
// AFFICHAGE DE LA TEMPERATURE DE L'EAU
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
TemperatureEau = 0;
sensors.requestTemperatures(); // Send the command to get temperatures
delay(1000);
TemperatureEau = (sensors.getTempCByIndex(0));
}
// Affiche les températures
{
TempRTC = DS3231_get_treg(); // lit la température de l'horloge
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print("Temp RTC: ");
lcd.print(float(TempRTC),1);
lcd.print((char)223), ("C");
delay(3000);
}
{
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print("Temp Eau: ");
lcd.print(TemperatureEau, 1);
lcd.print((char)223), ("C");
delay(3000);
}
}
Si cela peut t'aider, j'utilise le programme suivant pour lire la température d'un DS18B20 (avec UNO), et tout fonctionne rondement:
#include <OneWire.h>
int DS18S20_Pin = 8; //DS18S20 Signal pin on digital 8
int laser = 4;
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 8
void setup(void)
{
Serial.begin(9600);
pinMode(laser, OUTPUT);
}
void loop(void)
{ float temperature = getTemp(); //will take about 750ms to run
Serial.print(" Temperature= ");
Serial.print(temperature, 1);
Serial.println(" C");
digitalWrite(laser, HIGH); // sets the LED on
delay(100); // waits for a second
digitalWrite(laser, LOW); // sets the LED off
delay(4900);
}
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
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
delay(750); // Wait for temperature conversion to complete
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;
}
ok, je vais modifier mon code et essayer le tien.
merci
Je viens de m'apercevoir de quelque chose en vérifiant ma connexion sur la broche 19 de ma MEGA :
si je déconnecte le câble de la broche 19 et que je le reconnecte, la première lecture est bonne 24.9° et les suivantes sont fausses -127°. J'ai fait plusieurs fois la manip et j'ai toujours le même résultat.
Est ce qu'un reset "propre" entre deux mesures est nécessaire? et si oui par quel code ?
Salut ! je prends en cours!
A tu regarder cela [PARTAGE] DS18B20 Datasheet en francais. Sonde T°. - Tutoriels et cours - Arduino Forum
Les sondes sont elles raccordé par des câbles? Quelle est La distance de câble et le type de câble. Voir son passage ?si il passe a proximité de gaines de puissance.
A plus!
Bonjour
J'ai trouvé mon erreur !!!!!!!!!
C'est l'instruction de delai pour la lecture qui était mal placée.
Je l'ai mise APRES le gettempérature.
Et là nickel
Voilà 1 heure que ça tourne et plus de -127
Merci à tous ceux qui m'ont aidé.
Bonjour,
J'ai une petite question concernant le programme que duino nano a posté :
//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
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
delay(750); // Wait for temperature conversion to complete
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;
A quoi sert le ,1 dans l'instruction ds.write(0x44, 1).
Si c'est lier à l'utilisation du mode parasite, peut-on le supprimer?
Merci de m'éclairer,
cf la documentation technique du composant
DS18B20 FUNCTION COMMANDS
After the bus master has used a ROM command to address the DS18B20 with which it wishes to communicate, the master can issue one of the DS18B20 function commands. These commands allow the master to write to and read from the DS18B20’s scratchpad memory, initiate temperature conversions and determine the power supply mode. The DS18B20 function commands, which are described below, are summarized in Table 3 and illustrated by the flowchart in Figure 12.
CONVERT T [44h]
This command initiates a single temperature conversion. Following the conversion, the resulting thermal data is stored in the 2-byte temperature register in the scratchpad memory and the DS18B20 returns to its low-power idle state. If the device is being used in parasite power mode, within 10μs (max) after this command is issued the master must enable a strong pullup on the 1-Wire bus for the duration of the conversion (tCONV) as described in the Powering the DS18B20 section. If the DS18B20 is powered by an external supply, the master can issue read time slots after the Convert T command and the DS18B20 will respond by transmitting a 0 while the temperature conversion is in progress and a 1 when the conversion is done. In parasite power mode this notification technique cannot be used since the bus is pulled high by the strong pullup during the conversion.
ok
Merci