Odczyt z kilku czujników DS18B20
Odczyt z kilku czujników DS18B20
Witam serdecznie majsterkowiczów.
Robię termometr zdalny temperatury pieca, bojlera i instalacji. Łącznie 3 czujniki DS18B20.
Czuję się słabo w C, stąd ten temat.
Nie mogę sobie poradzić z rozpracowaniem biblioteki obsługi termometru.
Mam biblioteki: OneWire.h, DallasTemperature.h .
Mam dobrze podłączone czujniki z zasilaniem pasożytniczym, na jednej linii 1Wire, ich adresy:
Czujnik 1:
28 C8 EB A0 4 0 0 BD
Czujnik 2:
28 27 9B A1 4 0 0 52
Czujnik 3:
28 E3 D7 A1 4 0 0 D9
Chciałbym zdefiniować sobie je jakoś np.
czujnik-piec1 = { 28 C8 EB A0 4 0 0 BD }
czujnik-piec2 = { 28 27 9B A1 4 0 0 52 }
czujnik-woda = { 28 E3 D7 A1 4 0 0 D9 }
Oraz chciałbym wyświetlać to na wyświetlaczu LCD, czyli mniej więcej tak:
lcd.print(sensors.getTempC (czujnik1));
W tym problem, że adres czujnika ma 48 bajtów i się w żadnej zmiennej typu float czujnik1 się nie zmieści.
Pytanie brzmi jak to napisać w C ?
Funkcja getTempCByIndex(), też raczej odpada bo chciałbym na stałe przypisać czujniki do ich przeznaczenia, a nie odczytywać temperaturę w zależności od tego ile i jakie czujniki są aktualnie podłączone.
Mam nadzieję, że jasno przedstawiłem temat, myślę że znajdzie się ktoś kto rozumie te biblioteki i pomoże ;)
Pozdrawaim.
EDIT: Nie wiem czy to dobry dział, jak by co proszę moderatora o przeniesienie do odpowiedniego działu.
Robię termometr zdalny temperatury pieca, bojlera i instalacji. Łącznie 3 czujniki DS18B20.
Czuję się słabo w C, stąd ten temat.
Nie mogę sobie poradzić z rozpracowaniem biblioteki obsługi termometru.
Mam biblioteki: OneWire.h, DallasTemperature.h .
Mam dobrze podłączone czujniki z zasilaniem pasożytniczym, na jednej linii 1Wire, ich adresy:
Czujnik 1:
28 C8 EB A0 4 0 0 BD
Czujnik 2:
28 27 9B A1 4 0 0 52
Czujnik 3:
28 E3 D7 A1 4 0 0 D9
Chciałbym zdefiniować sobie je jakoś np.
czujnik-piec1 = { 28 C8 EB A0 4 0 0 BD }
czujnik-piec2 = { 28 27 9B A1 4 0 0 52 }
czujnik-woda = { 28 E3 D7 A1 4 0 0 D9 }
Oraz chciałbym wyświetlać to na wyświetlaczu LCD, czyli mniej więcej tak:
lcd.print(sensors.getTempC (czujnik1));
W tym problem, że adres czujnika ma 48 bajtów i się w żadnej zmiennej typu float czujnik1 się nie zmieści.
Pytanie brzmi jak to napisać w C ?
Funkcja getTempCByIndex(), też raczej odpada bo chciałbym na stałe przypisać czujniki do ich przeznaczenia, a nie odczytywać temperaturę w zależności od tego ile i jakie czujniki są aktualnie podłączone.
Mam nadzieję, że jasno przedstawiłem temat, myślę że znajdzie się ktoś kto rozumie te biblioteki i pomoże ;)
Pozdrawaim.
EDIT: Nie wiem czy to dobry dział, jak by co proszę moderatora o przeniesienie do odpowiedniego działu.
Re: Odczyt z kilku czujników DS18B20
Żaden majsterkowicz nie używał najpopularniejszego cyfrowego czujnika temperatury, czy ja ak chaotycznie napisałem post, że nie wiadomo o co mi chodzi ? ;p
Re: Odczyt z kilku czujników DS18B20
W bibliotece DallasTemperature, jest przykład odczytu kilku czujników po adresie (plik Multiple.pde)
Re: Odczyt z kilku czujników DS18B20
Gdybym wiedział jak wykorzystać ten przykład nie zakładałbym tematu.
Skoro już wiem, że ten kod się nada do tego zastosowania mam jeszcze jedno pytanie:
W którym miejscu tego kodu wkleić adresy czujników? I w jakiej formie?
Skoro już wiem, że ten kod się nada do tego zastosowania mam jeszcze jedno pytanie:
W którym miejscu tego kodu wkleić adresy czujników? I w jakiej formie?
Kod: Zaznacz cały
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// assign address manually. the addresses below will beed to be changed
// to valid device addresses on your bus. device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
//outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
// search for devices on the bus and assign based on an index. ideally,
// you would do this to initially discover addresses on the bus and then
// use those addresses and manually assign them (see above) once you know
// the devices on your bus (and assuming they don't change).
//
// method 1: by index
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
// method 2: search()
// search() looks for the next device. Returns 1 if a new address has been
// returned. A zero might mean that the bus is shorted, there are no devices,
// or you have already retrieved all of them. It might be a good idea to
// check the CRC to make sure you didn't get garbage. The order is
// deterministic. You will always get the same devices in the same order
//
// Must be called before search()
//oneWire.reset_search();
// assigns the first address found to insideThermometer
//if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
// assigns the seconds address found to outsideThermometer
//if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");
// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();
Serial.print("Device 1 Address: ");
printAddress(outsideThermometer);
Serial.println();
// set the resolution to 9 bit
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer), DEC);
Serial.println();
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
Serial.print("Resolution: ");
Serial.print(sensors.getResolution(deviceAddress));
Serial.println();
}
// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
Serial.print("Device Address: ");
printAddress(deviceAddress);
Serial.print(" ");
printTemperature(deviceAddress);
Serial.println();
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
// print the device information
printData(insideThermometer);
printData(outsideThermometer);
}
Re: Odczyt z kilku czujników DS18B20
Kod: Zaznacz cały
insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
Re: Odczyt z kilku czujników DS18B20
Wystarczyło tylko usunąć komentarz? Czemu na to nie wpadłem?
Dziękuję.
Dziękuję.
Re: Odczyt z kilku czujników DS18B20
Nie ma za co.
Mam nadzieje że uda się dokończyć projekt.
Mam nadzieje że uda się dokończyć projekt.
Re: Odczyt z kilku czujników DS18B20
Kod podany wcześniej nie działa i nie zadziała bez poprawek kogoś kto zna się na C. Kompilator wariuje poprostu.
Ale znalazłem lepszy, krótszy bardziej przejrzysty kod i wklejam go tu.
BTW: @Łukasz Więcek, jak by było na forum kolorowanie składni takie jak na głównej, to by wszyscy się ucieszyli ;)
Ale znalazłem lepszy, krótszy bardziej przejrzysty kod i wklejam go tu.
Kod: Zaznacz cały
// This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into pin 10 on the Arduino
#define ONE_WIRE_BUS 10
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
DeviceAddress outsideThermometer = { 0x28, 0xC8, 0xEB, 0xA0, 0x04, 0x00, 0x00, 0xBD };
DeviceAddress insideThermometer = { 0x28, 0x27, 0x9B, 0xA1, 0x04, 0x00, 0x00, 0x52 };
//DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };
void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(outsideThermometer, 10);
sensors.setResolution(insideThermometer, 10);
// sensors.setResolution(dogHouseThermometer, 10);
}
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(tempC);
// Serial.print(" F: ");
// Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}
void loop(void)
{
delay(2000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();
Serial.print("Outside temperature is: ");
printTemperature(outsideThermometer);
Serial.print("\n\r");
Serial.print("Inside temperature is: ");
printTemperature(insideThermometer);
Serial.print("\n\r");
// Serial.print("Dog House temperature is: ");
// printTemperature(dogHouseThermometer);
// Serial.print("\n\r\n\r");
}
BTW: @Łukasz Więcek, jak by było na forum kolorowanie składni takie jak na głównej, to by wszyscy się ucieszyli ;)
Re: Odczyt z kilku czujników DS18B20
Kolorowanie sobie możesz sam dorobić. Ręcznie
Re: Odczyt z kilku czujników DS18B20
Kod z przykładu bardzo ładnie kompiluje się w Arduino.
Natomiast pod innymi kompilatorami może powodować problemy.
Natomiast pod innymi kompilatorami może powodować problemy.
Re: Odczyt z kilku czujników DS18B20
Kredkami mam kolorować?Marhef pisze:Kolorowanie sobie możesz sam dorobić. Ręcznie
U mnie się nie kompiluje na arduino 1.0.5, kiedy dodam (a raczej usunę znak komentarza) tu:Janus pisze:Kod z przykładu bardzo ładnie kompiluje się w Arduino.
Natomiast pod innymi kompilatorami może powodować problemy.
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
//outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
Re: Odczyt z kilku czujników DS18B20
Akurat używam wersji 1.0.3, i na niej się kompiluje bez problemów.
Jak będę miał chwilkę to ściągnę 1.0.5 i spróbuję.
Jak będę miał chwilkę to ściągnę 1.0.5 i spróbuję.
Re: Odczyt z kilku czujników DS18B20
@piox89: Dziwne. Nie muszę kredek używać. A kolorowe czcionki są.
W pełnym edytorze masz opcję "Kolor tekstu". Ustawiasz odpowiedni kolor dla fragmentów składni
W pełnym edytorze masz opcję "Kolor tekstu". Ustawiasz odpowiedni kolor dla fragmentów składni
Re: Odczyt z kilku czujników DS18B20
Nie od końca mi o to chodziło.Marhef pisze:@piox89: Dziwne. Nie muszę kredek używać. A kolorowe czcionki są.
W pełnym edytorze masz opcję "Kolor tekstu". Ustawiasz odpowiedni kolor dla fragmentów składni
Wiem, że można sobie w bbcode tekst kolorować.
Bardziej mi chodziło o taki filtr, który działał by tylko w obrębie znacznika [ code/ ] i by kolorował tekst, żeby lepiej było się w nim połapać. Automatycznie. NA głównej jest, więc pewnie implementacja na forum nie byłaby bardzo kłopotliwa, a znacznie ułatwiła by czytanie dodawanych tu programów.
Re: Odczyt z kilku czujników DS18B20
Cóż ja bym zrobił na LM35 bo łatwiej je zastosować. DS18B20 ma dokładnośc plus-minus 2 stopnie. Jeżeli chodzi o mnie jest to skandaliczna niedokładność. LM25 trochę lepiej w wypada w tej kwesti bo plus-minus 0.6 stopnia.(dane z dygi-key) Najprostsza aplikacja nie wymaga żadnych dodatkowych elemntów, niestety nie może mierzyć ujemnych temperatur a nawet bliskich zera. Przy około 2 stopniach odczyt to wariacja. Jeżeli to ma być do pomiaru ciepłej wody to się nadają doskonale. Problemem mogą być przewody o dużej długości czujnik-mikrokontroler, trzeba zastowować niskopojemnościowe przewody. Takie pytanie przy okazji czy ktoś próbował kiedykolwiek kalibrować DS18B20 ?? Oczywiście kalibracja programowa. Na przykład: Birzemy DS`a i wkładamy do szklanki z lodem i wodą odczytaną wartość korygujemy programem do 0 stopni Celciusza. Robił ktoś coś takiego ??
- Tomasz.B
- Starszy majsterkowicz
- Posty: 344
- Rejestracja: 28 kwie 2012, 14:43
- Lokalizacja: Grabowo Kościerkie
Re: Odczyt z kilku czujników DS18B20
O ile się nie mylę to producent deklaruje ±0.5°C w zakresie –10°C do +85°C.
Wadliwa seria?
Wadliwa seria?
Kiedy wszystko inne zawiedzie, przeczytaj instrukcję 

Re: Odczyt z kilku czujników DS18B20
Deklaracja producenta to sobie a rzeczywistość sobie. Wystarczy połączyć np. trzy sztuki obok siebie i wtedy można zobaczyć deklarację producenta, czyli każdy sobie pokazuje co chce. Nie widzdzę prawie sensu stosować takich czujników temperatury bo taką dokładność można osiągnąć termometrem z alkocholem. Który nie wymaga ani zasilania ani mikrokontrolera ani żadnej obsługi.
Re: Odczyt z kilku czujników DS18B20
Mam podłączone dwie sztuki obok siebie i odczyty różnią się minimalnie. Różnica mieści się w 0.5 °C. Oczywiście oba jednocześnie mogą zaniżać temperaturę o 10 °C, ale nie sądzę by tak było.
Tylko z takich termometrów z 'alkocholem' nie zapiszesz automatycznie temperatur do bazy danych, nie wygenerujesz ładnych wykresów, a nie nie odczytasz temperatury będąc 500 km od domu.
Tylko z takich termometrów z 'alkocholem' nie zapiszesz automatycznie temperatur do bazy danych, nie wygenerujesz ładnych wykresów, a nie nie odczytasz temperatury będąc 500 km od domu.