Odczyt z kilku czujników DS18B20

Pochwal się, co ostatnio zmajstrowałeś.
ODPOWIEDZ
piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Odczyt z kilku czujników DS18B20

Post autor: piox89 » 8 cze 2013, 21:52

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.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Re: Odczyt z kilku czujników DS18B20

Post autor: piox89 » 10 cze 2013, 08:31

Żaden majsterkowicz nie używał najpopularniejszego cyfrowego czujnika temperatury, czy ja ak chaotycznie napisałem post, że nie wiadomo o co mi chodzi ? ;p
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Odczyt z kilku czujników DS18B20

Post autor: Janus » 10 cze 2013, 10:06

W bibliotece DallasTemperature, jest przykład odczytu kilku czujników po adresie (plik Multiple.pde)
piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Re: Odczyt z kilku czujników DS18B20

Post autor: piox89 » 10 cze 2013, 17:22

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?


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);
}
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Odczyt z kilku czujników DS18B20

Post autor: Janus » 10 cze 2013, 18:23

Kod: Zaznacz cały

insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
Forma nie powinna stanowić problemu
piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Re: Odczyt z kilku czujników DS18B20

Post autor: piox89 » 10 cze 2013, 19:06

Wystarczyło tylko usunąć komentarz? Czemu na to nie wpadłem?
Dziękuję.
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Odczyt z kilku czujników DS18B20

Post autor: Janus » 10 cze 2013, 20:07

Nie ma za co.
Mam nadzieje że uda się dokończyć projekt.
piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Re: Odczyt z kilku czujników DS18B20

Post autor: piox89 » 10 cze 2013, 23:02

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.

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 ;)
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Odczyt z kilku czujników DS18B20

Post autor: Marhef » 10 cze 2013, 23:12

Kolorowanie sobie możesz sam dorobić. Ręcznie
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Odczyt z kilku czujników DS18B20

Post autor: Janus » 11 cze 2013, 05:55

Kod z przykładu bardzo ładnie kompiluje się w Arduino.
Natomiast pod innymi kompilatorami może powodować problemy.
piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Re: Odczyt z kilku czujników DS18B20

Post autor: piox89 » 11 cze 2013, 16:45

Marhef pisze:Kolorowanie sobie możesz sam dorobić. Ręcznie
Kredkami mam kolorować?

Janus pisze:Kod z przykładu bardzo ładnie kompiluje się w Arduino.
Natomiast pod innymi kompilatorami może powodować problemy.
U mnie się nie kompiluje na arduino 1.0.5, kiedy dodam (a raczej usunę znak komentarza) tu:
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
//outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Odczyt z kilku czujników DS18B20

Post autor: Janus » 11 cze 2013, 17:12

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ę.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Odczyt z kilku czujników DS18B20

Post autor: Marhef » 11 cze 2013, 20:03

@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
piox89
Młodszy majsterkowicz
Posty: 17
Rejestracja: 7 sty 2013, 22:08

Re: Odczyt z kilku czujników DS18B20

Post autor: piox89 » 11 cze 2013, 23:57

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
Nie od końca mi o to chodziło.
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.
Awatar użytkownika
hyena
Młodszy majsterkowicz
Posty: 34
Rejestracja: 28 lis 2013, 23:51

Re: Odczyt z kilku czujników DS18B20

Post autor: hyena » 10 gru 2013, 21:18

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 ??
Awatar użytkownika
Tomasz.B
Starszy majsterkowicz
Posty: 344
Rejestracja: 28 kwie 2012, 14:43
Lokalizacja: Grabowo Kościerkie

Re: Odczyt z kilku czujników DS18B20

Post autor: Tomasz.B » 11 gru 2013, 12:08

O ile się nie mylę to producent deklaruje ±0.5°C w zakresie –10°C do +85°C.
Wadliwa seria?
Kiedy wszystko inne zawiedzie, przeczytaj instrukcję :)
Awatar użytkownika
hyena
Młodszy majsterkowicz
Posty: 34
Rejestracja: 28 lis 2013, 23:51

Re: Odczyt z kilku czujników DS18B20

Post autor: hyena » 11 gru 2013, 19:13

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.
Awatar użytkownika
rafalzaq
Majsterkowicz
Posty: 180
Rejestracja: 2 maja 2013, 23:57

Re: Odczyt z kilku czujników DS18B20

Post autor: rafalzaq » 11 gru 2013, 20:05

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.
ODPOWIEDZ

Strony partnerskie: