12-04-2017, 22:23
Witam. Z ciężkim bólem kod przerobiony na użycie samego millis(). Błąd z dioda pozostał.
W szkicu led na pinie 12 sygnalizuje działanie funkcji migacz a led_builtin wskazuje stan przycisku. I w sytuacji gdy stan led na pinie 13 jest HIGH to funkcja migacz działa poprawnie. Lecz jeśli stan przycisku się zmieni na przeciwny( led_bultin gaśnie ) w momencie gdy led na pinie 12 jest w stanie HIGH , to już taki zostaje do momentu zmiany stanu przycisku. Mam nadzieję, że zrozumiale to opisałem.
A poza tym sklejenie dwóch przykładów (BlinkWithoutMillis + Debounce) tyle czasu ponieważ wiedziałem, że muszę wstawić odpowiedni warunek do działania kodu. Problem w tym, że nie wiedziałem gdzie go wstawić. Poradniki tego nie "mówią".
Ten kod jest z dwoma opóźnieniami. Zasada ta sama.
W szkicu led na pinie 12 sygnalizuje działanie funkcji migacz a led_builtin wskazuje stan przycisku. I w sytuacji gdy stan led na pinie 13 jest HIGH to funkcja migacz działa poprawnie. Lecz jeśli stan przycisku się zmieni na przeciwny( led_bultin gaśnie ) w momencie gdy led na pinie 12 jest w stanie HIGH , to już taki zostaje do momentu zmiany stanu przycisku. Mam nadzieję, że zrozumiale to opisałem.
A poza tym sklejenie dwóch przykładów (BlinkWithoutMillis + Debounce) tyle czasu ponieważ wiedziałem, że muszę wstawić odpowiedni warunek do działania kodu. Problem w tym, że nie wiedziałem gdzie go wstawić. Poradniki tego nie "mówią".
Kod:
const int ledPin = LED_BUILTIN;
int ledPin1 = 12;
int ledState1 = LOW;
static int ledState = LOW;
const long interval = 500;
int przycisk = 2;
int stanPrzycisku;
int poprzedniStanPrzycisku = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(przycisk, INPUT_PULLUP);
}
void migacz() {
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (ledState1 == HIGH) {
if ( currentMillis - previousMillis >= interval ) {
ledState1 = LOW;
previousMillis = currentMillis;
}
}
else {
if ( currentMillis - previousMillis >= interval * 5 ) {
ledState1 = HIGH;
previousMillis = currentMillis;
}
digitalWrite(ledPin1, ledState1);
}
}
void loop() {
int odczyt = digitalRead(przycisk);
if (odczyt != poprzedniStanPrzycisku) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (odczyt != stanPrzycisku) {
stanPrzycisku = odczyt;
if (stanPrzycisku == LOW) {
ledState = !ledState;
}
digitalWrite(ledPin, ledState);
}
}
poprzedniStanPrzycisku = odczyt;
if (ledState == HIGH) {
migacz();
}
}