DS1307 a dýchání led pásku

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: DS1307 a dýchání led pásku

Příspěvek od jankop » 11 úno 2019, 23:42

Tedy pár ladících-testovacích řádků jsem tam zapomněl navíc, spíš takhle:

Kód: Vybrat vše

#include <interval.h>
#include <RTClib.h>
#include <Wire.h>
#define DELAY 50 // nastaveni rychlosti dychani
#define DELAY_MEZI 800 // prodleva mezi nadechem a vydechem
#define DELAY_PRINT 1000
#define MIN_PWM 1 // minimalni jas LED, nejmene 0
#define MAX_PWM 40 // maximalni jas LED, nejvyse 255
#define VYPNI_PWM 0
#define LED_PIN 11
bool NadechTrue = false;// priznak nadech nebo vydech
bool Dychej = false;
bool Zrovna_Dycham = false;
int PWM_VALUE = MIN_PWM;
Interval DelayInterval;
Interval DelayPrint;
RTC_DS1307 rtc;
DateTime now;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  if (!rtc.isrunning())Serial.println("RTC is NOT running!");
}
void loop() {
  if (DelayPrint.expired()) {
    now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print("/");
    Serial.print(now.month(), DEC);
    Serial.print("/");
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(now.hour(), DEC);
    Serial.print(":");
    Serial.print(now.minute(), DEC);
    Serial.print(":");
    Serial.print(now.second(), DEC);
    Serial.print(")");
    Serial.println();
    DelayPrint.set(DELAY_PRINT);
  }
  if (now.hour() == 18 && now.minute() == 0)Dychej = true;
  if (now.hour() == 18 && now.minute() == 5) Dychej = false;
  if (DelayInterval.expired() && (Dychej || Zrovna_Dycham)) {
    Zrovna_Dycham = true;
    if (NadechTrue) {
      DelayInterval.set(DELAY);
      analogWrite(LED_PIN, PWM_VALUE);
      PWM_VALUE++;
      if (PWM_VALUE > MAX_PWM) {
        DelayInterval.set(DELAY_MEZI);
        PWM_VALUE = MAX_PWM;
        NadechTrue = false;
      }
    } else {
      DelayInterval.set(DELAY);
      analogWrite(LED_PIN, PWM_VALUE);
      PWM_VALUE--;
      if (PWM_VALUE < MIN_PWM) {
        DelayInterval.set(DELAY_MEZI);
        PWM_VALUE = MIN_PWM;
        NadechTrue = true;
        Zrovna_Dycham = false;
        if (!Dychej)analogWrite(LED_PIN, VYPNI_PWM);
      }
    }
  }
}

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: DS1307 a dýchání led pásku

Příspěvek od gilhad » 12 úno 2019, 08:30

Grischnackh píše:
11 úno 2019, 17:46
Program je to hezký,takle nějak jsem si představoval že mne nakopnete,díky.Jen mám dotaz proč když chci nahrát výše uvedený program tak mi napíše že "now" was not declared. a když dám pouze "hour" a "minute",tak mi to napíše pro změnu že hour was not declared??
Já mám dotaz, kde deklaruješ now mimo blok

Kód: Vybrat vše

if (DelayPrint.expired()) {...};
- pokud takové místo nenajdeš před jeho použitím řádku

Kód: Vybrat vše

  if (now.hour() == 18 && now.minute() == 0)Dychej = true;
tak se nediv, když ho nenajde ani překladač.

Grischnackh
Příspěvky: 10
Registrován: 17 led 2019, 16:45
Reputation: 0

Re: DS1307 a dýchání led pásku

Příspěvek od Grischnackh » 12 úno 2019, 18:11

Díky všem,už jsem si uvědomil že tam "now" nebylo deklarováno.ladícířádky jsem si vyignoroval lomítkami.jen mi bylo divné že samotný program když jsem nahrál o pár příspěvků výše tak po mne nechtěl deklarovat "now".Jinak jen dotaz:Proč když program který spouští dýchání v 18:00 a já jej nahraji třeba v 17:50 a vypnout se má v 18:05 tak do 18:00 led pásek svítí plným svitem?Prominte,možná můj dotaz je pitomý ale snažím se to pochopit..díky.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: DS1307 a dýchání led pásku

Příspěvek od jankop » 12 úno 2019, 21:06

Odpovím ti otázkou. Co ve svém programu děláš proto, aby po jeho startu byla na pinu 11 garantovaně logická úroveň LOW, tedy LED vypnuty? Problém bude nejspíš právě v tomhle, přestože netuším, jak máš spínač LED zapojen.

posjirka
Příspěvky: 14
Registrován: 05 srp 2017, 22:12
Reputation: 0

Re: DS1307 a dýchání led pásku

Příspěvek od posjirka » 06 bře 2019, 22:55

asi bych na to šel trochu jinak:

Kód: Vybrat vše

  if (now.hour() == 18) {
      if (now.minute() => 0) Dychej = true;
      if (now.minute() >= 5) Dychej = false;
   } else {
      Dychej = false;
   }
  
jen takový drobný návrh ... většinou používám to, že přepočítám časy na minuty ((hodina x 60) + minuta) a ptám se na přechod intervalů ve smyslu
když je aktuální čas větší než xxxxx tak nastav proměnou na 1
když je aktuální čas větší než yyyyy tak nastav proměnou na 0
když je aktuální čas větší než zzzzz tak nastav proměnou na 1
....
když je proměnná 1 tak rozsvit LED, jinak zhasni LED.
-------------------------------------------------------------------
a ano neustále překlápím stavy proměnné, ale předejdu tím hazardním stavům jako kdy se resetovalo Arduino a co mám pak dělat.
Chce to řešit trochu dynamicky.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: DS1307 a dýchání led pásku

Příspěvek od pavel1tu » 07 bře 2019, 06:11

Kód: Vybrat vše

      if (now.minute() => 0) Dychej = true;
      if (now.minute() >= 5) Dychej = false;
to nebude fungovat, ne myšlenkou, ale jak je to napsané ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

posjirka
Příspěvky: 14
Registrován: 05 srp 2017, 22:12
Reputation: 0

Re: DS1307 a dýchání led pásku

Příspěvek od posjirka » 08 bře 2019, 22:10

máš pravdu ... oprava sorry

Kód: Vybrat vše

if (now.minute() >= 0) Dychej = true;
if (now.minute() >= 5) Dychej = false;

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů