Skocz do zawartości

Specyficzna kompozycja warunku IF


omnixcrs

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.