• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
DS18S20 I RS485
#5
RS485.write(sensors.getTempC(sensor3));
nie napisałeś, że chcesz wysłać jako floata, to wysłał int'a. W AVR/C czy C++ jest domyślnie do wszystkiego int, liczba całkowita, hasło dnia "promocja do integer".
Na serial drukujesz float tempC1 to on wie, że to float.
Poza tym domyślnie DS działa tak, że jak zapytasz o temperaturę to on dopiero wtedy pyta jaka jest, termometr zaczyna pomiar, to trwa 750ms, wysyła i masz. Jak w jednym loop pytasz o 3, a potem znowu, i jeszcze wysyłasz na LCD, serial, RS485 to taki loop trwa kilka sekund, a powinien kilka us.
Zrób sobie zmienną globalną float na temperatury i RAZ odczytaną temperaturę wyślij na LCD, serial i do SLAVE.
Poza tym włącz tryb asynchroniczny dla DS, sam dbaj o to by zlecać pomiar i go odczytywać w odpowiednim czasie, np. na przykład zleć pomiar w SETUP, poczekaj 1s, wejdź do loop i tu już wywal wszystkie DELAY. Zacznij mierzyć sekundy w millis, gdy jest nowa sekunda odczytaj temperatury i zleć nowy pomiar.
W kolejnej sekundzie odczytasz pomiar zlecony w poprzedniej. Cały loop skraca się do czasu transmisji z czujnikami, czyli około 20ms na odczyt x3 i raz 20ms na zlecenie pomiarów do wszystkich. Ale to jest tylko ten 1 loop gdzie jest nowa sekunda, wszystkie inne loop w tej sekundzie wykonają się w kilka us. Chcesz zauważyć wciśnięcie jakiegoś przycisku, zmianę stanu pinu - voila, teraz możesz.
Oczywiście transmisji na UART/LCD czy RS485 też nie robisz w każdym loop, tylko co wybrany okres czasu, np. gdy jest nowy odczyt temp. Niestety to będzie ten sam loop, ale możesz tak ułożyć kod, że będzie kolejny, czyli najpierw się sprawdza czy wysłać temp bo jest nowy odczyt, a dopiero potem sprawdzasz czy odczytać.
Potem można to 80ms w jednym loop dla DS również rozbić tak, by nie robić w jednym loop wszystkich czterech transmisji. Można ustawić jakąś zmienną, że jest nowa sekunda, zrobić blok programu gdzie to odblokowuje wejście, przy pierwszym odczytać 1 czujnik, przy drugim trzeci, itd, zlecić pomiar, potem wysłać na LCD, potem wysłać na UART, potem wysłać na RS, zablokować wejście w ten blok ustawiając "jakąś zmienną=0" i znowu wejdziesz tu gdy nowa sekunda ustawi ją na 1.
 
Odpowiedź
  


Wiadomości w tym wątku
DS18S20 I RS485 - przez tabazka - 16-05-2023, 16:29
RE: DS18S20 I RS485 - przez kaczakat - 16-05-2023, 17:01
RE: DS18S20 I RS485 - przez MadMrQ - 16-05-2023, 18:09
RE: DS18S20 I RS485 - przez tabazka - 17-05-2023, 10:37
RE: DS18S20 I RS485 - przez Irvin - 17-05-2023, 16:07
RE: DS18S20 I RS485 - przez tabazka - 06-06-2023, 22:09
RE: DS18S20 I RS485 - przez kaczakat - 07-06-2023, 06:12

Skocz do:


Przeglądający: 1 gości