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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 17 kwi 2025, o 07:49


    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: 3228
    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 0 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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO