Millis arduino reset. Arduino késleltetés millis és mikros a vázlat késleltetésének megszervezéséhez. Példa késleltetésre villogó LED-del
Az első dolog, amivel egy kezdő Arduino tanuló találkozik, a delay() függvény kellemetlen tulajdonsága – a programvégrehajtás blokkolása. Az interneten számos példa használja ezt a funkciót, de a gyakorlati alkalmazás valahogy azt sugallja, hogy jobb nélküle csinálni.
Ahogy egy kezdőhöz illik, újra feltaláltam a kereket, és elkészítettem a nem blokkoló késleltetést. A feladat így hangzott:
- Biztosítson pszeudo-multitaskingot, hogy a különböző események a maguk idejében, saját időközönként történjenek, és ne blokkolják egymást.
- Kényelmes volt ezt használni.
- Megtervezhető könyvtárnak, és könnyen beilleszthető más projektekbe másolás-beillesztés nélkül.
Az eredmény ez.
#beleértve
A Now() metódus igazat ad vissza, ha az intervallum elmúlt. Ebben az esetben a visszaszámlálás ugyanazon időközönként újraindul. Vagyis a Now() minden alkalommal automatikusan „feltöltődik”.
A klasszikus LED-villogás azonnal két villanásra bonyolítható. Például a 12. és 11. érintkezőhöz csatlakoztatott izzóknak 1 másodpercenként, illetve 777 ms-os időközönként kell villogniuk.
#beleértve
A hurokban mást is tehet; a villogó LED-ek nem blokkolják a kód végrehajtását.
Nyilvánvaló, hogy ez nem helyettesíti teljesen a delay()-et, amely egy adott időre leállítja a folyamot, a programot mindig FSM-ként (véges állapotú gépként) kell megírni. Vagyis tárolja az állapotot, és attól függően lépjen a kód kívánt helyére.
Régi verzió:
Action1(); késleltetés(1000); akció2(); késleltetés(500); akció3(); ...
Új lehetőség:
Byte állapot=0; SmartDelay d(); ... kapcsoló (állapot) ( 0. eset: action1(); d.Set(1000000UL); állapot=1; szünet; 1. eset: if (d.Now()) ( action2(); d.Set(500000UL) állapot=2 ) 2. eset: if (d.Now()) ( action3(); state=0; ) break;
A Set(interval) metódus új intervallumot állít be, és a régit adja vissza. Egyszerűen megtekintheti az intervallumot a Get() metódussal;
A Stop() leállítja a feldolgozást, a Now() pedig mindig false értéket ad vissza.
A Start() folytatódik, és a Now() a szokásos módon kezd működni.
Ha le kell lassítani az időszámítást, de nem kell teljesen leállítani, akkor ott van a Wait() metódus. Például, ha a 12-es LED villog, de nem villog a gomb megnyomásakor, egyszerűen adja hozzá a következő kódot a loop()-hoz a fenti két diódával rendelkező példában:
If (digitalRead(9)) led12.Wait(); ...
Tehát a 9. láb magas jelszintje esetén a 12. lábon lévő dióda nem villog, és tovább fog villogni, amikor a 0 megjelenik.
Ha például egy képernyőt ilyen „időzítővel” rajzolnak meg, és a gombokat párhuzamosan dolgozzák fel, előfordulhat, hogy a képernyőt vagy a részt közvetlenül a gomb megnyomása után újra kell rajzolni, nem pedig megvárni az intervallum végét. Erre a Reset() metódust használjuk, ami után a Now() következő hívása igazat ad vissza. Például:
SmartDelay kijelző (1000000UL); void loop() ( if (btClick()) display.Reset(); // megnyomta a gombot, meg kell rajzolnia a képernyőt. if (display.Now()) screenRedraw(); // rajzolja meg a képernyőt. )
Az egyetlen hiba, amit látok, hogy a mikroszekundumos számláló túlcsordulását nem veszik figyelembe, de egyébként igen, a kódot meg kell tisztítani. Nem tetszik, ahogy a Reset() működik, még mindig gondolkodom rajta.
Ha szeretné „szüneteltetni” a mikrokontrollert, akkor csak a késleltetési utasítást kell beírnia a program megfelelő helyre. Ez azonban valódi akadályt jelent, ha más dolgokat próbál meg tenni, például nyomon követni a gombkattintásokat. Ebben az esetben egyfajta multitasking megvalósítása szükséges.
Igen, ez néhány sor kódot ad a programjaihoz, de ezzel tapasztaltabb programozóvá válik, és növeli az Arduino potenciálját. Ehhez csak meg kell tanulnia a millis függvény használatát.
Meg kell érteni, hogy a késleltetési funkció szünetelteti az Arduino program végrehajtását, így nem tud mást tenni ebben az időszakban. Ahelyett, hogy egy bizonyos időre szüneteltetnénk a teljes programunkat, megtanuljuk megszámolni, mennyi idő telt el a művelet befejezése előtt. Ez természetesen a millis() függvény és néhány barát változó használatával történik az adatok tárolására. Hogy minden könnyen érthető legyen, kezdjük az első oktatóvázlattal, a „Pillogással”, de ebben az esetben késedelem nélkül villogni fogunk a LED-en.
Ennek a programnak az eleje megegyezik bármely más szabványos Arduino programéval. Először az összes szükséges változó és bemeneti/kimeneti sor deklarálása következik (például a LED 13. sora). Itt is szükségünk van egy egész változóra a LED aktuális állapotának tárolására. LOW-ra lesz állítva, mert a LED kezdeti állapota ki van kapcsolva. Ezután deklaráljuk az „unsigned long” típusú „previousMillis” változót. Az "int"-től eltérően a hosszú előjel nélküli változók 32 bitesek, erre olyan változóknál van szükség, amelyek értéke nagyon nagyra nőhet - mint például az a potenciális idő, amellyel megvárhatjuk a cselekvést. Az előző Millis változó a LED utolsó villogásának időpontjának tárolására szolgál. Létezik „const long” típus is, az is 32 bites, de nem változtat az értéken, vagyis konstansokra (jelen esetben az intervallumállandóra) való. 1000-re állítjuk, és ezt használjuk szünetidőként, ezredmásodpercben mérve.
const int ledPin = 13; // a LED kimenet meghatározása // A változók megváltoznak: int ledState = LOW; // A ledState a LED előjel nélküli hosszú előző állapotának meghatározására szolgálMillis = 0; // megmenti a LED utolsó frissítésének idejét // a konstansok nem változnak: const long interval = 1000 // villogó intervallum ezredmásodpercben void setup() ( // a kimenet 13. sorának beállítása pinMode(ledPin, OUTPUT); )
Ezután egy végtelen körbe megyünk. Ne feledje, hogy a késleltetés helyett azt szeretnénk számolni, hogy mennyi idő telt el az utolsó pislogás óta, esetünkben 1000 ms. Ha a megadott idő letelt, ideje megváltoztatni a LED-ünk állapotát.
Először az előjel nélküli hosszú "currentMillis"-t "millis()"-re állítjuk, ami az aktuális időt ezredmásodpercben adja meg. Ez segít kitalálni, hogy a jelenlegi és az előző időpont közötti különbség nem haladta-e meg az 1000 ms-ot. Ehhez azt mondjuk: "Ha az aktuális idő mínusz a LED-ünk előző villogása nagyobb vagy egyenlő, mint a hozzárendelt 1000 ms-os érték, akkor az utolsó villogási időt az előzőként tárolja." Ez segít emlékeznünk arra, hogy a ciklus következő fordulójában mennyi idő telt el az utolsó pislogás óta. Majd ha a LED állapota LOW, állítsa MAGAS, egyébként pedig LOW. Ezután a digitalWrite paranccsal írja be az aktuális állapotot a LED-be.
void loop() ( előjel nélküli long currentMillis = millis(); if (currentMillis - előzőMillis >= intervallum) ( // a LED állapotának utolsó változásának időpontjának mentése previousMillis = currentMillis; // ha a LED nem világít, majd kapcsolja be, és fordítva, ha (ledState == LOW) ( ledState = HIGH; ) else ( ledState = LOW; ) // kimenet a LED-re digitalWrite(ledPin, ledState) )
A millis() függvény lehetővé teszi az aktuális program indítása óta eltelt idő megszámlálását. A függvény „előjel nélküli hosszú” formátumú értéket ad vissza, és lehetővé teszi az értékek számlálását a program indításától számított 50 napig. Ezen idő elteltével a visszaszámlálás újra kezdődik. Az alábbiakban egy példa a millis() függvény használatára:
Hosszú ideig aláíratlan; void setup())( Serial.begin(9600); ) void loop())( Serial.print("On time: "); time = millis(); // emlékszik az időértékre Serial.println(time); // információ küldése soros porton keresztül delay(1000);
A fenti példában minden másodpercben a program indítása óta eltelt időről szóló információ kerül elküldésre a portfigyelőnek. Mivel az időt ezredmásodpercben mérik, minden következő érték 1000-rel különbözik. A leolvasás pontossága az Arduino kvarcrezonátor stabilitásától függ.
micros() függvény
A micros() függvény a millis() függvény analógja, a különbség a mérési pontosságban rejlik. A micros() függvény segítségével mikroszekundumban kapjuk meg az aktuális program indítása óta eltelt időt. A számláló mikroszekundum számláló 70 perc elteltével nullázódik. Az alábbiakban egy példa a micros() függvény használatára:
Hosszú ideig aláíratlan; void setup())( Serial.begin(9600); ) void loop())( Serial.print("Kezdés óta eltelt idő: "); time = micros(); Serial.print(time); Serial.println(" µs "); késleltetés(1000);
Csakúgy, mint a példában a millis() függvénnyel, itt is másodpercenként elküldik a mért időről szóló információkat a portmonitornak, csak annyi a különbség, hogy ebben az esetben az időt mikroszekundumban mérjük.
delay() függvény
A delay() függvény lehetővé teszi az aktuális program végrehajtásának szüneteltetését a paraméterben megadott ideig. A parancs szintaxisa a következő:
//parancsok késleltetése(500); //késleltetés 0,5 másodperccel //parancsok késleltetése(1000); //1 másodperces késleltetés
Az idő ezredmásodpercben van megadva (1 mp = 1000 ms). Ez a paraméter „unsigned long” típusú lehet, amely 0 és 4294967295 között lehet. Az alábbiakban egy példa a delay() parancs használatára:
#define ledPin 13 void setup() ( pinMode(ledPin,13); ) void loop() ( digitalWrite(ledPin,HIGH); //a LED késleltetés bekapcsolása (500); //várjon 500 ms (0,5 mp) digitalWrite( ledPin ,LOW //kikapcsolja a LED késleltetést (1000 //vár 1000 ms (1 mp));
A fenti példában a LED 0,5 másodpercre bekapcsol, majd 1 másodpercre kialszik, és így tovább, amíg az Arduino ki nem kapcsol.
delayMicroseconds() függvény
A delayMicroseconds() függvény a delay() függvény egy változata. A különbség a mennyiségben és az időzítési pontosságban rejlik. A delay() függvény lehetővé teszi az idő 1 ezredmásodperces, míg a delayMicroseconds() függvény 1 mikroszekundumos pontosságú mérést tesz lehetővé.
A paraméterben megadható érték 0 és 16383 között van. Hosszabb időintervallumok esetén használja a delay() függvényt, vagy használja többször a delayMicroseconds() függvényt.
#define outPin 8 void setup() ( pinMode(outPin, OUTPUT); // pin 8 kimenetként ) void loop() ( digitalWrite(outPin, HIGH); // pin 8 high state delayMicroseconds(50); // pause 50 microseconds digitalWrite(outPin, LOW // pin 8 low state delayMicroseconds(50) // szünet 50 mikroszekundum);
Ez a példa négyszöghullámot generál 100 mikromásodperces periódussal és 50%-os kitöltési aránnyal.
Az Arduino késései nagyon nagy szerepet játszanak. Nélkülük a Blink legegyszerűbb példája sem működik, amely meghatározott idő elteltével villog egy LED-et. De a legtöbb kezdő programozó keveset tud az időkésleltetésről, és csak az Arduino késleltetést használja anélkül, hogy ismerné ennek a parancsnak a mellékhatásait. Ebben a cikkben részletesen beszélek az időzítési funkciókról és azok használatáról az Arduino IDE-ben.
Az Arduino-ban számos különböző parancs található, amelyek felelősek az idővel és a szünetekkel való munkavégzésért:
- késleltetés()
- késleltetésMikroszekundum()
- millis()
- micros()
Pontosságban különböznek, és megvannak a saját jellemzőik, amelyeket figyelembe kell venni a kód írásakor.
Az arduino késleltetési funkció használata
Szintaxis
Az Arduino késleltetés a legegyszerűbb parancs, és leggyakrabban kezdők használják. Lényegében ez egy késleltetés, amely szünetelteti a programot a zárójelben jelzett ezredmásodpercekre. (Egy másodpercben 1000 ezredmásodperc van.) A maximális érték 4294967295 ms lehet, ami megközelítőleg 50 napnak felel meg. Nézzünk egy egyszerű példát, amely világosan megmutatja, hogyan működik ez a parancs.
Void setup() ( pinMode(13, OUTPUT); ) void loop() ( digitalWrite(13, HIGH); // magas jel küldése a 13-as érintkezőnek delay(10000); // szünet 10000 ms vagy 10 másodperc digitalWrite13, LOW) ; // alacsony jel küldése a 13-as lábnak delay(10000); // szünet 10000 ms vagy 10 másodperc)
A módszerben beállít Meghatározzuk, hogy a 13-as láb kimenetként kerül felhasználásra. A program fő részében először egy magas jelet küldünk a pinre, majd 10 másodperces késleltetést teszünk. Ez idő alatt a program felfüggeszteni látszik. Ezután alacsony jelet adnak, és ismét késés következik, és minden kezdődik elölről. Ennek eredményeként azt kapjuk, hogy a tűt felváltva 5 V vagy 0 táplálja.
Világosan meg kell értenie, hogy a késleltetést használó szünet alatt a program működése felfüggesztésre kerül, az alkalmazás nem kap adatokat az érzékelőktől. Ez az Arduino késleltetési funkció használatának legnagyobb hátránya. Ezt a korlátozást megkerülheti megszakításokkal, de erről egy külön cikkben fogunk beszélni.
Példa késleltetésre villogó LED-del
Egy példaáramkör a késleltetési függvény működésének szemléltetésére.
LED-del és ellenállással áramkört építhet. Akkor lesz egy szabványos példa - villogó LED. Ehhez egy pozitív érintkezős LED-et kell csatlakoztatni a tűhöz, amelyet kimenetként jelöltünk meg. A LED szabad lábát körülbelül 220 ohmos ellenálláson keresztül csatlakoztatjuk a földhöz (egy kicsit több is lehetséges). A polaritást a belsejének megtekintésével határozhatja meg. A benne lévő nagy csésze a mínuszhoz, a kis láb a pluszhoz kapcsolódik. Ha új LED-ed, akkor a vezetékek hosszával határozhatod meg a polaritást: a hosszú láb plusz, a rövid láb mínusz.
delayMicroseconds funkció
Ez a funkció a késleltetés teljes analógja, azzal a különbséggel, hogy mértékegységei nem ezredmásodpercek, hanem mikroszekundumok (1 másodpercben 1 000 000 mikroszekundum van). A maximális érték 16383 lesz, ami 16 ezredmásodpercnek felel meg. A felbontás 4, vagyis a szám mindig négy többszöröse lesz. Egy példarészlet így nézne ki:
DigitalWrite(2, HIGH); // magas jelet küld a 2. lábnak delayMicroseconds(16383); // szünet 16383 µs digitalWrite(2, LOW); // alacsony jelet küld a 2. lábnak delayMicroseconds(16383); // szünet 16383 µs
A delayMicroseconds probléma pontosan ugyanaz, mint a késleltetéssel - ezek a funkciók teljesen „lefagyják” a programot, és szó szerint lefagy egy időre. Jelenleg lehetetlen portokkal dolgozni, érzékelőktől származó információkat olvasni és matematikai műveleteket végrehajtani. Ez az opció villogó fényekhez alkalmas, de a tapasztalt felhasználók nem használják nagy projektekhez, mivel ott nincs szükség ilyen hibákra. Ezért sokkal jobb az alább leírt funkciók használata.
Millis funkció késleltetés helyett
A millis() függvény lehetővé teszi, hogy késleltetés nélkül hajtsa végre az Arduino-t, ezzel megkerülve az előző módszerek hiányosságait. A millis paraméter maximális értéke megegyezik a késleltetési funkcióéval (4294967295 ms vagy 50 nap).
A millis használatával nem állítjuk le a teljes vázlat végrehajtását, hanem egyszerűen jelezzük, mennyi ideig kell az Arduino-nak egyszerűen „megkerülnie” azt a kódblokkot, amelyet szüneteltetni szeretnénk. Ellentétben a késleltető millissel, nem állít meg semmit magától. Ez a parancs egyszerűen visszaadja nekünk a mikrokontroller beépített időzítőjéből az indítás óta eltelt ezredmásodpercek számát. Minden hurokhívásnál mi magunk mérjük a kódunk utolsó hívása óta eltelt időt, és ha az időeltolódás kisebb, mint a kívánt szünet, akkor figyelmen kívül hagyjuk a kódot. Amint a különbség nagyobb, mint a szükséges szünet, végrehajtjuk a kódot, lekérjük az aktuális időt ugyanazzal a milliszel, és emlékezzünk rá - ez lesz az új kiindulási pont. A következő ciklusban a visszaszámlálás már az új ponttól fog történni, és ismét figyelmen kívül hagyjuk a kódot, amíg a millis és a korábban elmentett érték közötti új különbség ismét el nem éri a kívánt szünetet.
A késleltetés nélküli késleltetés millis használatával több kódot igényel, de segítségével a rendszer leállítása nélkül villoghat egy LED és szüneteltethet egy vázlatot.
Íme egy példa, amely egyértelműen illusztrálja a csapat munkáját:
Előjel nélküli hosszú időzítés; // Változó a referenciapont tárolására void setup() ( Serial.begin(9600); ) void loop() ( /* Ezen a ponton kezdődik a delay() analóg végrehajtása. Számítsa ki a különbséget az aktuális pillanat és a korábban mentett referenciapont Ha a különbség nagyobb, mint a kívánt érték, akkor hajtsa végre a kódot. = millis(); Serial.println ("10 másodperc") ;
Először bemutatjuk az időzítési változót, amely az ezredmásodpercek számát tárolja. Alapértelmezésben a változó értéke 0. A program fő részében ellenőrizzük a feltételt: ha a mikrokontroller indulásától számított ezredmásodpercek száma mínusz az időzítési változóba írt szám nagyobb, mint 10000, akkor a üzenetet küld a portfigyelőnek, és az aktuális időértéket a változóba írja. A program működése következtében 10 másodpercenként megjelenik a 10 másodperc üzenet a port monitoron. Ez a módszer lehetővé teszi a LED késleltetés nélküli villogását.
Micros funkció késleltetés helyett
Ez a funkció késleltetést is végrehajthat a késleltetés parancs használata nélkül. Pontosan ugyanúgy működik, mint a millis, de ezredmásodperc helyett mikroszekundumokat számol 4 μs felbontással. Maximális értéke 4294967295 mikroszekundum vagy 70 perc. Ha túlcsordul, az érték egyszerűen visszaáll 0-ra, ne feledkezzünk meg róla.
Összegzés
Az Arduino platform számos módot biztosít számunkra, hogy késleltetést hajtsunk végre projektünkben. A késleltetés segítségével gyorsan szüneteltetheti a vázlat végrehajtását, ugyanakkor blokkolja a mikrokontroller működését. A millis parancs használatával késedelem nélkül megteheti az Arduino-t, de ez egy kicsit több programozást igényel. Válassza ki a legjobb módszert a projekt összetettségétől függően. Általában az egyszerű vázlatoknál és 10 másodpercnél rövidebb késleltetésnél késleltetést használnak. Ha a működési logika bonyolultabb és nagy késleltetésre van szükség, akkor a késleltetés helyett jobb a millis használata.
Szia Andrei. Nagyon érdekes az Ön megközelítése a felhalmozott tudás és tapasztalat átadásához. Sokat segít a törekvéseiben. Nos, én, amikor elkezdem elsajátítani az arduino-t, vágyom a fejlődésre. Sőt, külső segítséggel gyorsabban meg tudom csinálni. Tehát: először az volt a feladatom, hogy készítsek egy vonal mentén haladó robotot. Megcsináltam – minden rendben volt. De további lehetőségeket biztosítva nem értettem, miért nem reagál megfelelően a vonalra. Találkoztam ezzel a cikkel, és megértettem az okát.
Most lenne egy kérdésem hozzád: az alább említett és kész vázlatban a késleltetéssel kapcsolatos problémákat figyelembe véve mindenhol át kell váltani millisra ahol ez a funkció megvan? Ha igen, akkor megértem, hogy szinte a teljes vázlatot újra kell készíteni? És nem teljesen világos, hogyan kell használni a millimétereket a távolság mérésében? Köszönöm.
//Robot fehér vonalat követő funkcióval
// **************************Motorkábelek beszerelése *************************** *
int MotorLeftSpeed = 5; // Bal (A) motor SPEED - ENA
int MotorLeftForward = 4; // Bal (A) motor FORWARD - IN1
int MotorLeftBack = 3; // Bal (A) motor BACK - IN2
int MotorRightForward = 8; // Jobb (B) motor ELŐRE - IN3
int MotorRightBack = 7; // Jobb (B) motor VISSZA - IN4
int MotorRightSpeed = 9; // Jobb (B) motor SPEED - ENB
// ************************** Ultrahangos érzékelő kimenetek telepítése************************ ***
int trigPinL = 14; // a bal oldali trig ultrahangos érzékelő pin számának beállítása
int echoPinL = 15; // a bal oldali echo ultrahangos érzékelő kimeneti számának beállítása
int trigPinC = 10; // a központi trig ultrahangos érzékelő pin számának beállítása
int echoPinC = 11; // a központi echo ultrahangos érzékelő kimeneti számának beállítása
int trigPinR = 12; // a jobb trig ultrahangos érzékelő pin számának beállítása
int echoPinR = 13; // a jobb echo ultrahangos érzékelő kimeneti számának beállítása
// ********************* Vonalérzékelő érintkezők beszerelése *******************
const int LineSensorLeft = 19; // bal oldali érzékelő bemenet
const int LineSensorRight = 18; // a jobb oldali érzékelő bemenete
int SL; // bal oldali érzékelő állapota
int SR; // jobb érzékelő állapota
// *********************A fény- és hangriasztás kimenet beállítása***************
int Fény = 2; // a fényriasztás kimenet számának beállítása
int Zumm = 6; // a hangjelzés kimeneti számának beállítása
int ledState = LOW; // állítsa be a LED állapotát ezzel a változóval
hosszú előzőMillis = 0; // tárolja az utolsó LED váltás időpontját
hosszú intervallum = 300; // a LED be-/kikapcsolása közötti intervallum (0,3 másodperc)
// *********************Változó távolságmérés érzékelőkkel***************
unsigned int impulseTimeL=0;
unsigned int impulseTimeC=0;
unsigned int impulseTimeR=0;
long distL=0; // a bal oldali ultrahangos érzékelő által mért távolság
hosszú distC=0; // a központi ultrahangos érzékelő által mért távolság
hosszú disztR=0; // a jobb oldali ultrahang érzékelő által mért távolság
// ******************************** BEÁLLÍT ************ *** *****************
Serial.begin(9600); //indítsa el a soros portot (9600-as sebesség)
//*************** Állítsa be a motor érintkezőit****************
pinMode(MotorRightBack, OUTPUT); // Jobb (B) motor VISSZA
pinMode(MotorRightForward, OUTPUT); // Jobb (B) motor ELŐRE
pinMode(MotorLeftBack, OUTPUT); // Bal (A) motor VISSZA
pinMode(MotorLeftForward, OUTPUT); // Bal (A) motor ELŐRE
késleltetés(időtartam);
//*************** Állítsa be a szalagérzékelő érintkezőit**************
pinMode(LineSensorLeft, INPUT); // a bal oldali vonalérzékelő tűjének meghatározása
pinMode(LineSensorRight, INPUT); // a jobb oldali érzékelő tűjének meghatározása
// *************** Ultrahangos érzékelők kimeneti módjának beállítása***********************
pinMode(trigPinL, OUTPUT); // az ultrahangos érzékelő bal oldali trig kimenetének üzemmódjának beállítása
pinMode(echoPinL, INPUT); // a bal oldali echo ultrahangos érzékelő kimenetének üzemmódjának beállítása
pinMode(trigPinC, OUTPUT); // a központi trig ultrahangos érzékelő kimenetének üzemmódjának beállítása
pinMode(echoPinC, INPUT); // a központi echo ultrahangos érzékelő kimenetének üzemmódjának beállítása
pinMode(trigPinR, OUTPUT); // a jobb trig ultrahangos érzékelő kimenetének üzemmódjának beállítása
pinMode(echoPinR, INPUT); // a jobb echo ultrahangos érzékelő kimenetének üzemmódjának beállítása
// **************Érintkezők beállítása fény- és hangriasztásokhoz**************************** *****
pinMode(Zumm,OUTPUT); // a berregő kimenet üzemmódjának beállítása
pinMode(Light,OUTPUT); // a fényjelző kimenet üzemmódjának beállítása
// ****************** Alapvető mozgásparancsok ******************
void forward (int a, int sa) // FORWARD
analogWrite(MotorRightSpeed, sa);
analogWrite(MotorLeftSpeed, sa);
üres jobb (int b, int sb) // ROTATE RIGHT (egyik oldal)
digitalWrite(MotorRightBack, LOW);
digitalWrite(MotorLeftBack, LOW);
digitalWrite(MotorBal előre, HIGH);
analógWrite(MotorLeftSpeed, sb);
void left (int k, int sk) // FORDULAT BALRA (egyik oldal)
digitalWrite(MotorRightBack, LOW);
digitalWrite(MotorRightForward, HIGH);
analogWrite(MotorRightSpeed, sk);
digitalWrite(MotorLeftBack, LOW);
void stop (int f) // STOP
digitalWrite(MotorRightBack, LOW);
digitalWrite(MotorRightForward, LOW);
digitalWrite(MotorLeftBack, LOW);
digitalWrite(MotorLeftForward, LOW);
// ************************************* Távolságmérés************* ******
void izmdistL () // távolságmérés a bal oldali ultrahangos érzékelővel
digitalWrite(trigPinL, HIGH);
digitalWrite(trigPinL, LOW); // 10 mS impulzus az ultrahangos érzékelő trig kimenetére a távolság mérésére
impulzusIdőL = pulseIn(echoPinL, HIGH); // az ultrahangos érzékelő távolságának leolvasása
distL=impulseTimeL/58; // Átalakítás centiméterre
void izmdistC () // távolságmérés a központi ultrahangos érzékelővel
digitalWrite(trigPinC, HIGH);
digitalWrite(trigPinC, LOW); // 10 mS impulzus az ultrahangos érzékelő trig kimenetére a távolság mérésére
impulzusIdőC = pulseIn(echoPinC, HIGH); // az ultrahangos érzékelő távolságának leolvasása
distC=impulseTimeC/58; // Átalakítás centiméterre
void izmdistR () // távolságmérés a központi ultrahangos érzékelővel
digitalWrite(trigPinR, HIGH);
digitalWrite(trigPinR, LOW); // 10 mS impulzus az ultrahangos érzékelő trig kimenetére a távolság mérésére
impulzusidőR = pulseIn(echoPinR, HIGH); // az ultrahangos érzékelő távolságának leolvasása
distR=impulseTimeR/58; // Átalakítás centiméterre
// ************************************** LOOP ************ *************************
// *********************** LINE követési mód *********************** ********* ***
// *********************fény- és hangriasztó***************
hangszín (Zumm,900); // bekapcsolja a hangot 900 Hz-en
hangszín (Zumm,900); // kapcsolja be a hangot 800 Hz-en
előjel nélküli hosszú áramMillis = millis();
if (currentMillis - previousMillis > interval) //ellenőrizze, hogy a szükséges intervallum eltelt-e, ha elmúlt, akkor
előzőMillis = jelenlegiMillis; // az utolsó váltás időpontjának mentése
if (ledState == LOW) // ha a LED nem világít, akkor világít, és fordítva
ledState = MAGAS;
digitalWrite(Light, ledState); // a kimeneti állapotok beállítása a LED be- vagy kikapcsolásához
// ************************ Mérési távolság*********************** **
Serial.println(distL);
Serial.println(distC);
Serial.println(distR);
if (distL>50 && distC>50 && distR>50) // ha a mért távolság több mint 50 centiméter, akkor megyünk
SL = digitalRead(LineSensorLeft); // beolvassa a jelet a bal sáv érzékelőjétől
SR = digitalRead(LineSensorRight); // beolvassa a jelet a jobb oldali sáv érzékelőjétől
// ************************************ A fekete vonalat követve ************ ******* ****
// ROBOT a sávon - menj egyenesen
if (SL == LOW & SR == LOW) // FEHÉR - FEHÉR - EGYENES
előre (10, 100 // KÖZVETLEN (idő, sebesség)
// A ROBOT elkezd kimozdulni a sávból – taxizunk
else if (SL == LOW & SR == HIGH) // FEKETE - FEHÉR - forduljon BALRA
balra (10, 100 // balra fordulás (idő, sebesség)
else if (SL == HIGH & SR == LOW) // FEHÉR - FEKETE - forduljon JOBBRA
jobbra (10, 100 // forgatás JOBBRA (idő, sebesség)
// FINISH – A ROBOT mindkét érzékelővel látja a csíkot
else if (SL == HIGH & SR == HIGH) // FEKETE - FEKETE - STOP
stop (50); // STOP
else // ha a mért távolság kisebb vagy egyenlő, mint a minimum - megállunk