Close

petan

Vytvořené odpovědi

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 16)
  • Autor
    Příspěvky
  • odpověď na: Laik prosi o pomoc #12199
    petan
    Účastník

    Hoď dotaz do novýho fóra: https://www.arduino-forum.cz/viewforum.php?f=3 a nějak rozumě ho pojmenuj (např. Jak nastavit barvu RGB LEDky) a někdo ti tam odpoví. A když né nikdo, tak já 😉

    petan
    Účastník

    Úplně nejjednodušejc by to šlo udělat takhle:
    Je tam delay, takže na stisk tlačítka to bude reagovat vždy až po zhasnutí výstupu. Ale to při krátkých časech nemá vliv.

    
    int time1 = 10; //čas svícení (počáteční nastavení 10 ms)
    int time2 = 10; //čas nesvícení (počáteční nastavení 10 ms)
    
    void setup() {
    pinMode (5, INPUT); //vstup 1
    pinMode (6, INPUT); //vstup 2
    pinMode (7, INPUT); //vstup 3
    pinMode (8, INPUT); //vstup a tak dále
    
    pinMode (13, OUTPUT); //výstup
    }
    
    void loop() {
      //tady se řeší rozřazování
      if digitalRead(5){
        //stisknuto tlačítko 1
        //nastavit parametry 1
        time1 = 10;
        time2 = 10;
      }
    
        if digitalRead(6){
        //stisknuto tlačítko 2
        //nastavit parametry 2
        time1 = 20;
        time2 = 20;
      }
    
      //tady se řeší blikání
      digitalWrite(13, HIGH);
      delay(time1);
      digitalWrite(13, LOW);
      delay(time2);
    }
    
    odpověď na: Rozběh Hvězda trojůhelník #11560
    petan
    Účastník

    RomanB má pravdu. Signál pro relé je LOW, ne HIGH. To není moc dobré, pokud Arduino vypadne a nenaběhne. Tak se všechny zapnou? WTF?
    V mým programu by mělo stačit přehodit LOW za HIGH a opačně. Ale tím že relé je sepnuto v log. 0 me nepřijde úplně nejlepší varianta.

    Pokud je rozběh řízen pomocí PLC, tak je často vhodné zapojit první stykač za reléovou logiku (popřípadě bezpečnostní modul) a ostatní spínat pomocí PLC (nahradí v podstatě časový spínač). Stejně jako to je v tomto článku: https://www.mylms.cz/text-rozbeh-hvezda-trojuhelnik-s-modulem-siemens-logo/ Stykač KM1 je ovládán přímo tlačítky (včetně nouzového vypnutí) a zbylé dva stykače (běh do Y a do D) je ovládán z PLC.

    odpověď na: Rozběh Hvězda trojůhelník #11547
    petan
    Účastník

    Snad to bude pochopitelný. Nezkoušel jsem to, ale mělo by to snad fungovat.
    Samozřejmě, není nutný po celou dobu zapínat digitální výstupy, ale ničemu to nevadí. Doporučuji vyvarovat se použití příkazu delay();

    //Rozběh Y-D
    //Je nutné elektricky a nejlépe i mechanicky blokovat stykače Y a D
    
    #define tlStart A0
    #define tlStop A1
    #define stStart 1
    #define stStar 2
    #define stDelta 3
    
    int systemState; //stav systému 0 - vypnuto, 1 - provoz Y, 2 - přepínání, 3 - provoz D
    long casBehu; //čas po který je motor spuštěn do hvězdy
    
    void setup() {
      pinMode(tlStart, INPUT);  //tlačítko START
      pinMode(tlStop, INPUT);  //tlačítko STOP
      pinMode(stStart, OUTPUT);  //hlavní stykač
      pinMode(stStar, OUTPUT);  //stakač pro hvězdu
      pinMode(stDelta, OUTPUT);  //stakač pro trojuhelník
    }
    
    void loop() {
    
    if (digitalRead(tlStop)){
      //stisknuto tlačítko STOP
      systemState = 0;  //vypnout motor
    }
    
    switch (systemState) {
      case 0:
        //motor je vypnut
        digitalWrite(stStart, LOW); //pro sichr vypnout stykač
        digitalWrite(stStar, LOW);  //pro sichr vypnout stykač
        digitalWrite(stDelta, LOW); //pro sichr vypnout stykač
    
        if (digitalRead(tlStart)){
          systemState = 1;  //zapnout motor
          casBehu = millis(); //uložit čas sepnití motoru
        }
        break;
        
      case 1:
        //motor se rozbíhá zadaný čas v konfiguraci Y
        digitalWrite(stStart, HIGH);  //zapnout hlavní stykač
        digitalWrite(stStar, HIGH);   //zapnout stykač Y
    
        if (millis() >= casBehu + 5000){
          //pokud motor běží už 5s tak přepni stav systému na 2
          systemState = 2;  //další krok
          casBehu = millis(); //uložení aktuálního času
        }
        break;
        
      case 2:
        //před přepnutím do D je nutné vypnout stykač pro běh do Y a počkat
        digitalWrite(stStart, HIGH);  //zapnout hlavní stykač
        digitalWrite(stStar, LOW);  //pro sichr vypnout stykač
    
        if (millis() >= casBehu + 500){
          //pokud od vypnutí stykače uplynulo 0,5s zapni stykač pro běh do trojuhelníka
          systemState = 3;  //další krok
        }
        break;
        
      case 3:
        //provoz do D
        digitalWrite(stStart, HIGH);  //zapnout hlavní stykač
        digitalWrite(stStar, LOW);  //pro sichr vypnout stykač
        break;
    }
    
    }
    odpověď na: Čtečka čárového kódu #11321
    petan
    Účastník

    Tady něco je: https://www.youtube.com/watch?v=t5gkg645xGE Zdá se, že to funguje.

    Jen pro zajímavost. K čemu by to mělo sloužit? Pokud to není tajný?

    odpověď na: Čtečka čárového kódu #11320
    petan
    Účastník

    Dělají se čtečky čárových kódu s RS232. Pak jednoduše vytvořit pole, ve kterém budou uložené načtené kódy. Kus projde čidlem, uloží se kód do mezipaměťi, porovná se z databází. Pokud už existuje nepřidá se, jinak ano. Připočte se kus a jede se dál. Rozhodně by to bylo zajímavé na velikost paměti a rychlost porovnání – ideálně nějaký optimalizace…třídění apod.). Asi bych se to nesnažil nacpat do nějakýho mrňavýho Arduina ve stylu Nano apod.

    Problém akorát s tou čtečkou, protože s RS232 jsou dražší. Většinou fungují jako klávesnice. Načtený kód se jakoby napíše na klávesnici. Ale myslím, že jsem někde zahlídl jak připojit klávesnici k Arduinu. Takže by to bylo v podstatě stejný. Akorát by se místo portu obsluhovala nějaká knihovna na komunikaci s kliávesnicí.

    petan
    Účastník

    Musíš si vytvořit několik proměnných. V jedné potom budou hodiny, ve druhé minuty, … Pak musíš nějak detekovat stisk tlačítka – aby to při stisku vyvolalo pouze jednu událost. Na to můžeš použít např. knihovnu Bounce2…

    Budeš mít tedy nějaké proměnné a při stisknutí tlačítka se ti vždy jednou provede nějaká funkce. Při stisknutí tlačítka A tedy zvýšíš hodnotu např. hodin; při stisknutí tl. B snížíš počet hodin. Při stisknutí C to nahrneš do modulu…

    A nebo si vygůgli něco jako Arduino set time ds1307 by button, nebo tak. Určitě půjde část kódu z něčeho vyseparovat.

    petan
    Účastník

    Mrkni sem: http://playground.arduino.cc/Main/ACPhaseControl (bacha, mají přehozeno in a out na Arduinu). Jinak, když zadáš do gůglu „AC Phase Control“ tak toho určitě najdeš dost. Je to v podstatě řízená triaková regulace.

    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8765
    petan
    Účastník

    Po restartu je proměnná otevřeno false. A vlastně všechny proměnný jsou po restartu 0, LOW, false, …

    A protože si ji nikde neukládáš a ani nezjišťuješ koncákem, tak se ti spustí kód za else (je světlo) a druhá podmínka taky (negované false je true).

    Právě takovejhle problém se řeší u těch dveří. Po restartu nevědí kde jsou (během výpadku napájení s nimi někdo mohl pohnout atd.). Takže se po zapnutí napájení provede inicializace. Najde si to koncovou polohu, zresetuje se to a už to frčí…

    Jedna varianta je ukládat poslední stav do EEPROM, ale ta na to není moc vhodná. Lepší by byl ten koncák, který by definoval jednu jistou stranu.

    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8725
    petan
    Účastník

    Pokud budeš dokupovat enkodér, tak je lepší ho dát na co nejrychlejší část motorku. Ono by potom mohlo dělat na tej hlavní hřídeli jenom pár pulzů a rozlišení je rázem v tahu. To se mi pak jeví lepší ten motor „vše v jednom“ jak si posílal.

    Kolik potřebuješ otáček motoru (myslím už za převodovkou) na přetočení žaluzií do poloh? pokud by to bylo do deseti otáček, tak by si mohl koupit nějaký mrňavý servo, to vykuchat, potenciometr připojit na hřídel, posílit výstupy původní elektroniky a v podstatě by si měl výkonný servo vlastní konstrukce. Navíc velice jednoduše ovládatelný (jsou na to knihovny).

    Serva bez zpětné vazby se používají třeba u kotlů. To se otočí o 90° třeba za dvě minuty. Rychlost je celkem spolehlivá, takže se dá dobře řídit. Když se pak vrací do „nulové polohy“ a tak kontrolér pustí ovládací impulz delší, aby byla jistota, že je v nulové poloze – provede se najetí na referenční bod.

    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8712
    petan
    Účastník

    V jakým stavu bude výstup 9, když bude DigitalRead(7) v log. 1? 😎

    Osobně bych použil buď dva koncáky, nebo koncák a inkrementální snímač (ideální řešení), nebo krokáč, nebo servo.

    Koncák a inkrementální snímač by měl výhodu v najetí na referenční polohu (třeba zcela otevřené žaluzie) a pak by si to mohlo žít vlastním životem – např. 500 impulsů otevřené žaluzie, 1200 impulsů zavřené žaluzie, 1500 impulsů zatažené žaluzie apod. Kdyby se to ztratilo, najelo by si to znovu na referenční polohu.
    Takhle fungují vyjíždějící dveře např. Efaflex. Nemají jediný koncák – referenční polohu si najdou pomocí přetížení měniče a od této polohy si odpočítávají pozici. Když se ztratí (výpadek proudu), najedou si nahoru, snulují si vnitřní počítadlo a jedou dál. Dá se pak nastavit, aby dolní poloha byla 5 cm nad zemí, horní třeba v půlce atd. atd.

    Potom by se u těch žaluzií neřešil nějaký čas, který je závislý mimo jiné i na teplotě (pokud je převodovka mazaná tukem, tak má nějakej odpor), ale vždy počet pulzů, který by měl být konstantní.

    Inkrementální snímač jsem zatím nikdy neřešil, ale ačkoliv není potřeba řešit směr počítání (ten je daný podle spuštění motoru), tak se bude zřejmě jednat jenom o připojení snímače na pin, který umí přerušení a v každém přerušení přičíst, nebo odečíst hodnotu podle směru otáčení motoru. Při najetí na koncák hodnotu vynulovat… Jen takovej nástřel by mohl vypadat třeba takto.

    
    int aktualni_pozice = 0; //proměnná s aktuální pozicí
    int smer = 0; //0 - stop, 1 nahoru, 2 dolu
    
    void reset(){
    //najelo se na koncák (referenční poloha)
    aktualni_pozice = 0;
    }
    
    void preruseni(){
    //provede se při přijmutí impulzu ze snímače. Tohle si zapíná sám procesor.
    //ještě jsem to nezkoušel, tak nevím jak to funguje
    //ale na netu toho určitě bude mrtě
    
    //provede zvýšení, nebo snížení počtu podle směru pohybu žaluzií
    switch(smer)
    case 0:
    //stojí
    break;
    case 1:
    //jede nahoru, pozice se zvyšuje
    aktualni_pozice++;
    break;
    case 2:
    //jede dolu, pozice se zmenšuje
    aktualni_pozice--;
    break;
    }
    
    void pohyb(){
    switch(smer)
    case 0:
    //zastav vole
    stop();
    break;
    case 1:
    //příkaz pro jetí nahoru
    if(aktualni_pozice == 0){
    //je v pozici 0, což by mohly být zatažené žaluzie, takže zastav (viz níž)
    stop();
    }
    break;
    case 2:
    //příkaz pro jetí dolu
    if(aktualni_pozice == 100){
    //je v pozici 100, což by mohly být otevřené žaluzie, takže zastav (viz níž)
    stop();
    
    break;
    }
    
    void stop(){
    //příkazy pro zastavení motoru (různý didžitl outputy atd..)
    smer = 0;
    }
    

    Je to jen takovej nástřel. Ani jsem to kloudně neprohlížel, protože tahlecta internetová mašinérie neformátuje text.
    V reálu by bylo asi dobrý nehlídat přesně 0, nebo 100 impulzů, ale třeba od 95 do 105. Mohlo by se stát, že by Arduino nestihlo něco zaznamenat atd… I když tady by to asi nehrozilo. Ale sichr je sichr…

    Jak na to pak koukám, tak by šel udělat ovladač na otevřený, zavřený atd. žaluzie, který by z jakékoliv polohy vždycky na první dobrou zajely do pozice kam chceš. Vědí, kde jsou, vědí kam mají jet. Tak no-problem….

    A nebo to ovládej táhlem jako do teď a nic neřeš 😀 Ale zas na druhou stranu, tohle je taková bejkárna, že to má cenu zkusit. Člověk se alespoň něčemu přiučí.

    Ps.: Bejt tebou, tak si nejdřív rozbyslím, jak budeš ovládat ty žaluzky na hardwarovej úrovni – servo, krokáč, dc-motor. Čas, koncáky, inkrementální snímač, kombinace, … Zdar, jdu spát

    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8706
    petan
    Účastník

    Na otevření/zavření ti stačí jenom jedna proměnná. Bool může nabývat dvou hodnot true = otevřeno a false = zavřeno. Když budeš mít pro otevřeno a zavřeno dvě proměnné, tak si v tom uděláš akorát guláš. Nehledě na to, že existuje možnost mít obě aktivní. Co by pak platilo? Otevřeno, nebo zavřeno?

    
    bool otevreno = false; //pokud je true, je otevřeno; pokud je false, je zavřeno
    

    V podmínce „else“ už neřeš intenzitu osvatělení pomocí IF. Když se neprovede první IF (když je dost světla), tak se provedou příkazy za ELSE. Už to namusíš komplikovat další podmínou.

    Koukni se na můj starší příspěvek. Tam je v podstatě celej program, kromě setupu a deklarací proměnných. Příkazy pro otevření a zavření žaluzií si doplníš s tvýho příspěvku (DigitalWrite atd). Deklaraci před a v vouid setup(); doplň taky od sebe + tu deklaraci proměnné bool… Případně dopřejmenuj nějaký proměnný (já mám int ldr_value označenou jako intenzita).

    PS.: Nemělo by být ldr = A0?
    PPS.: Já jsem taky začátečník. Jedinej program, kterej jsem zatím naprogramoval je v tomto sodobaru
    PPPS.: Doporučuji zkouknout tu knížku, co tu furt vyskakuje. Je tam spousta základů
    PPPPS.: Docela mě překvapuje, jak je to tu mrtvý. Doteď jsem si myslel, že si s Arduinem hrajou uplně všichni kromě mě 🙂
    PPPPPS.: Přešel bych na PHPbb fórum (nebo jak se jmenuje). Tohle je celkem nepřehledný a pomalýýýýýýýýýýý 😛

    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8699
    petan
    Účastník

    Připoj k motoru ještě enkodér např. jako tento: https://goo.gl/xbrZ63 a počítej impulsy. Pak s tím můžeš dělat víc věcí – zatáhnout/roztáhnout, zavřít/otevřít. Dalo by se detekovat třeba zaseknutí žaluzií apod…

    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8666
    petan
    Účastník

    Čemu nerozumíš? Zkus si projít kód řádek po řádku. Schválně jsem ho rozdělil na jednotlivý funkce, aby si mohl každou pochopit zvlášť. Navíc rozdělení na jednotlivý funkce (procedury) usnadňuje úpravy v programu.

    Nebo zkus servo. To se umí jednoduchým příkazem otočit o 180°. Ráno nastavíš, aby se servo otočilo např. na 0° a večer na 180°. Servo má v sobě elektroniku, která si sama měří úhel, takže opravdu jenom pošleš hodnotu a o nic jinýho se nestaráš.

    Pro servo by to mohlo vypadat takhle:

    #include <Servo.h> 
    
    Servo servopohon; //instance objektu (to neřeš)
    
    void setup() 
    { 
      servopohon.attach(8); //servo připojeno na pinu 8
    } 
    
    void loop() {
    //opakuj stále dokola
    
    intenzita = analogRead(A0); //načti intenzitu osvětlení
    
    if (intenzita > 500){
    //pokud je tma
    servopohon.write(0); // nastavit úhel na 0
    }
    
    else{
    //pokud není tma
    servopohon.write(180); // nastavit úhel na 180
    }
    
    } 
    odpověď na: Rada pro začátečníka -stmívač a žaluzie #8661
    petan
    Účastník
    
    void loop(){
    
    if (intenzita > 500){
    //pokud je tma
    if(otevreno){
    //pokud je tma (z předchozí podmínky) a žaluzky jsou otevřeny
    zavri();
    }
    }
    
    else{
    //pokud není tma
    if (!otevreno){
    //pokud není tma (z předchozí podmínky else) a žaluzie jsou zavřeny
    otevri();
    }
    }
    
    }
    
    void zavri(){
    //zde napsat příkazy k zavření žaluzií (zapnutí výstupů apod)
    delay(5000);
    otevreno = false;
    vypni();
    }
    
    void otevri(){
    //zde napsat příkazy k otevření žaluzií (zapnutí výstupů apod)
    delay(5000);
    otevreno = true;
    vypni();
    }
    
    void vypni(){
    //příkazy k vypnutí pohonu žaluzií
    }

    Asi takhle bych to viděl… Psal jsem to „poslepu“, ale mělo by to fungovat. Možná budou šatně velikosti písmen.

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 16)