Skocz do zawartości

Arduino Uno - drgania styków (przycisk) na przerwaniach


Pomocna odpowiedź

Napisano

Ma ktoś jakiś pomysł jak mogłabym wyeliminować drgania styków na przycisku? Program ma działać (na przerwaniach) tak, że po naciśnięciu na przycisk informacja wyświetlana na LCD ma się zmieniać, np. z Hello na Cześć, a po ponownym naciśnięciu z powrotem na Hello.

Tutaj mój kod:

#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27

int i = 0;
int licznik = 1;

void setup()
{
 lcd.begin(16,2);
 lcd.backlight(); 
 lcd.setCursor(0,0);

 attachInterrupt(1, toggle, FALLING);                                                         
}

void loop()
{
  while (i == 0) {
   if (licznik == 1) lcd.clear();
   lcd.print("Czesc");
   licznik++; 
  }
  licznik = 1;

  while (i == 1) {
   if (licznik == 1) lcd.clear();
   lcd.print("Hello");  
   licznik++;                 
  }
  licznik = 1;
}

void toggle()                                        
{
 i = !i;
}

Chodzi o to, że czasem po naciśnięciu na przycisk nic się nie dzieje. Pewnie chodzi o drgania styków, ale nie wiem za bardzo jak mogę temu zapobiec.

Zamiast przerwania z przycisku użyj timera.

Ustaw timer tak, żeby odpalał się np. co 10ms.

W przerwaniu timera zrób tak, że jak przycisk jest wciśnięty to zwiększasz zmienną, a jak nie jest wciśnięty to ją zerujesz.

Dodatkowo w programie głównym robisz tak, że jak zmienna jest większa od określonej liczby (np. 5 dla 50ms trzymania przycisku) to wykonujesz funkcję specjalną.

Przykład


volatile unsigned char licznik = 0;

void Przerwanie_timera()
{
if (pinwcisniety) 
{
   if (licznik<253) licznik++;
 }
 else licznik = 0;
}

void loop()
{
 if ((licznik>5) && (licznik<254))
{
   przyciskzostalzaakceptowany();
   licznik=255; // nie chcemy ponownie wywolac funkcji - czekamy az licznik zostanie puszczony i wyzeruje zmienna licznik
}
}

Możesz też na początku przerwania dodać zapamiętywanie kiedy ostatnio było wywołane i ignorowanie, jeśli nie upłynęło wystarczająco wiele czasu. Rozwiązań jest naprawdę dużo, polecam przeszukanie tego forum albo ogólnie Internetu po kątem hasła "debouncing".

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...