Skocz do zawartości

Problem z odmierzaniem czasu, timer, kod, arduino nano


Pomocna odpowiedź

Napisano

Chcę zrobić timer w którym wpisuje tylko i wyłącznie minuty (wykonane) a później ten czas jest odliczany. Problem tkwi w tym, że nie umiem logicznie zamienić minuty na 60 sekund a resztę minut dekrementować. Wiadomo najprościej to seconds =  minutes * 60; ale nie o to mi chodzi. Tutaj kawałek kodu w którym chcę żeby to działało:

int interval = 1;

...
  
case 2:

      /* Serial.println("min1");
      Serial.println(minutes);
      Serial.println("sec1");
      Serial.println(seconds);*/

      lcd.setCursor(0, 0);
      lcd.print("TIME:");
      lcd.setCursor(0, 1);
      lcd.print(minutes);
      lcd.setCursor(5, 1);
      lcd.print(seconds);

      currentsecs = currentMillis / 1000;
      if ((unsigned long)(currentsecs - previoussecs) >= interval) {
        seconds = seconds - 1;
        lcd.clear();
        previoussecs = currentsecs;

        Serial.println("min2");
        Serial.println(minutes);
        Serial.println("sec2");
        Serial.println(seconds);

        if (seconds = 0) {
          minutes = minutes - 1;
          seconds = 60;
        }
      }
      if (seconds && minutes <= 0) {
        digitalWrite(relay, LOW);
      } else {
        digitalWrite(relay, HIGH);
      }
      break;

 

22 minuty temu, dzemdobrek napisał:
  if (seconds = 0) {
          minutes = minutes - 1;
          seconds = 60;
        }

Popatrz na spokojnie na ten if 😉 jak się pisze warunki?

  • Lubię! 1

Wszystko gra i buczy jak zespół z bambuczy, ale jest jedno ale. Efekt w sumie dla mnie zadawalający, na końcu timer cały czas się resetuje ale mi to nie przeszkadza bo od razu przeskoczy do innego case'a 🙂 Kasujcie albo zostawcie dla potomnych.

case 2:



      /* Serial.println("min1");
      Serial.println(minutes);
      Serial.println("sec1");
      Serial.println(seconds);*/



      lcd.setCursor(0, 0);
      lcd.print("TIME:");
      lcd.setCursor(0, 1);
      lcd.print(minutes);
      lcd.setCursor(5, 1);
      lcd.print(seconds);


      currentsecs = currentMillis / 1000;
      if ((unsigned long)(currentsecs - previoussecs) >= interval) {
        if (seconds <= 0) {
          minutes = minutes - 1;
          seconds = 5;
        }
        seconds = seconds - 1;
        lcd.clear();
        previoussecs = currentsecs;

        Serial.println("min2");
        Serial.println(minutes);
        Serial.println("sec2");
        Serial.println(seconds);
      }

      if (minutes <= 0 && seconds <= 0) {
        //if (seconds <= 0) {
          digitalWrite(relay, LOW);
          minutes = 0;
          seconds = 0;
       // }
      } else {
        digitalWrite(relay, HIGH);
      }
      break;
  }
}

 

7 minut temu, dzemdobrek napisał:
if (minutes <= 0 && seconds <= 0) {
        //if (seconds <= 0) {
          digitalWrite(relay, LOW);
          minutes = 0;
          seconds = 0;
       // }

To też masło maślane, skoro program wejdzie do tego ifa, kiedy minuty i sekundy == 0, po co je drugi raz zerować? 

(edytowany)
currentsecs = currentMillis / 1000;
      if ((unsigned long)(currentsecs - previoussecs) >= interval) {
        if (seconds <= 0) {
          minutes = minutes - 1;
          seconds = 5;
        }
        seconds = seconds - 1;
        lcd.clear();
        previoussecs = currentsecs;
      }

      if (minutes <= 0 && seconds <= 0) {
        digitalWrite(relay, LOW);
        lcd.clear();
        var = 3;
      } else {
        digitalWrite(relay, HIGH);
      }
      break;

    case 3:

Poprawione i działa 🙂 dla jasności sekundy ustawione na 5 sekund tylko dla testów 

Edytowano przez dzemdobrek
      currentsecs = currentMillis / 1000;
      if ((unsigned long)(currentsecs - previoussecs) >= interval) {
        if (seconds <= 0) {
          minutes = minutes - 1;
          seconds = 15;
        }
        DO_STH_FOR100MS();
        seconds = seconds - 1;
        lcd.clear();
        previoussecs = currentsecs;
      }

Odgrzewam temat bo teraz już trochę się poddaję. Nie wiem jak zrobić by wysterować wyjście na 100 ms zakażdym razem po przekroczeniu 1000ms. Czy koledzy naprowadzili by na jakiś trop 😉

Można np. użyć delay(100).

A tak poza tym po co Ci w programie minuty poza wyświetlaniem? Dajesz sekundy jako uint32_t i wszystko liczysz w sekundach.

Jeszcze taki trick:

currentsecs = currentMillis / 1000; // taką linijkę masz
// i zaraz za tym      
digitalWrite(OUTPUT_PIN, currentMillis % 1000 < 100);

 

  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...