• 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
Pytanie o pętlę while, kolejność wykonywania kodu
#1
Witam z nudów buduję automatyczne poidełko dla moich klatkowych zwierzątek, zasada działania jest bardzo prosta. Program sprawdza poziom wody raz dziennie (są 3 poziomy ale narazie używam tylko jednego) jeżeli brakuje wody uruchamia pompkę która ponosi poziom w tym czasie program cały czas sprawdza aktualny poziom i kiedy się on zgodzi wyłącza pompkę i znów odlicza czas do kolejnego sprawdzania poziomu wody. Sterowanie pompki zrobiłem na mosfecie, jest jeszcze dodatkowy tranzystor który uruchamia vcc w mierniku wody, to sterowanie dodałem żeby styki za szybko się nie utleniły. Sam miernik oparty jest o macierz tranzystorową ogólnie bardzo prosty projekt.

jednak mam problem z pętlą while, do tej pory myślałem (już wiem, że błędnie) że jeśli warunek pętli while jest spełniony to wykonuje się tylko ta pętla i nic więcej w całym kodzie, natomiast w tym co zrobiłem takie myślenie narobiło mi kłopotów bo zauważyłem że oprócz pętli while wykonuje się tak na prawdę cały kod co skutkowało włączaniem i wyłączaniem się pompki w kółko a w połączeniu z instrukcjami delay (użytych z lenistwa i tylko na testy) zrobił się totalny chaos. Na chwilę obecną sobie poradziłem i program działa tak jak chciałem ale moje pytanie brzmi, czy pomijając użycie switch case można wymusić wykonywanie tylko danego kawałka kodu pomijając resztę ?

wrzucam mój kod, to co jest zakomentowane to część po której zorientowałem się, że kod jednak wykonuje się w całości podczas gdy zmienna timeForFeed ma wartość 1 a myślałem, że ustawienie tej zmiennej wartości 1 spowoduje, że górna część kodu zostanie pominięta. Do głowy przychodzi mi tylko użycie switch case.

Kod:
#include <avr/wdt.h>

#define VCC A2
#define MOTOR A1

void setup()
{
  //  wdt_disable();
  //  delay(2L * 1000L);
  //  wdt_enable(WDTO_2S);

  pinMode(0, INPUT_PULLUP); // low point
  pinMode(1, INPUT_PULLUP); // middle point
  pinMode(2, INPUT_PULLUP); // high point
  pinMode(13, OUTPUT);
  pinMode(MOTOR, OUTPUT);
  pinMode(VCC, OUTPUT);
}

void pumpOn()
{
  digitalWrite(MOTOR, HIGH);
  digitalWrite(13, HIGH);
}

void pumpOff()
{
  digitalWrite(MOTOR, LOW);
  digitalWrite(13, LOW);
}

void vccOn()
{
  digitalWrite(VCC, LOW);
}

void vccOff()
{
  digitalWrite(VCC, HIGH);
}

int timeForFeed = 1;
unsigned long timeOne;
unsigned long timeTwo = 0;
unsigned long timethree;

void loop()
{
  timeOne = millis();
  timethree = timeOne - timeTwo;

  if (timethree >= 5000UL)
  {
    timeForFeed = 1;
    timeTwo = timeOne;
    vccOn();
    delay(100);
  }
  //  else
  //  {
  //    pumpOff();
  //    vccOff();
  //    timeForFeed = 0;
  //  }

  while (timeForFeed == 1)
  {
    while (digitalRead(1) == HIGH)
    {
      pumpOn();
    }
    while (digitalRead(1) == LOW) {
      pumpOff();
      vccOff();
      timeForFeed = 0;
      timeOne = millis();
      timeTwo = timeOne;
    }
  }
}
 
Odpowiedź
  


Wiadomości w tym wątku
Pytanie o pętlę while, kolejność wykonywania kodu - przez kataklysm - 06-04-2020, 02:37

Skocz do:


Przeglądający: 1 gości