Arduino Polska Forum

Pełna wersja: Jednokrotne wykonanie poleceń
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam.
Dopiero zaczynam przygodę z Arduino i jeszcze wiele muszę się nauczyć ale stworzyłem program do sterowania solarnym podgrzewaczem wody.
Pokrótce program działa w następujący sposób:
- w sposób ciągły dokonywany jest pomiar temperatury wody i wyświetlany na wyświetlaczu LCD
- program może pracować w dwóch trybach:
1. Tryb auto gdzie w momencie przekroczenia zadanej temperatury (np. 85 st) automatycznie włącza się pompa chłodząca podgrzewacz a w momencie zbyt niskiej temperatury (np. 35 st) włącza się grzałka podgrzewająca wodę
2. Tryb manual w tym trybie nie włącza się nic automatycznie ale za pomocą przycisków można uruchomić zarówno pompę jak i grzałkę
Przełączanie pomiędzy trybami zrobiłem za pomocą przełącznika bistabilnego - nie przycisku (stale włączony jest tryb auto lub manual w zależności od pozycji przełącznika), Takie rozwiązanie pozwala uruchomić ostatnio używany tryb pracy np. po zaniku prądu, ponownym włączeniu urządzenia.
Problem w tym że po przełączeniu z trybu auto na manual program nadal trzyma wartości z trybu auto a chcę żeby zostały one jak gdyby "wyzerowane" np. jeśli w tym momencie jesteśmy w trybie auto Auto i grzałka jest załączona to po przełączeniu w tryb Manual powinna ona zostać automatyczny wyłączona i program powinien "czekać" na ewentualne uruchomienie grzałki za pomocą przycisku.
Potrzebuje jakąś komendę, funkcję lub pętlę która "wyzeruje" wszystkie ustawienia, czyli taka która zadziała (wykona się) tylko jeden raz i nie będzie się wykonywać za każdym kolejnym razem pomimo tego że zagnieżdżona jest w pętli.

Czyli krótko - potrzebuję aby np. komenda:

digitalWrite(pin, LOW);

wykonała się tylko raz pomimo tego że znajduje się w pętli.
Nie mam pojęcia jak to zrobić.
Bardzo proszę o pomoc.
Użyj flagi. przed pętla ustaw ją np na true, w pętli
Kod:
if( flaga ){
flaga = false;
digitalWrite(pin, LOW);
}
(20-11-2019, 14:10)semi napisał(a): [ -> ]Użyj flagi. przed pętla ustaw ją np na true, w pętli

Kod:
if( flaga ){
flaga = false;
digitalWrite(pin, LOW);
}
Ok - tak spróbuję i dam znać jak poszło
Dzięki za odpowiedź
Zrobiłem tak jak radziłeś:
Zadeklarowałem zmienną jako boolean, z wartością true; a w pętli "Manual" po jej uruchomieniu następuje zmiana stanu na false. Dodatkowo w pętli obsługującej tryb "AUTO" dopisałem komendę ponownie zmieniającą wartość tej zmiennej na true aby przy kolejnej zmianie trybu pracy na MANUAL nastąpiło ponownie jednorazowe zadziałanie tej funkcji "zerującej".
Wszystko działa jak należy.
Bardzo dziękuję za pomoc
(21-11-2019, 08:55)JurasM_PL napisał(a): [ -> ]Zrobiłem tak jak radziłeś:
Zadeklarowałem zmienną jako boolean, z wartością true; a w pętli "Manual" po jej uruchomieniu następuje zmiana stanu na false. Dodatkowo w pętli obsługującej tryb "AUTO" dopisałem komendę ponownie zmieniającą wartość tej zmiennej na true aby przy kolejnej zmianie trybu pracy na MANUAL nastąpiło ponownie jednorazowe zadziałanie tej funkcji "zerującej".
Zadeklaruj zmienną lokalną przed pętlą (pewnie deklarujesz globalnie) ustawiając jednocześnie na false.
Panie JurasM_PL, jeśli kolega semi pomógł, to wypadało by kliknąć tego kciuka w górę i przyznać punkt reputacji.
Takie działanie sporo pomoże naszej społeczności.
(21-11-2019, 20:22)Robson Kerman napisał(a): [ -> ]Panie JurasM_PL, jeśli kolega semi pomógł, to wypadało by kliknąć tego kciuka w górę i przyznać punkt reputacji.
Takie działanie sporo pomoże naszej społeczności.
Nie ma sensu!
Jestem banitą!
(21-11-2019, 23:30)semi napisał(a): [ -> ]
(21-11-2019, 20:22)Robson Kerman napisał(a): [ -> ]Panie JurasM_PL, jeśli kolega semi pomógł, to wypadało by kliknąć tego kciuka w górę i przyznać punkt reputacji.
Takie działanie sporo pomoże naszej społeczności.
Nie ma sensu!
Jestem banitą!
Sorry - już naprawiłem swój błąd. Nie doczytałem zasad forum bo jestem tutaj nowy ale to mnie nie tłumaczy.
Jeszcze raz sorry