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

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

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

Příspěvek od Grischnackh » 06 úno 2019, 17:35

Zdravím,jsem zde nový a zároveň začátečník.Tudíž potřebuji pomoci s kódem.Mám Arduino nano,k němu připojen přes tranzistor (na pinu 11) led pásek jako PWM,dále modul reálného času DS1307.Led pásek rozdýchám,ale když chci aby mi led pásek začal dýchat v určitou dobu a v další dobu vypnul je problém a sice v tom že buď pásek nedýchá plynule,nebo čas na serial monitoru je o hodinu a čtvrt nazpět,nebo když odpojím arduino od počítače a připojím na zdroj tak pásek svítí (dýchá) furt.zkoušel jsem upravovat ze zdejšího i zahraničního fora všechny možné kódy a pořád bez úspěchu.Pro dýchání ledek mám tento kód :

Kód: Vybrat vše

 int ledPin = 11;    
 
/* nastavení desky Arduino */
void setup() {
  /* nic nenastavujeme, ale tato část zde musí být */
}
 
/* HLAVNÍ SMYČKA PROGRAMU */
void loop() {
 
  /* 
  PÁSEK ÚPLNĚ NEZHASÍNÁME, JE LEPŠÍ, 
  KDYŽ ZŮSTANE TROŠKU SVÍTIT, EFEKT VYPADÁ LÉPE 
  */
  
  /* NADECHNUTÍ - OD 2 DO 255 */
  for (int Hodnota =1 ; Hodnota <= 40; Hodnota += 1) {
    analogWrite(11, Hodnota);
    /* DROBNÁ PAUZA PRO LEPŠÍ EFEKT */
    delay(50);
  }
 
/* DROBNÁ PAUZA MEZI NÁDECHEM A VÝDECHEM */
delay(800);
 
  /* VYDECHNUTÍ - OD 255 DO 2 */
  for (int Hodnota = 40 ; Hodnota >= 1; Hodnota -= 1) {    
    analogWrite(11, Hodnota);
    /* DROBNÁ PAUZA PRO LEPŠÍ EFEKT */
    delay(50);
  }
  
/* DROBNÁ PAUZA MEZI NÁDECHEM A VÝDECHEM */
delay(800);
 
}

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 » 06 úno 2019, 18:16

Promiň, ale vůbec nechápu, o co ti jde. Program, který prezentuješ, opravdu "dýchá", to jsem zkontroloval. A je pochopitelné, že dýchá, i když Arduino odpojíš od počítače a připojíš pouze ke zdroji. Program je v Arduinu a to prostě "dejchá" dál.
Tvoje problémy s časovačem posoudit nemohu. Netuším, co s ním děláš, jak vypadá jeho obsluha nebo jak ho máš zapojen.
Takže: "Ano, dejchá a doufejme že hned tak nedodejchá."
BTW:
Pokud ti jde o plynulost dýchání, je pochopitelné, že takto špatně napsaný program obohacený o další procedury nemůže blikat slušně plynule. Opravdu na webu není lepší dýchání? To ti ho snad budu muset napsat.

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 » 06 úno 2019, 18:40

promin blbě jsem se vyjádřil...jde mi o to že potřebuji pomoct sestavit kód aby to dýchalo pouze v určitý čas...

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 » 06 úno 2019, 18:46

V kodu úplně chybí ty hodiny reálného času ...

Asi by bylo lepší bodově sepsat co ti chodí, co chodí a potřebuješ vylepšit a co potřebuješ komplet dodělat.

"Dýchání" pásku - slyším poprvé :-)

PS: Na RTC modul je spousta příkladů přímo součástí knihovny ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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 » 06 úno 2019, 18:52

ano vím že tam ty knihovny chybí,záměrně jsem dal kód pro dýchání,neboť potřebuji sestavit kód pro hodiny...kódy jsem bral i odsud https://arduino.cz/forum/tema/osvetleni ... ky/page/4/ ale o po upravě to neběželo.

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 » 06 úno 2019, 20:05

Můžeš aspoň naznačit, o co ti jde? Bude to budík z displejem, na kterém ten čas zapnutí a vypnutí nastavíš, nebo jak si to představuješ? Opravdu je tak těžké sem dát aspoň nefunkční program a říct přesně co nefunguje a co by měl vlastně dělat? Ty máš nepochybně jasnou představu, ale nevím proč, ji tajíš.
Tady přikládám upravený program dýchání. Podstatné je to, že neobsahuje funkci delay(), která blokuje činnost procesoru a je tudíž žádoucí ji používat co nejméně a lépe vůbec ne. Potřebnou knihovnu interval najdeš tady:http://www.xpablo.cz/wp-content/uploads ... terval.zip

Kód: Vybrat vše

#include <interval.h>
#define DELAY      50  // nastaveni rychlosti dychani
#define MIN_PWM    1   // minimalni jas LED, nejmene 0
#define MAX_PWM    40  // maximalni jas LED, nejvyse 255
#define DELAY_MEZI 800 // prodleva mezi nadechem a vydechem
#define LEDPIN     11
bool NadechTrue = true;// priznak nadech nebo vydech
int PWM_VALUE = MIN_PWM;
Interval DelayInterval;

void setup() {
  //DelayInterval.set(DELAY);
}
void loop() {
  if (DelayInterval.expired()) {
    if (NadechTrue) {
      analogWrite(LEDPIN, PWM_VALUE);
      DelayInterval.set(DELAY);
      PWM_VALUE++;
      if (PWM_VALUE > MAX_PWM) {
        NadechTrue = false;
        PWM_VALUE--;
        DelayInterval.set(DELAY_MEZI);
      }
    } else {
      analogWrite(LEDPIN, PWM_VALUE);
      DelayInterval.set(DELAY);
      PWM_VALUE--;
      if (PWM_VALUE < MIN_PWM) {
        NadechTrue = true;
        PWM_VALUE++;
        DelayInterval.set(DELAY_MEZI);
      }
    }
  }
}


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 » 09 úno 2019, 17:58

Děkuji za nakopnutí...Program dýchání bez Delay se mi moc líbí a funguje hezky.zkoušel jsem jej zakomponovat do programu a po nahrání než dojde čas tak pásek svítí furt,přičemž serial print běží jak zběsilý,když dojde čas zapnutí tak pomaličku dýchá (což je až okem nepatrné) a pak vypne.zde je program:

Kód: Vybrat vše

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

void setup() {
  // put your setup code here, to run once:
 
Serial.begin(9600);
Wire.begin();
   rtc.begin();
   if (! rtc.isrunning())
  {
    Serial.println("RTC is NOT running!");
}
}

void loop() {
  // put your main code here, to run repeatedly:
  DateTime 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();

  Serial.println( );
  DelayInterval.set(DELAY_PRIN);


 if (now.hour() == 18 && now.minute() == 0) {
     
      if (DelayInterval.expired()) {
    if (NadechTrue) {
      analogWrite(LEDPIN, PWM_VALUE);
      DelayInterval.set(DELAY);
      PWM_VALUE++;
      if (PWM_VALUE > MAX_PWM) {
        NadechTrue = false;
        PWM_VALUE--;
        DelayInterval.set(DELAY_MEZI);
      }
    } else {
      analogWrite(LEDPIN, PWM_VALUE);
      DelayInterval.set(DELAY);
      PWM_VALUE--;
      if (PWM_VALUE < MIN_PWM) {
        NadechTrue = true;
        PWM_VALUE++;
        DelayInterval.set(DELAY_MEZI);
      }
    }
  }
}

 if (now.hour() == 18 && now.minute() == 5) {
     
      analogWrite (LEDPIN, LOW);
}
}


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 » 09 úno 2019, 19:20

Zkusil bych třeba následující:

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 = true nebo vydech = false
bool Dychej = false; //  zacni dychat Dychej = true
bool Zrovna_Dycham = false; // Zrovna_Dycham = true, nech me dodychat do zhasnuti
int PWM_VALUE = MIN_PWM;
Interval DelayInterval;
Interval DelayPrint;
RTC_DS1307 rtc;

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  if (! rtc.isrunning())
  {
    Serial.println("RTC is NOT running!");
  }
}
void loop() {
  // put your main code here, to run repeatedly:
  if (DelayPrint.expired()) {
    DateTime 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);
      }
    }
  }
}


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 » 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??

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, 22:07

To bys měl vědět ty, tuhle část programu jsi tam přidal ty, ne já.
Maximálně můžeš zkusit tohle:

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 Dychej = true;
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(2019, DEC);
    Serial.print("/");
    Serial.print(now.month(), DEC);
    Serial.print(02, DEC);
    Serial.print("/");
    Serial.print(now.day(), DEC);
    Serial.print(11, DEC);
    Serial.print(" (");
    Serial.print(now.hour(), DEC);
    Serial.print(10, DEC);
    Serial.print(":");
    Serial.print(now.minute(), DEC);
    Serial.print(58, DEC);
    Serial.print(":");
    Serial.print(now.second(), DEC);
    Serial.print(21, 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);
      }
    }
  }
}

Odpovědět

Kdo je online

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