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 🙂
Vojtěch VosáhloÚčastníkMáte to super vymyšlené a to je hodně důležité u jakéhokoliv projektu. Zaprvé máte už nějak navržené schéma? Většinou je lepší nejdříve dořešit hardware a pak až software. Taky by mě zajímalo pár věcí ohledně vašich rozhodnutí. Psal jste o teplotních čidlech. Proč byste rád použil analogová? Nic proti nim nemám ale nevím jak to bude s přesností při použití ADC (analogově digitální převodník) u arduina. Nevím jestli bude tak jednoduché zjistit rozdíl mezi 25 a 28 stupni (u některých je rozdíl třeba 10mV na stupeň celsia), pak by možná bylo lepší něco digitálního nebo použít externí napěťovou referenci (externí „zdroj“ napětí s minimálním šumem se kterým se potom porovnává napětí na analogových pinech). Bohužel nemluvím z vlastních zkušeností tak mě tu snad opraví někdo kdo analogy používá pokud melu nesmysly.
Fotorezistory můžete taky použít jen 2 místo 4. Panel by mohl při spuštění programu „proskenovat“ oblohu a zjistit kde slunce je a podle toho určit jestli je ráno nebo večer. Možná máte jiný důvod pro používání i těch pevně přichycených fotorezistorů ale já ho nevidím.
Určitě bych počítal s použitím limitových spínačů které vypnou motory když se panel otočí na určitou koncovou pozici. Ušetří vám to hodně starostí a zabere jen 2 piny.
Co se týče kódu, řešil bych to teprv až budete mít opravdu vymyšlený hardware. Pokud to ale chcete přesně tak jak jste napsal tak můžem začít makat na prográmku 🙂
Mimo to vítejte, super že se to tu tak rozrůstá
Vojta
Vojtěch VosáhloÚčastníkNašel jsem je na PTshop.cz, nemám žádný zkušeností ale mají je skladem.
https://www.ptshop.cz/Dupont-c24_6_2.htm
Divím se že SOSelectronic, GES, HWkitchen ani žádný další to nemá. Tolik věcí nám v ČR chybí…Vojtěch VosáhloÚčastníkNejlepší bude číst data z url, tedy nastavit textbox jako formulářový a mít pod ním tlačítko nastavené jako submit. Po stisknutí tlačítka se data z formuláře „odešlou“ a vy je přečtete z url. Otázka je jakou přesně aplikaci potřebujete. Je o tlačítko na odeslání přípustné nebo chcete číst na jiný podnět?
Vojtěch VosáhloÚčastníkPokud chcete samostudium tak stačí vědět co vlastně dělá client.read() a pak mít základní povědomí o smyčkách for a while.
Ve vašem případě by stačilo přidat do smyčky proměnnou ke které se při každém cyklu přičte 1. O tolik se pak posuneme v poli.
Zápis dat do pole by tedy vypadal asi takto:
int i = 0; while (client.available()) { c[i] = client.read(); i++; } i = 0;
pokud byste pak chtěl data vyčítat a třeba vypisovat, použil byste smyčku for asi takto:
for(int j = 0; i < sizeof(c); i++){ Serial.print(c[i]); }
Vojtěch VosáhloÚčastníkAsi tento plugin, stáhněte si ho a nainstalujte.
Poté kamkoliv na svou stránku vložte toto:
[insert_php] $thingspeakAPItemp = file_get_contents('https://api.thingspeak.com/channels/216038/fields/1/last'); $thingspeakAPIpress = file_get_contents('https://api.thingspeak.com/channels/216038/fields/3/last'); $thingspeakAPIhumi = file_get_contents('https://api.thingspeak.com/channels/216038/fields/2/last'); $tempLast = round($thingspeakAPItemp, 2) . " °C "; $pressLast = round($thingspeakAPIpress, 2) . " hPa "; $humiLast = round($thingspeakAPIhumi, 2) . "%"; [/insert_php] <h1>[insert_php] echo $tempLast; [/insert_php]</h1> <h1>[insert_php] echo $pressLast; [/insert_php]</h1> <h1>[insert_php] echo $humiLast; [/insert_php]</h1>
Vojtěch VosáhloÚčastníkNo jo, taky máme meteostanici na thingspeaku 🙂
Pro získání jsonu s poslední hodnotou stačí totohttps://api.thingspeak.com/channels/216038/fields/1/last.json?timezone=Europe%2FPrague
Když to obalíme jednoduchým php dostanete takovýto kódík který vypíše poslední hodnoty.
<?php $thingspeakAPItemp = file_get_contents('https://api.thingspeak.com/channels/216038/fields/1/last'); $thingspeakAPIpress = file_get_contents('https://api.thingspeak.com/channels/216038/fields/3/last'); $thingspeakAPIhumi = file_get_contents('https://api.thingspeak.com/channels/216038/fields/2/last'); $tempLast = round($thingspeakAPItemp, 2) . "°C "; $pressLast = round($thingspeakAPIpress, 2) . "hPa "; $humiLast = round($thingspeakAPIhumi, 2) . "%"; ?> <!DOCTYPE html> <html> <body> <h1><?php echo $tempLast ?></h1> <h1><?php echo $pressLast ?></h1> <h1><?php echo $humiLast ?></h1> </body> </html>
Pokud chcete vidět ukázku uploadnul jsem jí sem.
Vojtěch VosáhloÚčastníkJen malinký dodatek z mojí zkušenosti. Většinou když dostávám něco z webu třetích stran vytvářím si webového „prostředníka.“ Nějaký malý skript v php nebo čemkoliv jiném který si vyžádá potřebná data a převede je na to co chci já. Rozhodně je to jednoduší než se snažit dělat podobná kouzla přes arduino. Samo sebou si neplatím hosting na každý projekt, stránka na webzdarma.cz bohatě postačí ?
Vojtěch VosáhloÚčastníkJde to s arduinem udělat? Ano. Je na to vhodné? Asi né tak úplně, raspberry by mohlo být třeba lepším a jednodušším řešením, je otázka na co se vy cítíte.
Jde o takovou důležitou maličkost. Musí „projekt“ umět hrát několik věcí najednou? Např. rep 1 hraje tón 1 zatímco 2 hraje tón 2.
Na přehrávání zvuků existuje mnoho modulů, pak se to dá řešit i pomocí knihovny jen s arduinem, ale vše závisí na předchozí otázce…
Vojtěch VosáhloÚčastníkDobře, generuje mi to stejně, nebo alespoň podobně, můj hex je v příloze, je jiný než ten váš ale je to jen zkompilované arduinoISP. V tomhle případě bych tedy asi řádek dopsal FF tzn. toto:
:02134000 FFCFDD
se změní na toto:
:02134000 FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
Tak by to asi mělo fungovat, to DD musí být na konci protože by to měl být checksum který my ignorujeme, takže data která pošlete by mělo být těchto 16B FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Vojtěch VosáhloÚčastníkPošlete *.ino jestli máte abych to zkompiloval.Pardon, to je obyčejné ISP, je to z Příkladů ne?
Vojtěch VosáhloÚčastníkTakhle vám to vygenerovalo ten intel hex soubor? To vypadá opravdu divně. Hoďte sem ten *.hex co to vygenerovalo a i ten kód ze kterého jste to generoval, já to zkusím u sebe.
Vojtěch VosáhloÚčastníkDobrý den, dostal jste se s tím někam nebo jste na mrtvém bodě? Já se k tomu bohužel dostanu až o víkendu…
Vojtěch VosáhloÚčastníkZdravím, kouknu na to zas co nejdřív, akorát mám teď hodně práce. Jen aby jste věděl že jsem nezapoměl ?
Vojtěch VosáhloÚčastníkJeště jsem zapoměl zmínit že jsou tam 2 programy. Kratší je blink v GCC s pauzou 100ms a delší je arduinovské Blink s pauzou 1s. Prostě si odkomentujte co potřebujete a nebo zkuste vlastní kód.
Vojtěch VosáhloÚčastníkNic extra, prostě jen metoda pokus omyl. Vím že při malých datech to fungovalo ale když bylo dat víc, nevzalo arduino vše, tak jsem tipnul a vyšlo to ?
-
AutorPříspěvky