Arduino Polska Forum

Pełna wersja: Sterownik do akwarium
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Witam.

Na samym początku zaznaczę, że jestem totalnym amatorem. Wink

Zrobiłem mały układ który docelowo ma od godziny 11:00 do 19:00 załączać światło w moich trzech akwariach i w każdym z osobna ma mierzyć temperaturę (termometry to DS18b20 z przewodami) oraz załączać chłodzenie latem oraz wyświetlać podstawowe dane na wyświetlaczu.

Generalnie coś tam działa, ale nie do końca tak jak powinno.

Problemy jakie napotkałem to:

- przy załączaniu się przekaźników przygasa wyświetlacz,
- przy jednym z termometrów skok temperatury to 0,25 stopnia, dwa pozostałe podają temperaturę w setnych stopnia, czym to może być spowodowane? Rezystory mam tak jak na schemacie 4,7 Ohma, zamieniałem je, może coś z termometrem jest nie tak?
- zegar ( DS3231 ) na wyświetlaczu odlicza co dwie sekundy ( pewnie wina kodu mam fragmenty w nim z odniesieniem do ds1307 ).


Prośba moja o rady i może uproszczenie jakoś kodu.

Planuje w przyszłości wykorzystać pin 11 który odpowiada za włączenie oświetlenia do uzyskania efektu świtu i zmierzchu, tylko nie wiem jak się za to zabrać, tzn diodą sterować pwm potrafię, ale jak zadziałać na oświetlenie pod 230V, co dodatkowo jest potrzebne?

Poniżej schemat i kod.

Pozdrawiam.

[Obrazek: twsafsjhuiefypikgwpvdftlgrcmthnilpssuekq...vwmxivsnqg]


Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
#define DS1307_ADDRESS 0x68
#define RELAY_ON 0 // 0 means active low relay
#define RELAY_OFF 1
#define Relay_1  11  // Arduino Digital I/O pin number
OneWire ds_1(A0);  //sensor 1 on pin 11
OneWire ds_2(A1);  //sensor 2 on pin 12
OneWire ds_3(A2);  //sensor 3 on pin 13
DallasTemperature sensor_1(&ds_1);
DallasTemperature sensor_2(&ds_2);
DallasTemperature sensor_3(&ds_3);
int nastaw = 26; // ustaw temperature
int przekaznik8 = 8; // pin przekaznik
int przekaznik9 = 9; // pin przekaznik
int przekaznik10 = 10; // pin przekaznik
byte state = LOW;
const char *monthName[12] = {
 //  "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze",
 //  "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"
 "01", "02", "03", "04", "05", "06",
 "07", "08", "09", "10", "11", "12"
};
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);

float temp_1; //HLT
float temp_2; //Mash
float temp_3; //Boil


void setup() {
 Wire.begin();
 digitalWrite(Relay_1, RELAY_OFF);
 pinMode(Relay_1, OUTPUT);
 pinMode(przekaznik8, OUTPUT);
 pinMode(przekaznik9, OUTPUT);
 pinMode(przekaznik10, OUTPUT);
 lcd.begin(20, 4);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 sensor_1.begin(); //initialize sensors
 sensor_2.begin();
 sensor_3.begin();
 Serial.begin(9600);
}

void loop() {
 printDate();
}
byte bcdToDec(byte val)  {
 return ( (val / 16 * 10) + (val % 16) );
}




void printDate() {
 Wire.beginTransmission(DS1307_ADDRESS);
 byte zero = 0x00;
 Wire.write(zero);
 Wire.endTransmission();
 Wire.requestFrom(DS1307_ADDRESS, 7);
 int second = bcdToDec(Wire.read());
 int minute = bcdToDec(Wire.read());
 int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
 int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
 int monthDay = bcdToDec(Wire.read());
 int month = bcdToDec(Wire.read());
 int year = bcdToDec(Wire.read());

 if ((hour == 11 ) && (minute == 00))
   digitalWrite(Relay_1, RELAY_ON);// set the Relay ON
 if ((hour == 19) && (minute == 00))
   digitalWrite(Relay_1, RELAY_OFF);// set the Relay OFF


 sensor_1.requestTemperatures();
 lcd.setCursor(0, 1);
 lcd.print("Temp1: ");
 lcd.print(sensor_1.getTempCByIndex(0));
 lcd.print(" N:");
 lcd.print(nastaw);
 if (temp_1 < (nastaw)) {
   digitalWrite(8, HIGH);
   int val = digitalRead(8);
   if (val)
     lcd.setCursor(19, 1);
   lcd.print("0");
 } else {
   lcd.setCursor(19, 1);
   lcd.print("1");
   digitalWrite(8, LOW);
 }
 sensor_2.requestTemperatures();
 lcd.setCursor(0, 2);
 lcd.print("Temp2: ");
 lcd.print(sensor_2.getTempCByIndex(0));
 lcd.print(" N:");
 lcd.print(nastaw);
 if (temp_2 < (nastaw)) {
   digitalWrite(9, HIGH);
   int val = digitalRead(9);
   if (val)
     lcd.setCursor(19, 2);
   lcd.print("0");
 } else {
   lcd.setCursor(19, 2);
   lcd.print("1");
   digitalWrite(9, LOW);
 }
 sensor_3.requestTemperatures();
 lcd.setCursor(0, 3);
 lcd.print("Temp3: ");
 lcd.print(sensor_3.getTempCByIndex(0));
 lcd.print(" N:");
 lcd.print(nastaw);
 if (temp_3 < (nastaw)) {
   digitalWrite(10, HIGH);
   int val = digitalRead(10);
   if (val)
     lcd.setCursor(19, 3);
   lcd.print("0");
 } else {
   lcd.setCursor(19, 3);
   lcd.print("1");
   digitalWrite(10, LOW);

 }


 tmElements_t tm;

 if (RTC.read(tm)) {
   lcd.setCursor (0, 0);
   LCDprint2digits(tm.Hour);
   lcd.print(':');
   LCDprint2digits(tm.Minute);
   lcd.print(':');
   LCDprint2digits(tm.Second);
   lcd.setCursor (9, 0);
   lcd.print(tm.Day);
   lcd.print('/');
   lcd.print(monthName[tm.Month - 1]);
   lcd.print('/');
   lcd.print(tmYearToCalendar(tm.Year - 2000));


 } else {
   if (RTC.chipPresent()) {
     lcd.println("DS1307 stoi. Uruchom Zegar");
   }
   else {
     lcd.println("DS1307 blad oczczytu!");
     lcd.println("sprawdz polaczenie");
   }
 }
}
void LCDprint2digits(int number) {
 if (number >= 0 && number < 10) {
   lcd.write('0');
 }
 lcd.print(number);
}
co do czujników ds 18b20 to 1wire czyli możesz podłączyć je do 1 wejścia digital a nie analog jak masz to nie błąd ze wykorzystujesz analogi jako cyfrowe ale ich mało i szkoda je marnować.
Wiem i z początku tak miałem podłączone, ale wówczas dwa termometry mi wariowały, a jakoś analogów mi nie szkoda.
wariowały bo masz te same adresy można je zmienić ja mam podpięte 3 w linie i nie mam problemu co do kodu to potrzebuje mi chwile na analizę


A co do przygasania to jaki masz zasilacz ile amper

Jeśli zamienisz miejscami czujniki to ten co źle pokazuje zmienia pozycje

do sterowanie 230v za pomocom 5v potzrbujesz:
moc3041-Obtotrazystor
rezystor 220 ohma
tranzystor bc547
tranzystor bd911- maksymalnie do 100W żarówka tranzystor musi być na radiatorze z pełnego aluminium będzie się grzał przy 100W

Obtotrazystor-to element elektroniczny rozdzielony galwanicznie ale sprzężony optycznie układ

bc557 i bd 911 łączysz w Darlington
Raczej nie to było problemem, tak myślę, bo każdy czytał temperaturę, pierwszy stąd:

Kod:
lcd.print(sensors.getTempCByIndex(0));


drugi stąd:

Kod:
lcd.print(sensors.getTempCByIndex(1));


a trzeci stąd:

Kod:
lcd.print(sensors.getTempCByIndex(2));


tylko wówczas dwa odczytywały co 0,25  stopnia, a jeden prawidłowo, ale spoko, analizuj. Smile

Zasilacz ma 2 ampery.
testowałeś osobno każdy ds możne ubiłeś jakiegoś z kodu wynika ze ma to poprawnie czytać ja teraz nie mam and tech tu to nie napisze ci testowego programu do nich

przekaźniki na ile V

Kod:
#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(10);  // on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  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.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // 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.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}
tu masz kod z przykładu z próbuj sprawdzić te czujniki muszę poszukać to dam ci kod do skanera 1wire bo będziesz musiał znacz adresy czujników chyba ze znasz
Przekaźnik na 5V, poprzekładałem termometry i wygląda to tak, jeden wskazuje pomiar tak jak powinien, a dwa pozostał co 0,25 stopnia. W kodzie miałem kilka błędów. Poniżej działający tak jak do tej pory.

Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
#define DS1307_ADDRESS 0x68
#define RELAY_ON 0 // 0 means active low relay
#define RELAY_OFF 1
#define Relay_1  11  // Arduino Digital I/O pin number
OneWire ds_1(A0);  //sensor 1 on pin 11
OneWire ds_2(A1);  //sensor 2 on pin 12
OneWire ds_3(A2);  //sensor 3 on pin 13
DallasTemperature sensor_1(&ds_1);
DallasTemperature sensor_2(&ds_2);
DallasTemperature sensor_3(&ds_3);
int nastaw = 26; // ustaw temperature
int przekaznik8 = 8; // pin przekaznik
int przekaznik9 = 9; // pin przekaznik
int przekaznik10 = 10; // pin przekaznik
byte state = LOW;
const char *monthName[12] = {
 //  "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze",
 //  "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"
 "01", "02", "03", "04", "05", "06",
 "07", "08", "09", "10", "11", "12"
};
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);

float temp_1; //HLT
float temp_2; //Mash
float temp_3; //Boil


void setup() {
 Wire.begin();
 digitalWrite(Relay_1, RELAY_OFF);
 pinMode(Relay_1, OUTPUT);
 pinMode(przekaznik8, OUTPUT);
 pinMode(przekaznik9, OUTPUT);
 pinMode(przekaznik10, OUTPUT);
 lcd.begin(20, 4);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 sensor_1.begin(); //initialize sensors
 sensor_2.begin();
 sensor_3.begin();
 Serial.begin(9600);
}

void loop() {
 printDate();
}
byte bcdToDec(byte val)  {
 return ( (val / 16 * 10) + (val % 16) );
}




void printDate() {
 Wire.beginTransmission(DS1307_ADDRESS);
 byte zero = 0x00;
 Wire.write(zero);
 Wire.endTransmission();
 Wire.requestFrom(DS1307_ADDRESS, 7);
 int second = bcdToDec(Wire.read());
 int minute = bcdToDec(Wire.read());
 int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
 int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
 int monthDay = bcdToDec(Wire.read());
 int month = bcdToDec(Wire.read());
 int year = bcdToDec(Wire.read());

 if ((hour == 15 ) && (minute == 44))
   digitalWrite(Relay_1, RELAY_ON);// set the Relay ON
 if ((hour == 15) && (minute == 45))
   digitalWrite(Relay_1, RELAY_OFF);// set the Relay OFF


 sensor_1.requestTemperatures();
 lcd.setCursor(0, 1);
 lcd.print("Temp1: ");
 lcd.print(sensor_1.getTempCByIndex(0));
 lcd.print(" N:");
 lcd.print(nastaw);
 if (sensor_1.getTempCByIndex(0) < (nastaw)) {
   digitalWrite(8, HIGH);
   int val = digitalRead(8);
   if (val)
     lcd.setCursor(19, 1);
   lcd.print("0");
 } else {
   lcd.setCursor(19, 1);
   lcd.print("1");
   digitalWrite(8, LOW);
 }
 sensor_2.requestTemperatures();
 lcd.setCursor(0, 2);
 lcd.print("Temp2: ");
 lcd.print(sensor_2.getTempCByIndex(0));
 lcd.print(" N:");
 lcd.print(nastaw);
 if (sensor_2.getTempCByIndex(0) < (nastaw)) {
   digitalWrite(9, HIGH);
   int val = digitalRead(9);
   if (val)
     lcd.setCursor(19, 2);
   lcd.print("0");
 } else {
   lcd.setCursor(19, 2);
   lcd.print("1");
   digitalWrite(9, LOW);
 }
 sensor_3.requestTemperatures();
 lcd.setCursor(0, 3);
 lcd.print("Temp3: ");
 lcd.print(sensor_3.getTempCByIndex(0));
 lcd.print(" N:");
 lcd.print(nastaw);
 if (sensor_3.getTempCByIndex(0) < (nastaw)) {
   digitalWrite(10, HIGH);
   int val = digitalRead(10);
   if (val)
     lcd.setCursor(19, 3);
   lcd.print("0");
 } else {
   lcd.setCursor(19, 3);
   lcd.print("1");
   digitalWrite(10, LOW);

 }


 tmElements_t tm;

 if (RTC.read(tm)) {
   lcd.setCursor (0, 0);
   LCDprint2digits(tm.Hour);
   lcd.print(':');
   LCDprint2digits(tm.Minute);
   lcd.print(':');
   LCDprint2digits(tm.Second);
   lcd.setCursor (9, 0);
   lcd.print(tm.Day);
   lcd.print('/');
   lcd.print(monthName[tm.Month - 1]);
   lcd.print('/');
   lcd.print(tmYearToCalendar(tm.Year - 2000));


 } else {
   if (RTC.chipPresent()) {
     lcd.println("DS1307 stoi. Uruchom Zegar");
   }
   else {
     lcd.println("DS1307 blad oczczytu!");
     lcd.println("sprawdz polaczenie");
   }
 }
}
void LCDprint2digits(int number) {
 if (number >= 0 && number < 10) {
   lcd.write('0');
 }
 lcd.print(number);
}
Adresy termometrów mam, wszystko testowałem i nie wiem skąd tak dziwnie odczyty.

Ten przykład który wkleiłeś po zmianie pinów na te które mam pokazuje identycznie jak mój kod, czyli problem leży w samym odczycie, a nie w kodzie.
Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>
  const int buttonPin = 2;     // the number of the pushbutton pin
const int buzer =  13;
int klawisz = 0;  
bool buz;
bool alarm;
   // 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);
    buz=0;
    alarm=0;
  
  
}
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(buz=1){
  alarm=0;
}
}
if
if(buz=1){
alarm=1;
}
if(alarm){
digitalWrite(buzer, HIGH);
}
else
{
digitalWrite(buzer, LOW);
}
if(celsius<=37||celsius>=80){

  buz=1;
  Serial.println("37");
}
else
{
  buz=0;

Serial.println("stop");
  }
Serial.println(celsius);


}
tu masz kod co robiłem komuś na forum termometr sprawdź czy wszystko wskazują przerób go pod lcd i2c


i czy jesteś wstanie określi na którym A działa a na którym nie bo nie wiem gdzie ci błędu w kodzie szukać



co do migania możne być za slaby zasilacza ale 2 amper powinien wystarczyć jeszcze jedno do przekaźników na wejście równolegle do cewki wpina się diodę w kierunku zaporowym
Dziękuje bardzo za chęć pomocy, ale jest jeden szkopuł:


Cytat:Na samym początku zaznaczę, że jestem totalnym amatorem.  Wink

Ten kod który wkleiłeś, wywala mi jakiś błąd kompilacji, a co do diody i cewki oraz kierunku zaporowym, to wybacz ale ni w ząb nie rozumiem. Smile

Mam dokładnie taki przekaźnik:

[Obrazek: 41279ab82ae5d5134b372062447d9166.jpg]
dokładniejsze zdjęcie mi daj jak możesz a kod już po paczę czemu wyrzuca błąd
Kod:
#include <OneWire.h>
   #include <LiquidCrystal.h>
  const int buttonPin = 2;     // the number of the pushbutton pin
const int buzer =  13;
int klawisz = 0;  
bool buz;
bool alarm;
   // 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);
    buz=0;
    alarm=0;
  
  
}
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(buz=1){
  alarm=0;
}
}

if(buz==1){
alarm=1;
}
if(alarm){
digitalWrite(buzer, HIGH);
}
else
{
digitalWrite(buzer, LOW);
}
if(celsius<=37||celsius>=80){

  buz=1;
  Serial.println("37");
}
else
{
  buz=0;

Serial.println("stop");
  }
Serial.println(celsius);


}
wkradł się holik ale już ok
Stron: 1 2 3