Close

Rada pro začátečníka -stmívač a žaluzie

Úvodní stránka Fórum Vaše projekty Arduino Rada pro začátečníka -stmívač a žaluzie

  • Toto téma obsahuje celkem 30 odpovědí. Do diskuze (6 diskutujících) se naposledy zapojil uživatel Ladis_Kv a poslední změna proběhla před 5 roky a 7 měsíci.
Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 31)
  • Autor
    Příspěvky
  • #8655
    Ladis_Kv
    Účastník

    Zdravím.Nedávno jsem si pořídil Arduino a velice mě zaujalo.
    Potřeboval bych ale poradit s programem pro žaluzie.
    Potřebuji aby příkaz if mi při splněné podmínce splnil,ale jen jednou (na určitou dobu -třeba 5 sekund a pak už ne.
    Dokud se podmínka nezmění.
    To znamená že až fotoodpor změní stav tak se udělá druhá podmínka.
    Mám to na zatáhnutí žaluzii večer a ráno na odtažení podle fotoodporu.

    int ldr = 0; //analogovy pin kde je pripojeno LDR
    int ldr_value = 0; //variable to store LDR values
    int c = 1000;
    void setup()
    {
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    Serial.begin(9600); //spuštění serioveho rozhrani
    }

    void loop()
    {
    ldr_value = analogRead(ldr); //čte hodnoty LDR
    Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
    if(ldr_value > 500){ //první podmínka (stmívání) hodnota z fotoodporu
    digitalWrite(8,LOW); // pro dc motor
    digitalWrite(9,HIGH);
    delay(6*c);}
    if(ldr_value > 500) digitalWrite(9,LOW);
    if(ldr_value < 500) ……………….;//druhá podmínka (rozednění)
    ……
    …… ještě nemám doděláno
    delay(100); //wait

    Takto jsem začal a nevím jestli dobře.
    Díky moc za rady.
    L.

    #8656
    Zbyšek Voda
    Správce

    Co je připojeno na pinech 8 a 9?

    Zkusím vás nasměrovat 🙂 Přidejte si ještě jednu proměnnou, ve které budete uchovávat, jestli je žaluzie zatažená, nebo roztažená.

    Potom budete zkoumat:
    -je hodnota nad určitou hodnotu a je roztaženo? -> zatáhni
    -je hodnota pod určitou hodnotu a je zataženo? -> roztáhni

    Také nesmíte zapomenout nastavit aktuální hodnotu proměnné po zatažení či roztažení.

    PS. Asi v kódu myslíte analogový pin A0, ne jenom 0 🙂

    #8660
    Ladis_Kv
    Účastník

    Na pinech 8 a 9 bude dc motorek,přes budič L298N.
    A ten analog je A0.
    Když se setmí tak hodnota zůstane (nad 500) ,takže potřebuji aby to jednou seplo na určitou dobu a pak se vlastně čeká až na ráno kdy se hodnota změní pod 500.

    #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.

    #8664
    Ladis_Kv
    Účastník

    Díky moc,
    je vidět že to dost umíte.
    Já to promyslím vše,dopíšu jak má být a vyzkouším.
    Pak se ozvu a napíšu jak to dopadlo.
    p.s. jsem trochu pomalejší… 😀
    ještě jednou díky
    L.

    #8665
    Ladis_Kv
    Účastník

    No trochu v tom bádám…a nevím..
    asi to nebude fungovat,nebo tomu nějak nerozumím.
    Budu mít na dvou digi výstupech zapojen budič pro morky.A tam se bude otáčet napětí.
    Nemám koncáky a nic jiného.Chci to zkusit časově.Pokud to půjde.A chci jen zavřít a otevřít žaluzie -ne vytahovat je nahoru a dolu.
    Prvně jsem tam chtěl dát krokový motor,ale nenašel jsem vhodný typ(jak výkonem,tak velikosti).
    Máte někdo jiné nápady,které by mi pomohly?Děkuji
    Budu rád za jakoukoli radu k danému problému.

    #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
    }
    
    } 
    #8667
    Ladis_Kv
    Účastník

    jo servo by bylo lepší, ale nenašel jsem které by mělo průměr 25mm a dostatečný výkon aby to s tím otočilo.
    Zatím jsem takový nenašel.Jen motor DC s převodovkou.
    Ten motor by měl být schovaný v žaluzii.
    No zkusím se s tím nějak poprat.
    Díky

    #8673
    Vojtěch Vosáhlo
    Účastník

    Já bych použil nějaké optické hradlo a takové to kolečko kde se střídá černá a průhledná. Vzor se dá sehnat na internetu a na laserovce vytisknout na průhlednou fólii. Hradlo můžete koupit a nebo i s kolečkem vytáhnout ze staré tiskárny. Asi by to mohlo fungovat dobře, nemusíte natahovat kablíky pro koncáky a můžete použít nějaký obyčejný motor. Pak se to dá ovládat prakticky jak servo.
    Držim palce

    #8684
    Ladis_Kv
    Účastník

    Jo tak nad tím jsem uvažoval taky.Bylo by to super (optické snímače jsou i levné) a také přesné hlídání krajních poloh.Jenže jak jsem psal dříve,tak to chci dát dovnitř žaluzie (kde jsou převody a roluje se tam ten pásek)
    A tam je prostor cca 25x25x70mm. Takže mi tam tam optický člen nevejde.
    Vlastně potřebuji jen aby příkaz IF udělal jen jednou a pokud se neudělá druhá podmínka tak aby se už nedělal ten první příkaz.Vypadá to jednoduše,ale…..
    Viz výše mi poradil Petan.Trochu nad tím musím popřemýšlet a něco vytvořit.
    Jsem opravdu začátečník,tak mi to do té hlavy moc nejde…
    Ale díky za rady.

    #8690
    posjirka
    Účastník

    pokud tam máš 25x25x70mm tak to je místa víc než dost:
    http://www.ges.cz/cz/tcst1103-GES05100332.html
    http://www.ges.cz/cz/tcst2103-GES05100333.html
    http://www.ges.cz/cz/cny70-GES05100334.html
    stačí si vybrat který ti bude vyhovovat a samozřejmě je ještě více typů.
    Dal bych to na PCB, který by ti umožnil jak lepší přidělaní, tak i připojení kabelu ….

    #8691
    Ladis_Kv
    Účastník

    jo to je dost místa,ale zrovna ho zabírá motor s převodovkou a chtěl bych jít k tomu jen s dvěma dráty.
    motor bych tam chtěl tento https://goo.gl/AG8l9X

    #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…

    #8701
    Ladis_Kv
    Účastník

    Petane mohl by jsi mi prosím tě s tím programem pomoct(napsat ho).Sám to zřejmě nezvládnu.Nějak v tom lítám a nedokážu udělat
    cyklus aby při „tmě“ se udělal 1 příkaz pro povel „zavři“ a potom se zase mohl udělat až po cyklu otevři.
    Nakonec tam nebude intenzita,ale logická 1(zavřeno),nebo logická 0(otevřeno).
    Pro tebe to bude maličkost a já se tím naučím víc…
    Nebo pokud budeš ochotný tak mi to pošli na e-mail. ladkva@gmail.com
    Díky
    L.

    #8704
    Ladis_Kv
    Účastník

    Tak jsem to dal dohromady,ale ještě nevím jak deklarovat „otevreno“ a „zavreno“ -třetí a čtvrtý řádek.
    Aby potom fungovalo true a false.
    Poradiš mi?Děkuji

    int ldr = 0;
    int ldr_value = 0;
    //int otevreno = ???
    //int zavreno = ??
    void setup()
    {
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    //pinMode(A0,INPUT);
    Serial.begin(9600); //spuštění serioveho rozhrani
    }
    void loop()
    {
    ldr_value = analogRead(ldr); //čte hodnoty čídla
    Serial.println(ldr_value);
    if(ldr_value > 500){ //první podmínka (stmívání)
    //if(otevri){
    zavri();
    // }
    }
    else{
    if(ldr_value < 500){ //druhá podmínka (rozednění)
    otevri();
    }
    }
    }

    void zavri(){
    digitalWrite(8,HIGH); // pro dc motor
    digitalWrite(9,LOW);
    delay(3000);
    zavreno = false;
    vypni();
    }
    void otevri(){
    digitalWrite(8,LOW); // pro dc motor
    digitalWrite(9,HIGH);
    delay(1000);
    otevreno = true;
    vypni();
    }
    void vypni(){
    digitalWrite(8,LOW); // pro dc motor
    digitalWrite(9,LOW);
    delay(1000);
    }

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 31)
  • Pro reakci na toto téma se musíte přihlásit.