Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Bedobtam a gemininek a kódodat. Szerintem próbáld ki te is. Elég lényegre törő megoldási javaslatokat kaptam. A soros port kezelés időzítési hibái és a delay használata okozhat ilyen sleepeket. Ha gondolod mellékelem a teljes választ, de nem akarom feleslegesen szaporítani a szót.
Idézet: „Íme néhány megfigyelés és lehetséges ok a másodperc ugrására, valamint javaslatok a javításra: delay() használata a loop() függvényben: A kód több helyen is használja a delay() függvényt (pl. a pont villogtatásánál, az animációnál, a colorWipe, rainbow stb. függvényekben). A delay() blokkolja a program futását a megadott ideig. Ez azt jelenti, hogy amíg egy delay() lefut, az Arduino nem tudja olvasni az RTC-t vagy frissíteni a kijelzőt. Ha ezek a késleltetések elég hosszúak vagy gyakoriak, az befolyásolhatja az időmérés pontosságát és a másodperc léptetésének ütemét. Javaslat: Próbáld meg elkerülni a hosszú delay() hívásokat a loop() függvényben. Helyette használj nem blokkoló technikákat, például a millis() függvényt az időzítéshez. Így a program továbbra is futhat és rendszeresen ellenőrizheti az időt az RTC-ről, miközben más feladatokat is elvégez. Soros port olvasása (Serial.available() és Serial.readStringUntil()): A soros portról érkező adatok olvasása a loop() függvényben történik. Ha lassan érkeznek az adatok, vagy ha a Serial.readStringUntil() függvény hosszabb ideig vár a befejező karakterre (.), az szintén blokkolhatja a programot, és befolyásolhatja az időzítést. Javaslat: Gondold át, hogy mennyire kritikus az azonnali adatfogadás a soros porton. Ha nem feltétlenül szükséges, hogy minden karakter azonnal feldolgozásra kerüljön, érdemes lehet pufferelni az érkező adatokat, és csak bizonyos időközönként feldolgozni őket, vagy nem blokkoló módon olvasni a soros portot. Neopixel frissítések: A Neopixel LED-ek frissítése is időigényes lehet, különösen ha sok pixel van. Bár a kódban csak 7 pixel van vezérelve csatornánként, a sok show() hívás egymás után (különböző pixelekre) a yaz() és más függvényekben összeadódhat. Javaslat: Minimalizáld a show() hívások számát. Ha több pixel állapotát is megváltoztatod, érdemes lehet az összes változtatást elvégezni, majd egyszerre meghívni a show() függvényt az összes pixel frissítéséhez. GameOfThrones() függvény: Ez a függvény több másodpercig blokkolja a program futását a tone() és delay() hívásokkal. Amíg ez a függvény fut, az idő nem frissül a kijelzőn, és ha a függvény befejeződésekor az RTC éppen átlép egy másodpercet, az ugrásnak tűnhet. Javaslat: Ha a pontos időmegjelenítés kritikus, akkor a GameOfThrones() függvényt is érdemes lehet nem blokkoló módon megvalósítani, vagy ritkábban futtatni, vagy ha fut, akkor is rendszeresen frissíteni a kijelzőn az aktuális időt (bár ez a zenei effektus szempontjából nem biztos, hogy ideális). A másodperc kijelzése: A másodpercet a d4 és d5 változók tárolják, és a yaz() függvény frissíti a kijelzőt. A loop() függvényben az idő lekérdezése (t = rtc.getTime() ![]() Javaslat: Érdemes lehet egy dedikált időzítőt használni a másodperc kijelzésének frissítéséhez. Például a millis() függvény segítségével ellenőrizheted, hogy eltelt-e 1000 milliszekundum az utolsó frissítés óta, és csak akkor frissítsd a d4, d5 változókat és hívd meg a yaz() függvényt. Konkrét lépések a hibakereséshez: Kommenteld ki a delay(500) sort a pont villogtatásánál a loop() elején, és figyeld meg, hogy a másodperc ugrása továbbra is jelentkezik-e. Kommenteld ki a soros porttal kapcsolatos kódrészeket (if(Serial.available()) { ... }) ideiglenesen, hogy kizárd annak hatását. Ha a hiba továbbra is fennáll, próbáld meg a GameOfThrones() függvényt kikommentelni. Adj hozzá soros portra kiíratást a másodpercről a loop() függvényben minden iterációban, hogy lásd, a belső időváltozó (t.sec) ugrik-e, vagy csak a kijelzőn látható a probléma. Például: Serial.println(t.sec);. Ez segíthet eldönteni, hogy az RTC olvasásával vagy a kijelzéssel van-e a gond. Vizsgáld meg a yaz() függvényt. Bár nem tűnik közvetlenül hibásnak az időfrissítés szempontjából, ha más, időigényes műveletek is lennének benne, azok is okozhatnának problémát. A legvalószínűbb ok a sok delay() használata, ami megakadályozza a programot abban, hogy rendszeresen és pontosan olvassa az RTC-t és frissítse a kijelzőt. A nem blokkoló programozási technikák alkalmazása valószínűleg megoldja a problémát. Ha elvégzed a fenti lépéseket és megosztod a tapasztalataidat, tovább tudunk segíteni a hiba pontosabb beazonosításában!” |
Bejelentkezés
Hirdetés |