Millis się przepełnia, ale działania zrobione na liczbach bez znaku typu uint32_t powodują, że nie ma żadnego końca działania i nic się nie "psuje" po tych 54 dniach, można to sobie przetrenować na liczbach typu uint8_t czy uint16_t wprost inkrementując je w każdym obiegu loop, porównując warunki i wykonując jakieś działania co określoną wartość.
Przykładowy kod przetestuj na zwykłym UNO, potem ewentualnie na attiny13, niektóre core mogą wyłączyć millis by oszczędzać zasoby tak małych uC.
Możesz mieć też źle ustawiony Attiny13.
Fabrycznie uC jest ustawiony na 1MHz, trzeba wypalić bootloader by go ustawić na takie MHz jak w Arduino IDE, czyli np. 9.6 MHz. Bez tego 90s będzie trwało z 900s. W Attiny13 wypalenie bootloadera tylko ustawia fusebity.
Jak to jedyna funkcja programu to można zrobić na delay, duże delay nie zadziałają, ale jak masz rozdzielczość działania 1s to można zrobić np. 90 x delay 1000:
Kod:
#define CZAS_WYLACZONA 20 * 60 // 20 minut
#define CZAS_WLACZONA 90 // 90s
#define CZAS_POMIEDZY 60 * 60 // 60s
#define pompa 4
void setup() {
// Konfiguracja pinów i przekaźnika
digitalWrite(pompa, 0);
pinMode(pompa, OUTPUT);
for (int i=0;i< CZAS_WYLACZONA;i++)
{
delay(1000);
}
}
void loop() {
digitalWrite(pompa, 1);
for (int i=0;i< CZAS_WLACZONA;i++)
{
delay(1000);
}
digitalWrite(pompa, 0);
for (int i=0;i< CZAS_POMIEDZY;i++)
{
delay(1000);
}
}
Niektóre przekaźniki są aktywowane zerem, trzeb zamienić 1 i 0.
Oczywiście millis, czy choćby ten sam kod z delay 1000 i switch case byłby lepszy, bo można wtedy uruchomić WDT ustawiony na >1000ms i będzie pilnował, czy nie wydarzyło się coś niezwykłego i wtedy zresetuje uC, przy delay 90x60 to nie bardzo idzie zastosować, max czas WDT to 8s. Ale w celach edukacyjnych można zastosować i takie proste rozwiązanie jako pierwsze przybliżenie.