Skocz do zawartości

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


muminek600

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.

Link do komentarza
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
}
}

Link do komentarza
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".

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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!

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.