logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pomiar temperatur w domu Arduino + ethernet + DS18B20

marcin_rs 20 Lis 2019 10:53 930 9
REKLAMA
  • #1 18289428
    marcin_rs
    Poziom 11  
    Posty: 80
    Ocena: 4
    Dzień dobry

    Chcę zrobić a właściwie zmodyfikować pomiary temperatur w pomieszczeniach.

    Założenie jest takie:

    1. dwie linie 1Wire odczytywane przez arduino, 9 i 12 czujników kilka sztuk jeszcze pewnie dojdzie. (wcześniej było wszystko na jednej ale pojawiały się problemy).

    2. wysłanie danych na serwer www metodą GET, POST lub plik z danymi? docelowo dane trafiają i tak do SQL (teraz mam podłączone do serwera po USB dwa odczytujące arduino, na serwerze są uruchomione 2 programy odczytujące i zapisujące dane do bazy danych). Tutaj problemem są odległości dlatego chcę przejść na przesyłania danych po sieci.

    ale po kolei:

    chcę uruchomić na jednym arduino dwie linie 1Wire mam taki programik, zacząłem coś kombinować na pinach 2 i 3 ale efekt końcowy był taki, że dublował odczyty:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    wyglądało to w ten sposób że odczytywał po kolei:

    1 ds - linia pierwsza
    1 ds - linia druga

    2 ds - linia pierwsza
    2 ds - linia druga

    3 ds - linia pierwsza
    1 ds - linia druga (zdublował odczyt)

    jak ten program zmodyfikować, aby odczytał to co ma odczytać z pinu 2, jak skończy odczytać dane z pinu 3

    potem pętla i od początku?


    ten zmodyfikowany wyglądał tak:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 18290328
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 18290469
    marcin_rs
    Poziom 11  
    Posty: 80
    Ocena: 4
    Został z testów / kombinowania...

    Tak się zastanawiałem nad rozwiązaniem tego problemu może millis() zastosować - odczyt pinu 2 co 5 sek. a po 7 sek. odczyt pinu 3?
  • REKLAMA
  • #4 18290626
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 18291624
    marcin_rs
    Poziom 11  
    Posty: 80
    Ocena: 4
    Nie wiem czy ten czas konwersji coś wprowadza do sprawy? Na biurku działa mi na 8 DS'ach, jak ustawie 10 ms odczyt jest dużo szybszy niż jak ustawie np 1000 ms. Pomiary są identyczne.
    Nie mam wpiętego opornika na linii 1Wire tylko DS9503 i DS2480B może to ma wpływ?

    Głównym problemem jest to iż chciałbym to zdublować dla drugiego wejścia arduino żeby obsługiwał dwie magistrale:

    odczyt wszystkiego co ma na pinie 2 -> odczyt wszystkiego co ma na pinie 3 -> i pętla nieskończona :D
  • #6 18291643
    Konto nie istnieje
    Poziom 1  
  • #7 18291658
    Konto nie istnieje
    Poziom 1  
  • #8 18291667
    marcin_rs
    Poziom 11  
    Posty: 80
    Ocena: 4
    Chyba źle robię pętle - on w kółko "przelatuje", odczytuje czujniki z pinu 2 i 3, skończą mu się czujniki np na pinie 2 i zaczyna od początku, a na pinie 3 jeszcze nie skończył... więc zaczyna mieszać... nowe odczyty z pinu 2 - kończąc odczyty z pinu 3.

    Chciałem to obejść funkcją millis() - niech odczyta pin 2, a po upływie czasu (z zapasem) zacznie odczyt z pinu 3, tak aby "zdążył odczytać". Zakończyło się fiaskiem...

    Dodano po 13 [minuty]:

    Wiem, dzięki oglądałem tą dokumentacje już wcześniej, producent podaje maksymalny czas... używam rozdzielczości 9 bit czyli 93.75 ms, mam ustawione 100 i jest wszystko ok - to był tylko eksperyment nie związany z moim problemem.

    Dodano po 7 [godziny] 17 [minuty]:

    Szanowni Eksperci zdradźcie tajemnice jak wpisać te dane do tablicy:

    for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); }


    robię tak ale nie zapisuje całego ciągu

    for( i = 0; i < 8; i++) { adresy_czujnikow [i] = (addr[i], HEX); }

    jak to powinno wyglądać?
  • #9 18401909
    marcin_rs
    Poziom 11  
    Posty: 80
    Ocena: 4
    Wymyśliłem coś takiego:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Doszedłem do wniosków takich - kilka rzeczy, z którymi eksperymentowałem, robiłem na arduino nano lub uno, problem tkwi zazwyczaj w pamięci jak projekt zajmuje około blisko 97% pamięci, lepiej dać sobie spokój i wrzucić to do arduino mega.

    Wiadomo niektórzy wytkną mi "można optymalizować", ale niestety na razie mój stopień programowania, jest jeszcze na sporo na za niskim poziomie ;-) ...jeśli można nazwać programowaniem, modyfikacje pod siebie programów, które ktoś zrobił.


    Plik php odczytujący wygląda tak:

    Kod: PHP
    Zaloguj się, aby zobaczyć kod



    Doszedłem do tego co chciałem - podmieniając czujnik temperatury nie trzeba "wchodzić do arduino", tylko na serwerze w php podmienić.

    Niestety nie udało się zmusić arduino do wykonywania tego samego na dwóch pinach równocześnie... :-(


    Pozdrawiam,
    Macie uwagi piszcie.
  • #10 18401937
    MOBIUS19
    Poziom 11  
    Posty: 50
    Pomógł: 5
    Ocena: 7
    marcin_rs napisał:
    Niestety nie udało się zmusić arduino do wykonywania tego samego na dwuch pinach równocześnie

    Bo biblioteka której używasz nie obsługuje w tym samym czasie więcej niż jednego wyprowadzenia tak jak i DS2480
    marcin_rs napisał:
    Nie mam wpiętego opornika na linii 1Wire tylko DS9503 i DS2480B

    Jak używasz zewnętrznych układów to raczej nie DS2480 chyba, że potrzebujesz zapisu eeprom, tylko DS2482, DS2486, jeśli ma być więcej magistral 1wire to kilka DS2482 albo DS2482-800.

Podsumowanie tematu

✨ Dyskusja dotyczy modyfikacji systemu pomiaru temperatury w domu z wykorzystaniem Arduino, Ethernetu oraz czujników DS18B20. Użytkownik planuje użycie dwóch linii 1Wire do odczytu danych z 9-12 czujników, z zamiarem przesyłania danych do serwera przez Ethernet. Problemy związane z dublowaniem odczytów oraz czasem konwersji czujników zostały poruszone, a uczestnicy sugerowali zastosowanie funkcji millis() do synchronizacji odczytów. Wskazano również na konieczność użycia odpowiednich bibliotek oraz rozważono zastosowanie układów DS2482 dla obsługi wielu magistrali 1Wire.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA