-
Grischnackh
- Příspěvky: 10
- Registrován: 17 led 2019, 16:45
- Reputation: 0
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: 1034
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
-
Kontaktovat uživatele:
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
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...
-
pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
-
Kontaktovat uživatele:
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"
-
jankop
- Příspěvky: 1034
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
-
Kontaktovat uživatele:
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
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: 1034
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
-
Kontaktovat uživatele:
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
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: 1034
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
-
Kontaktovat uživatele:
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);
}
}
}
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti