allumer une led sous condition de température

bonjour,
le but de mon montage est le suivant:
allumer une led lorsque la valeur de température du capteur 1 >capteur 2+x degrés
j’utilise deux capteur 18B20
une led
une arduino uno
pour l’instant mon montage fonctionne mais seulement lorsque capteur 1>capteur 2
je n’arrive pas à ajouter x degrés
ci dessous mon code:

#include <OneWire.h>
 
// DS18S20 Temperature chip i/o

const int pin_led=2;// led sur port digital 2
OneWire ds(10); // on pin 10
 
byte addr1[8] = {0x28, 0x90, 0xCC, 0x36, 0x06, 0x00, 0x00, 0x3C};
byte addr2[8] = {0x28, 0x07, 0xF9, 0x36, 0x06, 0x00, 0x00, 0x5E};
int SignBit = 0;
 
void setup(){
pinMode(pin_led,OUTPUT);
Serial.begin(9600);

}
 
int tc_100(byte* addr){
int HighByte, LowByte, TReading;
byte data[12];
byte i;
 
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.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
 
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
return (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
}
 
void mypr(int Tc_100) {
int Whole, Fract;
 
Whole = Tc_100 / 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
 
if (SignBit) // If its negative
{
Serial.print("-");
}
Serial.print(Whole);
Serial.print(".");
if (Fract < 10)
{
Serial.print("0");
}
Serial.print(Fract);
 
Serial.print("\n");
}
 
void loop()
{
byte i;
byte data[12];
int Tc_100;

if (tc_100(addr1)>tc_100(addr2)+1)digitalWrite(pin_led,HIGH);
else digitalWrite(pin_led,LOW);
 
Tc_100 = tc_100(addr1);
Serial.print("1: ");
mypr(Tc_100);
 
Tc_100 = tc_100(addr2);
Serial.print("2: ");
mypr(Tc_100);
}

merci d’avance pour votre aide

Bonjour,

Tu as déjà le test capteur 1 >capteur 2+1 degrés

  if (tc_100(addr1) > tc_100(addr2) + 1)digitalWrite(pin_led, HIGH);

A la place de 1, il suffit de mettre le x que tu désires.

le code que j'ai écrit fonctionne mais la led s'allume seulement lorsque capteur1>capteur2
il ne tient pas compte de la différence
par exemple je souhaite que la led s'allume lorsque la différence de température est supérieure à 5°c

le but de mon montage est de gérer une pompe à eau à la place de la led et je ne souhait epas qu'elle se déclenche tout le temps pour quelques dixiemes de degré de différence.

Tu mets 5 à la place de 1 dans le test

hello

comme le dit Kamill

as tu testé
if (tc_100(addr1) > 20 {digitalWrite(led, HIGH);}

voici les valeurs dans le terminal:
1: 21.25
2: 21.06
la difference est de 21.25-21.06=0.27
pourtant la led s'allume alors que la difference est inférieure à 1

et en forçant l'addition avec des parenthèses

if (tc_100(addr1) > (tc_100(addr2) + 1))

Est-ce que quelqu'un va réaliser que tc_100 retourne la température exprimée en centièmes de degrés ?

yerk yerk :smiling_imp:

1: 21.43
2: 21.00
avec cette différence, soit 0.43 la led s'allume quand meme alors que je souhaite qu'elle s'allume lorsque la différence est supérieure à 1°c(voir plus )
pour l'instant il ne prend en compte que la comparaison des capteurs

bricoleau:
Est-ce que quelqu'un va réaliser que tc_100 retourne la température exprimée en centièmes de degrés ?

yerk yerk :smiling_imp:

if (tc_100(addr1) > tc_100(addr2) + 100) //Pour 1 degré de différence

bien vu

c'est de l'utopie :slight_smile:

en effet
merci bricoleau
mainteant cela fonctionne

Quand on additionne des choux et des carottes, ben forcément la led elle s'allume pas
:smiley:

Perso avec les DS18B20 je ne me casse pas la tête : je garde toutes les températures en format brut, c'est-à-dire un nombre entier sur 2 octets exprimé en 16ièmes de degrés, tel que lu dans le scratchpad.
Comme ça je n'altère pas la mesure.
Elle est traitée telle quelle partout, et convertie en degrés celsius uniquement au moment d'afficher les valeurs.

merci pour les conseils

En complément :

Sur ce type de montage avec plusieurs ds18b20, on fonce souvent sans se poser de question vers un cablage où les deux sondes sont reliés à l'arduino via la même broche.
A première vue cela semble normal, puisque c'est justement l'avantage du oneWire.

Sauf que derrière il faut gérer les adresses.

Si on les code en dur dans le programme tel que dans l'exemple ci-dessus :
Initialement, pour connaitre ces valeurs, il faut utiliser un autre programme pour les afficher, afin de les saisir dans le code
Par la suite, si on veut remplacer une sonde, il faut revenir modifier le code.

Il existe des solutions pour gérer cela plus aisément, en passant par l'eeprom de l'arduino ou l'eeprom du ds18b20, et en ajoutant du code d'apprentissage.

Mais à mon avis, la première question à se poser est : ai-je vraiment besoin d'économiser une pin de l'arduino?

Si à la sortie, le montage complet laisse plein de pins de l'arduino inutilisées, cela ne vaut peut-être pas le coup de s'embêter.
Il est tout à fait possible de brancher chaque sonde sur une pin distincte, pour ne plus avoir à gérer les adresses. Sur chaque pin, je lis la première sonde que je touve.
En sortie de l'arduino, j'ai alors deux connecteurs distincts : un pour chaque sonde, qui peut être remplacée sans impact sur le programme.
Ca coûte une pin et une résistance de pull up.