Arduino Polska Forum

Pełna wersja: millis nie działa
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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);
 }
   

}
//=======================================================================
}
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.
(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
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.
już rozwiązałem ten problem, miałem; else {
digitalWrite(7, LOW);
które wyłączało zaraz po włączeniu
(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!