nicolasoto
Vytvořené odpovědi
-
AutorPříspěvky
-
posjirka
Účastníkasi 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 …
posjirka
ÚčastníkDS18B20 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…
Attachments:
marvik.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);
}Vojtěch Vosáhlo
ÚčastníkPane 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.
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ě 🙂
Zbyšek Voda
ÚčastníkJestli je to opravdu problém s nepodepsanými ovladači (instalace hlásí „The third-party INF does not contain digital signature information“, nebo něco na ten způsob), tak by mohl pomoci tento postup: http://forum.arduino.cc/index.php/topic,94651.msg727588.html#msg727588
Pokud vím, tak se tento problém objevoval na Win8 a Win10. Vy máte ale Win7, ne?
santa999
ÚčastníkDobrá tedy, počkám na další rada. I tak Vám moc děkuji. Už přemýšlím že to hodím do koše 😀
Vojtěch Vosáhlo
ÚčastníkPak by se dalo vypnout vyžadování digitálního podpisu a naistalovat ovladače ale být vámi ještě počkám. Nejspíš se tu ozve někdo kdo bude vědět víc než já. To co jsem navrhoval byly nejstandardnější řešení.
santa999
Účastníkzkusil sem, už se jmenuje arduino uno ale píše to že nemá digitální podpis. IDE ho vidí ale stále nedokáže zapsat.
Attachments:
Vojtěch Vosáhlo
ÚčastníkNo jediné co mě přijde divné je že se ve správci zařízení zobrazuje arduino jako USB Serial Port. Kdyby byl na čipu správný firmware nebo byly naistalované správné ovladače mělo by se projevovat jako Arduino UNO. Možná je to ale jen tím že je neoriginální. Vy jste zkoušel přeinstalovat ovladače? Zkuste je odstranit a nainstalovat ty výchozí od arduina. COM port nechte na COM9.
santa999
Účastníkzkusil sem změnit na com9 ale stále to píše to stejné. Máte prosím ještě nějaký nápad?
Attachments:
MiK
ÚčastníkSkoro 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.jpgAkorá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.Vojtěch Vosáhlo
ÚčastníkA jste si jistý že je to opravdu arduino? Např když ho odpojíte, zmizí COM1 ze správce zařízení? Osobně bych čekal že to bude spíš COM7.Nevšiml jsem si pojmenování, je to COM1. Postupujt tedy jak popsáno níže.Pokud jste si jistý že to arduino je tak bych postupoval podle tohoto návodu. Pravym na ten port o kterym si myslíte že je to arduino, proklikejte se jako v návodu a změňte COM1 na něco jiného. Třeba COM9.
santa999
Účastníkjako správce jsem zkoušel problém přetrvává. Posílám screenshot měl by to být com1
Attachments:
Vojtěch Vosáhlo
ÚčastníkDůležitá je tato linka:
avrdude: ser_open(): can’t open device „\\.\COM1“: Přístup byl odepřen.
Arduino IDE očividně nemá přístup k danému portu.
Používáte správný port? Screenshot ze „správce zařízení“ (pokud máte windows)by mohl pomoci.
Zkuste arduino IDE spustit jako správce a pak programovat.
Zkuste vypnout jakékoliv programy které by mohly port blokovat.santa999
ÚčastníkArduino: 1.8.3 (Windows 7), Vývojová deska: „Arduino/Genuino Uno“
Projekt zabírá 928 bytů (2%) úložného místa pro program. Maximum je 32256 bytů.
Globální proměnné zabírají 9 bytů (0%) dynamické paměti, 2039 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM1 -b115200 -D -Uflash:w:C:\Users\“smazáno“\AppData\Local\Temp\arduino_build_264646/Blink.ino.hex:iavrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg WunschNastala chyba při nahrávaní projektu.
System wide configuration file is „C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf“Using Port : COM1
Using Programmer : arduino
Overriding Baud Rate : 115200
avrdude: ser_open(): can’t open device „\\.\COM1“: Přístup byl odepřen.avrdude done. Thank you.
Táto zpráva by měla mít víc informacií v
„Zobrazení podrobného výstupu při kompilaci“
podle zapnuté volby v Soubor -> Nastavení.santa999
ÚčastníkMáš na mysli tohle nebo to je něco jiného?
Arduino: 1.8.3 (Windows 7), Vývojová deska: „Arduino/Genuino Uno“
Archiving built core (caching) in: C:\Users\“smazáno“\AppData\Local\Temp\arduino_cache_959925\core\core_arduino_avr_uno_0c812875ac70eb4a9b385d8fb077f54c.a
Projekt zabírá 928 bytů (2%) úložného místa pro program. Maximum je 32256 bytů.
Globální proměnné zabírají 9 bytů (0%) dynamické paměti, 2039 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
avrdude: ser_open(): can’t open device „\\.\COM1“: Přístup byl odepřen.Problém s přenosem dat na vývojovou desku (board). Na http://www.arduino.cc/en/Guide/Troubleshooting#upload naleznete další doporučení.
Táto zpráva by měla mít víc informacií v
„Zobrazení podrobného výstupu při kompilaci“
podle zapnuté volby v Soubor -> Nastavení.Vojtěch Vosáhlo
ÚčastníkStejná otázka, co vypíše arduino IDE? Nejlepší by bylo v nastavení zapnout slovní výstup (verbose output) a pak poslat co vypíše konzole při nahrávání.
santa999
ÚčastníkAhoj, koupil jsem si uno R3 na ebay ale nejdou mi drivery na čipu je psáno mega16u2 1708 ph a8xs3a.
zkoušel jsem snad už vše co jsem našel ale nahrát data na desku nelze ale info o desce mi to vyčte. může někdo poradit prosím?posjirka
Účastníkpodle popisu bych viděl použité vstupy výstupy takto (příloha)
jestli souhlasí tak těm pinům můžeme dát rovnou pozici na Arduinu.
Koukám že tam máš navíc Trafo a filtraci jako digi výstupy (opraveno).
Takže by ti to na UNO mohlo vyjít včetně 5 rezerv (4xdigi, 1xanalog) a to jsem tam ještě přihodil LCD 🙂Sktrukturu programu máš vcelku správně. na začátku s všechno načti (světlo, nastavení, teploty,..) pak vyhodnoť a nakonci zareaguj.
Vypadne ti z toho, že si jen všechno načteš a postupně pomocí podmínek ožiuješ jednotlivé výstupy …
Attachments:
posjirka
Účastníkpotenciometr jde řešit i na digitálním pinu, ale není to nic přesnýho.
Funguje to na principu:
Dig.out dej do log. 0 – vybije se kondenzátor
přepni na dig.in a čekej než se přepne do log.1
tento čas je roven velikosti natoční potenciometru.http://gcbasic.sourceforge.net/help/output/html/images/potb1.JPG
je třeba při psaní kodu používat párové značky CODE jinak se kod zapisuje nesprávně.
Doporučoval bych udělat si přehled použitých čidel, akutatoru a ovl. obvod + nějákou rezervu. Pak si teprve hrát s programem. Bude se ti lépe bádat když už budeš mít vše po ruce a nebudeš mít těžkou hlavu kde jsi co nevyřešil.
Axamith
ÚčastníkDěkuji moc, už objednávám. Někdy je problém správně pojmenovat, co hledáme. Ale souhlasím, velcí hráči na trhu a tak základní věc nenabízí.
Vojtěch Vosáhlo
ÚčastníkA teď k poslední otázce. Problém je že otáčenoím poťákem ničeho nedocílíte. Digitální piny umí číst jen hodnotu 0 nebo 1 a to vše závisí na tom jestli je překročena určitá napěťová hranice. Nedostanete tedy nic víc než 1 nebo 0.
Vojtěch Vosáhlo
Účastník1. Jak psal jirka, pro definici pinů používejte #define, tady jsem vás špatně navedl na proměnné. Definice vypadá třeba takto: #define pinR1 A0 2. Proč nastavujete hodnoty pinRx_value na nějaký z analogových pinů? Není to potřeba, stačí je inicializovat jako prázdnou proměnnou: int pinRx_value; Data se do nich zapisují až pomocí analogRead() 3. V setupu máte na konci navíc 2 závorky, proč? Měl jste s tím nějaký úmysl? Jde o tento kousek kódu:
{
Serial.begin(9600);
Serial.println(„Pripojeno“);
}
`
4.
Po void loop() máte spoustu závorek. To mají být funkce (smyčky)? Pokud ano chybí jim jméno a typ. Musí se definovat takto:
typ nazev(odatecne promenne){}
Typ: Void – nic nevrací
Název proměnné – int, boolean, … – funkce vrací hodnotu typu této proměnné5. DigitalWrite u filtrace ZAP-VYP máte špatně, ne digitalWrite(pinFiltr = HIGH) ale digitalWrite(pinFiltr, HIGH)
6.
Proměnné minNeco a maxNeco byly zamýšlené pro určení těch hranic. Podmínku byste tedy zapisoval třeba takto:
If(namrenaHodnota > R1min) neco sepni;
Namerena hodnota může být třeba z analogRead(); pokud tato hodnota stoupne nad hodnotu R1min která je pevně definovaná třeba na 120 tak můžete něco spustit.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);
}posjirka
Účastníkpřidám svoji troškou do mlýna:
Pro definici čísel pinu použivejte spíš #define
#define pinR1 1
na konci se nepíše středník. ROzdíl je v tom, že nezabíráte místo v paměti, ale při kompilaci program nahradí tyto zástupné „pinR1“ za hodnotu „1“.Co se týká těch 2 fotorezistorů, tak princip je trochu jiný než tu popisujete. Funguje to tak, že dáte 2 fotorezistory vedle sebe (východ a západ) a oddělíte je přepážkou. Potud to máte správně 🙂 Funkce je ale taková, že se panel snaží vyrovnat intenzitu světla na obou fotorezistorech na stejnou hodnotu. To co je ve stínu říka, že se má panel otočit na druhou stranu. Nemusíš právě skenovat celou oblohu, jen stačí najít nejasnější stranu a snažit se pohybem panelu vyrovnat hodnoty světla na obou stranách.
tady máš takový jednoduchý příklad:
Vojtěch Vosáhlo
ÚčastníkTak jo, máte to hezky nastrukturované, vzal jsem to a trochu poupravil. Nejdůležitější jsou asi ty proměnné, pokud je budete používat místo pevného definování pinů tak můžete pak cokoliv jednoduše měnit. Definice pinu by tedy teď měla vypadat třeba takto: int pinR1 = 11;
Pak jsem vzal kód který jste si jen tak předepsal a hodil ho do reálně funkčího kódu.
Opět se ptejte na vše co vás napadne.
//Definice pinu int pinR1 = ...; //pin s fotorezistorem 1 int pinR2 = ...; //pin s fotorezistorem 2 int pinRZ = ...; //pin s fotorezistorem na zapade int pinRV = ...; //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 pr zapnuti trafa a napajeni motoru //Definice hodnot pouzivanych programem int maxTeplotaVzduchu = ...; int minTeplotaVzduchu = ...; int maxTeplotaVody = ...; int minTeplotaVody = ...; int maxRozdilSvetla = ...; boolean ohrivej = ...; //promena skryvajici 1 nebo 0 bude urcovat jestli chceme ohrivat nebo ne 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 s koncovymi spinaci jako vstupy pinMode(pinKoncakV, INPUT); pinMode(pinKoncakZ, INPUT); //nastav pin pro ovladani trafa jako vystup pinMode(pinTrafo, OUTPUT); } void loop(){ //urcete si podminky kdy chcete aby se ohrivalo a kdy ne, podle toho se pak bude spoustet program dole if(neco a neco je splneno){ //treba pokud (teplotaVzduchu > teplotaVzduchuMin && teplotaVody < maxTeplotaVody) ohrivej = true; }else{ ohrivej = false; } if(ohrivej){ //spust program pouze pokud chceme ohrivat digitalWrite (pinTrafo,HIGH); // zapni filtraci a napájení transformátoru (půjde zapínat i samostatně přes vypínač) while(digitalRead(pinKoncakV) == 0){ //otacej motorem na pravo dokud se nesepne koncak digitalWrite(pinMotorP, HIGH); } digitalWrite(pinMotorP, LOW); //potom co se sepne koncak se smycka rozpadne a motor se vypne if(abs(rozdilRezistoru) > maxRozdilSvetla){ //pokud je rozdil svetla mezi rezistory (absolutni hodnota, chceme znat jen rozdil, ne ne kterem je vic a na kterem mene) vetsi nez maxRozdil svetla pokracuj dale //kod pro pohybovani panelem dokud se rozdil mezi rezistory nezmensi } } } 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 hodnotu }
-
AutorPříspěvky