• 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
przekaźnik czasowy
#10
Bardzo przekombinowałeś proste rzeczy. Masz przykład BlinkWithouDelay do nauki zamiany delay na millis. Loop ma się wykonywać najszybciej jak to możliwe, miliony lub chociaż tysiące razy na sekundę. Wystarczy ten przykład tak zmodyfikować, żeby oznaczyć jakoś ten jeden przebieg loop gdy jest nowa sekunda, a w każdym innym loop ją zerować, na koniec zamianę stanu led zamienić na zmienną zwiększającą swój licznik co 1s.
Kod:
uint32_t poprzednio = 0,licznikSekund;        // will store last time LED was updated
uint32_t interwal = 1000;           // interval at which to blink (milliseconds)
bool flaga1s;

void setup()
{
Serial.begin(115200);
}

void loop() {
uint32_t teraz = millis();
flaga1s=0; //zerowanie flagi, tu lub na koncu loop
  if (teraz - poprzednio >= interwal)
  {
    poprzednio = teraz; //zapamietanie tego stanu licznika jako ostatni uzyty
    flaga1s=1; //oznaczamy ten loop jako wybrany
    licznikSekund++;//i zwikszamy licznik uplynietych sekund
  }
//teraz mozna uzyc flagi

if(flaga1s) //czyli tylko wtedy, gdy jest loop z nowa sekunda, raz bo zerujemy flaga1s w kazdym innym loop
{
  Serial.println(licznikSekund);
}

//mozna tez uzyc licznika sekund i flagi
if(flaga1s and licznikSekund%10==0) //czyli gdy jest ten jeden loop z nowa sekunda, a licznik sekund dzieli sie przez 10 bez reszty, ==0
{
  Serial.println("A to co dziesiata sekunde");
}
}

Można w ten sam sposób zmniejszyć mierzone odcinki do np. 10ms, ze 100 sklejać 1s, sekundy w minuty, minuty w godziny, itd. Jak to zrozumiesz to znajdź mój post z funkcją czas().
Jeśli nie wiesz jak bez delay odczytać przycisk to są gotowe biblioteki, ale jest to proste jak zrozumiesz działanie millis. Przy intervale 10ms można raz na te 10ms sprawdzać stan pinu, jeśli nie był wciśnięty, a jest, i jest przez kolejne 3-4 wywołania, to znaczy, że jest wciśnięty i drgania minęły. A jak to zrobić, tak samo jak millis, robisz zmienną poprzedni stan przycisku, aktualny stan przycisku, czas wciśnięcia, jeśli nie jest wciśnięty to zerujesz czas, jeśli czas wciśnięcie >=4, to został wciśnięty, można zareagować, albo dodać dodatkowe funkcje i czekać na puszczenie, czyli wykonać akcję na wciśnięcie po 40ms, albo czekać na puszczenie i wykonać akcję dla krótkiego wciśnięcia przy czasie 40-500ms, albo wykonać akcję dla długiego wciśnięcia powyżej 500ms, albo zmienić na jeszcze inną akcję gdy ktoś trzyma przycisk dalej bo minęło już np. 4000ms. Oczywiście nie stoisz w tym miejscu, żaden for, while, delay, wskakujesz w ten blok programu, sprawdzasz stan, odnotowujesz parametry w zmiennych, zerujesz lub inkrementujesz i powrót do loop, trwa to kilka us.
Zrobiłem sobie funkcję czas(), bo nie ma sensu sprawdzać millis dla każdej opcji dodanej w programie, wywolanie millis też trwa parę us, tak samo jak raz funkcji czas(), a potem takie polecenie if(flaga1s) to już tylko ze 100ns, lub kilka ns w szybszym od UNO ESP32.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
przekaźnik czasowy - przez ferdricco - 16-01-2024, 00:24
RE: przekaźnik czasowy - przez oscarX - 16-01-2024, 07:16
RE: przekaźnik czasowy - przez ferdricco - 16-01-2024, 13:27
RE: przekaźnik czasowy - przez oscarX - 16-01-2024, 14:01
RE: przekaźnik czasowy - przez kaczakat - 16-01-2024, 15:12
RE: przekaźnik czasowy - przez ferdricco - 16-01-2024, 19:25
RE: przekaźnik czasowy - przez oscarX - 16-01-2024, 20:03
RE: przekaźnik czasowy - przez ferdricco - 16-01-2024, 20:28
RE: przekaźnik czasowy - przez Jarewa0606 - 17-01-2024, 00:59
RE: przekaźnik czasowy - przez kaczakat - 19-01-2024, 16:52

Skocz do:


Przeglądający: 1 gości