Arduino Polska Forum
Pomoc w kodzie - 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: Pomoc w kodzie (/watek-pomoc-w-kodzie)

Strony: 1 2


Pomoc w kodzie - wewtorek - 23-02-2018

Witam uczę się programować Arduino. Mam zadanie napisać program który będzie za każdym użyciem przycisku wykonywał -- lub ++. Program jest już prawie gotowy problem w tym że po użyciu przycisku wartość się zmienia przez czas wciśnięcia przycisku, zależy mi na tym żeby wartość podnosiła się lub spadała dokładnie o 1 za każdym naciśnięciem. Myślałem nad użyciem pętli while. Proszę o podpowiedz w rozwiązaniu problemu. 

Kod:
int a=0;
void setup() {

pinMode (4, INPUT_PULLUP);  
pinMode (7, INPUT_PULLUP);  
  Serial.begin(9600);    


}

void loop() {
 if (digitalRead (4) == LOW) // przycisk numer 4 włączony
 {
   a++;
 }
 if (digitalRead (7) == LOW) // przycisk numer 7 włączony
 {
  a--;
  }
 
Serial.println (a);
}



RE: Pomoc w kodzie - Robson Kerman - 23-02-2018

To za każdym razem sprawdzaj, czy przycisk został puszczony. Jaki masz z tym problem?


RE: Pomoc w kodzie - wewtorek - 26-02-2018

(23-02-2018, 22:40)Robson Kerman napisał(a): To za każdym razem sprawdzaj, czy przycisk został puszczony. Jaki masz z tym problem?
Nie wiem czego użyć w tym celu.


RE: Pomoc w kodzie - Smaczek - 26-02-2018

Witam,
Użyj zmiennej pomocniczej typu boolean, która będzie przechowywać poprzedni stan przycisku.
Pozdrawiam,
Tomek.


RE: Pomoc w kodzie - wewtorek - 26-02-2018

(26-02-2018, 13:05)Smaczek napisał(a): Witam,
Użyj zmiennej pomocniczej typu boolean, która będzie przechowywać poprzedni stan przycisku.
Pozdrawiam,
Tomek.
A mógłbym zrobić to dodając do kodu pętle while?


RE: Pomoc w kodzie - Smaczek - 26-02-2018

Witam,
Jeśli chcesz sprawdzać stan dwóch przycisków to pętla while nie będzie dobrym rozwiązaniem.
Pozdrawiam


RE: Pomoc w kodzie - wewtorek - 26-02-2018

(26-02-2018, 13:05)Smaczek napisał(a): Witam,
Użyj zmiennej pomocniczej typu boolean, która będzie przechowywać poprzedni stan przycisku.
Pozdrawiam,
Tomek.

Jak mogę zadeklarować tą zmienną? I jak to się ma do reszty kodu? Znajdę jakiś poradnik, artykuł odnośnie używania boolean?
Bardzo dziekuje za pomoc


RE: Pomoc w kodzie - Smaczek - 27-02-2018

Witam,
Odnośnie zmiennych masz wszystko na oficjalnej stronie Arduino.
Zmienną deklarujesz na samym początku programu i przypisujesz jej wartość HIGH. W pętli loop() w programie masz if-a w którym sprawdzasz stan przycisku (czy jest LOW). Musisz tam dodatkowo umieścić warunek, który będzie CI zwiększał wartość zmiennej a ale tylko wtedy, gdy wartość zmiennej boolean jest HIGH. Dodatkowo, jeśli odczyt stanu przycisku jest różny od wartości zmiennej boolean to należy jej wartość zmienić na przeciwną (LOW->HIGH lub HIGH->LOW), czyli aktualny stan przycisku. Podobnie dla drugiego przycisku (czyli potrzeba jest dwóch zmiennych typu boolean). Takie rozwiązanie nie będzie uwzględniać tzw. zjawiska drgania styków, ale to z kolei można wyeliminować dokładając "małego" delay().
Pozdrawiam,
Tomek.


RE: Pomoc w kodzie - wewtorek - 27-02-2018

Kod:
int a;
boolean b = HIGH;
boolean c = HIGH;

void setup() {

pinMode (4, INPUT_PULLUP);  
pinMode (7, INPUT_PULLUP);  
  Serial.begin(9600);    


}

void loop() {
boolean b = digitalRead (4);
boolean c = digitalRead (7);
if (digitalRead (4) == LOW, b = HIGH)
{
   delay(5);
   a++;
  
}
if (digitalRead (7) == LOW, c = HIGH)
{
  delay (5);
  a--;
  }


Serial.println (a);
}

Nie działa, w czym mam błąd?


RE: Pomoc w kodzie - Smaczek - 28-02-2018

Witam,
To, w jaki sposób "poprawiłeś" kod świadczy, że ... jeszcze dużo nauki przed Tobą.
Przede wszystkim masz jakąś dziwną konstrukcję dwóch warunków w if-ach!!
Wyrzuć (ponowną) deklarację zmiennych z loop().
Sugeruję, po uwzględnieniu powyższego:
if(digitalRead(4) != b)
{
if (b == HIGH) a++;
b = !b;
}
Plus ewentualnie jakiś delay();
Pozdrawiam,
Tomek.