wtorek, 9 lipca 2013

Czujnik DS18B20 - odczyt rom code

Witam!

Użycie wielu czujników temperatury DS przy jednym projekcie bywa czasem kłopotliwe, jeżeli nie
odpytamy tych które właśnie w danym miejscu programu chcemy. Potrzebowałem rozwiązania do jednego ze swoich projektów, jak zwykle przewalając szukajke znalazłem tylko poszlaki, więc przyszło mi się trochę nad nimi popracować. Miał to być program którym odczytałbym kod i wkleił do projektu właściwego "imię i nazwisko Kowalskiego" którego miałbym właśnie odczytać.

Wersja oryginalna, kiepsko to wygląda :(
Znalazłem dobrą poszlakę na stronie: http://hobby.abxyz.bplaced.net/index.php?pid=8&tid=45
wysyła on kod w hex przez UART, pomysł dobry lecz postanowiłem go dopracować wedle własnego uznania, ponieważ te krzaczki są mało funkcjonalne. Aby wkleić id do programu trzeba było się namęczyć dodając 0x, przecinki dołączając go do tabeli a ja jestem leniem!:)


Nie wygląda to lepiej?:)

Jako że dzięki poradnikowi:
https://www.youtube.com/watch?v=qDDCU3udirA (zajrzyj, bo warto!) Mirka z forum.atnel.pl poznałem kody terminala VT100, postanowiłem chociaż podstawową część z nich wykorzystać.





Jako że to co stworzyłem ma jakąś wartość merytoryczną i może się przydać innym udostępniam źródła + gotowy wsad do pobrania: 07_UART_DS_ODCZYT.zip http://adf.ly/Rmxe9
Kod jest dobrze okomentowany, więc myślę że nie potrzeba moich dodatkowych wyjaśnień.
Aby ciągle mikrokontroler nie wysyłał tego samego adresu, wykonałem wyzwalanie odczytu przyciskiem, schemat ogólny (bez złącza kanda/kondensatorów filtrujących) wygląda następująco (obrazek po lewej stronie).



Program w konsoli drukuj gotową tabelę języka C z kodem w hexach, starczy ją kleić bezpośrednio do kodu programu:

Done by Mesho @ www.atmegan.blogspot.com

DS18B20 ID READER
unsigned char rom_code[8] = {0x28, 0x82, 0xCE, 0x8E, 0x04, 0x00, 0x00, 0x48};
 


 Jak go użyć? Korzystam z biblioteki do ds18b20 z niebieskiej książki i przy odczytywaniu temperatury starczy zrobić prosty myk:

if( DS18X20_OK == DS18X20_read_meas(rom_code, &subzero, &cel, &cel_fract_bits) ) display_temp(3);



Zamiast gSensorIDs[0] wstawiamy rom_code, czyli nazwę tablicy która przechowuje kod czujnika.

Tyle, jak są jakieś pytania to walcie śmiało:)

Pozdrawiam,
Marcin


4 komentarze:

  1. ale juz bez nie bieskiej bys nie dał rady co ?
    to takie czasy tylko copy paste

    OdpowiedzUsuń
    Odpowiedzi
    1. No pewnie, po co wynajdować na nowo koło? ;) Proszę mnie nie oskarżać o copy paste tylko sprawdzić inne projekty :D

      Usuń
  2. Cześć, mam pytanie do zamieszczonego kodu.

    Podłączyłem czujnik, odczytałem ID Twoim kodem i uzyskałem adres {0x28, 0x0E, 0x20, 0x40, 0x05, 0x00, 0x00, 0x43} - jak go wpisuję w projekcie to uzyskuję error.

    Odczytałem ID w inny sposób i uzyskałem 28e73f5050000eb, przepisałem go do projektu tak {0x28, 0x0e, 0x73, 0xf5, 0x05, 0x00, 0x00, 0xeb} - uzyskałem prawidłową temperaturę.

    Porównując:
    Twój odczyt - {0x28, 0x0E, 0x20, 0x40, 0x05, 0x00, 0x00, 0x43}
    Mój odczyt - {0x28, 0x0e, 0x73, 0xf5, 0x05, 0x00, 0x00, 0xeb}

    Tylko 5/8 adresu się zgadza, czym to jest spowodowane?

    OdpowiedzUsuń
    Odpowiedzi
    1. Dobra doszedłem do tego, że problem jest jak na linii jest więcej czujników niż jeden, adresy się mieszają.

      Usuń