Skocz do zawartości

Czas odmierzany w minutach na arduino


Pomocna odpowiedź

Napisano

witam , chciałam zrobić projekt, w kórym po wciśnieciu przycisku sprawdzajacego zacznie sprawdzać czy wentylator jest włączony (domyslnie go ustawiałam na właczonego) i jeśli jest to po 15 minutach od naciśniecia przycisku wentylator ma sie sam wyłączyć, tyle tylko jak dać te 15 minut bo chyba nie będe je zamieniała na milisekundy?, używam funkcji millis() , próbowałam jeszcze wykorzystać do tego SECS(), ale wyskakuje mi błąd

tutaj jest mój kod

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;
#define wentylator 3
#define przycisk 4
 
void setup(){
   Serial.begin(9600);
  pinMode(przycisk,INPUT_PULLUP);
  pinMode(wentylator,OUTPUT);
  digitalWrite(wentylator,HIGH);
  
}
 
void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
  roznicaCzasu = aktualnyCzas - zapamietanyCzas;
  if(digitalRead(przycisk)==LOW)
  {
    if(digitalRead(wentylator)==HIGH)
    {
      if (roznicaCzasu >= SECS(5)) {
    //Zapamietaj aktualny czas
    zapamietanyCzas=millis();
    Serial.println(zapamietanyCzas);
     digitalWrite(wentylator,LOW);
    }
  }
  //Jeśli różnica wynosi ponad sekundę
  
}
}

 a i jeszcze jesli ktos miałby sugestie jak wykonac to zadanie z wentylatorem w inny sposób to chętnie wysłucham pomysłów

 

(edytowany)
3 godziny temu, faustin napisał:

tyle tylko jak dać te 15 minut bo chyba nie będe je zamieniała na milisekundy?




    

 

@faustin no jeśli millis() jest w ms to musisz sobie przeliczać z ms i innej rady nie ma😉 możesz sobie zrobić jakąś stałą żeby samemu nie liczyć np. 

#define TIME 15
  
  if (wyłącz za 15 min) {
  last_time = millis();
  stan = 1;
  }
  
  if (millis() - last_time > (TIME * 60000UL) && stan == 1) {
    // wyłącz wentylator 
    stan = 0;  
    }

 

Edytowano przez farmaceuta

a czy ktos może powiedziec co powinnam tutaj zmienić aby ten wentylator gasł dopiero po jakims okreslonym czasie od momentu właczenia przycisku a nie wtedy kiedy nacisne przycisk to wyłącza się od razu, chyba ze nacisne przycisk zaraz od samego startu programu ale to mija sie z celem bo ten przycisk ogólnie jest tu do tego aby sprawdzać czy wentylator jest włączony czy nie jest jesli jest to ma go wyłączyć po 15 minutach ale nie od razu

Czy do realizacji tego zadania ta funkcja millis mi wystarczy ? czy to starta czasu aby myśleć nad zastosowaniem funkcji millis a np. zrobić to przy pomocy biblioteki Timers.h?

#define przycisk 4
#define wentylator 3

 
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
 
void setup(){
  Serial.begin(9600);
  pinMode(wentylator, INPUT_PULLUP);
  pinMode(przycisk, INPUT_PULLUP);
 
 // pinMode(wentylator,HIGH);
}
 
void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
  pinMode(wentylator,HIGH);
 

  if (digitalRead(przycisk) == LOW) {
    //Jeśli przycisk wcisniety i wykryto włączony wentylator 
    zapamietanyCzas = aktualnyCzas; //Zapamietaj czas
  
    if(digitalRead(wentylator)==HIGH)
    {
      Serial.println("wentylator jest wlaczony");
    }else
    {
      Serial.println("wentylator wyłączony");
    }
    
   digitalWrite(wentylator, HIGH); //pozostaw wentylator nadal wlaczony przez 180s
   
  
  //Jeśli chodził przez określony czas, to wylacz go
  if (aktualnyCzas - zapamietanyCzas >= 5000UL) {
    digitalWrite(wentylator, LOW);
  }
}
}

 

(edytowany)
9 minut temu, faustin napisał:

a czy ktos może powiedziec co powinnam tutaj zmienić aby ten wentylator gasł dopiero po jakims okreslonym czasie od momentu właczenia przycisku a nie wtedy kiedy nacisne przycisk to wyłącza się od razu, chyba ze nacisne przycisk zaraz od samego startu programu ale to mija sie z celem bo ten przycisk ogólnie jest tu do tego aby sprawdzać czy wentylator jest włączony czy nie jest jesli jest to ma go wyłączyć po 15 minutach ale nie od razu




 

 

No przecież podałem Ci przykład wyżej...dopisz sobie tylko warunek odnośnie wciśnięcia guzika i gotowe... A co do używania millis() to moim zdaniem koniecznie powinnaś umieć się nim posługiwać...im więcej problemów bedziesz rozwiązywać bibliotekami tym więcej (paradoksalnie) tych problemów będziesz mieć 😉 

Edytowano przez farmaceuta
30 minut temu, faustin napisał:

Właśnie. Nie rozumiem tego przykładu który napisałeś gdzie mam zadeklarować wcześniej te stany ? 

No chyba nie pytasz o zmienne?😉 No jak gdzie?? To są zmienne statyczne ten stan i last...daj to globalnie a w tym pierwszym if'e sprawdzasz czy guzik został wciśnięty a w drugim od millis() masz tylko dopisać wyłączanie wemtylatora jak w komentarzu i działa.. 

#include <Timers.h>

#define przycisk 4
#define wentylator 3
//#define PIR 5
 
unsigned long czas;

#define LED 9

void setup() {
  // put your setup code here, to run once:
  pinMode(wentylator, OUTPUT);
  pinMode(przycisk,INPUT_PULLUP);
  digitalWrite(wentylator, HIGH);
  czas = millis();
}

#define ST_OFF  1
#define ST_ON   2

byte state = ST_OFF;

void loop() {
 if(digitalRead(przycisk)==LOW)
 {
  // put your main code here, to run repeatedly:
  switch (state) {
    case ST_OFF:
    Serial.println("wentylator zgaszony");
      digitalWrite(wentylator, LOW);
      
      }
      break;
    case ST_ON:
      digitalWrite(wentylator, HIGH);
      if (millis() - czas > 1000) {
        state = ST_OFF;
        czas = millis();
      }
      break;
 }
  
}

 

(edytowany)

próbowałam to zrobic także przy użyciu biblioteki timers, ale nadal bład jest ten sam, że po okreslonym czsie po naciśnieciu przycisku wentylator wyłącza się automatycznie i nie czeka na czas który zadałam no chyba ze nacisne przycisk na samym poczatku

Edytowano przez faustin
#include <Timers.h>

#define przycisk 4
#define wentylator 3
//#define PIR 5
 
Timer ledBlinkTimer;

void setup() {
  pinMode(wentylator, OUTPUT);
  pinMode(przycisk,INPUT_PULLUP);
  
  digitalWrite(wentylator,HIGH);
  digitalWrite(przycisk,HIGH);
}

void loop() {
  if(digitalRead(przycisk)==LOW)
  { 
    ledBlinkTimer.begin(SECS(7));
  if (ledBlinkTimer.available())
  {
    
    digitalWrite(wentylator,LOW);
  
  }
  }
}

 

3 minuty temu, faustin napisał:

czy o coś takiego chodziło ? bo znów mi nie działa to wgl 

No nic dziwnego... tu nie powinnaś przypadkiem informować kodu o tym że guzik wciśnięty i pasuje zacząć czas odliczać?? 

if(digitalRead(przycisk)==LOW)
 {

Druga sprawa wywal tego switch z if'a bo to nigdy działać nie będzie... jeżeli wciśniesz guzik to masz zmienić case, a tak jak teraz to byś odpaliła wiatrak i już nigdy by sie nie wyłączył bo if millisa jest w switch który jest w if guzika a skoro guzik już nie wciśnięty to......to tak jak by ten switch nie istniał

a mógłbys w wolnej chwili pokazac jak to zrobić bo nie wiem dokładnie już gdzie mam to dać i czego w koncu uzyć czy milis() czy bibliotek jakis typu Timers?

 A tak to bym sobie wtedy przeanalizowała to i nauczyła się na Twoim przykładzie

(edytowany)
6 minut temu, faustin napisał:

próbowałam to zrobic także przy użyciu biblioteki timers

Ale daj już spokój z bibliotekami do takich prostych rzeczy...nie kombinuj z switch tylko zrób najprościej jak się da żeby zrozumieć millis() a później będziesz ubierać kod w "kwiatki"...a no...i skoro w warunku i ifach dałem pewne zmienne i linijki kodu to znaczy że one tam były potrzebne😉

Edytowano przez farmaceuta

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...