Close

Osvětlení akvaria Led pásky

Úvodní stránka Fórum Vaše projekty Arduino Osvětlení akvaria Led pásky

  • Toto téma obsahuje celkem 62 odpovědí. Do diskuze (9 diskutujících) se naposledy zapojil uživatel Nasranek a poslední změna proběhla před 8 roky a 2 měsíci.
Aktuálně je na stránce zobrazeno 30 příspěvků - 31. až 60. (celkem z 63)
  • Autor
    Příspěvky
  • #7201
    letakp
    Účastník

    Tak toto je moje verze upravená podle původního návrhu od vnouzirozbijsklo:

    #include „Wire.h“
    #define DS3231_I2C_ADDRESS 0x68
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
    return( (val/10*16) + (val%10) );
    }
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
    return( (val/16*10) + (val%16) );
    }
    int svetlo1 = 9;
    int sviti = 0;
    int den = 0;
    int jas = 0;

    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

    void setup()
    {

    Wire.begin();
    Serial.begin(9600);
    // set the initial time here:
    // DS3231 seconds, minutes, hours, day, date, month, year
    //setDS3231time(30,27,19,7,15,11,15);
    }
    void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
    dayOfMonth, byte month, byte year)
    {
    // sets time and date data to DS3231
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set next input to start at the seconds register
    Wire.write(decToBcd(second)); // set seconds
    Wire.write(decToBcd(minute)); // set minutes
    Wire.write(decToBcd(hour)); // set hours
    Wire.write(decToBcd(dayOfWeek)); // set day of week (1=pondeli, 7=nedele)
    Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
    Wire.write(decToBcd(month)); // set month
    Wire.write(decToBcd(year)); // set year (0 to 99)
    Wire.endTransmission();
    }
    void readDS3231time(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set DS3231 register pointer to 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
    // request seven bytes of data from DS3231 starting from register 00h
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());

    }
    void displayTime()
    {
    ;
    // retrieve data from DS3231
    readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
    &year);
    // send it to the serial monitor
    Serial.print(hour, DEC);
    // convert the byte variable to a decimal number when displayed
    Serial.print(„:“);
    if (minute<10)
    {
    Serial.print(„0“);
    }
    Serial.print(minute, DEC);
    Serial.print(„:“);
    if (second<10)
    {
    Serial.print(„0″);
    }
    Serial.print(second, DEC);
    Serial.print(“ „);
    Serial.print(dayOfMonth, DEC);
    Serial.print(„/“);
    Serial.print(month, DEC);
    Serial.print(„/“);
    Serial.print(year, DEC);
    Serial.print(“ Day of week: „);
    switch(dayOfWeek){
    case 7:
    Serial.println(„nedele“);
    break;
    case 1:
    Serial.println(„pondeli“);
    break;
    case 2:
    Serial.println(„utery“);
    break;
    case 3:
    Serial.println(„streda“);
    break;
    case 4:
    Serial.println(„ctvrtek“);
    break;
    case 5:
    Serial.println(„patek“);
    break;
    case 6:
    Serial.println(„sobota“);
    break;
    }
    }
    void loop()
    {

    pinMode(svetlo1,OUTPUT);
    displayTime(); // display the real-time clock data on the Serial Monitor,
    delay(1000); // every second

    byte s, m, h, dvt, dvm, mesic, r;
    readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);

    if (h >= 9 && h < 21) den = 1; // nastaveni intervalu sviceni
    else den = 0;
    for (byte brightness = 0; den == 1 && sviti == 0 && brightness < 255; brightness ++) {
    analogWrite(svetlo1, brightness);
    if(brightness == 255) sviti = 1;
    delay(3500);
    }

    for (byte brightness = 255; den == 0 && sviti == 1 && brightness > 0; brightness –) {
    analogWrite(svetlo1, brightness);
    if(brightness == 0) sviti = 0;
    delay(3500);}

    }

    #7202
    letakp
    Účastník

    Tak jsem se díval na ty knihovny a zjistil jsem, že tam asi fakt nic není, tak jsem stáhl a nainstaloval knihovnu a potom se před #include „wire.h“ nainstalovalo toto:
    #include <RtcDateTime.h>
    #include <RtcDS3231.h>
    #include <RtcTemperature.h>

    Ale stejně to na monitoru vypisuje to stejné.

    #7210
    posjirka
    Účastník

    a co když zkusíš tenhle exampl.

    Tutoriál – užívání hodin reálného času DS1307 a DS3231 s Arduinem

    Ten funguje? Ten projekt osvětlení akvaria v podstatě jen rozšiřuje tento tutorial.

    Pak mě napadá jen pár věcí proč to nefunguje:
    – špatné zapojení (např prohození SDA a SCK)
    – špatný modul/čip DS3231
    – chybná adresa modulu (na modulu se dá nastavit tak můžeš mít nastavenou jinou než defaultní)

    DS3231 bohužel doma nemám a nedostává se mi času s tím experimentovat ….

    #7217
    letakp
    Účastník

    Ahoj, právě když jsem zkoušel všechny možnosti s RTC, tak mi to nefungovalo nikdy.
    Špatně zapojené SDA a SCK jsem vyloučil otočením a stále nic.
    Tak jsem si prohlédl čip pod lupou a zjistil jsem, že je polovina nožiček ve vzduchu. Dneska to přiletuju a večer doma odzkouším funkčnost. Díky zatím za malou nápovědu v čem by ten problém mohl být.

    #7218
    ArduXPP
    Účastník

    Když budu chtít u modulu použít baterii CR2032 je potřeba přerušit obvod dobíjecí ?

    #7220
    posjirka
    Účastník

    nechápu ???? Myslíš jako výměnu baterie nebo použití baterie jako primárního zdroje pro apliakci?

    #7221
    ArduXPP
    Účastník

    Koupil jsem si DS3231 a ten i baterii nabíjí. Baterie CR2032 je nenabíjecí.

    #7229
    posjirka
    Účastník

    tak ti nevím. V popsiu je Battery input takže bych to bral jako vstup.
    Pak jsem našel v datasheetu toto:
    The device is UL recognized to ensure against reverse charging when used with a primary lithium battery.

    no a na netu jsou i moduly s baterii cr2030:

    vzheldem k tomu, že to má pouze 1 vstup a nikde nabijecí pin nevidím … chtělo by to sehnat schéma toho tvého modulu.

    ještě mě napadlo: to že tam je baterie napevno (tzn. připájena na páskách, neznamená, že je nabijecí….

    #7233
    ArduXPP
    Účastník

    Četl jsem to v této diskuzi

    #7234
    letakp
    Účastník

    To-ArduXPP Ta baterie je jenom záložní, takže se nenabíjí. Má jenom 3,5V a do destičky se pouští 5V.
    To-posjirka Tak čip je odzkoušený a funkční. Teď ještě odladit prográmek pro to akvárko, něco se mi tam nezdá, ještě musím posledovat chování v průběhu dne a při různých poruchových stavech, zatím co jsem zjistil, že pokud je v režimu noc, tak LED TX bliká co 1sec. a když dopočítá 255 kroků do úplného rozednění, tak přestane LED TX blikat a ani na výpisu monitoru se neobjevují nové informace o čase. A taky se mi asi po cca 30 minutách resetuje a startuje znovu, ale LED nebliká.
    Datasheet k DS3231 je zde: https://datasheets.maximintegrated.com/en/ds/DS3231.pdf

    Tady je výpis mé úpravy programu z prvního příspěvku:
    [code]
    #include <Wire.h>
    #define DS3231_I2C_ADDRESS 0x68
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
    return( (val/10*16) + (val%10) );
    }
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
    return( (val/16*10) + (val%16) );
    }
    int svetlo1 = 9;
    int sviti = 0;
    int den = 0;
    int jas = 0;

    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

    void setup()
    {

    Wire.begin();
    Serial.begin(9600);
    // set the initial time here:
    // DS3231 seconds, minutes, hours, day, date, month, year
    //setDS3231time(00,59,18,7,05,06,16);
    }
    void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
    dayOfMonth, byte month, byte year)
    {
    // sets time and date data to DS3231
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set next input to start at the seconds register
    Wire.write(decToBcd(second)); // set seconds
    Wire.write(decToBcd(minute)); // set minutes
    Wire.write(decToBcd(hour)); // set hours
    Wire.write(decToBcd(dayOfWeek)); // set day of week (1=pondeli, 7=nedele)
    Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
    Wire.write(decToBcd(month)); // set month
    Wire.write(decToBcd(year)); // set year (0 to 99)
    Wire.endTransmission();
    }
    void readDS3231time(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set DS3231 register pointer to 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
    // request seven bytes of data from DS3231 starting from register 00h
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());

    }
    void displayTime()
    {
    ;
    // retrieve data from DS3231
    readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
    &year);
    // send it to the serial monitor
    Serial.print(hour, DEC);
    // convert the byte variable to a decimal number when displayed
    Serial.print(„:“);
    if (minute<10)
    {
    Serial.print(„0“);
    }
    Serial.print(minute, DEC);
    Serial.print(„:“);
    if (second<10)
    {
    Serial.print(„0″);
    }
    Serial.print(second, DEC);
    Serial.print(“ „);
    Serial.print(dayOfMonth, DEC);
    Serial.print(„/“);
    Serial.print(month, DEC);
    Serial.print(„/“);
    Serial.print(year, DEC);
    Serial.print(“ Den: „);
    switch(dayOfWeek){
    case 7:
    Serial.println(„nedele“);
    break;
    case 1:
    Serial.println(„pondeli“);
    break;
    case 2:
    Serial.println(„utery“);
    break;
    case 3:
    Serial.println(„streda“);
    break;
    case 4:
    Serial.println(„ctvrtek“);
    break;
    case 5:
    Serial.println(„patek“);
    break;
    case 6:
    Serial.println(„sobota“);
    break;
    }
    }
    void loop()
    {

    pinMode(svetlo1,OUTPUT);
    displayTime(); // display the real-time clock data on the Serial Monitor,
    delay(1000); // every second

    byte s, m, h, dvt, dvm, mesic, r;
    readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);

    if (h >= 8 && h < 20) den = 1; // nastaveni intervalu sviceni
    else den = 0;
    for (byte brightness = 0; den == 1 && sviti == 0 && brightness < 255; brightness ++) {
    analogWrite(svetlo1, brightness);
    if(brightness == 255) sviti = 1;
    delay(5000);
    }

    for (byte brightness = 255; den == 0 && sviti == 1 && brightness > 0; brightness –) {
    analogWrite(svetlo1, brightness);
    if(brightness == 0) sviti = 0;
    delay(5000);}

    }
    [/code]

    #7235
    posjirka
    Účastník

    podle mých výpočtu by to mělo resetovat po 21 minutách 🙂

    Když se na ten program podívaáš, tak ve smyčce ( loop() ) ti neustále :
    – nastavuje vstup „svetlo1“ jako výstupní (pinmode)
    – pak ti zobrazí aktuální čas (displayTime)
    – počká 1 s
    – přečte si aktuální čas (readDS3231time)
    – zjistí jestli není náhodou den (if (h>=8 ….)
    – spustí sekvenci rozsvícení (podmíněnou dalšími faktory) a ta trvá 255 kroku * 5s zpoždění = cca 21minut.
    ….

    po tu dobu rozsvěcení vlastně cykluje sám v sobě a tím pádem nezobrazuje na „serialmonitor“ žádné hodnoty. jestli to chceš vypisovat tak musíš příkaz „displayTime();“ dát i do symček „for“.

    proč se ti resetuje / znovu načítá nevím, nekde je chybka v proměnných „den“, „sviti“, „brightness“. Když tak na to koukám, tak on ti vlastně nikdy nedojede v rozsvícení na „brightness = 255“, protože ve smyčce „for“ mu dáváš podmínku „brightness < 255“. Tzn. že ti skončí ve 254 kroku 🙂 .

    Já bych celou tuto situaci řešil asi trochu jinak. Na počátku bych si nadefinoval pole o 24 pozicích (0-23 hodin) do nich bych si zapsal jakou intenzitu mají mít v nulté minutě a pomocí fuknce „map()“ bych plynule přecházel mezi jednotlivými hodnotami.
    Ano trvalo by to 1 hodinu než by se rozsvítilo světlo naplno/zhasnulo ale bylo by to mnohem čistší řešení …

    nemám moc rád tyhle vnořené podmínky, člověk se v nich ztrácí.

    #7236
    ArduXPP
    Účastník

    Včera se mi nedal odkaz do příspěvku.

    Tak tady je https://bastlirna.hwkitchen.cz/tutorial-uzivani-hodin-realneho-casu-ds1307-a-ds3231-s-arduinem/

    Píše o tom Kolbis .

    #7238
    letakp
    Účastník

    To-posjirka Tak to, že by se to rozsvěcelo hodinu by nevadilo, ba naopak, jenom přesně nechápu, jak to myslíš s těmi poli, jestli máš chvilku, zkus mně alespoň navést, zkusim si o tom něco přečíst, uvidim, co ze mně vypadne. Díky.

    #7239
    letakp
    Účastník

    Zatím jsem upravil void loop a funguje mi to asi tak, jak jsem si představoval.
    výpis loop zde:
    void loop()
    {

    pinMode(svetlo1,OUTPUT);
    displayTime(); // display the real-time clock data on the Serial Monitor,
    delay(1000); // every second

    byte s, m, h, dvt, dvm, mesic, r;
    readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);

    if (h >= 8 && h < 21) den = 1; // nastaveni intervalu sviceni
    else den = 0;
    for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 255) sviti = 1;
    delay(5000);

    }

    for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 0) sviti = 0;
    delay(5000);}

    }

    #7240
    posjirka
    Účastník

    napsal jsem jednoduchý příklad.
    Je to myslim dobře okomentovaný takže princip by měl být jasný:

    // priklad principu regulace osvetleni akvaria
    // v01
    // by JP 2016
    //
    
    // knihovny
    
    #include <Time.h>
    
    // promenne
    int jas = 0; // pomocna promenna pro vypocet jasu
    const int LED = 10; // pin s LED diodou
    // nasatveni casovace
    int casovac[24] = {0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    // jednotlive polozky casovace predstavuji intenzitu jaku v celou hodinu
    // 1. cislice je intenzita osvetleni v 0:00
    // 2. cislice je intenzita osvetleni v 1:00
    // ...
    // 23. cislice je intenzita osvetelni v 23:00
    // cislice jsou v rozsahu:
    // 0 = 0%
    // 255 = 100%
    
    void setup() {
      Serial.begin(9600); // nastaveni seriove komunikace
      pinMode(LED, OUTPUT); // nastaveni pinu jako vystup
    }
    
    void loop() {
      // vypis na seriovy port
      Serial.print(hour()); // hodiny
      Serial.print(":"); 
      Serial.print(minute()); // minuty
      Serial.print(":"); 
      Serial.print(second()); // sekundy
      Serial.print("   Jas:");
      Serial.println(jas); // aktualni jas
      // kdyz je 23 hodin je treba porovnavat hodnoty cislice 23 a 0
      if(hour() == 23) {
        // nastav jas podle aktualni minuty a hodiny 
        jas = map(minute(), 0, 59, casovac[23], casovac[0]);
        // ochrana proti hazardnimu stavu prepoctu
        jas = constrain(jas, casovac[23], casovac[0]);
      } else {
        // jinak porovnej hodnoty cilice pole = aktualni hodina a vedlejsi cislice
        jas = map(minute(), 0, 59, casovac[hour()], casovac[hour()+1]);
        // ochrana proti hazardnimu stavu prepoctu
        jas = constrain(jas, casovac[hour()], casovac[hour()+1]);
      }
      jas = constrain(jas, 0, 255); // omezeni rozsahu regulace
      analogWrite(LED, jas); // nastav aktualni intenzitu  
      delay(1000); // pauza 1s
    }
    #7242
    posjirka
    Účastník

    ještě máš chybu tady:

    for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 0) sviti = 0;
    delay(5000);}

    na konci definice smčky for patří 2x minus
    for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –-)
    jinak ti to nepujde odečítat …..

    #7245
    letakp
    Účastník

    Díky za upozornění, ale v programu to bylo tak, jak to má být, nevím, buďto jsem to opravil hned po nahraní na forum a nebo se to smázlo cestou na forum 😀
    Včera jsem to zkoušel a v poho to celý den svítilo a večer to pohaslo až do konce.
    pokud to bude fungovat, zkusim ještě tu tvoji verzi a uvidim, co bude vyhovovat víc.
    Ještě mám v plánu pořídit displej a zobrazovat aktuální čas a třeba teplotu nasnímanou z čidla teploty. Snímač CO2 jsem zatím neviděl, tak to by bylo ještě něco, co by mi tam chybělo aby to bylo dokonalé.

    #7246
    vnouzirozbijsklo
    Účastník

    Konečně nějaká konstruktivní debata ohledně mého prvního dotazu, které založilo celé toto forum. Trvalo mi celkem dlouho, než jsem našel chyby, takže ty zdrojové kody ze začátku fora, ve kterých jsem prosil o radu nebyly plně funkční.
    Fakt,že v podmínce nedosáhnu 255 je tim, že jsem za boha nemohl docílit toho, aby mi to neustále do kola jen nerozsvěcelo, nebo nezhasínalo.
    Prostě podmínky mi nepoznali jeslti je už rozvíceno nebo ne.
    A ani teď nedokážu docílit plného zhasnutí, ale to bude nejspíše způsobeno nějakou indukcí na tranzistor v tištáku.

    #7247
    letakp
    Účastník

    Tak to jsem vyřešil stejně jako to kolísání při rozsvěcení. Je potřeba dát na konci řádku informaci o tom, že hodnota je větší NEBO rovna 0. Zatím funkční část tvého programu s mýma úpravama je tady :

    #7248
    letakp
    Účastník

    Sorry, neposlalo se to 🙁

    Je to zde:

    [code]

    #include <Wire.h>
    #define DS3231_I2C_ADDRESS 0x68
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
    return( (val/10*16) + (val%10) );
    }
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
    return( (val/16*10) + (val%16) );
    }
    int svetlo1 = 9;
    int sviti = 0;
    int den = 0;
    int jas = 0;

    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

    void setup()
    {

    Wire.begin();
    Serial.begin(9600);
    // set the initial time here:
    // DS3231 seconds, minutes, hours, day, date, month, year
    //setDS3231time(00,59,18,7,05,06,16);
    }
    void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
    dayOfMonth, byte month, byte year)
    {
    // sets time and date data to DS3231
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set next input to start at the seconds register
    Wire.write(decToBcd(second)); // set seconds
    Wire.write(decToBcd(minute)); // set minutes
    Wire.write(decToBcd(hour)); // set hours
    Wire.write(decToBcd(dayOfWeek)); // set day of week (1=pondeli, 7=nedele)
    Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
    Wire.write(decToBcd(month)); // set month
    Wire.write(decToBcd(year)); // set year (0 to 99)
    Wire.endTransmission();
    }
    void readDS3231time(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set DS3231 register pointer to 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
    // request seven bytes of data from DS3231 starting from register 00h
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());

    }
    void displayTime()
    {
    ;
    // retrieve data from DS3231
    readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
    &year);
    // send it to the serial monitor
    Serial.print(hour, DEC);
    // convert the byte variable to a decimal number when displayed
    Serial.print(„:“);
    if (minute<10)
    {
    Serial.print(„0“);
    }
    Serial.print(minute, DEC);
    Serial.print(„:“);
    if (second<10)
    {
    Serial.print(„0″);
    }
    Serial.print(second, DEC);
    Serial.print(“ „);
    Serial.print(dayOfMonth, DEC);
    Serial.print(„/“);
    Serial.print(month, DEC);
    Serial.print(„/“);
    Serial.print(year, DEC);
    Serial.print(“ Den: „);
    switch(dayOfWeek){
    case 7:
    Serial.println(„nedele“);
    break;
    case 1:
    Serial.println(„pondeli“);
    break;
    case 2:
    Serial.println(„utery“);
    break;
    case 3:
    Serial.println(„streda“);
    break;
    case 4:
    Serial.println(„ctvrtek“);
    break;
    case 5:
    Serial.println(„patek“);
    break;
    case 6:
    Serial.println(„sobota“);
    break;
    }
    }
    void loop()
    {

    pinMode(svetlo1,OUTPUT);
    displayTime(); // display the real-time clock data on the Serial Monitor,
    delay(1000); // every second

    byte s, m, h, dvt, dvm, mesic, r;
    readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);

    if (h >= 8 && h < 20) den = 1; // nastaveni intervalu sviceni
    else den = 0;
    for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 255) sviti = 1;
    delay(5000);

    }

    for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 0) sviti = 0;
    delay(5000);}

    }

    [/code]

    #7250
    letakp
    Účastník

    Nevím proč ale při kopii programu do schránky se nezobrazuje správně řádek:
    for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –) {

    Správně tam patří rightness >=0; brightness –) jak mně upozornil posjirka.

    #7251
    posjirka
    Účastník

    já bych řekl, že ty „chyby“ k kodu asi způsobuje fakt, že nepoužíváte místní značky pro vkládání kodu. Tady jsou použity apostrofy nikoliv párovná značka CODE .
    Ten můj program je jen rychlý návrh jak by to šlo udělat. Jak sjem psal nemám doma DS3231 jen DS1307 a to ve fromě IO = nemám volný hotový modul.
    Chtěl jsem ti jen nastínit jonou možnost řešení …
    Když používáš tu násobnou podmínku ve smyčce FOR doporučil bych spíš použít jednotlivé podmínky IF vnořené (kaskádově) v sobě. Lépe se pak chápe funkce a možnosti řešení z pohledu programátora „žáka“ .

    #7305
    letakp
    Účastník

    Díky psjirko za upozornění, já si to bral jako překlad z ArduinoIDE Kopírovat pro použití ve fóru a ono to dělá toto.
    Správná varianta je:

    #include <Wire.h>
    #define DS3231_I2C_ADDRESS 0x68
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
    return( (val/10*16) + (val%10) );
    }
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
    return( (val/16*10) + (val%16) );
    }
    int svetlo1 = 9;
    int sviti = 0;
    int den = 0;
    int jas = 0;
    
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    
    void setup()
    {
    
    Wire.begin();
    Serial.begin(9600);
    // set the initial time here:
    // DS3231 seconds, minutes, hours, day, date, month, year
    //setDS3231time(00,59,18,7,05,06,16);
    }
    void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
    dayOfMonth, byte month, byte year)
    {
    // sets time and date data to DS3231
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set next input to start at the seconds register
    Wire.write(decToBcd(second)); // set seconds
    Wire.write(decToBcd(minute)); // set minutes
    Wire.write(decToBcd(hour)); // set hours
    Wire.write(decToBcd(dayOfWeek)); // set day of week (1=pondeli, 7=nedele)
    Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
    Wire.write(decToBcd(month)); // set month
    Wire.write(decToBcd(year)); // set year (0 to 99)
    Wire.endTransmission();
    }
    void readDS3231time(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set DS3231 register pointer to 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
    // request seven bytes of data from DS3231 starting from register 00h
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
    
    }
    void displayTime()
    {
    ;
    // retrieve data from DS3231
    readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
    &year);
    // send it to the serial monitor
    Serial.print(hour, DEC);
    // convert the byte variable to a decimal number when displayed
    Serial.print(":");
    if (minute<10)
    {
    Serial.print("0");
    }
    Serial.print(minute, DEC);
    Serial.print(":");
    if (second<10)
    {
    Serial.print("0");
    }
    Serial.print(second, DEC);
    Serial.print(" ");
    Serial.print(dayOfMonth, DEC);
    Serial.print("/");
    Serial.print(month, DEC);
    Serial.print("/");
    Serial.print(year, DEC);
    Serial.print(" Den: ");
    switch(dayOfWeek){
    case 7:
    Serial.println("nedele");
    break;
    case 1:
    Serial.println("pondeli");
    break;
    case 2:
    Serial.println("utery");
    break;
    case 3:
    Serial.println("streda");
    break;
    case 4:
    Serial.println("ctvrtek");
    break;
    case 5:
    Serial.println("patek");
    break;
    case 6:
    Serial.println("sobota");
    break;
    }
    }
    void loop()
    {
    
    pinMode(svetlo1,OUTPUT);
    displayTime(); // display the real-time clock data on the Serial Monitor,
    delay(1000); // every second
    
    byte s, m, h, dvt, dvm, mesic, r;
    readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);
    
    if (h >= 8 && h < 20) den = 1; // nastaveni intervalu sviceni
    else den = 0;
    for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 255) sviti = 1;
    delay(5000);
    
    }
    
    for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness --) {
    displayTime(); // display the real-time clock data on the Serial Monitor,
    analogWrite(svetlo1, brightness);
    if(brightness == 0) sviti = 0;
    delay(5000);}
    
    }

    A zatím, co ji testuju už skoro týden, tak chodí bez problémů.
    Na ty pole, jak jsi mi nastínil se moc necítím. Trochu jsem to četl, ale asi jsem už starší a pomaleji chápu, tak radši budu mít tuto jistotu. Ale i tak díky za popostrčení, bylo to velmi užitečné, myslím i pro vnouzirozbijsklo.

    #7699
    letakp
    Účastník

    Ahoj. Tak po delší době jsem si pořídil displej s I2C sběrnicí a na vyzkoušení jsem použil program pro ovládání LCD displeje jen pro ověření činnosti. A nyní k mému dotazu.
    Jakým způsobem by šlo dát oba tyto kódy dohromady aby mi fungovalo stmívání a rozsvěcení LED pásku a zároveň mohl mít zobrazeno na displeji datum, čas, teplotu z čidla (teplota vody akvaria) případně ještě znak pro svícení nebo nesvícení?

    Už jsem zkoušel dát kódy dohromady, ale buďto nešel displej a nebo mi to nešlo ani načíst v programu 🙁

    Děkuji za každé popostrčení.

    #7700
    vnouzirozbijsklo
    Účastník

    Mě to funguje více než přes rok spolehlivě. Ještě si můžeš smazat definici JAS, která není nikde v programu použitá, deklaroval jsem ji na začátku, když jsem ještě nevěděl, jak vyřešit rozsvícení, když by vypadnul proud.

    Jinak z vlastní zkušenostu určitě použij led pásky bez krycího silikonu, ten se za pár mesíců spálí. Ale musíš mít nad akva sklo. Já jsem to zrovna před týdnem doplnil o COB led čipy, a zrovna se chystám vyrobit nový tišták na stmívání se stálým proudem.

    S displayem zkušenosti nemám, te si mi zdá jako vyšší liga:D
    jen mě napadlo, jestli to nemůže být tím, žě když beží zrovna cyklus FOR (a to je na pěkně dlouho při kroku á 5000 ms), všechno ostatní stojí?

    #7715
    posjirka
    Účastník

    to letakp:
    dej sem kod cos napsal, třeba příjdeme na příčinu. Osobne si myslím, že je to jak psal vnouzirozbijsklo . pokud čas zobrazuješ jen na začátku smyčky loop() a začne se rozsvěcovat LED tak 255 kroků * 5s = cca 21 minut tj. doba kdy ti asi nereaguje ten LCD display. Zkus si ještě rozmyslet jak by vypadalo to zobrazení na LCD. klidně napiš jeden příklad a podíváme se na to.

    #7721
    letakp
    Účastník

    Tak zatím obrázek jak bych si to představoval, kód dodám později.

    #7723
    letakp
    Účastník

    Tak ten kód, jenom jsou tam pro čas i sekundy, ty být nemusí, a místo toho nějaký znak pro zobrazení svitu LED a teplota je místo z čidla externího braná z DS3231.

    Tak kód mi nejde vložit, nevím proč, pořád to píše err 403

    #8955
    Nasranek
    Účastník

    Minulý týden jsem dodělal a teď je už je i odzkoušen Led pásek/stmívač/teplota vody/hodiny/Displej Nokia 5110(čekám na 4×20 I2C displej pak předělám na něj).
    Program má nějaké nedostatky – mám ho ve dvou verzích jedna vypíná/zapíná podsvícení displeje mechanicky (Pod světlení je rozpojované spínačem) tu tady dám, pod světlení přes tlačítko řešeno výstupem s Arduina, má tu nevýhodu – pří startu pásku nereaguje hned ale od 1-10 sekund protože Led postupně rozsvěcuje cca 42 minut a krok je po 10 sekundách.
    Sériový výstup je vypnut(žere moc prostředků pro lokální proměnné)
    budete potřebovat 2 knihovny a to tyto:

    #include <DallasTemperature.h>
    #include <Nokia_5110.h> //https://github.com/baghayi/Nokia_5110
    
    const int pinCidlaDS = 2;//teplotní čidlo vody je připojeno k Digitálním pinu D2
    
    OneWire oneWireDS(pinCidlaDS);
    
    DallasTemperature senzoryDS(&oneWireDS);
    
    //nastavení pinu pro displej, můžou být skoro všechny digitální, ale jeden pwm musíte nechat pro řízení mosfetu (pwm 11,10,9,6,5,3)
    // BL - podsvícení rozpojit přes spínač jinak bude v kuse svítit ve verzi 1.3 je napojen na D10,ale zpožďuje
    #define RST 4
    #define CE 5
    #define DC 6
    #define DIN 7
    #define CLK 8
    
    Nokia_5110 lcd = Nokia_5110(RST, CE, DC, DIN, CLK);
    
    #include <Wire.h>
    #include <DS3231.h> //http://www.rinkydinkelectronics.com/library.php?id=73
    
    DS3231  rtc(SDA, SCL);
    
    #define DS3231_I2C_ADDRESS 0x68
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
      return ( (val / 10 * 16) + (val % 10) );
    }
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
      return ( (val / 16 * 10) + (val % 16) );
    }
    int svetlo1 = 11;//pwm vystup
    int sviti = 0;
    int den = 0;
    
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    
    void setup()
    {
      rtc.begin();
      lcd.clear();//smaže obrazovku
      lcd.setContrast(30);//nastavení kontrastu je to individuální, mám jich několik a každý chce něco jiného ale je to v rozmezí 30-60
    
      Wire.begin();
      // Nastavení hodin a datumu po nastavení dát do poznámek v mění se jen to co jen odemknuto
      
    
      //rtc.setDOW(3);  // Den v tydnu- mozno napsat jako cislo nebo jako den -- rtc.setDOW(1)
    
      //rtc.setTime(17, 31, 20);     // Nastaveni Casu 12:00:00 (24hod format) po nastavení dát "//" a znovu nahrát jinak při resetu se znovu nastaví
      
      // rtc.setDate(21, 10, 2016);   // Nastaveni datumu den/mesic/rok
    }
    
    void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
    {
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0); // set DS3231 register pointer to 00h
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
      // request seven bytes of data from DS3231 starting from register 00h
      *second = bcdToDec(Wire.read() & 0x7f);
      *minute = bcdToDec(Wire.read());
      *hour = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month = bcdToDec(Wire.read());
      *year = bcdToDec(Wire.read());
    
    }
    void displayTime()
    
    {
    
      // příjem dat z DS3231
      readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
      senzoryDS.requestTemperatures();//při stmívání nebo svítání obnovuje co 10 sekund jinak co 1 sekundu
    
      lcd.setCursor(0, 0);
      lcd.print ("Cas: ");
      lcd.print(rtc.getTimeStr(1));// v zavorce 1 bez sekund, prazdna ukaze sekundy,ale při startu LED skače o 11 a je to ...
      lcd.print(" hod.");
      lcd.setCursor(0, 2);                  // pokud máte teplotní čidlo napevno a nevypadává Vám není potřeba
      lcd.print("T. Vody:               "); //  já mám prototyp který nebude použit tak to řeším přepsáním
      lcd.setCursor(0, 2);
      lcd.print("T. Vody:  ");
      lcd.print(senzoryDS.getTempCByIndex(0));
    
      lcd.setCursor(0, 1);
      lcd.print("Dat. ");
      lcd.print(rtc.getDateStr());
      lcd.setCursor(0, 3); lcd.print("T. Okoli: ");
      lcd.print(rtc.getTemp()); //Hodiny real.času ds3231 mají v sobě teploměr - teplotni cidlo obnovuje co 64 sekund dá se to zkrátit, ale nebudu zbytečně zvětšovat program
      lcd.setCursor(0, 4); lcd.print(" ------------");
    
    }
    void loop()
    {
      senzoryDS.requestTemperatures();
      pinMode(svetlo1, OUTPUT);
      displayTime();
      delay(1000);
    
      byte s, m, h, dvt, dvm, mesic, r;
      readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);
    
      if (h >= 9 && h < 21) den = 1; // nastaveni intervalu sviceni
      else den = 0;
      for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
        displayTime();
        analogWrite(svetlo1, brightness);
        if (brightness == 255) sviti = 1;
        lcd.setCursor(0, 5);
        lcd.print("Stav Led:       ");
        lcd.setCursor(0, 5);
        lcd.print("Stav Led: ");
        lcd.print(brightness);
         delay(10000);
    
      }
    
      for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness --) {
        displayTime();
        analogWrite(svetlo1, brightness);
        if (brightness == 0) sviti = 0;
        lcd.setCursor(0, 5);
        lcd.print("Stav Led:       ");
        lcd.setCursor(0, 5);
        lcd.print("Stav Led: ");
        lcd.print(brightness);
           delay(10000);
      }
    
    }
    
    #8960
    posjirka
    Účastník

    to nasranek:
    onečně jsem dokopal k tomu abych někde ukazal jak jsem myslel linearni rozložení rozsvěcení/zhasnutí na základě času. Trachu jsem upravil/zjednodušil tvůj program a mírně z přeházel některé funkce. Ta uprava co jsem udělal by měla odstranit ten neduh o zpožděné reakci v důsledku dlouhého delay(). Zjednodušil jse to proto aby bylo poznat co se tam měnilo. Jestli máš chut tak to prosím vyzkoušej. krok se mění 1x za minutu a funkcí map() se přepočítává na rozsah 0-255.

    #include <Wire.h>
    #include <DS3231.h>
    #define DS3231_I2C_ADDRESS 0x68
    DS3231  rtc(SDA, SCL);
    
    int svetlo1 = 11;//pwm vystup
    int den = 9*60; // od kdy je den
    int noc = 21*60;// od kdy je noc
    int svetlo = 42; // doba rozsveceni/zhasnuti
    int cas = 0; // nasobek aktualnich hodin a minut
    byte jas = 0; // velikost jasu 0-255
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    
    void setup()
    {
      rtc.begin();
      lcd.clear();//smaže obrazovku
      lcd.setContrast(30);//nastavení kontrastu je to individuální, mám jich několik a každý chce něco jiného ale je to v rozmezí 30-60
      Wire.begin();
      pinMode(svetlo1, OUTPUT);
    }
    
    byte decToBcd(byte val){
      return ( (val / 10 * 16) + (val % 10) );
    }
    
    byte bcdToDec(byte val){
      return ( (val / 16 * 10) + (val % 16) );
    }
    
    void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
    {
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0); // set DS3231 register pointer to 00h
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
      *second = bcdToDec(Wire.read() & 0x7f);
      *minute = bcdToDec(Wire.read());
      *hour = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month = bcdToDec(Wire.read());
      *year = bcdToDec(Wire.read());
    }
    
    void loop()
    {
      delay(1000);
      byte s, m, h, dvt, dvm, mesic, r;
      readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);
      analogWrite(svetlo1, brightness);
      
      cas = h*m; // nasobek minut a hodin
      if (cas < den) {
        jas = 0; // jeste neni den tak nesvit
      } else {  
        if(cas < (den+svetlo)}{
          jas = map(cas, den, (den+svetlo), 0, 255); // rozsveceni
        }
      }
      if (cas > (noc + svetlo)) {
        jas = 0; // jeste neni den tak nesvit  
      } else {
        if (cas > noc){
          jas = map(cas, noc, (noc+svetlo), 255, 0); // zhasnuti  
        }
      }
    }
Aktuálně je na stránce zobrazeno 30 příspěvků - 31. až 60. (celkem z 63)
  • Pro reakci na toto téma se musíte přihlásit.