09-12-2018, 16:37
Jak nie znasz lepszego podejścia do przycisków niż delay to poznaj bibliotekę bounce2: https://github.com/thomasfredericks/Bounce2 , poznaj millis w kursie na Forbot (nie zrozumiesz jak nie przejdziesz całego kursu, nawet tych elementów, które pozornie nie są Ci teraz potrzebne, bo każdy odsłania nieco niezbędnej teorii): https://forbot.pl/blog/kursy.
Wciśnięcie przycisku trawa kilka ms, sprawdzenie i wykonanie poleceń kilka us. Może to zrobić tysiące razy przy jednym maźnięciu paluchem po przycisku. I żeby tego uniknąć używanie delay jest jak włożenie patyka w szprychy - jest fe. Bez zrozumienia kursu i poznania bibliotek będziesz wymyślał koło na nowo kręcąc się w kółko.
Można też zrobić tak, że po pierwszym wykryciu wciśnięcia przycisku wszystkie inne są ignorowane, choć program pracuje bez blokowania pętli (przykład z millis()):
Chyba że użyjesz gdzie delay, to przestanie działać.
Wciśnięcie przycisku trawa kilka ms, sprawdzenie i wykonanie poleceń kilka us. Może to zrobić tysiące razy przy jednym maźnięciu paluchem po przycisku. I żeby tego uniknąć używanie delay jest jak włożenie patyka w szprychy - jest fe. Bez zrozumienia kursu i poznania bibliotek będziesz wymyślał koło na nowo kręcąc się w kółko.
Można też zrobić tak, że po pierwszym wykryciu wciśnięcia przycisku wszystkie inne są ignorowane, choć program pracuje bez blokowania pętli (przykład z millis()):
Kod:
const int buzzer=13;
const int button=2;
boolean stanbuzzera=0;
void setup() {
// put your setup code here, to run once:
pinMode(buzzer,OUTPUT);
pinMode(button,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if(!digitalRead(2)||stanbuzzera) dzwiek(500,10,buzzer);
}
void dzwiek(uint16_t dlugosc, uint16_t pikniec, uint16_t pin) //(dlugosc piku, ile pikniec, na ktory pin)
{
static uint16_t aktualnyPik=0;
static boolean stanpoprzedni=0;
static uint32_t lasttime=0;
uint32_t currenttime=millis();
// na razie zakladam 5 pikniec co 1000ms
if(currenttime-lasttime>=(uint32_t)dlugosc)
{
lasttime=currenttime;
if( aktualnyPik++ <(pikniec*2))//mnozymy *2 by pikniec bylo 10, nie zmian stanu
{
digitalWrite(pin,!digitalRead(pin));
stanbuzzera=1;
}
else
{
aktualnyPik=0;
stanbuzzera=0;
}
}
}
Miło być decenianym https://buycoffee.to/kaczakat