![]() |
Przekaźnik czasowy na attiny13 - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino) +--- Wątek: Przekaźnik czasowy na attiny13 (/watek-przeka%C5%BAnik-czasowy-na-attiny13) |
Przekaźnik czasowy na attiny13 - Spinus - 17-04-2024 Witam, potrzebuje zaprogramować przekaźnik pompy na attiny13 w następujący sposób: 1. Wyłączona 20min 2. Włączona 90s 3. Wyłączona 60min Punkt 2 i 3 w pętli Próbowałem funkcją delay ale maksymalny czas mi wychodził około 1min, a millis coś mi nie wychodzi. Czy ktoś był by mi w stanie pomóc ? RE: Przekaźnik czasowy na attiny13 - Łowiczak - 17-04-2024 (17-04-2024, 08:58)Spinus napisał(a): Witam, potrzebuje zaprogramować przekaźnik pompy na attiny13 w następujący sposób: Jasne, tylko pokaż jak to masz napisane. Ja na podobnej zasadzie będę robił system do wentylacji wyłazu na strychu aby robić przewiew świeżego powietrza gdyż aktualnie skrapla mi się wilgoć. RE: Przekaźnik czasowy na attiny13 - oscarX - 17-04-2024 60 sec czyli argument delay to ok 60000. To blisko granicy 16 bitów. Pokaż może dokładnie kod jaki napisałeś, być może wystarczy 'wypromować' typ do longa i delay zadziała. Argument delaya jest typu unsigned long. Może sprawdź delay(100000UL); RE: Przekaźnik czasowy na attiny13 - Łowiczak - 17-04-2024 delay przyjmuje unsigned int, czyli 65535 to ponad 1 minutę ale nie więcej czyli tylko 65 sek MAX RE: Przekaźnik czasowy na attiny13 - Spinus - 17-04-2024 (17-04-2024, 11:30)oscarX napisał(a): 60 sec czyli argument delay to ok 60000. To blisko granicy 16 bitów. Pokaż może dokładnie kod jaki napisałeś, być może wystarczy 'wypromować' typ do longa i delay zadziała. Argument delaya jest typu unsigned long.Dopisek UL nie działał, próbowałem. Nie ma mnie teraz przy komputerze, żebym wysłał kod. Ale teraz to już nie wiem nawet co mam ci wysłać, bo pisałem chyba 10 razy na nowo i każdy przerabiałem kilka razy? RE: Przekaźnik czasowy na attiny13 - oscarX - 17-04-2024 (17-04-2024, 11:40)Łowiczak napisał(a): delay przyjmuje unsigned int, czyli 65535 to ponad 1 minutę ale nie więcej czyli tylko 65 sek MAXTutaj podają że unsigned long. RE: Przekaźnik czasowy na attiny13 - Łowiczak - 17-04-2024 może zamiast delay użyj cykle zegara systemowego, coś w tym stylu Kod: #define CZAS_WYLACZONA 20 * 60 * 1000 // 20 minut w milisekundach RE: Przekaźnik czasowy na attiny13 - Spinus - 17-04-2024 Jutro rano spróbuję wgrać zobaczę co z tego wyjdzie i dam znać. Próbowałem z millis, ale mi coś nie wyszło ? RE: Przekaźnik czasowy na attiny13 - oscarX - 18-04-2024 (17-04-2024, 14:10)Łowiczak napisał(a): może zamiast delay użyj cykle zegara systemowego, coś w tym stylu Tylko trzeba pamiętać, że millis też się zeruje co jakiś czas - kilkadziesiąt dni, co generuje taki problem, że podczas pisania, uruchamiania i testowania kodu wszystko będzie działać, a jak się zostrawi uruchomione urządzenie już włączone to może się zdarzyć, że zmienna czas_startu zostanie przypisana wartością bliską maksymalnej, chwilę potem millis się wyzeruje i będzie problem. I te wartości w #define też chyba powinny być oznaczone UL. RE: Przekaźnik czasowy na attiny13 - Łowiczak - 18-04-2024 (18-04-2024, 07:32)oscarX napisał(a): Tylko trzeba pamiętać, że millis też się zeruje co jakiś czas - kilkadziesiąt dni, co generuje taki problem, ... to że się zeruje nie ma żadnego znaczenie bo jest w pętli pobierane za każdym razem pdczas zmiany stanu, czyli tak jakby program zaczął działanie od nowa, podobnie jak podczas zaniku zasilania PS. Funkcja millis() w mikrokontrolerach Arduino (w tym ESP8266 używanym w NodeMCU) zwraca liczbę milisekund od czasu uruchomienia urządzenia. Oznacza to, że wartość zwracana przez millis() zwiększa się w miarę upływu czasu od momentu uruchomienia urządzenia i nie jest zerowana automatycznie. Jednakże, wartość zwracana przez millis() jest liczbą typu unsigned long, która ma ograniczenie górne. Po przekroczeniu maksymalnej wartości (4294967295 milisekund, czyli około 50 dni), wartość ta przepełnia się i zaczyna od zera. To oznacza, że z powodu przepełnienia millis() zacznie zwracać wartości od zera i liczyć czas od nowa. |