Skocz do zawartości

Specyficzna kompozycja warunku IF


Pomocna odpowiedź

Napisano

Witam.

Nie jestem jakimś super programistą raczej elektronikiem, więc potrzebuje pomocy z kodem dla Arduino, a mianowicie chodzi mi o to jak zapisać warunek, który będzie spełniony wtedy, gdy np. A=1 ale przez minimum 5 sekund? Z góry dzięki.

oczywiście bez delay

Bezpośrednio się nie da (if sprawdza stan bieżący a nie historię ostatnich piętnastu lat).

Musisz periodycznie sprawdzać czy A == 1, i jeśli minie 5 sekund odpalić co ma być po ifie.

Pytanie: co się ma stać, jeśli minęło 5 sekund, blok został wykonany i przychodzi następny obrót pętli? Ma się wykonać jeszcze raz czy czekać na A != 1?

chodzi mi o coś takiego co napisałem poniżej z wykorzystaniem delay(), no ale muszę to zrobić bez dealy

long time = 0;
long delayed = 3000;

void setup() 
{

 Serial.begin(9600);
pinMode(2,INPUT_PULLUP); 

}

void loop()
{

if(digitalRead(2) == LOW )
{
delay(3000);
 if(digitalRead(2)== LOW)
 {
   Serial.print("jest jest");
   }


}


}

[ Dodano: 06-07-2018, 11:49 ]

Tak dokładniej to po prostu programuje pewien termostat cyfrowy z wykorzystaniem czujników DS18B20 i jak to z tymi czujnikami bywa czasem odczyt potrafi na ułamek sekundy zwariować i np. z 25,5 stopnia zrobi się 24,5 czy coś w tym stylu i funkcja if już to wyłapie i załączy np. grzanie dlatego chciałbym to zabezpieczyć w ten sposób alby termostat załączał się na daną temperaturę tylko wtedy gdy "widzi" ją przez co najmniej np. 5s

Wyjaśnieniem tego zajmuje się kurs Arduino na tej stronie opisujący i zwieńczający go odcinek o millis(). W przykładzie w Arduino w podstawach też jest przykład blink without delay - jest użyta funkcja millis() do migania led zamiast delay. W Twoim wypadku powołujesz zmienną, którą zwiększasz co np. 100ms gdy warunek jest spełniony i zerujesz gdy nie jest. Jak zmienna przekroczy 50 to odliczyłeś te swoje 5s. Możesz sprawdzać co 1ms i liczyć do 5000. Możesz zliczać do zera od jakieś liczby. Żeby zrobić cokolwiek sensownie poza jedną czynnością trzeba się nauczyć jakoś zarządzać czasem, millis() czy analogiczna micros() to jedna z dróg.

static uint32_t last_ok = millis(); // tu przechowujemy historię zaczynając od pierwszego wejścia w loop
if (A != 1) {
  last_ok = millis(); // czyli zaczynamy liczyć od początku
}
else if (millis() - last_ok >= 5000UL) { // czyli minęło 5000 msec i A cały czas jest równe 1
  Serial.println("Hurra!");
}

Może być?

(Edycia)

A nie prościej po prostu powtórzyć odczyt termometru?

  • 2 tygodnie później...

Taki Ci się trafił egzemplarz DS18B20. Nie wiem czy to oznacza że jest uszkodzony, ale mam tak samo z jednym podłączonym do ESP8266, zasilany jest z 3.3V razem z ESP. Do jednego ESP podłączam 2 DS, temp pokoju i zewnętrzna, mam ich z 10 w sumie i z tych 10 9 szt. pokazuje stabilne odczyty, w kolejnych sekundach nie różnią się o więcej niż 0,06, no rzadko 0,12oC (odczyt jest z pełną precyzją). Ten jeden sobie skacze w zakresie +/- 0,5oC. Średnia ciągnięta jest OK i pokazuje temperatury jak inne DSy. Myślałem że dynda za oknem to sobie skacze, ale w środku robił to samo.

W sumie pisząc to wpadłem by podłączyć go do AVRka i 5V, zaczął działać stabilnie. Nie jest to raczej wysokość napięcia, bo DS działają mi nawet na dwóch AA przy napięciu lekko poniżej 2,5V, także chodzi bardziej o szarpanie prądu przez ESP. ESP ma co prawda kondensator 2000u LESR, kondensator jest 1cm od nóżki ESP i jeszcze jeden 100n ceramiczny na padzie zasilania ESP, ale jak widać nie pomaga (to typowa płytka dla samego chipa ESP12E). A zasilanie DS mam 2mm od pada ESP, potem kabelek do płytki rozdzielacza z gniazdkami telefonicznymi. Dodałem przy tej płytce z gniazdkami dla DS kondensator ceramiczny 220n i stabilność wzrosła, ale i tak ten "felerny" czujnik skacze częściej o te 6 12 setnych niż inne. Zasiliłem go więc sprzed stabilizatora 3.3V, z 5V i zmiany stały się leniwe, już tylko o 6 setnych, jakby nie był zdecydowany czy jest 23,38 czy 23,44oC.

Wybierz sobie co może pasować u Ciebie.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...