Vojtěch Vosáhlo
Vytvořené odpovědi
-
AutorPříspěvky
-
Vojtěch VosáhloÚčastník
Spotřeba závisí na tom jak vše budete používat, NRF i arduino mají možnosti spánku které mohou snížit odběr třeba 100x a více. Vše teda závisí na tom jak si kód napíšete. Kdybychom se podívali na nejhorší možnost, zřalo by NRF nonstop 12mA a arduino kolem 10mA. To je 22mA, na 3 hodiny by byla tedy potřeba baterie > 66mAh.
Chce to samozřejmě větší baterii aby napětí při vybití nekleslo na hodnotu menší než 3.3V, to je vše v datasheetu.Pokud je v datasheetu max 3.,6V tak bych do toho 3,7V nepouštěl, dobře to tomu určitě neudělá…
PROSÍM POUŽÍVEJTE NOVÉ FÓRUM, TOTO BUDE BRZY VYPNUTÉ.
Vojtěch VosáhloÚčastníkNefunguje protože byl špatný, tady je pro úplnost ten správný http://playground.arduino.cc/Learning/WhatAdapter
Vojtěch VosáhloÚčastníkJe to souosý konektor s vnitřním průměrem 2.1mm a + uvnitř. Na GME třeba toto: https://www.gme.cz/napajeci-souosy-konektor-dci-scp-2009b
Pak už stačí jen klipsa na 9v baterii.
Arduino o tom má i článek ? zde.Vojtěch VosáhloÚčastníkPole musíte mít nadefinované mimo smyčku, třeba na začátku programu. Takhle s ním může pracovat jen smyčka ve které bylo pole „stvořené“.
Vojtěch VosáhloÚčastníkNo 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…
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.
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í.
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.
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.
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.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í.
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.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 }
Vojtěch VosáhloÚčastníkJá osobně bych u takového projektu volil DS18B20, dají se najít i v hezkých vodotěsných obalech a nikdy s nimy nebyl problém. Pojďme tedy na takovou reprezentaci programu slovy:
//definice pinů a proměnných smyčka{ pokud (cas = den){ pokud(chceme ohrivat){ //třeba 10, chce to nějaký prostor, testovat jestli se = 0 by nemělo význam dokud (rozdil fotorezistoru < 10){ otacejMotor(strana = x); //Otáčej motor na stranu kde je na fotor. víc světla } }nebo pokud(nechceme ohrivat){ otacejMotor(strana = x); //Otáčej motor tak aby na pannel svítilo co nejmíň světla - nebo nastav panel na jednu z konečných pozic } }pokud (cas = noc); // Nedelej nic }
Je to super zjednodušené ale pomůže to pro představu. Osobně bych začal „kódit“ trochu od prostředka. Pojďme zkusit třeba zrealizovat funkci co přečte rozdíl mezi fotorezistory.
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 }
Tahle funkce vám jednoduše vrátí rozdíl mezi senzory. Ale pozor, není to hodnota napětí. analogRead(); totiž vrací hodnoty 0-1023 (10bit) které jsou vlastně namapované na referenci. Tzn. s referencí 5V znamená hodnota 0 0V a 1023 5V. Je to zatím srozumitelné? Můžete začít stavět základní strukturu programu podle toho co jsem napsal výše a pak přidávat funkce které vám ulehčí práci.
Ptejte se na vše co vám přijde na mysl. Taky si kdyžtak řekněte pokud popisuju něco co jsou pro vás už banálnosti, opravdu nevím jak jste na tom 🙂
-
AutorPříspěvky