Skocz do zawartości
muminek600

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

Pomocna odpowiedź

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...