Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 22 gru 2024, o 20:18


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 27 sty 2016, o 20:00 
Offline
Nowy

Dołączył(a): 13 sty 2016
Posty: 3
Pomógł: 0

Witam,

Na wstępie chcę zaznaczyć, że programowaniem zajmuje się od 3 miesięcy. :)

Mam wgrane w DS ach-do eepromu wartosci.
W rejestrze TL i TH czyli 2 i 3 bit eepromu mam wgrane:

czujnik 1 - eeprom bit 2 wartosc 11
czyjnik 2 - eeprom bit 2 wartosc 22
(sprawdzam to używajac biblioteki oneWire i przykładu DS18x20)

A teram co bym chciał osiągnąc :)
ZA kazdym razem jak zmienie czyjnik na inny np:
Czujnik 3 - eeprom bit 2 wartosc 11
Czyli jak zamienie czujnik 1 na czujnik 3 to chcialbym aby program przypisywal do niego ta sama nazwe np:
Temp. zewnetrzna ( cokolwiek )
Czyli czujnik majacy wartors eepromu 11 to temperatura zewnetrzna.
(nie ma potrzeblemu z podlaczeniem 2 czujnikow z eeprom b2 11 bo do takiej sytulacji nie dojdzie w moim przypadku)

Moje pomysły na rozwiaznie tego to:
po 1.
Sprawdzenie pojedynczego bitu 2 eepromu i jesli ma on wartosc 11 przypisanie mu znawy.
Mam problem z odczytaniem pojedynczego bitu eepromu i stworzeniem odpowiedniej funckcji

po 2.
Przypisanie na poczatku nazwy czujnikowi o wlasciwej zawartosci eepromu.
Nie jestem pewniem czy istnieje gotowa komenda ktora na sie to odrazu przypisac.


dzięki i czekam na jakies info ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2016, o 20:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
W rejestrze TL i TH czyli 2 i 3 bit eepromu mam wgrane:

czujnik 1 - eeprom bit 2 wartosc 11
czyjnik 2 - eeprom bit 2 wartosc 22

Bit to najmniejsza jednostka danych, przymująca wartość 0 lub 1. Chyba chodzi ci o bajt?

Mając w tymczasowej tablicy wykryte czujniki robisz dla każdego odczyt z nich bajtu z twoim ID i umieszczasz w swojej programowej tablicy na odpowiedniej pozycji jego serial (możesz też trzymać w seriale dwóch zmiennych jak bardzo nie chcesz tablicy). A w programie masz na stałe przypisana pozycję tablicy (zmienną) np. 0 do czujnika wewnątrz a 1 do czujnika na zewnątrz. Dzięki temu w dalszej części programu nie musisz martwić o poprawne przypisanie czujników.

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 2 minutach ]

Cytuj:
Mam problem z odczytaniem pojedynczego bitu eepromu i stworzeniem odpowiedniej funckcji

Aby odczytać dane z czujnika, to czytasz przecież kilka razy bajt po bajcie. Więc musisz tylko obejrzeć swoje biblioteki.
Używasz może Mirkowych z BB?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2016, o 22:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

DS18B20 nie ma możliwości czytania tylko jednego wybranego bajtu. Więc jest to emulowane poprzez bibliotekę, tak że odczytuje Scratchpad od pierwszego bajtu do wybranego i zwraca tylko wartość ostatniego odczytanego.

Cytuj:
Używasz może Mirkowych z BB?

Nie zauważyłem, że to Arduino C++ :roll:

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2016, o 20:21 
Offline
Nowy

Dołączył(a): 13 sty 2016
Posty: 3
Pomógł: 0

Hej

Pozwól, że napiszę moj tok rozumowania :
1. onewire.search(). wyszukuję czujnik, rozumiem, że są one indexowane losowo od 0 do nie wiekszej niż ilosc -1
( czujniki nie są podpięte w 1 lini tylko w siatce - w moim przykładzie)

2. Rom code - czyli teraz odnaszac sie gdziekolwiek w przykladzie do jego Nazwy (nazwa1 = Rom code1 itd)
dostaje odpowiedz z odpowiedniego rom code

3. odczyt temp w ten sam sposob :) nazwa = rom , wpisujac nazwe po rom odczyt temp.

Mam wszystko zrobione tak jak napisałeś ale tu właśnie pojawia sie moj problem.

Przykład. 1
mam 10 czujników
Jesli zamienię 5 z nich nie bede wstanie okreslic ich fizycznego polozenia.

przykład. 2
montuje czujnik na kablu jeden w odleglosci 1 metra drugi 50 metrow
tworze x takich kabli

Chce aby czyjnik w odleglosci 1 metra zawsze byl to temp wewnatrz a
w odlegloscie 50 na zewnatrz, nie wazne ktory kabel podłacze.

Jak pisałem moze w przypadku 2 czujnikow nie bedzie problemu bo ardu indexuje czyba po czasie odpowiedzi z czujnika (opornosci) ale jesli stworze siatke i dodam jeszcze termometr w kuchni i pokojach zacznie mi to mieszac.


Jedyny pomysl jaki mam to nazwanie ich w eepromie
Spowoduje to ze eeprom 11 bedzie zawsze czujnikiem na 1 metrze, a
eeprom 50 zawsze na 50 metrach. itd.

Pewnie sie zastanawiasz dlaczego nie odczytam ich addresow i nie przypisze ich na stale :)
Bylo by pięknie jak bym nie musial co chwile sprawdzać nowego kabla :)
jednego z ilosci nieogranicznej.

Wiem ze to troche dziwne ale nie potrafie tego lepiej opisac.

A teraz do konkretów

DeviceAddress insideThermometer, outsideThermometer; - w taki sposób określam sobie nazwy czujników.
Nie podaje adresów, bo niemożliwa będzie ich wymiana.

Następnie muszę przypisać nazwę do odpowiedniego Indexu.
sensors.getAddress(insideThermometer, 0)
sensors.getAddress(outsideThermometer, 1)

Problem w tym że index przydzielany jest dość losowo. Jeśli czujniki chcę podłączyć w siatce nie widzę innego sposobu niż ich nazwanie w eepromie.

Czy dało by sie sprawdzic czy w eeprom indexu 0 jest wartosc 0x11 to nazwij index 0 jako nazwa1
jesli jest wartosc 0x22 nazwij jako nazwa 22 itd ( mowie o bajcie 2 lub 3)


Próbowałem sprawdzić p0jedyńczy BAJT tak jak to jest w tym przykładzie:
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;
Oczywście przykład tyczy się addresu nie eepromu.
Jednak nie udało mi sie odnieść do odpowiedniego Bajtu - z tego co napisales jesli dobrze rozumialem nie bedzie to mozliwe

Znalazłem też coś takiego:
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);


ale tutaj jest odczyt 9 bajtow :(
Jak by mi się udało porównać to co jest w 2 bajcie i stworzyc takie takie warunki jak powyzej (case 0x11 itd)
J
Zablokowałem się strasznie już chyba od miesiąca szukam info na ten temat ........:(


Znalazłem jeszcze takie cos:
isConnected(uint8_t* deviceAddress, uint8_t* scratchPad)

Jestem w trakcie ustalania jak działa ta funkcja

Pozdrawiam i proszę o kolejne rady :D
Seba

ps.sorki za błedy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2016, o 11:49 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2016, o 13:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
1. onewire.search(). wyszukuję czujnik, rozumiem, że są one indexowane losowo od 0 do nie wiekszej niż ilosc -1
( czujniki nie są podpięte w 1 lini tylko w siatce - w moim przykładzie)
Co oznacza w siatkce? Czujniki masz podpięte do jednego pinu?
Wyszukiwanie czujników polega na odczytywaniu ich ID specjalna procedurą i przy normalnych procedurach masz je w kolejności rosnących lub malejących ROM CODE. Nie ma znaczenie który jest czytnik pierwszy a który ostatni na linii.

Cytuj:
2. Rom code - czyli teraz odnaszac sie gdziekolwiek w przykladzie do jego Nazwy (nazwa1 = Rom code1 itd)
dostaje odpowiedz z odpowiedniego rom cod
Komendy do DS mogą być wysyłane albo do wszystkich (używanie komendy SKIP ROM) albo do jednego konkretnego (komenda MATCH ROM). Gdy masz tylko jeden czujnik, to nie ma potrzeby adresowania go po ROM CODE, ale przy większej ilości już musisz - choć przy zlecaniu pomiaru często wydaje się komendę do wszystkich na raz a dopiero odczyt robi się indywidualnie.

Cytuj:
3. odczyt temp w ten sam sposob :) nazwa = rom , wpisujac nazwe po rom odczyt temp.
Jak odczytujesz temperaturę i masz więcej niż jeden czytnik, to musisz podać który chcesz odczytać. Używasz do tego ROM CODE uzyskany z funkcji search().

Cytuj:
Jak pisałem moze w przypadku 2 czujnikow nie bedzie problemu bo ardu indexuje czyba po czasie odpowiedzi z czujnika (opornosci) ale jesli stworze siatke i dodam jeszcze termometr w kuchni i pokojach zacznie mi to mieszac.
Nie wiem jak robi to Twoja biblioteka w arduino ale przy komunikacji po 1-wire nie da się ustalić położenia czujnika. Dlatego albo search() zwraca losowa kolejność (mało prawdopodobne) albo masz posortowane po ROM CODE (rosnąco lub malejąco).

Cytuj:
Pewnie sie zastanawiasz dlaczego nie odczytam ich addresow i nie przypisze ich na stale :)
Bylo by pięknie jak bym nie musial co chwile sprawdzać nowego kabla :)
jednego z ilosci nieogranicznej.

Nie wiem o co chodzi z tym sprawdzaniem nowego kabla. Ale sposób na wykorzystanie zapisywanej samodzielnie wartości identyfikacyjnej w EEPROM w miejscu progów temperaturowych dla alarmów jest ciekawa i jak nie potrzebujesz korzystać z alarmów jest OK.
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zrób tak. Deklarujesz tymczasową zmienną:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i do niej odczytujesz pierwszy address (ROM CODE) poprzez
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Następnie wywołujesz funkcję do sprawdzenia (odczyt wartości) czy jest to czytnik z wartością w EEPROM 0x11 czy 0x22. Jak jest to 0x11, to przypisujesz ten adres do pierwszej zmiennej (insideThermometer) a jak 0x22 to do drugiej (ousideThermometer). Jak masz inne wartości niż 0x11 i 0x22, to robisz interakcję z użytkownikiem by przypisał ten czytnik do odpowiedniego miejsca (po wybraniu miejsca robisz zapis do EEPROMu odpowiedniej wartości).
Z drugim czytnikiem robisz to samo, znowu odczytujesz kolejny adres (ROM CODE) do tempThermometer, sprawdzasz wartość w EEPROM i przypisujesz do właściwej zmiennej.
Jak masz wiele czujników to robisz to dla każdego to samo. Najlepiej zrobić pętlę przelatującą po każdym znalezionym czujniku.

W dalszym kodzie komunikacji już korzystasz ze swoich zmiennych insideThermometer i outsideThermometer, bo masz już tam poprawne adresy (ROM CODE).

Co do funkcji odczytu wartości z EEPROM, o której wcześniej wspominałem, to musisz odczytać minimum 3 bajty (bo Th jest trzecim z kolei).
Możesz też jak piszesz odczytać wszystkie 9:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

po odczytaniu tych 9 bajtów sprawdzasz czy data[2] ma odpowiednią wartość.
Jak zrobisz to jako dodatkową funkcję, to możesz zwracać z niej tylko wartość przypisaną w rejestrze Th.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO