millis-t rakd ki egy külön függvénybe ami a loopban meghívódik benne pedig csak a szükségesnél nem több bool változó ami a ketyegést mutatja
a loop-ban lévő if-nek és ott már ha pl a millis 1 sec ütemet ad akkor értelemszerűen az if en belül számolod pl ha 1 perc kell és nullázod majd megvárod a következőt
valahogy így
if(millisbool==1){ masodperc++; millisbool=0; }
if(masodperc==60){ valamitortenik(); }
a millis függvényében meg csak annyi van hogy a bool változót 1 re állítod amikor megmérted az 1 sec et..
ami a lopban pöröghet mint állat...
és amikor már megvan a perces if, ott számolhatsz órát is... vagy is pontosabban utána, mert vagy ott nullázod ki a masodpercet , vagy a az előtte lévö ifben...
} ---------------------- periudikus lenne de ez nem müködik? if(millis() - time_now >= period){ //good no overf... time_now = millis(); Serial.println("1"); time_now += period; } else {
Serial.println("0"); }
----------------------
Törölt felhasználó
2019-07-26 16:37:11
[1509]
millisel vakarozom.. a fö kodbol pár helyröl ki akarom venni a delay megoldást sajnos multi loop ez nem olyan egyszerü megoldani pl loop 2 ha nem fut épen (nincs meghivás) millis áll benne (nem ketyeg) de eben meg van olyan rész aminek csak loop2 meghiváskor kéne csak futni...
Korai volt az öröm az ora kodjába beraktam fö loop részbe ott az up változó ha if ugrik nem + egyet ad hozá percenként hanem egymás után gyorsan 5 ad hozzá ez mi a franc csinálhatja tulfut az up változó?
if ( now.minute() = 0 && now.second() < 1){ valtozo = valtozo + 1 ;} if valtozo = 5 { (ide amit szeretnél csináltatni) valtozo = 0 ; } Úgy is küldtem át neked, ne rakd bele a now.hour()-t.
Ez elrontja szerintem: now.hour() <= 1 Nem kell figyelni az órákat, csak a perceket, ha 0 perc akkor egész az óra Így most csak 0 és 1 órakor ad hozzá a változóhoz.
Probáltam! ha ora perc másodpercet van egyben ora változot nem veszi sosem figyelembe akárhogy rako kissebb nagyobb vagy egyenlő jelet az ora fügvényhez... pedig a 3 változó int jelegű (rtc lib)
if (now.hour() <= 1 && now.minute() <= 1 && now.second() < 1){ up = up + 1;} //if ( now.minute() < 1){ up++;}
if (up == 5) {digitalWrite(led,HIGH); up = 0; } else { digitalWrite(led,LOW);
Szépen leírják a feltételeket csak a lényeg sosem teljesül célirányosan 24h többször kell futnia nem csak egyszer csak az igaz feltételnek csak 1 secre! Ekkora feladat lenne ez 5 orénkét 1s igaz feltétel? Egyenlőre nem sikerült a kívánt megoldás 2 forumon sem! Sajnos a lenti ora projektem 3..4 hét munkám volt valaki egy köszönöm sem méltatót (cserébe a forrásért) vissza meg ilyen kiss kérdésre meg semmi válasz sem méltatóak akik ez kisujjak kiráznánk....
elegánsabb és memóriatakarékosabb ha bool változót használ ha megtörtént 1, ha újra meg kell hogy történjen ott 0 és majd amikor megtörtént megint 1 egyszer ellenőrizni kell hogy az 5 óra letelt e, ha igen akkor 1 ekkor lefuthat a másodperces cucc
egyébként meg óránként mérnék és ahogy mondod is egy változó értékét növelném és ott amikor az 5 re vált kinulláz a másodpercet engedélyezném, amikor lefutott akkor meg tiltanám, így biztos csak egyszer fut le 5 óránként...
Vagy lehet még jobb lenne, ha egy változóhoz minden óra 0 perc 0 másodperckor hozzáadnál +1-et. Amikor a változó értéke 5, lefutna aminek le kell, és nullázódna a változó. Bár biztos van erre elegánsabb megoldás is.
hogy mi változik a két feltöltés között azt nem tudom, de ha az lcd megy egyébként, ( kontakt hiba nincs) akkor annak mindig mennie kell
de azért érdekelne hogy a láb birizgálást hogy oldottad meg, milyen időzítéssel, timerrel? közvetlenül elérhetően az arduinoban 2 fajta van, egyik amelyik megfogja szintén a procit, a másik fajtával meg számolni kell úgy adja a pontos időzítést
utána meg jönnek a timer libek...
ügye a delay egyértelműen felfüggeszti a program futását
a micros és a millis -pedig bekapcsolástól kezdve számol az egyik hamarabb a másik később de körbefordul a micros 70 perc a millis 50 nap viszont ezekkel számolni kell mert az aktuális bekapcsolástól eltelt időt adják vissza...
lcdnek van késés ideje/válasz(kijelzés) 4bit üzemodba még lassabb ha jol tudom ez 100..200ms... ha ez alá mész idöben áll a kijelzés ez ez igaz a törlési idöre is... valamit osztást használ a program részben és azt jelenisd meg!
De ha beállítom, hogy ha a fordulat 100 vagy nagyobb, a 13pin legyen magas, egyébként legyen alacsony, akkor azt szépen váltogatja. A kijelzőn viszont nem látszik csak hogy 0 a fordulat. Ebből gondolom, hogy a program fut csak a kijelző nem megy valamiért. Amikor viszont jól működik, akkor a kijelzőn is szépen látszik, ahogy változik a fordulat. A működő és nem működő program ugyanaz, csak újra feltöltöm.
kijelzőnek időzítések lényegesek, az hogy neked látszik hogy a program fut, mikor veszel te észre 1-2-10ms -ot? sztem kb kizárt
egyébként meg kezd szépen elölről, eső körben az lcd-n egy külön fájlban jeleníts meg mondjuk egy sima változót hogy másodpercenként növeled. Ha a tápot nem veszed le a kijelzőn az utolsó állapot van, az meg hogy restnél nem törlődik minden bizonnyal azért van mert nem nyomsz neki egy törlést és még a kontakt hibáról nem is beszéltünk
De a program fut, mert ha kapcsoltatok Pint és teszek rá ledet, annak szépen változik az állapota. Az is a loop-ban van. A kijelző pedig le van fagyva. Ha ismét feltöltöm a vázlatot, akkor pedig minden jó. Resetre sem szokott helyre állni az lcd. Illetve feltöltéskor is van, hogy nem jó, de akkor le sem törli az lcd-t. Nem tudom érthető-e :D. Szóval van, hogy már az elejétől nem működik a kijelző, nem változik rajta semmi, csak azt irja ami volt rajta, van amikor semmi baja. Amikor nem működik, akkor sem feltöltéskor sem resetre nem törlődik a kijelző.
Cree, csak műkedvelő vagyok, fogalmam nincs mennyi a lekérdezési idő. LiquidCrystal_I2C könyvtárat használom.
az interupt, az az megszakítás megjön, majd mindaddig míg innen ki nem esik a program, tehát valami bazi hosszú időigényes feladat fut végig, minden ÁLL!!! ezért érdemes azt csinálni. hogy interuptban pl egy bool váltózó értéke lesz 1, és a főprogiban pedig meghívod a függvényedet úgy hogy
if ( valtozo ==1){ a te függvényed; valtozo=0;
} a megszakítás így csak egy változót állít be, ami egy bool ráadásul, ami miután lefut a függvényed vissza is áll alapértékre várva a következőt annyira rövid időre megakasztva a program futását amennyire csak lehet
tehát lényeg, interuptban nincs csak max 1 program sor, ami nem egy függvény hívás!! hanem csak egy jelzőbit állítása
megszakítások érdekes dolgokat tudnak produkálni, talán úgy tudod csökkenteni a hibát, hogy ha a megszakításban csak jelző bitet állítasz, nem pedig benne futtatod le a mit le akarsz, hanem így átadod a fő proginak, így nem csúsznak el az időzítések...