millis nie działa - mateusz - 05-05-2019
w tym przykładzie funkcja millis nie działa, jak to naprawić?
Kod: unsigned long aktualnyCzas = 0;
unsigned long pompa7dl = 0;
unsigned long pompa7kr = 0;
unsigned long pompa8dl = 0;
unsigned long pompa8kr = 0;
void setup() {
Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(53, OUTPUT);
pinMode(51, OUTPUT);
pinMode(22, OUTPUT);
digitalWrite(22, LOW);
digitalWrite(53, LOW); //grzałka p 0
digitalWrite(51, LOW); //grzałka l 1
digitalWrite(8, LOW); // pompa p
digitalWrite(7, LOW); // pompa l
pinMode(3, INPUT_PULLUP); // kawa p
pinMode(6, INPUT_PULLUP); // kawa l
pinMode(5, INPUT_PULLUP); // kawy p
pinMode(4, INPUT_PULLUP); // kawy l
pinMode(2, INPUT_PULLUP); // spieniacz l
pinMode(9, INPUT_PULLUP); // +p
pinMode(10, INPUT_PULLUP); // + l
pinMode(11, INPUT_PULLUP); // spieniacz p
pinMode(12, INPUT_PULLUP); //dźwignia p
pinMode(13, INPUT_PULLUP); //dźwignia l
}
void loop() {
aktualnyCzas = millis();
if (aktualnyCzas - pompa7kr >= 28000UL) {
digitalWrite(7, LOW);
}
if (aktualnyCzas - pompa8kr >= 28000UL) {
digitalWrite(8, LOW);
}
if (aktualnyCzas - pompa7dl >= 56000UL) {
digitalWrite(7, LOW);
}
if (aktualnyCzas - pompa8dl >= 56000UL) {
digitalWrite(8, LOW);
}
//==================================================================================
if (digitalRead(12) == LOW and digitalRead(13) == LOW){
if (digitalRead(10) == LOW) {
digitalWrite(7, HIGH); //manual
} else {
digitalWrite(7, LOW);
}
if (digitalRead(9) == LOW) {
digitalWrite(8, HIGH); //manual prawa
} else {
digitalWrite(8, LOW);
}
if (digitalRead(3) == LOW and digitalRead(6) == LOW) {
pompa8kr = aktualnyCzas;
pompa7kr = aktualnyCzas;
digitalWrite(8, HIGH);
digitalWrite(7, HIGH); // 2X jedna kawa prawa strona
}
if (digitalRead(5) == LOW and digitalRead(4) == LOW) {
pompa8dl = aktualnyCzas;
pompa7dl = aktualnyCzas;
digitalWrite(7, HIGH);
digitalWrite(8, HIGH); // 2X dwie kawY prawa strona
}
if (digitalRead(3) == LOW and digitalRead(4) == LOW) {
pompa8kr = aktualnyCzas;
pompa7dl = aktualnyCzas;
digitalWrite(7, HIGH);
digitalWrite(8, HIGH); // 2X dwie kawY prawa strona
}
if (digitalRead(5) == LOW and digitalRead(6) == LOW) {
pompa8dl = aktualnyCzas;
pompa7kr = aktualnyCzas;
digitalWrite(7, HIGH);
digitalWrite(8, HIGH); // 2X dwie kawY prawa strona
}
}
//====================================================================
if (digitalRead(12) == LOW and digitalRead(13) == HIGH) {
if (digitalRead(3) == LOW) {
pompa8kr = aktualnyCzas;
digitalWrite(8, HIGH); // jedna kawa prawa strona
}
if (digitalRead(5) == LOW) {
pompa8dl = aktualnyCzas;
digitalWrite(8, HIGH); // dwie kawy prawa strona
}
if (digitalRead(9) == LOW) {
digitalWrite(8, HIGH); //manual prawa
} else {
digitalWrite(8, LOW);
}
}
//=======================================================================
if (digitalRead(13) == LOW and digitalRead(12) == HIGH) {
if (digitalRead(6) == LOW) {
pompa7kr = aktualnyCzas;
digitalWrite(7, HIGH); // jedna kawa lewa strona
}
if (digitalRead(4) == LOW) {
pompa7dl = aktualnyCzas;
digitalWrite(7, HIGH); // dwie kawy lewa strona
}
if (digitalRead(10) == LOW) {
digitalWrite(7, HIGH); //manual
} else {
digitalWrite(7, LOW);
}
}
//====================================================================
if (digitalRead(2) == LOW) {
if (digitalRead(10) == LOW) {
digitalWrite(7, HIGH); //manual
} else {
digitalWrite(7, LOW);
}
if (digitalRead(10) == HIGH) {
digitalWrite(7, HIGH);
delay(25);
digitalWrite(7, LOW);
delay(700);
}
}
//=======================================================================
if (digitalRead(11) == LOW) {
if (digitalRead(9) == LOW) {
digitalWrite(8, HIGH); //manual prawa
} else {
digitalWrite(8, LOW);
}
if (digitalRead (9) == HIGH) {
digitalWrite(8, HIGH);
delay(25);
digitalWrite(8, LOW);
delay(700);
}
}
//=======================================================================
}
RE: millis nie działa - kaczakat - 05-05-2019
Wgrałem to do NANO i oczywiście działa, tylko uciąłem program po ostatnim porównaniu z millis. Zapewne sobie zerujesz w dalszej części programu zmienne, skoro warunek się nie spełnia.
if (aktualnyCzas - pompa7kr >= 28000UL) lepiej zapisać if ((uint32_t)(aktualnyCzas - pompa7kr) >= 28000UL) , tak by program nie miał wątpliwości jak traktować wynik tego odejmowania, a przy okazji zapobiega to problemom po przepełnieniu licznika, tu uint32_t to to samo co Twoje ulong.
RE: millis nie działa - mateusz - 06-05-2019
(05-05-2019, 22:44)kaczakat napisał(a): Wgrałem to do NANO i oczywiście działa, tylko uciąłem program po ostatnim porównaniu z millis. Zapewne sobie zerujesz w dalszej części programu zmienne, skoro warunek się nie spełnia.
if (aktualnyCzas - pompa7kr >= 28000UL) lepiej zapisać if ((uint32_t)(aktualnyCzas - pompa7kr) >= 28000UL) , tak by program nie miał wątpliwości jak traktować wynik tego odejmowania, a przy okazji zapobiega to problemom po przepełnieniu licznika, tu uint32_t to to samo co Twoje ulong.
Mimo wszystko led dalej gaśnie zaraz po puszczeniu przycisku a nie po 28 sekundach, może coś jeszcze mam źle
RE: millis nie działa - kaczakat - 06-05-2019
No ale millis działa, a przecież to opisałeś jako problem. Przestałby działać bo wyłączyłeś przerwania, czy akurat uC tego nie obsługuje. Napisałeś program, który chciałbyś by jakoś tam działał to opisz jak chcesz by działał, opisz jak zamiast tego działa.
RE: millis nie działa - mateusz - 06-05-2019
już rozwiązałem ten problem, miałem; else {
digitalWrite(7, LOW);
które wyłączało zaraz po włączeniu
RE: millis nie działa - es2 - 10-05-2019
(05-05-2019, 20:30)mateusz napisał(a): w tym przykładzie funkcja millis nie działa, jak to naprawić? To ciekawe, że początkujący, swoją niewiedzę upatrują w błędach kompilatora, komputera, mikrokontrolera. Wszystko działa źle tylko nie "programista". Fakt, że błędy w sprzęcie czy sofcie czasem si ę pojawiają ale początkujący raczej na takie niuanse nie napotykają się i 99,99% "problemów" to niewiedza!
|