Stránka 2 z 2

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

Napsal: 11 úno 2019, 23:42
od jankop
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);
      }
    }
  }
}

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

Napsal: 12 úno 2019, 08:30
od gilhad
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č.

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

Napsal: 12 úno 2019, 18:11
od Grischnackh
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.

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

Napsal: 12 úno 2019, 21:06
od jankop
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.

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

Napsal: 06 bře 2019, 22:55
od posjirka
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.

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

Napsal: 07 bře 2019, 06:11
od pavel1tu

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

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

Napsal: 08 bře 2019, 22:10
od posjirka
máš pravdu ... oprava sorry

Kód: Vybrat vše

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