Dwie funkcje przycisku wł/wył
Dwie funkcje przycisku wł/wył
Witam
Wzmagam się z problemem napisania programu do obsługi przycisku on/off.
Problem polega na tym, że przy naciśnięciu przycisku i funkcji on, włącza on np. diodę1.
Lecz w przypadku wciśnięcia ponownie przycisku w funkcji off, program musi błysnąć diodą2 a diodę1 wyłączyć po 5 sekundach.
Mam problem z obsługą diody nr 2. bo sama obsługa on/off jest prosta. Proszę wiec o pomoc.
pzdr.
Wzmagam się z problemem napisania programu do obsługi przycisku on/off.
Problem polega na tym, że przy naciśnięciu przycisku i funkcji on, włącza on np. diodę1.
Lecz w przypadku wciśnięcia ponownie przycisku w funkcji off, program musi błysnąć diodą2 a diodę1 wyłączyć po 5 sekundach.
Mam problem z obsługą diody nr 2. bo sama obsługa on/off jest prosta. Proszę wiec o pomoc.
pzdr.
- arduino-lab
- Młodszy majsterkowicz
- Posty: 30
- Rejestracja: 2 gru 2015, 14:41
- Kontakt:
Re: Dwie funkcje przycisku wł/wył
Podaj kod.
Tak w skrócie, by odczytać przycisk ON-OFF musisz napisać coś takiego:
Tak w skrócie, by odczytać przycisk ON-OFF musisz napisać coś takiego:
Kod: Zaznacz cały
#define PRZYCISK 2 // pin przycisku
#define DIODAA 5 // pin diody
#define DIODAB 6 // pin diody
int stan = 0; // stan przycisku
void setup() {
pinMode(PRZYCISK , INPUT); // ustawienie pinu jako wejście
pinMode(DIODAA, OUTPUT); // ustawienie pinu jako wyjście
digitalWrite(DIODAA, LOW);
pinMode(DIODAB, OUTPUT); // ustawienie pinu jako wyjście
digitalWrite(DIODAA, LOW);
}
void loop() {
int stan = digitalRead(PRZYCISK); // odczyt przycisku
if (stan == 1) {
digitalWrite(DIODA, HIGH);
}
if (stan == 0) {
digitalWrite(DIODAB, HIGH);
delay (500);
digitalWrite(DIODAB, LOW);
delay (5000);
digitalWrite(DIODAA, LOW);
}
}
-
- Starszy majsterkowicz
- Posty: 329
- Rejestracja: 1 sie 2014, 22:57
Re: Dwie funkcje przycisku wł/wył
No ten twoj kod to nawet nie przypomina przycisku on/off xD
Na poczatku daj zmienna time jako unsigned long.
Kod: Zaznacz cały
void loop() {
if(digitalRead(przycisk) == HIGH) {
if(digitalRead(diodaglowna) == HIGH) {
digitalWrite(drugadrioda,HIGH);
delay(500);
digitalWrite(drugadrioda,LOW);
time = millis() + 5000;
stan = 1;
}
else
{
digitalWrite(diodaglowna,HIGH);
}
if(stan == 1 || millis() >= time)
{
digitalWrite(diodaglowna,LOW);
stan = 0;
}
}
}
- arduino-lab
- Młodszy majsterkowicz
- Posty: 30
- Rejestracja: 2 gru 2015, 14:41
- Kontakt:
Re: Dwie funkcje przycisku wł/wył
Z tego co pamiętam taki włącznik daje nam dwa stany w zależności od "wduszenia", więc... Chyba że mówimy tu o zupełnie innych włącznikach :)
Re: Dwie funkcje przycisku wł/wył
I delay() ktora skutecznie blokuje w tym czasie odczyt przycisku, moim zdaniem wszystko powinno byc na millis() :)
Wysłane z mojego SM-A300FU przy użyciu Tapatalka
Wysłane z mojego SM-A300FU przy użyciu Tapatalka
Re: Dwie funkcje przycisku wł/wył
Tak, o taki przycisk chodzi. Ale o inne działanie: wciskam pierwszy raz - działa funkcja on. Wciskam drugi raz, działa funkcja off. I tak, jak kolega wyżej wspomniał, używanie funkcji delay() nie jest najlepszym rowiązaniemarduino-lab pisze:Z tego co pamiętam taki włącznik daje nam dwa stany w zależności od "wduszenia", więc... Chyba że mówimy tu o zupełnie innych włącznikach :)
-
- Starszy majsterkowicz
- Posty: 329
- Rejestracja: 1 sie 2014, 22:57
Re: Dwie funkcje przycisku wł/wył
No a jaki ja kod dalem? Niby mozna dodac timer ale po co skoro to jedyne 0,5s?
Re: Dwie funkcje przycisku wł/wył
Czy tam nie powinno być &&?razorxx100 pisze:
if(stan == 1 || millis() >= time)
Re: Dwie funkcje przycisku wł/wył
Tak, a poza tym ten drugi if powinien być "wyciągnięty" z tego pierwszego.
A jeśli chodzi ogólnie o programy to mavi pewnie miał na myśli zwykły przycisk zwierny i na nim napisać funkcję on/off, a nie o przycisk on/off, dlatego takie różne programy napisaliście, zależy jak to rozumieć co miał na myśli. W jednym i w drugim przypadku te delaye nie będą przeszkadzać w obsłudze przycisku, jeśli przyjmie się, że nie będzie się wciskać ponownie przycisku do końca wyłączenia. U arduino-lab to 5,5 sekundy, u razorxx100 tylko pół sekundy.
razorxx100 działa w praktyce digitalRead(), kiedy pin jest wyjściem?
EDIT
Aha, jeszcze jest to drganie styków, do else trzeba dodać delay(50), ale i tak nie jestem pewien czy całość będzie działać tak jak powinna.
A jeśli chodzi ogólnie o programy to mavi pewnie miał na myśli zwykły przycisk zwierny i na nim napisać funkcję on/off, a nie o przycisk on/off, dlatego takie różne programy napisaliście, zależy jak to rozumieć co miał na myśli. W jednym i w drugim przypadku te delaye nie będą przeszkadzać w obsłudze przycisku, jeśli przyjmie się, że nie będzie się wciskać ponownie przycisku do końca wyłączenia. U arduino-lab to 5,5 sekundy, u razorxx100 tylko pół sekundy.
razorxx100 działa w praktyce digitalRead(), kiedy pin jest wyjściem?
EDIT
Aha, jeszcze jest to drganie styków, do else trzeba dodać delay(50), ale i tak nie jestem pewien czy całość będzie działać tak jak powinna.
Re: Dwie funkcje przycisku wł/wył
Już odpowiadam co do wyłącznika on/off. Chodzi o przycisk, tzw włącznik chwilowy.
Kod sprawdziłem, lecz nie działa jak powinien.
wciskanie przycisku powoduje zapalenie się chwilowy obydwóch diod. Dłuższe przytrzymanie przycisku czasami powoduje, że dioda1 zapala się na stałe. Lecz potem kolejne włączanie przycisku już jej nie wyłącza....
W kodzie dodałem jedynie podciągniecie rezystora, bo diody błyskały przy każdym zbliżeniu dłoni do przycisku.
poniżej kod taki jaki wgrałem:
Kod sprawdziłem, lecz nie działa jak powinien.
wciskanie przycisku powoduje zapalenie się chwilowy obydwóch diod. Dłuższe przytrzymanie przycisku czasami powoduje, że dioda1 zapala się na stałe. Lecz potem kolejne włączanie przycisku już jej nie wyłącza....
W kodzie dodałem jedynie podciągniecie rezystora, bo diody błyskały przy każdym zbliżeniu dłoni do przycisku.
poniżej kod taki jaki wgrałem:
Kod: Zaznacz cały
#define diodaPin1 13
int diodaStatus = LOW;
#define diodePin2 12
int diodeStatus = LOW;
#define dioduPin3 11
int dioduStatus = LOW;
#define PinPin 10
int time1 = 1500;
int stan = 1;
void setup() {
irrecv.enableIRIn();
pinMode(diodaPin1, OUTPUT);
pinMode(diodePin2, OUTPUT);
pinMode(dioduPin3, OUTPUT);
pinMode(PinPin, INPUT);
digitalWrite(PinPin, HIGH);
}
void loop() {
if(digitalRead(PinPin) == LOW) {
if(digitalRead(diodaPin1) == HIGH) {
digitalWrite(diodePin2,HIGH);
delay(500);
digitalWrite(diodePin2,LOW);
time1 = millis() + 5000;
stan = 1;
delay(200);
}
else
{
digitalWrite(diodaPin1,HIGH);
}
}
if(stan == 1 && millis() >= time1)
{
digitalWrite(diodaPin1,LOW);
stan = 0;
delay(200);
}
}
Re: Dwie funkcje przycisku wł/wył
A jak dodasz delay(50) do else? Te 2 delay(200) możesz usunąć, bo one tu nic nie pomagają.
Re: Dwie funkcje przycisku wł/wył
Zamykam problem. Udało mi się wreszcie napisać kod i działa jak należy. W nowym poście opiszę nowy problem :)
-
- Starszy majsterkowicz
- Posty: 329
- Rejestracja: 1 sie 2014, 22:57
Re: Dwie funkcje przycisku wł/wył
To warto wstawic rozwiazanie bo jak ktos bedzie szukal kiedys czegos podobnego to wpadnie na ten temat.
Ten kod co wczesniej dales na 100% sie zawiesi poniewaz zmienna time dales jako int, a nie unsigned long tak jak wspominalem wczesniej.
Ten kod co wczesniej dales na 100% sie zawiesi poniewaz zmienna time dales jako int, a nie unsigned long tak jak wspominalem wczesniej.