• 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
Pętla while - opóźnienie pomiędzy spełnieniem warunku, a reakcją
#1
Cześć,
jestem w trakcie nauki programowania i napisałem taki prosty program:
Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temp;

void setup(void)
{
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(7, INPUT);
 Serial.begin(9600);
 Serial.println("TEST POPRAWNOŚCI DZIAŁANIA SENSORA TEMPERATURY");
 sensors.begin();
}

void loop(void)
{
 sensors.requestTemperatures();
 temp = sensors.getTempCByIndex(0);


 while (digitalRead(7) == LOW)
 {

   if (temp < 23)
   {
     digitalWrite(9, HIGH);
     digitalWrite(10, LOW);
     digitalWrite(11, LOW);

   }
   else  {

     if (temp >= 23 && temp <= 24)
     {
       digitalWrite(9, LOW);
       digitalWrite(10, HIGH);
       digitalWrite(11, LOW);


     }
     else {
       if (temp > 24)
       {
         digitalWrite(9, LOW);
         digitalWrite(10, LOW);
         digitalWrite(11, HIGH);

       }
     }
   }
 }
 digitalWrite(9, LOW);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);

}

Program jest jedynie do celów naukowych więc nie dziwcie się, że w praktyce nie ma żadnego sensownego zastosowania.

Zasada działania miała być prosta. Za każdym razem jak wcisnę przycisk i go przytrzymam, diody podłączone do pinów 9,10,11 miały wskazać temperaturę. Dioda 10 miała się zapalać jeśli temperatura jest w zakresie 23-24st. C, a diody 9 i 11 jeśli temperatura jest odpowiednio niższa i wyższa niż założony zakres. po zwolnieniu przycisku diody miały gasnąć.

Niby program działa dobrze, ale nie do końca tak jak to sobie wyobrażałem. Mianowicie, pomiędzy wciśnięciem przycisku, a zapaleniem diody jest opóźnienie, które nie mam pojęcia z czego wynika.
 
Odpowiedź
#2
Jako, że uczę się bardziej metodą prób i błędów, przygotowałem nieco inne kod:

Kod:
void setup() {
 pinMode(11, OUTPUT);
 pinMode(7, INPUT);

}

void loop() {
 
 while(digitalRead(7) == LOW)
 {
 digitalWrite(11, HIGH);
 }
  digitalWrite(11, LOW);

}

Tym razem dioda 11 ma się zapalać w momencie kiedy ktoś wciśnie i przytrzyma przyciski oraz zgasnąć kiedy zostanie zwolniony.

Tutaj nie ma już żadnego opóźnienia jak w pierwszym przypadku. Dioda zapala się od razu i wykrywane są nawet bardzo krótkie kliknięcia, które w poprzednim kodzie były "ignorowane".

Wnioskuję z tego, że problem tkwi we fragmencie kod który sprawdza czy odczytana temperatura jest zawarta w odpowiednim przedziale (te trzy pętle if) i wynika z tego, że mikrokontrolerowi, zajmuję chwilę zanim sprawdzi warunki, ale nie chce mi się wierzyć, że to aż tak duże opóźnienie, które da się zauważyć.
 
Odpowiedź
#3
(11-04-2017, 22:26)BorokaMan napisał(a): Wnioskuję z tego, że problem tkwi we fragmencie kod który sprawdza czy odczytana temperatura jest zawarta w odpowiednim przedziale (te trzy pętle if) i wynika z tego, że mikrokontrolerowi, zajmuję chwilę zanim sprawdzi warunki, ale nie chce mi się wierzyć, że to aż tak duże opóźnienie, które da się zauważyć.
Przeczytaj dokumentację do czujnika którego używasz a wszystko stanie się jasne.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#4
dokladnie tak jak kolega Ci poradzil, data sheet sensora sie klania Smile czas jest 'tracony' na odczyt temperatury a nie na if'y

wyslane z Tapatalka
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości