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 8 roky.
-
AutorPříspěvky
-
5.10.2016 v 12:49 #8655Ladis_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); //waitTakto jsem začal a nevím jestli dobře.
Díky moc za rady.
L.5.10.2016 v 13:05 #8656Zbyšek VodaSprávceCo 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áhniTaké 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 🙂
5.10.2016 v 13:59 #8660Ladis_KvÚčastníkNa 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.5.10.2016 v 18:36 #8661petanÚčastníkvoid 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.
5.10.2016 v 18:56 #8664Ladis_KvÚčastníkDí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.5.10.2016 v 20:20 #8665Ladis_KvÚčastníkNo 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.5.10.2016 v 20:57 #8666petanÚč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 } }
5.10.2016 v 21:25 #8667Ladis_KvÚčastníkjo 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íky6.10.2016 v 15:22 #8673Vojtěch VosáhloÚčastníkJá 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 palce6.10.2016 v 16:09 #8684Ladis_KvÚčastníkJo 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.6.10.2016 v 21:37 #8690posjirkaÚčastníkpokud 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 ….6.10.2016 v 22:32 #8691Ladis_KvÚčastníkjo 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/AG8l9X7.10.2016 v 20:37 #8699petanÚčastníkPř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…
9.10.2016 v 0:01 #8701Ladis_KvÚčastníkPetane 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.10.10.2016 v 12:12 #8704Ladis_KvÚčastníkTak 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ěkujiint 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);
} -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.