Sterownik do akwarium - Lobaf - 26-12-2015
Witam.
Na samym początku zaznaczę, że jestem totalnym amatorem.
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.
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);
}
RE: Sterownik do akwarium - adix - 26-12-2015
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ć.
RE: Sterownik do akwarium - Lobaf - 26-12-2015
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.
RE: Sterownik do akwarium - adix - 26-12-2015
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
RE: Sterownik do akwarium - Lobaf - 26-12-2015
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.
Zasilacz ma 2 ampery.
RE: Sterownik do akwarium - adix - 26-12-2015
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
RE: Sterownik do akwarium - Lobaf - 26-12-2015
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.
RE: Sterownik do akwarium - adix - 26-12-2015
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
RE: Sterownik do akwarium - Lobaf - 27-12-2015
Dziękuje bardzo za chęć pomocy, ale jest jeden szkopuł:
Cytat:Na samym początku zaznaczę, że jestem totalnym amatorem.
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.
Mam dokładnie taki przekaźnik:
RE: Sterownik do akwarium - adix - 27-12-2015
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
|