Arduino Polska Forum

Pełna wersja: Termometr cyfrowy z alarmem
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witajcie, szukam pomocy w napisaniu programu do Termometru cyfrowego z alarmem.
Z Arduino pracuję dopiero od tygodnia i do końca nie wiem wszystkiego.
Chciałbym do mojego termometru cyfrowego dołączyć buzzer którego zadaniem była by sygnalizacja gdy temperatura spadnie poniżej 37 stopni oraz gdy przekroczy 80stopni. Buzzer miałby się wyłączyć po przyciśnięciu switcha lub po określonym czasie sygnalizowania np 20 sekundach.



Oto schemat bez podłączonego czujnika ds18b20 który jest podłączony do pinu nr 8


[Obrazek: arduino-hd44780.png]

Oto program na którym aktualnie mam sam termometr :

Kod:
   #include <OneWire.h>
   #include <LiquidCrystal.h>

   // Connections:
   // rs (LCD pin 4) to Arduino pin 12
   // rw (LCD pin 5) to Arduino pin 11
   // enable (LCD pin 6) to Arduino pin 10
   // LCD pin 15 to Arduino pin 13
   // LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
   void setup(void) {
   lcd.begin(16, 2);
}
 byte i;
 byte present = 0;
 byte type_s;
 byte data[12];
 byte addr[8];
 float celsius, fahrenheit;
   
   int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

///////

void loop(void) {
 
 
 if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
 }
 
 if (OneWire::crc8(addr, 7) != addr[7]) {

     return;
 }


 // the first ROM byte indicates which chip
 switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
   default:

     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.
 
 present = ds.reset();
 ds.select(addr);    
 ds.write(0xBE);         // Read Scratchpad


 for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();

 }


 // 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;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
   
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
     delay(5000);  //Czeka 5 sekund i odswieza
}

Każda pomoc będzie nagradzana reputacją ! Smile
to wstepny jescze nie dala poprawnie
Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>
  const int buttonPin = 2;     // the number of the pushbutton pin
const int buzer =  13;
int klawisz = 0;  
   // Connections:
   // rs (LCD pin 4) to Arduino pin 12
   // rw (LCD pin 5) to Arduino pin 11
   // enable (LCD pin 6) to Arduino pin 10
   // LCD pin 15 to Arduino pin 13
   // LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
   void setup(void) {
      Serial.begin(9600);
   lcd.begin(16, 2);
     klawisz = digitalRead(buttonPin);
  pinMode(buzer, OUTPUT);

  pinMode(klawisz, INPUT);
  pinMode(klawisz, OUTPUT);
    digitalWrite(klawisz, LOW);
  
  
}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
  
   int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

///////

void loop(void) {


if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {

     return;
}


// the first ROM byte indicates which chip
switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
   default:

     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.

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad


for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();

}


// 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;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
  
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
     delay(5000);  //Czeka 5 sekund i odswieza
      klawisz = digitalRead(buttonPin);
if(klawisz==1){};

if(celsius<=37||celsius>=80){
  digitalWrite(buzer, HIGH);
  Serial.println("37");
}
else
{
digitalWrite(buzer, LOW);
Serial.println("stop");
  }
Serial.println(celsius);
}
przycisk kasowania alarmu pod pin 10 do masy
brzęczek pod pin 13 i do masy

Cykl trwa 40 sekund jak temperatura spadnie poniżej 37 lub będzie powyżej 80 włączy się alarm na 20sek.
po tym czasie sam się wyłączy lub możesz go wyłączyć w każdej chwili przyciskiem . Po 40 sekundach od
włączenia się alarmu kod restartuje wyzwolenie alarmu i znowu zaczyna wyć jeżeli temp. jest poniżej 37
lub powyżej 80. Jeżeli to ma być pod układ bojlera albo kotła c.o. to daj znać trzeba będzie przerobić
bo takie wycie co minutę będzie z goła upierdliwe .

Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>

   // Connections:
   // rs (LCD pin 4) to Arduino pin 12
   // rw (LCD pin 5) to Arduino pin 11
   // enable (LCD pin 6) to Arduino pin 10
   // LCD pin 15 to Arduino pin 13
   // LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
  
    byte buzer = 13;       // pin pod który dajesz brzęczek
    byte przycisk = 10;    // pin przycisku , przycisk do masy
    byte stanalarmu = 0;   // zminna pomocnicza
    long czaswyl = 0;      // zmienna pomocnicza
  
   void setup(void) {
   lcd.begin(16, 2);
  
   pinMode(buzer,OUTPUT);
   pinMode(przycisk,INPUT_PULLUP);
  
  
}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
  
   int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

///////

void loop(void) {


if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {

     return;
}


// the first ROM byte indicates which chip
switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
   default:

     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.

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad


for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();

}


// 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;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
  
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
     delay(5000);  //Czeka 5 sekund i odswieza
    
     byte reset = digitalRead(przycisk);
  if ((celsius < 37 or celsius > 80) and stanalarmu == 0 ){
      
       czaswyl = millis();
       digitalWrite( buzer , HIGH );
       stanalarmu = 1;}
      
  if ( ((millis()-czaswyl)/1000 > 20) or reset == LOW ){digitalWrite( buzer , LOW );}
  if ((millis()-czaswyl)/1000 > 40){stanalarmu = 0;}
    
}
(12-10-2015, 07:43)JasQ napisał(a): [ -> ]przycisk kasowania alarmu pod pin 10 do masy
brzęczek pod pin 13 i do masy

Cykl trwa 40 sekund jak temperatura spadnie poniżej 37 lub będzie powyżej 80 włączy się alarm na 20sek.
po tym czasie sam się wyłączy lub możesz go wyłączyć w każdej chwili przyciskiem . Po 40 sekundach od
włączenia się alarmu kod restartuje wyzwolenie alarmu i znowu zaczyna wyć jeżeli temp. jest poniżej 37
lub powyżej 80. Jeżeli to ma być pod układ bojlera albo kotła c.o. to daj znać trzeba będzie przerobić
bo takie wycie co minutę będzie z goła upierdliwe .

Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>

   // Connections:
   // rs (LCD pin 4) to Arduino pin 12
   // rw (LCD pin 5) to Arduino pin 11
   // enable (LCD pin 6) to Arduino pin 10
   // LCD pin 15 to Arduino pin 13
   // LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
  
    byte buzer = 13;       // pin pod który dajesz brzęczek
    byte przycisk = 10;    // pin przycisku , przycisk do masy
    byte stanalarmu = 0;   // zminna pomocnicza
    long czaswyl = 0;      // zmienna pomocnicza
  
   void setup(void) {
   lcd.begin(16, 2);
  
   pinMode(buzer,OUTPUT);
   pinMode(przycisk,INPUT_PULLUP);
  
  
}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
  
   int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

///////

void loop(void) {


if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {

     return;
}


// the first ROM byte indicates which chip
switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
   default:

     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.

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad


for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();

}


// 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;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
  
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
     delay(5000);  //Czeka 5 sekund i odswieza
    
     byte reset = digitalRead(przycisk);
  if ((celsius < 37 or celsius > 80) and stanalarmu == 0 ){
      
       czaswyl = millis();
       digitalWrite( buzer , HIGH );
       stanalarmu = 1;}
      
  if ( ((millis()-czaswyl)/1000 > 20) or reset == LOW ){digitalWrite( buzer , LOW );}
  if ((millis()-czaswyl)/1000 > 40){stanalarmu = 0;}
    
}
Cały układ ma właśnie służyć do kontroli temperatury kotła c.o Big Grin
Tak myślałem po temperaturach się kapnąłem 8 lat w hydraulice grzebałem Wink

Tak na szybko . W poniższych danych ustawiasz co ci tam pasuje jak nie naciśniesz przycisku to co 20 sekund będzie wył co by cię obudził i piec nie zaparkował na poddaszu . Jak już wstaniesz i zresetujesz go to masz 10 minut aby z nim zrobić porządek jak potrzebujesz więcej mień w tej linijce na tyle ile minut potrzebujesz .

int czreset = 10; // czas po jakim się zresetuje w minutach

a tutaj reszta do ustawienia :

int czalarm = 20; // czas alarmu w sekundach
int czreset = 10; // czas po jakim się zresetuje w minutach
int czrekcji = 40; // czas po jakim zacznie wyć bez przycisku w sekundach

ps. dopiero jak ściągnąłem bibliotekę onewire kapnołem się że reset nie może być użyta zmieniłem

" byte reset = digitalRead(przycisk);" na " byte preset = digitalRead(przycisk);"

ponieważ "reset" jest używana przez onewire .



Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>


   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
  
    byte buzer = 13;          // pin pod który dajesz brzęczek
    byte przycisk = 10;      // pin przycisku , przycisk do masy
    byte stanalarmu = 0;   // zmienna pomocnicza
    long czaswyl = 0;        // zmienna pomocnicza
    int czalarm = 20;        // czas alarmu w sekundach
    int czreset = 10;         // czas po jakim się zresetuje w minutach
    int czrekcji = 40;        // czas po jakim zacznie wyć bez przycisku w sekundach
  
   void setup(void) {

   lcd.begin(16, 2);
   Serial.begin(9600);
   pinMode(buzer,OUTPUT);
   pinMode(przycisk,INPUT_PULLUP);
  
  
}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
  
   int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

void loop(void) {


if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {return;}


switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
   default:

     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.

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad


for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();

}

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);
   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
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
  
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
     delay(5000);  //Czeka 5 sekund i odswieza
    
   byte preset = digitalRead(przycisk);
  
  if ((celsius < 37 or celsius > 80) and stanalarmu == 0 ){
      
       czaswyl = millis();
       digitalWrite( buzer , HIGH );
       stanalarmu = 1;}
      
  if ((millis()-czaswyl)/1000 > czalarm){
        digitalWrite( buzer , LOW );}
  if (((millis()-czaswyl)/1000 > czrekcji) and stanalarmu == 1){
        stanalarmu = 0;}
  if (((millis()-czaswyl)/60000 >= czreset) and stanalarmu == 2){
        stanalarmu = 0;}
  if ( preset == LOW ){    
       digitalWrite( buzer , LOW );
       czaswyl = millis();
       stanalarmu = 2;}
  
  Serial.print((millis()-czaswyl)/1000);
  Serial.print(" / ");
  Serial.print(stanalarmu);
  Serial.println();

  
}
(12-10-2015, 12:52)JasQ napisał(a): [ -> ]Tak myślałem po temperaturach się kapnąłem 8 lat w hydraulice grzebałem Wink

Tak na szybko . W poniższych danych ustawiasz co ci tam pasuje jak nie naciśniesz przycisku to co 20 sekund będzie wył co by cię obudził i piec nie zaparkował na poddaszu . Jak już wstaniesz i zresetujesz go to masz 10 minut aby z nim zrobić porządek jak potrzebujesz więcej mień w tej linijce na tyle ile minut potrzebujesz .

int czreset = 10; // czas po jakim się zresetuje w minutach

a tutaj reszta do ustawienia :

int czalarm = 20; // czas alarmu w sekundach
int czreset = 10; // czas po jakim się zresetuje w minutach
int czrekcji = 40; // czas po jakim zacznie wyć bez przycisku w sekundach

ps. dopiero jak ściągnąłem bibliotekę onewire kapnołem się że reset nie może być użyta zmieniłem

" byte reset = digitalRead(przycisk);" na " byte preset = digitalRead(przycisk);"

ponieważ "reset" jest używana przez onewire .



Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>


   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
  
    byte buzer = 13;          // pin pod który dajesz brzęczek
    byte przycisk = 10;      // pin przycisku , przycisk do masy
    byte stanalarmu = 0;   // zmienna pomocnicza
    long czaswyl = 0;        // zmienna pomocnicza
    int czalarm = 20;        // czas alarmu w sekundach
    int czreset = 10;         // czas po jakim się zresetuje w minutach
    int czrekcji = 40;        // czas po jakim zacznie wyć bez przycisku w sekundach
  
   void setup(void) {

   lcd.begin(16, 2);
   Serial.begin(9600);
   pinMode(buzer,OUTPUT);
   pinMode(przycisk,INPUT_PULLUP);
  
  
}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
  
   int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

void loop(void) {


if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {return;}


switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
   default:

     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.

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad


for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();

}

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);
   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
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
  
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
     delay(5000);  //Czeka 5 sekund i odswieza
    
   byte preset = digitalRead(przycisk);
  
  if ((celsius < 37 or celsius > 80) and stanalarmu == 0 ){
      
       czaswyl = millis();
       digitalWrite( buzer , HIGH );
       stanalarmu = 1;}
      
  if ((millis()-czaswyl)/1000 > czalarm){
        digitalWrite( buzer , LOW );}
  if (((millis()-czaswyl)/1000 > czrekcji) and stanalarmu == 1){
        stanalarmu = 0;}
  if (((millis()-czaswyl)/60000 >= czreset) and stanalarmu == 2){
        stanalarmu = 0;}
  if ( preset == LOW ){    
       digitalWrite( buzer , LOW );
       czaswyl = millis();
       stanalarmu = 2;}
  
  Serial.print((millis()-czaswyl)/1000);
  Serial.print(" / ");
  Serial.print(stanalarmu);
  Serial.println();

  
}

Niestety jak temperatura spada poniżej 37 buzzer nic nie sygnalizuje :/
int czrekcji = 40 zmieniłem na 10 i zauważyłem ,że jedyne zjawisko jakie ma miejsce to mrugnięcie diody TX na Arduino
Działa , działa jak tylko ręki się na resecie nie trzyma Big Grin

lekko poprawiony kod ( czytelniejszy )

Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>


   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8
  
    byte buzer = 13;          // pin pod który dajesz brzęczek
    byte przycisk = 10;      // pin przycisku , przycisk do masy
    byte stanalarmu = 0;   // zmienna pomocnicza
    long czaswyl = 0;        // zmienna pomocnicza
    int czalarm = 20;        // czas alarmu w sekundach
    int czreset = 10;         // czas po jakim się zresetuje w minutach
    int czrekcji = 40;        // czas po jakim zacznie wyć bez przycisku w sekundach
  
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;
  
   void setup(void) {

   lcd.begin(16, 2);
   Serial.begin(9600);
   pinMode(buzer,OUTPUT);
   pinMode(przycisk,INPUT_PULLUP);
  
}


void loop(void) {
  
     byte preset = digitalRead(przycisk);
  
  if ((celsius < 37 or celsius >= 80) and stanalarmu == 0 ){
      
       czaswyl = millis();
       digitalWrite( buzer , HIGH );
       stanalarmu = 1;}
      
  if ((celsius >= 37 and celsius < 80) and stanalarmu == 0 ){
      
       digitalWrite( buzer , LOW );stanalarmu = 0;}
      
  if ((millis()-czaswyl)/1000 > czalarm){
        digitalWrite( buzer , LOW );}
  if (((millis()-czaswyl)/1000 > czrekcji) and stanalarmu == 1){
        stanalarmu = 0;}
  if (((millis()-czaswyl)/60000 >= czreset) and stanalarmu == 2){
        stanalarmu = 0;}
  if ( preset == LOW ){    
       digitalWrite( buzer , LOW );
       czaswyl = millis();
       stanalarmu = 2;}
  
  Serial.print((millis()-czaswyl)/1000);
  Serial.print(" / ");
  Serial.print(stanalarmu);
  Serial.print(" / ");
  Serial.println(celsius);

if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;}

if (OneWire::crc8(addr, 7) != addr[7]) {return;}


switch (addr[0]) {
   case 0x10:

     type_s = 1;
     break;
   case 0x28:

     type_s = 0;
     break;
   case 0x22:

     type_s = 0;
     break;
     default:

     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.

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad


for ( i = 0; i < 9; i++) {data[i] = ds.read();}

int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
   raw = raw << 3; // 9 bit resolution default
   if (data[7] == 0x10) {raw = (raw & 0xFFF0) + 12 - data[6];}

} else {
  
   byte cfg = (data[4] & 0x60);
   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
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Temperatura: ");
     lcd.setCursor(2,1);
  
     if (SignBit) {
        lcd.print("-");
     }
     lcd.print(celsius);
     lcd.print(" C ");
        
}