Ki van pipálva. Az a helyzet, hogy nem egyesével léptetném, hanem tízesével, és ha a plussz gombot nyomom akkor is -1 és ha a minuszt akkor is.
Ez a kód van még a
touch press event-be a plussz jelnél
nbeall.val=nbeall.val+10 nhatra.val=nhatra.val+10
mínusz jelnél:
nbeall.val=nbeall.val-10
nhatra.val=nhatra.val-10
Ezzel vezérelném a szellőztetőmet. Arra gondoltam, hogy a plusz - mínusz gombokkal lehetne beállítani az időt, hogy honnan számoljon vissza (nbeall.val=50), majd ugyanezt az értéket adnám egy másik objektnek is (nhatra.val=50), majd az nhatra.val értékét csökkenteném az arduinoban futó kóddal percenként, és ha nhatra.val==0 akkor nullázom nbeall.val-t is és kikapcsolom a relét...
Így leállnak a ventik.
Esetleg privben átküldhetném a teljes (arduino) kódot, ránéznél?
Nekem egyszerű shift register + 7 szegmenses kijelző viszonylatában volt ilyen nehézségem.
Nem biztos, hogy nálad jól működik és elég számításigényes, de hátha.
Egyrészt, a beolvasott értéket ne float-ban, hanem int-ben tárold, mégpedig a beolvasott érték tíz (vagy száz) szorosaként. Előbbi egy, utóbbi két tizedes jegy pontos lesz.
Írj egy függvényt, aminek a bemenete a beolvasott int, kimenete pedig három (ha szükséges, négy) int (vagy byte), négy átmeneti változóban (vagy elegánsabban egy mátrixban), a következőképp:
veszed az int-et, a 10-es maradékát beírod az első byte-ba, aztán osztod tízzel, ennek a 10-es maradékát beírod a második byte-ba és így tovább négy számjegyig (ha több kell, annyival több, de valószerűtlennek tartok egy 100 foknál melegebb akváriumot). A kiírás is szivatós lesz, mert az összes karakterre kell egy switch / case vizsgálat, ami az adott byte adata alapján írja ki az annak megfelelő szöveget.
Most egy kicsit agyhalott vagyok, de nincs kizárva, hogy ennél azért van elegánsabb megoldás is.
Nextion HMI-vel küzdök. Tanulgatom esténként a programozást....
A hőmérő adatait akaorm kiíratni a kijelzőre, ami alapból float. Szeretném a tizedes jegyeket is megjeleníteni, de az eszköz csak egész számokat ismer (szövegként nem tudom küldeni, ahogy sploc javasolta, mivel nextion 7.0 libet használok, és ebben már nem engedi a foat-ot szövegként küldeni sajna). Szóval ügyeskedtem, szétvágtam és két részletben küldöm át, de nem valami elegáns a dolog. Tud valaki egyszerűbb és kevesebb számítással járó megoldást? Vagy összefűzni a két buffer-t hogy úgy tudjam egyben küldeni? Én ezt alkottam (működik):
homerseklet_akva = sensors1.getTempCByIndex(0); number1 = ((float)homerseklet_akva/60)*180+30; z0.setValue(number1); // mutató érték küldése int ho1 = homerseklet_akva; itoa(ho1, buffer1, 10); int ho11 = homerseklet_akva*100; itoa(ho11, buffer2, 10); memset(buffer2,' ',2), ho11 = atoi(buffer2); itoa(ho11, buffer2, 10); t_akva.setText(buffer1); t_akva0.setText(buffer2); // hőmérséklet küldése egész és tört részként
Illetve még egy kérdés: hogy tudok a kijelzőn létrehozott változónak az közvetlenül az arduinoról értéket adni? Erre nincs példa és a google sem volt a barátom
De amúgy jó, hogy ha -1-et kapsz, ha nincs kipipálva a "send component ID" . Létrehoztál egy belső változót aminek a kezdeti értéke 0. ha megnyomod a - gombot, (és persze -1-ként van deklarálva a gombnyomás a nextionban) akkor 0-1 eredmény: -1; ha mégegyszer megnyomod akkor -1 -1 = -2. innentől arduinóban bármit kezdhetsz vele, de én számként deklarálnám, mivel idő. int idox = 0 ; Ha percenként akarod léptetni, akkor ido_min = idox * 60 ; Ha ezt akarod megjeleníteni, akkor myNextion.setComponentText("ido_min",String (ido));
Persze a pontos dolgokhoz látni kellene az egészet...
Előbb próbáld meg átírni amit javasoltam, ha nem megy, csak akkor cseréld le a lib-et.
> Táp: ha nem limitálod, akkor mit csinál (a konkrét áramfelvétel és annak lefutása érdekelne)?
Már nem tudom megnézni, mert nincs nálam. Használják élesben.
Labortápról nem CC (Constant Current), hanem OCP (Over Current Protection) módban tápláltam, vagyis ha átlépte volna a korlátot, akkor lekapcsolta volna a kimenetet.
A megépített áramkörben nem 7805, hanem kapcsolóüzemű DC-DC van.
A szimulátorban van egy kitörölhetetlen ellenállás a 7805 bemenete és a föld között. Csak a kapcsolási rajzon látszik, breadboard nézetben nem. Nem tudom, hogy beleszámolja-e.
> Koncepció: szóval a postahajókra is akarsz bootloader-gyárat telepíteni? :-D
Neeem. :-)
Egyelőre tényleg csak bootloader, de később SD kártyáról bootloader + teljes firmware programozás kis-közepes sorozat gyártásakor. Aztán még később automatizált gyártósori teszt is kerülhet bele.
Számítógéptől függetlenül, 9 Voltos elemről megy. Egy db ISP csatlakozó lóg ki belőle.
Egy gomb és három LED van rajta. Piros LED a bekapcsolt állapotot jelzi, simán a tápon lóg, nem az MCU kezeli.
A gomb megnyomására bekapcsol, és keresni kezdi az ISP-n a cél eszközt. Eközben villog a sárga LED. Ha 10 sec alatt nincs meg, akkor kikapcsol. Ha megtalálja, akkor folyamatosan világít a sárga LED. Felismeri, hogy melyik cél MCU-ról van szó (32u4, 328, 2560, stb), és feltölti a megfelelő firmware-t. Közben villog a zöld LED. Sikeres flash írás esetén folyamatosan világít, hiba esetén kialszik.
Gombnyomásra jöhet a következő, vagy 10 sec inaktivitás után kikapcsolja magát.
IRL biztos más, nem építettem most meg, mert 6 óra forrasztás után ehhez most nem nagyon van kedvem. Amit a szimuláció mutatott, az az, hogy bekapcsolás után a P-MOS source 1,5 A áramot húz néhány másodpercig (a szimuláció időmérője alapján ez kb. 0,3 mp). A Flash erősen lassú nálam, így meg sem próbáltam megmérni, hogy pontosan micsoda (nem a fogyasztók), és miért (kondi nincs, az LM7805 meg ilyet nem csinál.
Ha a táp az MCU-t táplálja, akkor minek is kell érzékelnie, hogy a tápot bekapcsolták? Mert ugye ha ki van kapcsolva, nincs tápellátása, tehát nem tud figyelni, ha van táp, akkor meg... (Remélem érted.)
A mai nap is ékesen bizonyította, mennyivel egyszerűbb a fejlesztés néhány fázisa oszcilloszkóppal. Időzítés mikroszekundum alatti tartományban megoldva 5 perc alatt.
USB-ről nem illik relét hajtani, pláne úgy, hogy az Arduino is arról megy. Mérj rá a lábra, amit a relé optocsatolóját hajtja, hogy van-e rajta változás, amikor a gombot nyomogatod. Ha van, akkor vagy az optocsatoló, vagy a relé rossz és/vagy nem jó a táp neki. Ha a relé kapcsolásakor esik a tápfeszültség, akkor a táp gyenge (ez elég valószerű, azok a relé breakout boardok, amik nálam jártak, rendre bőven 50 mA feletti áramot szedtek behúzott állapotban.
Ha hosszútávra tervezel, mindenképpen külön táp kell neki, mert nagyon érzékeny rá. Eleinte én is boardról fejlesztgettem jobb híján, de nem ajánlatos.
A reléket meg mindenképpen optocsatolva külön tápra, tapasztalat, rengeteget szenvedtem...
Egy relé kapcsolásának egyszerűnek kellene lennie. Ha minden jól van deklarálva, és ha jó lib-et használsz, akkor mennie kell.
String message = myNextion.listen(); //check for message
if (message == "65 0 d 1 ffff ffff ffff"){ digitalWrite(rele5, LOW); // Relé5 (Elszívó) On/Off }
if (message == "65 0 c 1 ffff ffff ffff"){ digitalWrite(rele5, HIGH); }
Emlkszem, hogy a Serial2-höz valamit át kellett írni a library-ben, és én is sokat szenvedtem vele.
Az általam használt programban, én nem string ként használom a változót, amit állítani akarok, mivel felvetődött bennem, hogy ha valami oknál fogva nem menne át az adat, a kijelzőn már növelt értéket látnék, de a programban hibás adattal számolna. Ezért a Nextion-on egy helyi változót deklaráltam va0-néven, ami a + gomb érintésére hozzáad egyet, - ra kivon belőle. Aztán csak kiíratom a visszaérkezett adatot, tehát biztos, hogy az van a kijelzőn amivel számolok.
Mondjuk elméletileg működnie kellene text-el is.
int value = myNextion.getComponentValue("va0"); cel = value * 50; cel_old=cel;
Én azzal kezdeném, hogy teleraknám a programot Serial.print-el és a message-t is kiíratnám. Ha nem jön semmi gombnyomásra akkor a kommunikációban van a hiba. Ha megnyomod a gombot villan az Rx led?
if((second()==0) or (second()==10) or (second()==20) or (second()==30) or (second()==40) or (second()==50)) { krp(); //relay(); paratart(); //páratartalom blokk } // delay(4000);
String message = myNextion.listen(); //check for message
Azért szerettem volna nagyobb tápot, mert azzal akartam meghajtani a 4-es relé panelt és egy esp8266-ot is a MEGA2560 mellett. De valószínű, hogy a MEGA és a wifi megkapja a az általad linkelt tápot vagy annak egy erősebb 1,5-2A -es verzióját, a relének pedig veszek egy 5V 6A 30W os tápot http://www.ebay.com/itm/371514993202
A relék meghajtásához elvileg jónak kell lennie...