Dwie funkcje przycisku wł/wył

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
mavi
Młodszy majsterkowicz
Posty: 5
Rejestracja: 3 sty 2016, 23:33

Dwie funkcje przycisku wł/wył

Post autor: mavi » 13 sty 2016, 17:23

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.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Dwie funkcje przycisku wł/wył

Post autor: arduino-lab » 13 sty 2016, 17:49

Podaj kod.

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);
}
}
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Dwie funkcje przycisku wł/wył

Post autor: razorxx100 » 13 sty 2016, 20:27

No ten twoj kod to nawet nie przypomina przycisku on/off xD

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;
}

}
}
Na poczatku daj zmienna time jako unsigned long.
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Dwie funkcje przycisku wł/wył

Post autor: arduino-lab » 13 sty 2016, 21:30

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 :)
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Dwie funkcje przycisku wł/wył

Post autor: Slawek » 14 sty 2016, 08:38

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
Awatar użytkownika
Marhef
Złota rączka
Posty: 1261
Rejestracja: 18 lis 2011, 02:18

Re: Dwie funkcje przycisku wł/wył

Post autor: Marhef » 14 sty 2016, 09:26

arduino-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 :)
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ązaniem
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Dwie funkcje przycisku wł/wył

Post autor: razorxx100 » 14 sty 2016, 12:18

No a jaki ja kod dalem? Niby mozna dodac timer ale po co skoro to jedyne 0,5s?
Awatar użytkownika
Marhef
Złota rączka
Posty: 1261
Rejestracja: 18 lis 2011, 02:18

Re: Dwie funkcje przycisku wł/wył

Post autor: Marhef » 14 sty 2016, 12:24

razorxx100 pisze:
if(stan == 1 || millis() >= time)
Czy tam nie powinno być &&?
stiven
Złota rączka
Posty: 1644
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Dwie funkcje przycisku wł/wył

Post autor: stiven » 14 sty 2016, 12:36

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.
mavi
Młodszy majsterkowicz
Posty: 5
Rejestracja: 3 sty 2016, 23:33

Re: Dwie funkcje przycisku wł/wył

Post autor: mavi » 14 sty 2016, 16:58

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: 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);
}
}

stiven
Złota rączka
Posty: 1644
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Dwie funkcje przycisku wł/wył

Post autor: stiven » 14 sty 2016, 17:06

A jak dodasz delay(50) do else? Te 2 delay(200) możesz usunąć, bo one tu nic nie pomagają.
mavi
Młodszy majsterkowicz
Posty: 5
Rejestracja: 3 sty 2016, 23:33

Re: Dwie funkcje przycisku wł/wył

Post autor: mavi » 15 sty 2016, 04:23

Zamykam problem. Udało mi się wreszcie napisać kod i działa jak należy. W nowym poście opiszę nowy problem :)
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Dwie funkcje przycisku wł/wył

Post autor: razorxx100 » 15 sty 2016, 13:40

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.
ODPOWIEDZ

Strony partnerskie: