Close

MiK

Vytvořené odpovědi

Aktuálně je na stránce zobrazeno 30 příspěvků - 1,891. až 1,920. (celkem z 2,780)
  • Autor
    Příspěvky
  • odpověď na: Jak na název s automatickým posunem jména #7390
    Zbyšek Voda
    Účastník

    Dobrý den, pošlu vám celý kód určený pro LEDky ze článku.

    class LED{
        private: 
            int pin;
            boolean stav = LOW; //výchozí stav LED je vypnuto
            void nastav(boolean);
    
        public: 
            LED(int);
            void zapni();
            void vypni();
            void prepni();
            boolean vratStav();
    };
    
    LED::LED(int p){
        pin = p;
        pinMode(pin, OUTPUT);
        digitalWrite(pin, stav);
    }
    
    void LED::zapni(){
        nastav(HIGH);
    }
    
    void LED::vypni(){
        nastav(LOW);    
    }
    
    void LED::prepni(){
        nastav(!stav); //nastaví LED na obrácenou hodnotu (0->1, 1->0)
    }
    
    void LED::nastav(boolean s){
        stav = s;
        Serial.print("Nastavuji ");
        Serial.print(stav);
        Serial.print(" na pinu ");
        Serial.println(pin);
        digitalWrite(pin, stav);
    }
    
    boolean LED::vratStav(){
        return stav;     
    }
    
    #define NO_OBJECTS 6
    
    LED *LEDS = (LED*)malloc(NO_OBJECTS * sizeof(LED));
    
    void setup() {
        Serial.begin(9600);
        
        for(int i = 0; i < NO_OBJECTS; i++){
            LEDS[i] = LED(i);
        }
       
        for(int i = 0; i <= 10; i++){
            LEDS[2].prepni();
            delay(500);    
        }
    }
    
    void loop() {
    }

    Důležité části jsou:

    #define NO_OBJECTS 6
    Řekne programu, že bude celkem 6 LEDEK/TLAČÍTEK…

    LED *LEDS = (LED*)malloc(NO_OBJECTS * sizeof(LED));
    Vytvoří se ukazatel na datový typ LED. Funkce malloc alokuje v paměti prostor pro budoucí pole – potřebuje vědět, jak bude velké. Proto se jí jako parametr předá velikost jednoho objektu LED (sizeof) ponásobená počtem objektů v poli. Funkce malloc vrací datový typ void*, takže je potřeba ho ještě před uložením do LEDS přetypovat na LED*. Dále už se dá s LEDS pracovat jako s normálním polem.

    Nevím, jestli je toto nejjednodušší cesta, ale nenapadla mě jednodušší.

        for(int i = 0; i < NO_OBJECTS; i++){
            LEDS[i] = LED(i);
        }

    Do pole LEDS poukládá objekty LED na daných pinech.

       for(int i = 0; i <= 10; i++){
            LEDS[2].prepni();
            delay(500);    
        }

    Postupně bliká ledkami.

    Snad to je pochopitelné. Kód by měl jednoduše jít předělat pro vaše potřeby. Pole by mohlo vypadat takto:

    RBD::Button *pole = (RBD::Button*)malloc(NO_OBJECTS * sizeof(RBD::Button));

    Jeho naplnění potom:

    for(...){
        pole[i] = RBD::Button(i);
    }
    odpověď na: arduino DRL modul pre dialkove svetla #7387
    posjirka
    Účastník

    otočení klíče do 2. polohy je nejjednodušší varianta a v podstatě je tam to arduino už zbytečné. jak jsem ti posílal odkaz tak to je analogová konstrukce za pár korun a bez programování. Jen pro pořádek dobrá rada: používej autorelé na 12V. Jsou veliké ale budou spolehlivé.

    odpověď na: arduino DRL modul pre dialkove svetla #7386
    rumy
    Účastník

    jedna sa o hondu accord rocnik 2005
    ten druhy bod by mala byt ta filtracia pri to meracom bode?
    ale aj tak snazim sa to spavit co najmensie tak uvazujem nad tym ze by som to jednoducho tak spravil ze ked sa zapne arduino tak cca za 5s sa zapnu svetla.. lebo arduino zapinam tak ze otocim kluc do polohy II a arduino sa zapne..

    odpověď na: arduino DRL modul pre dialkove svetla #7385
    posjirka
    Účastník

    tady je spoustu faktoru, které to můžou ovlivňovat:
    – rušení od řídících jednotek
    – načnutý alternátor
    – špatná zem
    – ….
    Máš 2 možnosti:
    1, neuvádíš jaký je to auto. Postaru se to řešilo tak, že místo sledování baterie se sledovalo zde je napětí za ořechem (spínací skříňka), která zapíná třeba autorádio atd. Pak bys nemusel sledovat nic analogového jen je/není napětí. jednoduchá konstrukce je třeba tady:
    http://paja-trb.cz/konstrukce/aut_svetla.html
    2, musíš to napětí , které přivádíš nejdřív oddělit (diodou) a pak vyfiltrovat (kondenzátor 100n + 470u proti zemi).

    odpověď na: FT232RL FTDI Basic USB #7367
    ArduXPP
    Účastník

    Vím na co se ptám, chtěl jsem FT232RL FTDI Basic USB, který umožňuje přes ISP6PIN nahrát bootloader. Když mi to nešlo tak jsem automaticky využil možnost Arduino Uno za pomoci kodu ArduinoISP . A pak jsem napsal dotaz jak nahrát bootloader přes FT232RL FTDI Basic USB . Sám FT232RL FTDI Basic USB dělá i to co popisuji v dalším příspěvku .

    A taky by mě zajímalo, jestli jde u toho čipu Atmel ATMega328P-PU změnit z 5V na 3.3V logiku, jako je to u Arduino Pro Mini ATMega328P 3.3V, když bych využil samotný čip.

    V odpovědi nebylo řečeno, že to jde jen přes ICSP

    odpověď na: FT232RL FTDI Basic USB #7366
    posjirka
    Účastník

    víš vubec na co se ptáš?
    Na začátku řešíš nahrání bootloaderu … to jde jedině přes ICSP.
    Když ti dám alternativní návod tak píšeš že je na jiný čip a ve výsledku zjistím, že řešíš komunikaci přes UART …

    odpověď na: FT232RL FTDI Basic USB #7364
    ArduXPP
    Účastník

    Ten návod je na jiný typ chipu.

    Samotný čip jsem zprovoznil rychle přes ArduinoISP . U FT232RL FTDI Basic USB
    mi to ukazovalo chybu, když jsem dal DTR na reset docházelo k chybě, když jsem odpojil DTR tak docházelo k chybě no a poslední co jsem vyzkoušel bylo prostě přes jumper dat DTR a připojit na volný nevyužitý místo na nepájivé kontaktní pole tak najednou se kod nahrál a led svítila . Mám ještě převodník CP2102 , a tam to funguje bez problému nahrávání. Tak nevím proč u FT232RL FTDI Basic USB jde nahrát kod jen když se dá na volné pole . Tohle dělá jen u samotnýho čipu, který jsem dal dohromady podle návodu. U ostatných zařízení jako esp8266 to chybu nevykazuje a nemusím DTR dávat na volné pole.

    odpověď na: FT232RL FTDI Basic USB #7344
    posjirka
    Účastník

    1. nejspíš nemáš nainstalovaný ovladač pro FT232
    2. zkontroluj si zda máš správný port COMxx
    3. zkontroluj si typ programátoru
    4. zkontroluj si výběr správné desky arduino
    5. nevím jestli arduino podporuje FT232 jako ISP programator
    6. pokud sis tam (do atmegy) zkoušel něco nahrávat mohl jsi nastavit špatné pojistky
    7. zkus jiné arduino.
    8. zkus jiný programátor – můžeš využit i jiné arduino s programem Aruino as ISP promammer a dáš kondenzátro 10uF mez reset a zem …

    Use Arduino as an ISP programmer to program non-Arduino AVR microcontrollers

    odpověď na: Display 2004 #7342
    havala4
    Účastník

    Díky za radu vše funguje jak má.

    odpověď na: Display 2004 #7341
    Aleš
    Účastník

    Otočit trimrem nepomůže?

    odpověď na: Display 2004 #7340
    havala4
    Účastník

    //Please download the Arduino library!
    //The link:http://www.dfrobot.com/image/data/DFR0154/LiquidCrystal_I2Cv1-1.rar
    //DFRobot.com
    //Compatible with the Arduino IDE 1.0
    //Library version:1.1
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    #if defined(ARDUINO) && ARDUINO >= 100
    #define printByte(args) write(args);
    #else
    #define printByte(args) print(args,BYTE);
    #endif

    uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
    uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
    uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
    uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
    uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
    uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
    uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
    uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4};

    LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display(All jumpers should be connected!)

    void setup()
    {
    // Serial.begin(57600);
    lcd.init(); // initialize the lcd
    lcd.backlight();

    lcd.createChar(0, bell);
    lcd.createChar(1, note);
    lcd.createChar(2, clock);
    lcd.createChar(3, heart);
    lcd.createChar(4, duck);
    lcd.createChar(5, check);
    lcd.createChar(6, cross);
    lcd.createChar(7, retarrow);
    lcd.home();

    lcd.setCursor(0, 0);
    for(int i = 0;i < 20; i++) lcd.printByte(6);
    lcd.setCursor(0, 1);
    lcd.printByte(6);
    lcd.print(“ Hello world „);
    lcd.printByte(6);
    lcd.setCursor(0, 2);
    lcd.printByte(6);
    lcd.print(“ i „);
    lcd.printByte(3);
    lcd.print(“ arduinos! „);
    lcd.printByte(6);
    lcd.setCursor(0, 3);
    for(int i = 0;i < 20; i++) lcd.printByte(6);
    // lcd.clear();

    }

    void loop()
    {

    }

    odpověď na: Osvětlení akvaria Led pásky #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.

    odpověď na: "Skládání" názvu proměnné v cyklu FOR #7262
    posjirka
    Účastník

    co takhle použít pole (array).
    Můžeš si nadefinovat pole o 15 hodnotách a ve smyčce for do něj zapisovat hodnoty jednotlivých čidel.
    Pole může mít i více než 1 rozměr, takže můžeš udělat i pole o např. 2 rozměrech pro zadání adresy jednotlivých čidel (takže pole 15×8 byte)
    podívej se tady:
    https://www.arduino.cc/en/Reference/Array
    a nejlépe na kapitolu Arrays and FOR Loops

    jenom pozor !!! indexace pole začíná číslem 0 nikoliv 1 !!!

    odpověď na: Řízení kotle s akumulací #7252
    krkstex
    Účastník

    Ok, počkám na další instrukce 🙂

    odpověď na: Osvětlení akvaria Led pásky #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“ .

    odpověď na: Osvětlení akvaria Led pásky #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.

    odpověď na: Osvětlení akvaria Led pásky #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]

    odpověď na: Osvětlení akvaria Led pásky #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 :

    odpověď na: Osvětlení akvaria Led pásky #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.

    odpověď na: Osvětlení akvaria Led pásky #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é.

    odpověď na: Řízení kotle s akumulací #7244
    jurisek81
    Účastník

    Dobrý den,

    na 2-3 týdny jsem pracovně zaneprázdněný. Pak tohle můžeme řešit.

    JK

    odpověď na: Řízení kotle s akumulací #7243
    krkstex
    Účastník

    Jaký by měl být další postup? Nejsem příliš zkušený ve vývoji.

    odpověď na: Osvětlení akvaria Led pásky #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 …..

    odpověď na: Osvětlení akvaria Led pásky #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
    }
    odpověď na: Osvětlení akvaria Led pásky #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);}

    }

    odpověď na: Osvětlení akvaria Led pásky #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.

    odpověď na: Osvětlení akvaria Led pásky #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 .

    odpověď na: Osvětlení akvaria Led pásky #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í.

    odpověď na: Osvětlení akvaria Led pásky #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]

    odpověď na: Osvětlení akvaria Led pásky #7233
    ArduXPP
    Účastník

    Četl jsem to v této diskuzi

Aktuálně je na stránce zobrazeno 30 příspěvků - 1,891. až 1,920. (celkem z 2,780)