Close

Osvětlení akvaria Led pásky

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

Zvolené téma obsahuje celkem 62 odpovědí. Do diskuze (9 diskutujících) se naposledy zapojil uživatel Nasranek Nasranek a poslední změna proběhla před 2 roky, 8 měsíci.

Prohlížíte 15 příspěvků - 46 z 60 (celkem z 63)
  • Autor
    Příspěvky
  • #7242
    Profilový obrázek
    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
    Profilový obrázek
    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 :D
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    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
    Profilový obrázek
    letakp
    Účastník

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

    #7723
    Profilový obrázek
    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
    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
    Profilový obrázek
    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  
        }
      }
    }
Prohlížíte 15 příspěvků - 46 z 60 (celkem z 63)

Pro reakci na toto téma se musíte přihlásit.