• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wielowątkowość - aplikacja inteligentny dom
#11
Jak nie umiesz programowo ograniczyć wpływu drgań styków to wystarczy dobrać kondensator + rezystor i możesz to zrobić sprzętowo. Jak wejdziesz w przerwanie to możesz je wyłączyć i to taki sposób kiedyś wykorzystywałem, wejście w przerwanie, wyłączenie go, w pętli głównej po 100ms (uznałem, że na pewno nie umiem nacisnąć przycisku częściej niż 10Hz) wyczyszczenie kolejnego wywołania (nawet jak jest wyłączone to mi zapisywało w rejestrze że było i po włączeniu od razu odpalało) i włączenie z powrotem.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#12
No z takim kodem to ja się nie dziwię że ty masz problem bo nie znasz PODSTAW...

void toggleLedISR (){
static unsigned long lastTime;
unsigned long timeNow = millis();

unsigned long por = timeNow - lastTime;

if (por > 350) {// drganie styków - nie reaguje na załączenie poniżej 50 ms

ledState =! ledState ;
digitalWrite(LED_BUILTIN, ledState);

}

lastTime = timeNow ;

}

Przerwanie wykonuje się raz nie można używać millis....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#13
Kod:
Przerwanie wykonuje się raz nie można używać millis....

A dlaczego nie można?   Ta funkcja  to licznik. Muszę w jakiś sposób sprawdzić długość czasu trwania impulsów.
 
Odpowiedź
#14
W jaki sposób mam wykluczyć drgania impulsów poza hardware?
 
Odpowiedź
#15
A po co chcesz wykluczać drgania styków programowo?? skoro i tak wystapi przerwanie, co innego gdyby zrobić sprzętowo to wtedy warto bo mniej przerwań mniej zadań. Wystarczy w przerywaniu po wykryciu ustawić flagę nie na przeciwna a na np. high a w loop po wykorzystaniu dopiero wykorzystać i zmienić flagę więc drgania nie będą działać na program jakoś znaczaco...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#16
No przecież Kaczakat napisał, żeby wyłączać globalne zezwolenie na przerwania po wejściu w wektor. Przed wyjściem włączasz zezwolenie i problem drgań styków znika.
Druga sprawa, to piszesz, że nie masz dostępu do wszystkich wejść i pokazujesz zdjęcie sprzętu i ja widzę wyprowadzone wszystkie piny Mega2560 na kołkach.
https://www.controllino.com/wp-content/u...Pinout.pdf

A tutaj trochę o przerwaniach.
https://www.controllino.com/knowledge-base/interrupts/
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#17
(10-03-2021, 16:42)Jarewa0606 napisał(a): A po co chcesz wykluczać drgania styków programowo?? skoro i tak wystapi przerwanie, co innego gdyby zrobić sprzętowo to wtedy warto bo mniej przerwań mniej zadań. Wystarczy w przerywaniu po wykryciu ustawić flagę nie na przeciwna a na np. high a w loop po wykorzystaniu dopiero wykorzystać i zmienić flagę więc drgania nie będą działać na program jakoś znaczaco...

Poczytałem już troszkę na ten temat wychodzi na to, że muszę zrobić pomiędzy każdym włącznikiem, a wejściem  układ generowania pojedynczego impulsu, który będzie ignorował drgania styków w określonym zakresie czasowym i podać taki sygnał na wejście. 

Wówczas czas przerwania będzie bardzo krótki - chcę wygenerować sygnał o czasie trwania do 1/10000 sekundy.
 
Odpowiedź
#18
Cytat:Druga sprawa, to piszesz, że nie masz dostępu do wszystkich wejść i pokazujesz zdjęcie sprzętu i ja widzę wyprowadzone wszystkie piny Mega2560 na kołkach.


Ale chyba nie po to kupowałem urządzenie za prawie 2000 zł do zamontowania na szynę din, żeby korzystać z tych pinów na górze  i robić jakieś remapowanie.  Równie dobrze mógłbym kupić Arduino mega.   Zwróć uwagę, że są tam przekaźniki, wyjścia gdzie do dyspozycji jest 2A na 24V.   Są  mi one potrzebne w mojej aplikacji. 

Jedynie co nie potrzebuję to aż tyle wyjść cyfrowych i tutaj część z nich przemapowałem na wejścia poprzez górny panel. To niestety wymaga użycia konwerteraonwentera napięć z 5 na 24V i jest  średnio wygodne. 


Cytat:No przecież Kaczakat napisał, żeby wyłączać globalne zezwolenie na przerwania po wejściu w wektor. Przed wyjściem włączasz zezwolenie i problem drgań styków znika.


Nic mi to nie daje, wręcz przeszkadza. Poza tym już n razy pisałem, że te przerwania są tylko dla niektórych wejść.  

Dochodzę powoli do wniosku że na tym procesorze nie da się zrobić tego co bym chciał. Już nawet machnąłem ręką i powiedziałem sobie dobra zrobię przy każdym włączniku generator impulsu.  W ten sposób czas obsługi takiego zdarzenia byłby niezwykle szybki - niezauważalny.   

Ale jak zacząłem sobie myśleć o tym, że na tym samym sterowniku trzeba zrobić jeszcze obsługę rolet albo ściemnianie światła  to mam już spore wątpliwości czy to się da w ogóle zrobić. 

Załóżmy, że będę chciał opuścić roletę do określonego momentu.  Więc case będzie taki, że po wciśnięciu trzymam przycisk do momentu kiedy silnik przesunie roletę do pożądanej pozycji.   Zapewne tutaj będzie taka sytuacja, że do czasu kiedy na wejściu będzie stan wysoki to na wyjściu też powinien być stan wysoki.

Skomplikowane się to robi.
 
Odpowiedź
#19
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. 


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();

}
 
Odpowiedź
#20
przez delay (500) procesor nie robi nic tylko czeka przez te 0,5sek
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości