Én stoppert csináltam időkiértékeléssel (speciális versenyzéshez). A Nano-n lévő kristály biza elmászott. Egyszer csak úgy poénból csináltam egy mérést, elindítottam egy rendes stoppert és ezt a protót, aztán 10 perc után megnéztem, hogy mi az eltérés. Nem a programmal volt gond [szerintem, de ha gondolod, meg tudod nézni nyilvános oldalon], mert nem vártam alapvetően, hanem csak időket hasonlítottam össze (millis() mint referencia a mérés elején és a mérés végén). A mérési tartományban (30 mp +/- 5 mp) ez jelentéktelen eltérés, kisebb, mint amekkora eltérés a humán kezelésből adódik (tudniillik, hogy nem tudsz egy stoppert 0,1 mp-en belül azonos időben megállítani). 4 mp 10 percen belül pedig 30 mp-re nagyjából 0,2 mp. Ez 7 ezrelék körüli eltérés. Az alap DS1307 breakout-okat dobáltam kifelé meg vaterás rendelésekhez adtam ajándékba, annyira rettenetesek voltak (5-10 mp/nap vagy rosszabb). De való igaz, itt a minőségért fizetni kell rendesen és/vagy megfelelő szakértelemmel ki kell küszöbölni ezeket a hibákat (amely szakértelem nálam csak szórványosan van meg egyelőre).
Én változatlanul azt tartom, hogy ezek még bőven működő megoldások, ha valaki ismeri és tudja kezelni a hátulütőket, illetve olyan rendszert tud felépíteni, amely az igényeinek megfelel.
Meg lehet oldani persze, a lényeg, hogy oda kell figyelni, hogy meg legyen oldva a túlcsordulás.
Érdekes, hogy sokféle tartozékot láttam, de portbővítőt nem annyira, vagy a sensor shield lenne az? A shiftregiszter illesztése viszont egyszerű, olcsó, és védi a board bitjeit a külvilágtól.
Én csináltam a milis fügvénnyel egy komplett ébresztőórát. Egy nap alatt 1-2 sec eltérésem volt. Nyilván függ a kvarc pontosságától, sőt főleg ettől, így ettől nagyobb eltérés is előfordulhat. De hogy 10 percen belül legyen 2 sec eltérés, ott valami baj van, vagy nem korrekt a program valahol, és valamit nem veszel figyelembe.
10 perc az 600 sec. ebben 2 sec tévedés az 0.33%-os kvarc gyártási pontosságot jelentene. Ennél sokkal pontosabbak szoktak lenni, még a sima kerámiarezonátorok is jobbak. Nagyságrendileg 0,0005% körüli pontossági értékek vannak kvarecoknál.
Pont azért kvarc. Az vagy valami nagyon gagyi kvarc, vagy a progi valami rosszat művel, vagy valamiért nem rezeg rendesen. Elég sok trükköt kell alkalmazni, mire jó órát kapunk, nekem két napig eltartott egy mindenben tökéletesnek tekinthető óraprogramot megírni ébresztővel, túlcsordulás figyelővel. A mérete olyan 8-10 kbájt lett, már nem emlékeszem. Mármint C-ben Atmel Studió alatt, meg kíváncsiságból átírtam Arduinora is. Illetve anno PIC-eknél is volt hasonló gyakorlófeladatom.
Ültess be egy úrvezetőt egy Baja versenyautóba... Kb. ez az, amit az Atmel Studio tud. Kezdőknek csak komoly elhivatottsággal, vagy azzal sem (bár tény és való, hogy külső programmerrel csodákra képes).
Annyit azért hozzátennék, hogy lehet több szálon futtatni egy progi, azaz amolyan "ál-multitask" módon. meg lehet osztani az erőforrásokat a szálak között.
Ez valószínű. Csak ha szétírod a tokban lévő eepromot, akkor kuka a kártya. Ha szétírod a ráfűzött eepromot, akkor kidobod és bedugsz helyette egy másikat.
Nos, és az elmúlt uszkve 2 órában vastagon sz'ptam az mbed és egy ST Nucleo F401RE párosával.
Maga az eszköz kib. gyors, nagyon fáint rajta minden, kivéve, hogy a talpán is vannak lábak, ráadásul sok, összesen 80.
Az mbed önmagában egy rettentő komplex dolog, viszont összehasonlíthatatlanul jobb, mint az Arduino. Példa. Van pár eszközöd, ezekhez a könyvtárakat össze tudod magadnak válogatni, s ha kell, ott van. Amit változtatsz, változik mindenütt (teszem azt, megváltoztatod az i2c kulcsát egy modulnak, akkor az összes projektben átíródik, nem csak abban, amiben épp dolgozol). Ha valamit kidobsz, kiveszed a listából, többet nem foglal helyet (mint az Arduino library-k).
De.
Kiciócókínai bizbaszok nincsenek, legalábbis az én szettem és az mbed "Components" alatt fellelhető eszközök között nincs egyezés. Amit próbáltam (gyakorlatilag mindent), azzal eddig nem ment: MAX7221 + 7 szegmenses kijelző, 128x96 I2C/SPI OLED, 1602 I2C LCD vezérlő + LCD. Egyetlen shield-et tudtam életre kelteni, egy sima LCD keypad modult, ami elsőre működött. Bár súlyosan megütném az embert aki csinálta, mert az elejéről elegánsan kihagyta a törlő parancsot (vagyis ha előzőleg volt rajta valami, akkor reset után is lesz).
Az eszközre visszatérve. VÉÉÉÉGRE nem az van, hogy adott egy kártya és pokoli nehéz rá bármit is rakni az idióta lábkiosztás miatt, hanem konkrétan egy raszteres. Minden irányban. Vagyis piszok egyszerűen gyártható hozzá próbapanelből shield. Ez az Arduino fél raszteres lábeltolása miatt nem (illetve csak nagyon körülményesen) megy. Óriási respect.
Lehet, hogy az Atmel Studio ingyenes és van Arduino plugin hozzá, csak egy kezdőnek használhatatlan. Mintha a bicigli helyett egy űrhajóba ülnél (teljesen kiismerhetetlen).
Felraktam, nem kis munka volt, mert a telepítő mindent elkezdett húzogatni a netről. Végre elindult és fogalmam nem volt, hogy mi micsoda.
De csináltak már többen, többször is ilyen tesztet. A valóságban csak olyan egymillió írás után kezd el hibázni. A gyártó szándékosan ad meg egy nagyságrenddel kisebb értéket, mint a valódi érték.
> A millis()-sel lehet csak operálni? Eltenni az értéket, minden lefutásnál összehasonlítani, és ha már 1000-rel több, akkor váltani a ledet?
Igen.
delay()-t használni tilos. Szétcsúszik tőle minden, ami bonyolultabb egy LED villogtatásánál. Már két LED-et nem tudsz különbözőképpen villogtatni egyszerre, ha delay()-t használsz.
(Az mbed-ben kapásból van ilyen célra egy Ticker nevű interfész. Atmel MCU-n is van hasonló, csak az Arduino környezet nem támogatja ilyen egyszerűen.)
> -- javaslom valami alap szerkesztő használatát (Notepad ++) az Arduino IDE mellett
Javaslom az Atmel Studio-t. Ingyenes, Visual Studio alapú. Támogatja az összes Atmel hardvert. Van hozzá Arduino plugin, aminek a segítségével a sketch-ekből project-et lehet készíteni. A sketch-ek továbbra is használhatóak maradnak az eredeti Arduino IDE-vel is. Van benne rendes kódkiegészítés, debugger, átnevezés, stb.
Szóval egy komplett IDE, nem olyan herélt, mint az Arduino.
A termosztát adók kiváltása nem annyira egyszerű. Egy zárt, működő rendszerbe kívülről beavatkozni, adatokat vagy jelet kiszedni vagy berakni nem magától értetődő, ehhez a zárt rendszer architektúrájának ismerete (gyakorlatilag kapcsolási rajz szintjén) kell. És még így sem biztos, hogy sikerül. A termosztát egy kő egyszerű eszköz rendszerint, 1 bites szabályzást csinál a legtöbb esetben (magyarul ki/be kapcsol), egyszerűbb tehát kiváltani, mint beállni mellé.
A redőny más tészta, mert ha nincs saját vezérlése, akkor pl. a végállásokat meg kell oldani. Ha van saját vezérlése, akkor a kapcsolófelületre kell rácsatlakozni (kvázi nyomógombokat, kapcsolókat párhuzamosítani), ez viszonylag egyszerűen megoldható (hasonló projekten dolgozom épp csak teljesen más felállásban).7
"Remélem, hogy nem keverem össze több felhasználó igényét. :-)
Ha jól emlékszem, az alábbi követelmények voltak:
-Szenzorok olvasása. IGEN
-Értékek helyi naplózása SD kártyára. NEM AKAROM SD-RE, ELÉG HA A NAS SZERVERRE EGY FILE-BA RAKJA AMI KIÉRTÉKELHETŐ
-(Később beavatkozás a rendszerbe a mért, naplózott adatok alapján.) NEM AKAROK BEAVATKOZNI EGYÁLTALÁN, MAJD KÉSŐBB CSAK AMIT 645-ös hozzászólásomban írtam, hogy termosztát adókat csinálni (rádiós) és távolról vezérelni + ha megoldható szintén távolról redőnyvezérlés mind rádiós
-Lokális felhasználói felület grafikus LCD-vel, menüvel, grafikonokkal. HÁT ELÉG HA CSAK A MÉRT ÉRTÉKEKET KIÍRJA
-Távelérés etherneten. IGEN
-Legyen olcsóbb, mint egy gyári megoldás. MINIMUM :)
-Ne nulláról kelljen kezdeni a programozást. AZ BIZTOS
50 nap eszelősen sok idő, és azzal érdemes számolni, hogy a legtöbb kártya (kivétel a Due, a Leonardo és a speciális kártyák közül egyik-másik) azonnal resetet nyom, amikor -- külső táp ellenére -- USB-re dugod.
Valószínűleg az órajel felével vagy a körül, de nem egyenletesen -- ha egyáltalán. Érdekes kísérlet lenne szkóppal megnézni.
Mega(/Due) + RTC + hálókártya. Esetleg egy Yún, de annál már vannak jobbak.
Én vezéreltem már SSR-t netről, kívülről. Jól konfigurálhato router kell hozzá, erre figyelni kell (az Invitel lakossági modem + cucca pl. alkalmatlan rá teljesen)
Persze egy dolgot csinál egyszerre, úgy értettem, hogy sorban vannak a feladatok, és egymás után. A delay() az ebbe a koncepcióba nem ilik bele, az tipikusan a kezdő kis programocskákhoz jó. Viszont az időzítés az nagyon gyakori igény szinte bármilyen felhasználásnál, nade akkor majd a millis()-sel meg az rtc-vel ügyeskedek.
A belső eeprom írást akkor felejteni kell, meg ha lesz rtc, akkor már úgyis ott a ram rajta.
A delay nélküli példát néztem, és láttam hogy nem törődik a túlcsordulással:
if(currentMillis - previousMillis > interval)
ha a millis átcsordul, és kezdi 0-ról, akkor ez az if 50 napig nem lesz igaz, vagyis egy most bekapcsolt Arduino 50 napig szépen fogja villogtatni a ledet, majd 50 napig nem villog. Szóval ezt le kell kezelni, ha túlcsordult, akkor külön módon kell eljárni, és az értéket átírni a previousMillis-be.
Ha már említetted a sebességet, kb. mire lehet számítani? Mondjuk egy ledvillogtató delay nélkül mekkora frekivel villogna?
Ha csak egy parancsot lehetne örökre kiszedni az Arduino parancsok közül, az sok ember szerint a delay() lenne. Én inkább csak a paramétert limitálnám nagyjából 100-ra.
A meglátásod nem rossz, de van benne egy gixer. Itt nincs olyan hogy a board csinál mást IS. Egy dolgot csinál, nagyjából mindig. Ehhez képest egy érdemi kivétel van, az interrupt, mert az az architektúra másik szintjén figyel folyamatosan, vagyis akkor is bele tud szólni a programfutásba, ha épp nem történik vizsgálat. Jó játék soros kiolvasással megnézni pár kódrész futási idejét. Meg fogsz lepődni...
1. kérdés: a meglátás jó. Túlcsordulhat, erre figyelni kell, ha olyan a szoftverkörnyezet. A millis() alapból unsigned long, vagyis az a változó, amivel vizsgálsz, szintén unsigned long kell legyen, a kezdeti változódeklarációknál erre figyelni kell (a váltásnál így is előfordulhat nehézség, de ez ugye 50 nap nagyjából). Lásd: blink without delay.
2. kérdés: elvileg igen, gyakorlatilag olcsóbb és egyszerűbb egy külső eeprommal megoldani. Két okból: egyrészt a belső eeprom (ami konkrétan az IC-n belül van) csak limitált írási-olvasási műveletet képes elviselni (ez néhány ezer az I2C eeprom milliós értékével szemben). Az EEPROM-hoz sem kell elem, kb. 100-200 év az adatvesztésig eltelő idő. Van breakout is, de kb. 40 forint egy darab, plusz a két előtétellenállás.
3. kérdés: nincs rajta idő. A millis() elvileg alkalmas időmérésre, ha csinálsz egy változót, amit szinkronizálni tudsz. De...
Egyrészt az Arduinokon (pláne a klónokon) lévő kristály nem éppen atomi pontosságáról híres, nekem 10 percen belül másodperces járateltérést produkált, ami ugye pár perces időmérésnél irreleváns (nem fogod látni, hogy a blink without delay 1 másodperc vagy 1,001 másodperc), de a másodperces jel akár pár perc alatt el tud "mászni" egy referencia jeltől (pl. egy óra kattogásától).
Helyette: RTC, de ne az olcsójános kínai (DS1307, rettenetesek, 1 percet is meghaladó napi járateltérésük bír lenni), hanem a a DS3231 például.
Telefonon tényleg érdekes lehet programot diktálni, soronként egy elírás, nehezen fog működni.
Nulláról kezdem az ismerkedést az Arduinoval, de máris van kérdésem. A loop() ugye pörög állandóan, és a ledvillogtató példa a delay(1000)-rel lassítja láthatóra.
Ha két dolgot végez a board és az egyik a villogtatás, a másik meg egy olyan, amit maximális sebességgel kell futtatni, akkor a delay nem jó módszer, mert az a másik programrészt is lassítja. A millis()-sel lehet csak operálni? Eltenni az értéket, minden lefutásnál összehasonlítani, és ha már 1000-rel több, akkor váltani a ledet? Működhet ez így, de mi van, ha a millis túlcsordul?
Szabad-e használni az eepromot valami mérési eredmény tárolására? Nade úgy, hogy minden kiolvasást oda tárolok, vagyis lehet akár másodpercenként többezer írás is. Vagy jobb ilyen célra egy elemmel ellátott órapanel, mert a ramot végtelenszer lehet írni és az elem miatt nem felejt? Vagy más megoldás?
Órapanel nélkül van-e dátum és idő a boardon? Mondjuk napi szinkron megoldható pc-ről, reggel 8-kor a pc lehúzza low-ba a 2-es pint 5 másodpercre vagy ilyesmi, és akkor csak egy napig kell szabadon járnia az órának.