• 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
millis nie działa
#1
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);
 }
   

}
//=======================================================================
}
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
(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
 
Odpowiedź
#4
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.
 
Odpowiedź
#5
już rozwiązałem ten problem, miałem; else {
digitalWrite(7, LOW);
które wyłączało zaraz po włączeniu
 
Odpowiedź
#6
(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!
- Kod z Delay i/lub bez WDT (WDG) to nie kod, to DEMO!
- Wielowątkowość to najczęściej konieczność w dobrym programie.
- Kod wymaga komentarzy!
- Nie pomagam leniwym analfabetom. Sprawdzanie pisowni jest w każdej dobrej przeglądarce WWW.


 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości