Skocz do zawartości

Czas odmierzany w minutach na arduino


faustin

Pomocna odpowiedź

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

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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);
  }
}
}

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

#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;
 }
  
}

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

#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);
  
  }
  }
}

 

Link do komentarza
Share on other sites

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ł

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.