06-04-2020, 02:37
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.
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;
}
}
}