10-04-2021, 23:03
Minęło troszkę czasu i znalazłem rozwiązanie polegające na tym, że wykorzystam pulling w połączeniu z timerem. Sprawdzam pin co 10 ms. Zwarcie do masy powoduje, że zaczynam zwiększać licznik - jego zadaniem jest obliczenie długości sygnału w stanie zwarcia do masy.
Jeśli jest zwarty do masy to nic nie robię do czasu aż go nie puszczę. Dalej jeśli sygnał trwał od 50 ms i był mniejszy niż 1000 ms to na danym wyjściu załączam obwód - czyli w moim wypadku jest to dioda połączą przez rezystor 470R do wyjścia A0.
Jeśli sygnał był dłuższy lub równy 1000ms to wówczas guzik zmienia swoją funkcję na ściemniacz diody. To taki prosty programik aby zrozumieć jak to działa.
Program blokuje procesor co 10 ms. bo co taki czas timer odpala funkcję sprawdzającą stan wejścia. W tej funkcji można czytać wszystkie wejścia na raz. Więc jak ktoś ma więcej włączników do obsługi to można to robić w ten właśnie sposób.
Jeśli jest zwarty do masy to nic nie robię do czasu aż go nie puszczę. Dalej jeśli sygnał trwał od 50 ms i był mniejszy niż 1000 ms to na danym wyjściu załączam obwód - czyli w moim wypadku jest to dioda połączą przez rezystor 470R do wyjścia A0.
Jeśli sygnał był dłuższy lub równy 1000ms to wówczas guzik zmienia swoją funkcję na ściemniacz diody. To taki prosty programik aby zrozumieć jak to działa.
Program blokuje procesor co 10 ms. bo co taki czas timer odpala funkcję sprawdzającą stan wejścia. W tej funkcji można czytać wszystkie wejścia na raz. Więc jak ktoś ma więcej włączników do obsługi to można to robić w ten właśnie sposób.
Kod:
#include <Timers.h> /
Timers <1> akcja;
volatile int ledState = 0;
void drimmer (){
static int brightness = 250;
analogWrite(A0 , brightness );
if(brightness >= 50 ){
brightness = brightness + 1;
}
if(brightness == 260 ){
brightness = brightness - 210;
}
}
void redinputs() {
static int licznik;
int val = digitalRead(D44);
//powrót z niskiego na wyski po wciśnięciu
if(val == 1 && licznik != 0 ){
if(licznik > 5 && licznik < 100){
if (ledState > 0 ) {
ledState = 0;
}
else {
ledState = 255;
}
Serial.print("ledstate: ");
Serial.println(ledState);
licznik = 0;
analogWrite(A0, ledState );
Serial.println("pstryk");
}
if(licznik >= 100){
licznik = 0;
}
}
if(licznik >= 100 ){
drimmer();
Serial.println("drimemr run");
}
// załączanie z wysokiego na niski
if (val == 0 ){
licznik++;
}
}
void setup() {
Serial.begin(115200);
delay(3000);
Serial.println("SERIAL START");
pinMode(A0, OUTPUT);
pinMode(D44, INPUT_PULLUP);
akcja.attach(0, 10, redinputs);
}
void loop() {
akcja.process();
}