Bonjour,
J'ai un petit problème qui me bloque depuis quelques temps.
J'ai câbler deux sonde (ds18b20) sur un arduino Mega et le connecter a un écran LCD donc j'arrive a afficher la température des deux sonde sur le LCD
Seulement maintenant j'ai besoin de pouvoir faire sonner une alarme (Buzzer) si la temperature est au dessus de 3.7°C et si elle decent en dessous de 2.3°C et afficher un message d'erreur sur le LCD mais je suis complètement bloquée
Merci a ceux qui m'aiderons a résourdre mon problème ! 
Voici mon code :
#include <LiquidCrystal.h>
#include <OneWire.h>
// DS18S20 Temperature chip i/o
OneWire ds(22); // on pin 16
byte addr1[8] = {0x28, 0xFF, 0x5D, 0x1B, 0x6B, 0x04, 0x00, 0xC2};
byte addr2[8] = {0x28, 0xFF, 0xFE, 0x5C, 0x54, 0x14, 0x00, 0xB4};
int SignBit = 0;
int StartCol = 8;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
Serial.begin(9600);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Temp 1:");
lcd.setCursor(0, 1);
lcd.print("Temp 2:");
}
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 line) {
int Whole, Fract;
Whole = Tc_100 / 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
if (SignBit) // If its negative
{
lcd.setCursor(StartCol,line);
lcd.print("-");
}
lcd.setCursor(StartCol+1,line);
lcd.print(Whole);
lcd.print(".");
if (Fract < 10)
{
lcd.print("0");
}
lcd.print(Fract);
lcd.print("C");
}
void loop()
{
byte i;
byte data[12];
int Tc_100;
Tc_100 = tc_100(addr1);
mypr(Tc_100,0);
Tc_100 = tc_100(addr2);
mypr(Tc_100,1);
}
Qu'est-ce qui te bloques?
Il faut faire un test sur la température et si les seuils sont franchis déclencher une action ce n'est pas vraiment complexe en soi.
"
Seulement maintenant j'ai besoin de pouvoir faire sonner une alarme (Buzzer) si la temperature est au dessus de 3.7°C et si elle decent en dessous de 2.3°C et afficher un message d'erreur sur le LCD mais je suis complètement bloquée "
c'est un peu ambigu: je vais interorèter, pour simplifier, "LA température" par "la moyenne des températures (mais ça peut ^tre le min, le max). De même, je ne me soucierai que d'un seuil de température
Une squisse de code serait la suivante, non testée
en variable globales:
cont int patteBuzzer=11; // trouver une patte libre
float T_A_Surveiller;
const float TSeuil1=2.3;
dans loop
T_A_Surveiller = (tc_100(addr1) + tc_100(addr1)) *0.5; // en ayant 2 variables, une par thermomètre, ca serait + simple
if (T_A_Surveiller < TSeuil1) {
// mettre patteBuzzer à 1; ne pas oublier de la declarer en sortie dans setup
Serial.println("\n Il fait froid");
// voir où cader le message dans la LCD, si besoin
}
Merci de ta réponse, dans mon cas je dois fait en sorte que le LCD affiche "Attention Temp" quand la température est supérieure a 3.7°C et pareil quand elle décent en dessous de 2.3°C mais a l'heure actuel dans mon programme je n'ai pas de variable température seulement un sorte de multiplication qui fait que je peux trouver la température en Degrés Celsius
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
Serial.begin(9600);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Temp 1:");
lcd.setCursor(0, 1);
lcd.print("Temp 2:");
}
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 line) {
int Whole, Fract;
Whole = Tc_100 / 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
if (SignBit) // If its negative
{
lcd.setCursor(StartCol,line);
lcd.print("-");
}
lcd.setCursor(StartCol+1,line);
lcd.print(Whole);
lcd.print(".");
if (Fract < 10)
{
lcd.print("0");
}
lcd.print(Fract);
lcd.print("C");
}
void loop()
{
byte i;
byte data[12];
int Tc_100;
Tc_100 = tc_100(addr1);
mypr(Tc_100,0);
Tc_100 = tc_100(addr2);
mypr(Tc_100,1);
}
Tc_100 est une température en 1/100 degrés (vous pouvez ainsi explorer jusqu'à 320 degres), et non, comme je le lisais trop rapidement, un float.
C'est une variable locale à loop (et je n'hesiterais pas à la dupliquer, "perdant" 2 octets, pour séparer les thermomètres 1 et 2)
Il vous suffit de calculer les seuils en 1/100 degrés, (on doit pouvoir faire ça par calcul mental et graver les résultats dans le code)