• 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
jak wykonać kilka razy pętlę IF i zakończyć ją
#1
Na wstępie witam szanownych forumowiczów.

Jestem na etapie budowy zintegrowanego czujnika opadów deszczu, światła i temperatury zewnętrznej pod system alarmowy. Kwestia pomiarów światła i temperatury oraz wysyłka danych do centrali alarmowej w postaci danych dzień/noc oraz temperatura dodatnia/ujemna nie stanowi większego problemu.

Do budowy czujnika opadów deszczu wykorzystałem LC7555, który pod wpływem zmiany rezystancji wejściowej generuje częstotliwość na wyjściu. Temat związany z poprawnym odczytem tej częstotliwości przez Arduino oraz wysyłki danych deszcz/sucho do centrali alarmowej, również nie stanowił większego problemu. Problemem jest jednak kwestia sterowania grzałką w zależności od 3-4 różnych scenariuszy, zależnych od częstotliwości zmierzonej na wejściu Arduino:


Kod:
1. jeśli 200 < frequency < 2000
  - włączyć przekaźnik Out na pierwszy czas (np. 10 sek), po czym go wyłączyć na drugi czas (np. 20 sek)
  - wykonać pętlę 5 razy i wyjść
2. jeśli 2000 < frequency < 4000
 - włączyć przekaźnik Out na pierwszy czas (np. 10 sek), po czym go wyłączyć na drugi czas (np. 20 sek)
 - wykonać pętlę 10 razy i wyjść
3. jeśli frequency > 4000
 - zostaw wyłączony przekaźnik Out


Częściowo udało mnie się zrealizować pierwszy scenariusz, jak w przykładzie poniżej
tzn. jeśli częstotliwość jest większa niż 200 a mniejsza niż 2000 Hz przekaźnik jest włączany na czas1 i wyłączany na czas2 i tak w kółko, do momentu gdy częstotliwość nie spadnie poniżej 200Hz lub przekroczy 2kHz, gdzie:
- frequency - obliczona częstotliwość sygnału wchodzącego na wejście;
- Out - wyjście przekaźnika
Kod:
#define czas1 10000    // Czas włączenia przekaźnika
#define czas2 20000   // Czas wyłączenia przekaźnika
float frequency;          // Przeliczona częstotliwość
unsigned long czas
.
.
.
.
.
void Grzalka()
{
 if ((frequency>200)&&(frequency<2000)
 {
   if (millis()<(czas+czas1))
   {
     digitalWrite(Out, HIGH);
   }
   if (millis()>(czas+czas1)&&(millis()<(czas+czas2)))
   {
     digitalWrite(Out, LOW);
   }
   if (millis()>(czas+czas1+czas2)) czas=millis();
 }
 else
 {
   digitalWrite(Out, LOW);
   czas=millis();
 }
 delay(500);
}
}

... jednak nie potrafię skutecznie dodać warunku, który tylko np. 5 razy by wykonał główną pętlę "if". Dodawałem przed pierwszą "if" pętlę "for (k1=0; k1<6; k1++){pętla if}", jednak cały czas działała funkcja "if", jakby "for" w ogóle nie działało. Cały czas przekaźnik został włączany na okres czas1 i wyłączany na czas2 dopóki
Kod:
if ((frequency>200)&&(frequency<2000)

Nie mam pojęcia gdzie robię błąd lub jak inaczej można poradzić  sobie z tym problemem.

Potrzebuję wykonać przedstawione wyżej scenariusze aby uniknąć zbędnego grzania podczas intensywnych opadów deszczu/śniegu.

Pozdrawiam serdecznie, Rafał
 
Odpowiedź
  


Wiadomości w tym wątku
jak wykonać kilka razy pętlę IF i zakończyć ją - przez pinelesss - 24-07-2017, 14:43

Skocz do:


Przeglądający: 1 gości