marvik.jiri
Vytvořené odpovědi
-
AutorPříspěvky
-
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ýchodumarvik.jiriÚčastníkDí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 vychodevoid 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);
}marvik.jiriÚčastníkDě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ě 🙂
marvik.jiriÚčastníkMám čistě hypotetickou otázku 🙂
Za předpokladu, že jeden den bude příznivé počasí a hodnoty budou splněny (25°C, světelné podnínky) třeba v 9hodin a další dny bude počasí ještě hezčí a podmínky se splní již v 6hodin. Nebo snažší příklad. Začátek léta kdy nejsou potřebné podmínky časně z rána a průběh léta, kdy jsou splněny o poznání dříve.
Dá se do programu zadat výpočet pro výchozí hodnoty pomocí potenciometru?
Jako příklad uvedu:
Fotorezistor udává hodnoty od 12 (ostré světlo) po cca 700 (tma)původní data
int maxRozdilSvetla = 50 ;
int minSvetloRV = 150 ; // minimální hodnotu pro zapnutí filtrace
int minSvetloRZ = 150; //pokud bude nižší tak program vypne a čeká do svítání na RVnová data s použitím potenciometru pro úpravu výchozích hodnot
Teď nevím jaký rozsah bude mít 10KOhmový potenciometr, ale například 2000… což je daleko více než fotorezistor ve tmě (cca 3x) a musím připojit na digitál jelikož analog již nemám volný.definice pinu
int pinPot = 2 ; //pin s potenciometrem 10K
int pinPot_value = 2;
int maxRozdilSvetla = 50+(digitalRead(pinPot)/3) ; // výchozí hodnota nastavená na zhoršené podmínky + hodnota z potenciometru / 3
int minSvetloRV = 150+(digitalRead(pinPot)/3) ; //minimální hodnotu pro zapnutí filtrace
int minSvetloRZ = 150+(digitalRead(pinPot)/3) ; //pokud bude nižší tak program vypne a čeká do svítání na RVmarvik.jiriÚčastníkTady mám asi nesmysl.
if(minSvetloRV > 120) digitalWrite (pinMotorP = HIGH);
Nemělo by tam být spíše:
if(minSvetloRV < pinRV_value) digitalWrite (pinMotorP = HIGH);
nebo
if(120 > pinRV_value) digitalWrite (pinMotorP = HIGH);marvik.jiriÚčastníkKonečně jsem po několika hodinách něco spáchal. Je to zatím jen nadefinování, natočení do výchozí pozice a zapnutí filtrace-transformátoru. Můžete mi potvrdit, zda by to takto mohlo fungovat nebo dělám hlouposti.
//Definice pinu
int pinR1 = A0; //pin s fotorezistorem 1
int pinR2 = A1; //pin s fotorezistorem 2
int pinRZ = A2; //pin s fotorezistorem na zapade
int pinRV = A3; //pin s fotorezistorem na vychode
int pinMotorP = …; //pin s rele spoustejici motor doprava
int pinMotorL = …; //pin s rele spojstejici motor doleva
int pinKoncakV = .. ; //pin s koncovym spinacem na vychode
int pinKoncakZ = …; //pin s koncovym spinacem na zapade
int pinTrafo = …; //pin s rele pro zapnuti trafa napajeni motoru
int pinFiltr = …; //pin s rele pro zapnuti filtrace
int pinTepVzd = A4; //pin na čidlo teploty vzduchu
int pinTepVod = A5; //pin na čidlo teploty vody
//int pinTlacFiltr = …; // pro ruční zapnutí/vypnutí filtrace !!! – zatím nepoužito//Definice hodnot pouzivanych programem
int maxTeplotaVzduchu = …;
int minTeplotaVzduchu = …;
int maxTeplotaVody = …;
int minTeplotaVody = …;
int maxRozdilSvetla = …; //30
int minSvetloRV = …; // čeká na minimální hodnotu pro zapnutí filtrace
int minSvetloRZ = …; //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 = A0; //pin s fotorezistorem 1
int pinR2_value = A1; //pin s fotorezistorem 2
int pinRZ_value = A2; //pin s fotorezistorem na zapade
int pinRV_value = A3; //pin s fotorezistorem na vychodevoid 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);
//nastav pin tlačítka pro ruční zapnutí filtrace
//pinMode(pinTlacFiltr, INPUT); zatím nepoužito
{
Serial.begin(9600);
Serial.println(„Pripojeno“);
}
}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);
}marvik.jiriÚčastníkZkusil jsem udělat nástřel struktury programu.
int rozdilRezistoru(){
int R1 = analogRead(pinR1); //Přečtu napětí na prvním fotorezistoru
int R2 = analogRead(pinR2); //Přečtu napětí na druhém fotorezistoru
int rozdil = R1 – R2; //Rozdíl napětí
return rozdil; //Vrátím rozdíl napětí jako hodnotuvoid setup() {
pinMode(11, OUTPUT); //nastav pin 11 jako vystup = motor doprava – solar natáčí k východu
pinMode(12, OUTPUT); //nastav pin 12 jako vystup = motor doleva – solar natáčí k západu
pinMode(10, INPUT); //nastav pin 10 jako vstup = koncový spínač východ
pinMode(9, INPUT); //nastav pin 9 jako vstup = koncový spínač západ
pinMode(8, OUTPUT); //nastav pin 8 jako vstup = rele zapínání filtrace a transformátoru po motor solárního panelu
}pokud na teplotním snímači ovzduší je hodnota menší než 25 = zastav program
pokud na teplotním snímači ovzduší je hodnota větší než 25 = pokračuj dále // například 25°C
digitalWrite (8,HIGH) // zapne filtraci a napájení transformátoru (půjde zapínat i samostatně přes vypínač)
pokud (hodnota světla menší na „pinR1“ než 10 = nedělej nic //hodnota je informativní
pokud (hodnota světla větší na „pinR1“ než 10 = otáčej motor doprava až na koncový spínač K1 digitalWrite (11,true) //číslo pinu je informativní
pokud sepnuto pinK1 = digitalWrite(11,LOW); //na pinu 11 vypni proud = motor se zastavý
pokud na pinu R2 bude větší hodnota než na R1 = digitalWrite (12,true) – /* tady vycházím z toho že pin R1 je více na východ a R2 na západní stranu
je nutné určit rozsah (od – do) jalové hodnoty mezi R1 a R2, aby nedocházelo k tomu, že se bude chtít natáčet každých pár minut o milimetry.
Ještě k tomu snímámí hodnot z fotorezistorů by se měla dát určitá časová prodleva – třeba 30s z důvodu kdy půjde mrak a zastíní jeden z nich
*/
pokud sepnuto pinK2 digitalWrite(12,LOW); //na pinu 12 vypni proud = motor se zastavý
pokud na teplotním snímači vody je více jak 28°C = digitalWrite (12,true) až na koncový spínač K2 /* bude se snažit odstínit panel ze sluníčka
Ono by to chtělo zase nějak zprůměrovat a k večeru přetočit na východní stranu aby později večer a při západu na panel nesvítilo sluníčko, ale to
by se teď asi nemuselo řešit. To by se dalo až úplně nakonec v horším případě vynechat zcela. Tohle měli řešit ty další dva pevné fotorezistory*/
Pokud na teplotním snímači ovzduší menší teplota než na sníémači vody zastav filtraci digitalWrite (8, LOW)marvik.jiriÚčastníkNo… když to řeknu úsměvně tak jsem panic 🙂
S arduinem jsem začal cca před 2-mi měsíci a dostanu se k pc abych měl čas programovat jen po večerech a to jen někdy. Zatím jsem si hrál převážně s led. Dělal jsem synovi světelnou semafor pro auta s přechodem pro chodce. Ono se toho na Unu moc nedá udělat, když je k dispozici jen nějakých 18pinů. Toto bylo na 10 pinů. Dále jsem zkoušel infra přijímač s výpisem kódu z dálkového ovladače přes sériovou linku a následně jsem se snažil doprogramovat záměnu kódu a vyslání vysílačem jiný. Jednoduše řečeno pokud arduino přijme určitý kod (třeba ze starého ovladače od videorekorderu tak vyšle jiný kod, který přepne na televizi třeba kanál nebo zesílí zvuk. Má to být něco jako univerzální ovladač. Bohužel jsem to nedodělal. Dokážu pouze ovládat ledky na pinech dálkovým ovladačem.Ztroskotal jsem na zkušenostech. Použil jsem jiné programy, které jsem se snažil zkompilovat do jednoho.
Můj poslední výtvor je plně funkční mechanická přístrojová deska z auta kterou ovládá arduino a mám ji ke hře Euro Truck Simulátor. Zde jsem použil kód os Silase, kterou následně ještě někdo upravil a vytvořil plugin přímo pro hru. Zde jsem částečně upravil a částečně doprogramoval kód. Jelikož jsem použil místo Megy Uno a navíc místo led displeje 1602 připojenou přes ISP převodník (snad to píši správně).Vyhledávám podobné aplikace tomu čeho chci dosáhnout a snažím si je předělat nebo doprogramovat. Takže zkušeností jen málo… 🙁
marvik.jiriÚčastníkDobrý den Vojto,
děkuji za reakci a první připomínky a také za přijetí.
Hardwarově to vymyšlené mám. Mechanika je brnkačka 🙂
Již se projevuje má neznalost a málo zkušeností. V žádném případě netrvám na analogovém vstupu. Chtěl bych použít teplotní čidla například DS18B20. Jsou vodotěsná takže bych s jedním mohl měřit i teplotu vody.Samozřejmě před namontováním a zkušebním provoze program musím doladit na parapetu a výpisem na sériovou linku a s externím teploměrem vedle. Naměřené hodnoty pak zapsat do programu, tak aby fungoval dle představ a ne třeba o pár stupňů celsia jinak. Takjisto zkalibrovat světelné podmínky při použití fotodporů.
Použití 4 fotorezistorů s nichž jsou dva pevné jsem volil z toho důvodu, že by program hned věděl kde zhruba je a jakým směrem má natočit solární panel aby našel slunce. Fungovalo by to na principu rozdílu hodnot na fotorezistorech a zvolení směru natočení k tomu, který snímá větší intenzitu světla. Dále by fungovalo ovládání již jen podle těch dvou pohyblivých na panelu. Samozřejmě by vůbec nevadilo aplikovat pouze dva fotorezistory a napsat program jak uvádíte Vy. Funkce je naprosto stejná a funkční.
Vlastně máte pravdu. Slunce vychází pořád na stejné straně a tak by program věděl jakým směrem se má točit po zapnutí 😀
Zapomněl jsem uvést, že bych zařízení na noc nevypínal. Bylo by v provozu non-stop přes sezónu. Ideálně v programu dát podmínku při snížení intenzity světla zastavit program a pokračovat až ráno začne svítat znovu jej obnovit a natočit na východní stranu.Použití koncových spínačů mám v plánu jen jsem nechtěl v prvním příspěvku rozepisovat.
Vlastně tam budou na každé straně dva. Ideálně jeden pro impuls pro Arduino a druhý jako bezpečnostní, který odstaví napájení motoru kdyby motor nezastavil.Jirka
-
AutorPříspěvky