Close

Otáčení solárního panelu za sluncem

Úvodní stránka Fórum Vaše projekty Arduino Otáčení solárního panelu za sluncem

  • Toto téma obsahuje celkem 23 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 6 roky a 9 měsíci.
Aktuálně je na stránce zobrazeno 9 příspěvků - 16. až 24. (celkem z 24)
  • Autor
    Příspěvky
  • #11905
    MiK
    Účastník

    Skoro by stálo za úvahu, podívat se na celý problém z trochu jiného pohledu.

    Jestli jde jen o to, aby se panel natáčel pořád za Sluncem, tak ho přece stačí přidělat na krokový motor, který bude mít svou osu sklopenou na 50° nad severní horizont (osa bude mířit na Polárku).

    A ten motor se pak už bude pomalu krokovat tak, aby se otočil přesně o 1 otáčku za 24 hodin.
    Odpadnou všechny čidla (zůstanou jen 2 bezpečnostní koncáky, aby se panel nepřetočil kolem dokola).

    V principu to tedy bude jakási paralaktická vidlicová montáž, jaká se používá v Astronomii.

    Takže by to vypadalo nějak takhle:
    http://home.zcu.cz/~smid/stroje/bobik.jpg

    Akorát místo dalekohledu by tam byl solární panel
    A myslím, že by mohla odpadnout i ta možnost natáčení panelu nahoru a dolu (deklinace). Prostě by se napevno nastavila nějaká „průměrná letní“ deklinace.

    #11917
    marvik.jiri
    Účastník

    Děkuji všem za Vaše příspěvky a trpělivost se mnou.
    Jako začátečníkovi mi uniká docela dost věcí a musím říci, že ne všemu co mi radíte rozumím nebo rozumím tím správným způsobem.
    „posjirka“ psal, že na digitálním pinu lze snímat jen I/O a v dalším příspěvku na obrázku zapojení čidel dáte snímače teploty „DS18B20“ na digitální piny. Vždyť z nich potřebuji získat hodnoty dle teploty vzduchu a vody…

    Pane Vosáhlo děkuji za výtky k chybám. Vše co Vám je divná a dotazujete se na to, jsou skutečně mé chyby a opravím je dle rad.

    Zkusím ještě jednou jednoduše popsat co od programu a snímačů chci:
    4x fotorezistor (http://www.the-diy-life.com/arduino-solar-tracker/)
    2x teplotní čidlo (https://www.tweaking4all.com/hardware/arduino/arduino-ds18b20-temperature-sensor/)
    1) po rozednění (pevný fotoodpor východ) splní min intenzitu světla = solar se natočí na východ na koncový spínač – (pevný fotoodpor východ + teplota vzduchu) splní druhou vyšší hodnotu = zapne se filtrace – dále se otáčení řídí dle rozdílu hodnot na 2x fotoodporu, který je přidělám na rámu solárního panelu. Např. R1 východní a R2 západní. – měřená hodnota na R1 je vyšší než na R2 = solar stojí => měřená hodnota na R1 je nižší než na R2 = sepne se rele a solar se pootočí k západu dokud hodnota na R1 nebude vyšší než na R2 – celé se to opakuje až na koncový spínač na západě – následně při poklesu hodnoty na pevném západním fotoodporu se program zastaví taktéž.

    Dále je v programu podmínka, nadřazená fotoodporům R1 a R2 a čidlu vzduchu. Jedná se o snímač teploty vody.
    Pokud je program v provozu (zapnuta filtrace a natáčení dle R1 a R2, ale bude překročena teplota vody (např.28°C) budou se vyhodnocovat data z pevného východního a pevného západního fotoodporu – určí se menší hodnota a k té se solar natočí až na koncový spínač tak, aby na solar dále nesvítilo sluníčko, ale schovával se do stínu.

    Snad jsem to popsal pochopitelně 🙂

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

    Pane si prosím nechte, na to ještě věk nemám 😉 a odpovím trošku za jirku, snad to nebude vadit
    DS18B20 jsou totiž digitální senzory – jednoduše řečeno vysílají jedničky a nuly s určitou časovou prodlevou (běží na protokolu onewire). Arduino si vlastně měří časy po které je pin na 1 a nebo na 0 a podle toho sestaví bity, z nich pak stvoří data. O tohle všechno se stará jedna knihovna která udělá vše za vás a vrátí vám teplotu. Proto se pro tyto čidla používají digitální piny.

    Zkuste na ten kód kouknout, něco poupravit a ozvěte se.

    #11921
    marvik.jiri
    Účastník

    Díky za vysvětlení.

    Asi se v tom začínám plácat… Mám to opravené správně?

    Asi ještě přidám na A4 ten potenciometr pro změnu výchozích hodnot.

    //Definice pinu
    #define pinR1 A0 //pin s fotorezistorem 1
    #define pinR2 A1 //pin s fotorezistorem 2
    #define pinRZ A2 //pin s fotorezistorem na zapade
    #define pinRV A3 //pin s fotorezistorem na vychode
    #define pinTepVzd 3 //pin na čidlo teploty vzduchu
    #define pinTepVod 4 //pin na čidlo teploty vody
    #define pinKoncakV 5 //pin s koncovym spinacem na vychode
    #define pinKoncakZ 6 //pin s koncovym spinacem na zapade
    #define pinMotorP 7 //pin s rele spoustejici motor doprava
    #define pinMotorL 8 //pin s rele spojstejici motor doleva
    #define pinTrafo 9 //pin s rele pro zapnuti trafa napajeni motoru
    #define pinFiltr 10 //pin s rele pro zapnuti filtrace
    #define pinTlacFiltr 11 // pro ruční zapnutí/vypnutí filtrace

    //Definice hodnot pouzivanych programem
    int minTeplotaVzduchu = 25; //°C
    int maxTeplotaVody = 28; //°C
    int maxRozdilSvetla = 20; //20 = zatím odhad

    // sem ještě dát zda je vyšší hodnota na R1 než // svítání
    int minSvetloRV = 150; // čeká na minimální hodnotu pro zapnutí filtrace
    int minSvetloRZ = 180; //pokud bude nižší tak program vypne a čeká do svítání na R1
    // vložit rozdíl mezi pevnými fotorezistory pro otočení solaru do stínu při dosažení určité teloty vody
    int RozdilSvetla = …; // pokud bude voda teplejší jak … tak se bude solar otáčet na stranu k nižší hodnotě světla a odstiňovat další ohřev
    boolean nasleduj = …; //promena skryvajici 1 nebo 0 bude urcovat jestli chceme ohrivat nebo ne
    boolean stin = …; //promena skryvajici 1 nebo 0 bude urcovat jestli chceme odstinit ohrev nebo ne
    //pro seriovou linku
    int pinR1_value; //pin s fotorezistorem 1
    int pinR2_value; //pin s fotorezistorem 2
    int pinRZ_value; //pin s fotorezistorem na zapade
    int pinRV_value; //pin s fotorezistorem na vychode

    void setup()
    {
    //nastav piny pro ovladani motoru na vystupy
    pinMode(pinMotorP, OUTPUT);
    pinMode(pinMotorL, OUTPUT);
    //nastav piny fotorezistoru jako vstupy
    pinMode(pinR1, INPUT);
    pinMode(pinR2, INPUT);
    pinMode(pinRZ, INPUT);
    pinMode(pinRV, INPUT);
    //nastav piny teplotních čidel jako vstupy
    pinMode(pinTepVod, INPUT);
    pinMode(pinTepVzd, INPUT);
    //nastav piny s koncovymi spinaci jako vstupy
    pinMode(pinKoncakV, INPUT);
    pinMode(pinKoncakZ, INPUT);
    //nastav pin pro ovladani trafa a filtrace jako vystup
    pinMode(pinTrafo, OUTPUT);
    pinMode(pinFiltr, OUTPUT);
    pinMode(pinTlacFiltr, INPUT);
    //nastav pin tlačítka pro ruční zapnutí filtrace
    //pinMode(pinTlacFiltr, INPUT); zatím nepoužito
    }
    {
    Serial.begin(9600);
    Serial.println(„Spojeno“);
    }

    void loop()
    {
    Serial.println(„R1“);
    pinR1_value = analogRead(pinR1); //čte hodnoty fotorezistoru R1
    Serial.println(pinR1_value); //zobrazí hodnoty R1 na seriove lince
    Serial.println(„R2“);
    pinR2_value = analogRead(pinR2); //čte hodnoty fotorezistoru R2
    Serial.println(pinR2_value); //zobrazí hodnoty R1 na seriove lince
    Serial.println(„RZ“);
    pinRZ_value = analogRead(pinRZ); //čte hodnoty fotorezistoru RZ
    Serial.println(pinRZ_value); //zobrazí hodnoty R1 na seriove lince
    Serial.println(„RV“);
    pinRV_value = analogRead(pinRV); //čte hodnoty fotorezistoru RV
    Serial.println(pinRV_value); //zobrazí hodnoty R1 na seriove lince
    Serial.println(„konec“);
    delay(1000); //wait
    }
    {
    // Po rozednění natočení na východ

    // po rozednění se se solární panel natočí k východu, když hodnota na R1 vzroste nad určitou hodnotu
    if(minSvetloRV > 120) digitalWrite (pinMotorP, HIGH);
    while(digitalRead(pinKoncakV) == 0){ //otacej motorem na pravo dokud se nesepne koncak
    digitalWrite(pinMotorP, LOW);
    while(digitalRead(pinKoncakV) == 1) //zastav otaceni motorem na pravo – je sepnut koncak
    digitalWrite(pinMotorP, LOW); }
    }
    {
    // FILTRACE ZAP-VYP
    // po rozednění se sepne filtrace, když hodnota na RV vzroste nad určitou hodnotu zapne se filtrace
    if(minSvetloR1 > 120) digitalWrite (pinFiltr, HIGH);
    // po schování slunce za horizont se filtrace vypne, když hodnota na RZ klesne pod určitou hodnotu
    if(minSvetloR2 < 140) digitalWrite (pinFiltr, LOW); // musí být větší hodnota, aby se to nevyplo hned po zapnuti
    }
    {
    // Transformátor ZAP-VYP

    // po rozednění se sepne trafo, když hodnota na R1 vzroste nad určitou hodnotu, která je vyšší než hodnota filtrace
    if(minSvetloR1 > 80) digitalWrite (pinTrafo, HIGH);
    // po schování slunce za horizont se trafo vypne, když hodnota na R2 klesne pod určitou hodnotu, která je vyšší než hodnota filtrace
    if(minSvetloR2 < 95) digitalWrite (pinTrafo, LOW);
    }

    #11922
    posjirka
    Účastník

    DS18B20 je digitální čídlo se sběrnicí 1-wire. Tzn. že si veškerou komunikaci posílá přes 1 digitální pin. čte z čidla ovšem aktuální teplotu (-55 … +125 st.C) i když přes digitální pin.

    4 fotorezistory jsou podle mě zbytečné když nebudeš panel ještě naklánět. právě se dávají 2 fotorezistory oddělené vertikální přepážkou a někdy se polepují třeba alobalem aby brali i světlo z druhé strany. Právě pro měření min. intenzity světla.

    napsal jsem ti jednoduchý algoritmus jak by to mohlo celé fungovat, i když už dost velkou část máš …

    používej prosím párové značky CODE. zachová se ti i formátování kodu a bude přehlednější. Formátováním teď myslím odstazením např. závorek…

    #11925
    posjirka
    Účastník

    asi tě nechám v dobrých rukou ch Vojtěcha, a´t na tebe nesypeme rady ze 2 stran. Kdyby byl problém ozvi se …

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

    No nevím jestli v nejlepších rukou, k takovým funkčním diagramům mám ještě kousek cesty. Mimo to kde je kreslíš? Nějaký osvědčený soft by se hodil.

    Každopádně vložte sem prosím kód jak psal jirka. Použijte možnost textu code. Takhle se to opravdu velmi těžko čte. Nebo to vložte třeba na pastebin a pak pošlete odkaz, je to jedno. Člověk se v tom akorát nemůže vyznat…

    #11927
    marvik.jiri
    Účastník

    Tak nějak by to mělo skutečně fungovat. Jen bych upravil to natočení o vteřinu, ale rád bych na konkrétní snímané hodnoty. Čtení by mohlo být delší i třeba 5minut. Jen narážím na problem s mrakem, který zrovna zakryje jeden fotorezistor nebo proletí pták, list. Cokoli co může na chvilku zastínit jeden ze dvou fotorezistorů. Proto si myslím, že by bylo lepší snímat po čase (třeba 1-5minut) kontinuálně hodnoty z rezistorů a při spuštění motoru je sledovat dokud se nevyrovnají a poté natáčení vypnout a opět čekat několik minut.

    Fotorezistory 2 pohyblivé s panelem a 2pevné.
    pohyblivé na sledování slunce
    pevné na spuštění programu při svítání a následně při nahřátí vody k určení polohy slunce = dopoledne – FRvýchod má vyšší hodnotu světla =>solar se schová na západní stranu / odpoledne – FRzápad má vyšší hodnotu světla => solar se natočí na koncový spínač východu

    #11931
    posjirka
    Účastník

    to vojtech: používám diagram designer.je až primitivně funkční:
    https://www.zive.cz/clanky/diagram-designer-rychla-tvorba-diagramu-zdarma/sc-3-a-167191/default.aspx

    to marvik: z těch pevných fotoodporů mám trochu osypky. startovat proces při východu slunce je velmi nešťastné. nezapomeň, že i krátkodobý výpadek napájení (špička) ti může resetovat procesor. Ten pak „ztratí nit“ a musí se něják znovu chytit. jinak ti může spinkat do dalšího rána. proto se mi to řešení moc nelíbí. Rozhodně schavaluju koncáky jako vymezení max. polohy otáčení panelu. Nastavení na nejlepší hodnoty samozřejmě jde.

    Zatím bych se vykašlal na „solární chlazení“ při překročení 28 st.C.

    V příloze máš upravený algoritmus. je to už trochu hybrid a nejsme z něj moc nadšený. Radši bych celý proces regulace řešil „real time“ bez zpoždění. No pro začátek by ti toale mohlo vcelku vyhovovat…

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