Мазмуну:
Video: Millis менен Arduino хронометраждык методдору (): 4 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:40
Бул макалада биз millis () менен тааныштырабыз; функциясын колдонуп, ар кандай убакыт мисалдарын түзүү үчүн колдонуңуз.
Millis? Эрин синхрондору менен эч кандай байланышы жок … миллионду миңден бир бөлүгүнүн сандык префикси катары тааныдыңыз деп үмүттөнөбүз; бул өлчөө бирдигин 0,001ге көбөйтөт (же онду терс 3кө чейин).
Кызыктуусу, биздин Arduino тутумдары эскиздин башталышынан баштап, миллисекундтардын санын (миңдеген секунддар) санап турат, эсептөө максималдуу санга жеткенге чейин өзгөрүлбөгөн типте сакталышы керек (32-бит [төрт байт] бүтүн сан -бул нөлдөн (2^32) -1ге чейин. (2^32) -1, же 4294967295 миллисекунддар 49.71027-так күндөргө айланат.
Эсептегич Arduino баштапкы абалга келтирилгенде, ал максималдуу мааниге жетет же жаңы эскиз жүктөлөт. Белгилүү бир убакта эсептегичтин маанисин алуу үчүн, жөн гана функцияны чакырыңыз - мисалы:
баштоо = миллис ();
Кайда баштоо - бул белгисиз узун өзгөрмө. Бул жерде millis () кыймылда экенин көрсөтүү үчүн абдан жөнөкөй мисал:
/ * millis () демонстрация */
кол коюлбаган узак баштоо, бүтүү, өтүү;
жараксыз орнотуу ()
{Serial.begin (9600); }
боштук цикл ()
{Serial.println ("Баштоо…"); баштоо = миллис (); кечигүү (1000); даяр = millis (); Serial.println ("Даяр"); elapsed = аяктаган-баштоо; Serial.print (өткөн); Serial.println ("миллисекунддар өттү"); Serial.println (); кечигүү (500); }
Эскизде учурдагы миллис саны сакталат, андан кийин бир секунд күтүлөт, андан кийин миллис баасы кайрадан даяр бойдон сакталат. Акыр -аягы, ал кечигүү өткөн убакытты эсептейт. Сериялык монитордун кийинки экран төгүндүлөрүндө, сүрөттө көрүнүп тургандай, узактыгы дайыма 1000 миллисекунд эмес экенин көрө аласыз.
1 кадам:
Жөнөкөй сөз менен айтканда, millis функциясы ATmega микроконтроллеринин ичиндеги эсептегичти колдонот, сиздин Arduino. Бул эсептегич ар бир саат циклин көбөйтөт - бул (стандарт Arduinoдо жана шайкеш келгендерде) 16 МГц саат ылдамдыгында болот. Бул ылдамдык Arduino тактасындагы кристалл тарабынан көзөмөлдөнөт (T16.000 мөөрү басылган күмүш нерсе).
2-кадам:
Кристаллдын тактыгы тышкы температурага жана кристаллдын толеранттуулугуна жараша өзгөрүшү мүмкүн. Бул өз кезегинде миллис натыйжаңыздын тактыгына таасирин тийгизет. Анекдоттук тажрыйба убакыттын тактыгынын өзгөрүшүн жыйырма төрт сааттын ичинде үч же төрт секунддун тегерегинде болушу мүмкүн экенин билдирди.
Эгерде сиз кристаллдын ордуна керамикалык резонаторду колдонуп жаткан тактаны же өзүңүздүн версияңызды колдонуп жатсаңыз, анда алар анча так эмес экенин жана дрейфтин жогорку деңгээлинин мүмкүнчүлүгүн киргизерин эске алыңыз. Эгер сизге убакыт тактыгынын бир кыйла жогорку деңгээли керек болсо, Maxim DS3231 сыяктуу конкреттүү таймер ICлерин карап көрүңүз.
Эми биз миллисти ар кандай убакыт функциялары үчүн колдоно алабыз. Мурунку эскизде көрсөтүлгөндөй, биз өткөн убакытты эсептей алабыз. Бул идеяны алдыга жылдыруу үчүн, келгиле, жөнөкөй секундомер кылалы. Муну жасоо мүмкүн болушунча жөнөкөй же татаал болушу мүмкүн, бирок бул учурда биз жөнөкөйгө карай бурулабыз.
Аппараттык перспективада бизде эки баскыч болот-Баштоо жана Токтотуу-тиешелүүлүгүнө жараша 2 жана 3 санариптик казыктарга туташкан 10к Ом тартылып каршылыгы бар. Колдонуучу басууну баштаганда, эскиз миллис үчүн маанини белгилейт - андан кийин аялдама басылганда, эскиз дагы миллис үчүн маанини белгилеп, өткөн убакытты эсептеп жана көрсөтөт. Колдонуучу андан кийин процессти кайталоо үчүн баштоону басып, же жаңыртылган маалыматтарды токтото алат. Мына эскиз:
/* Супер-негизги секундомер миллис () менен; */
кол коюлбаган узак баштоо, бүтүү, өтүү;
жараксыз орнотуу ()
{Serial.begin (9600); pinMode (2, INPUT); // pinMode (3, INPUT) баштоо баскычы; // токтотуу баскычы Serial.println ("Баштоо/кайра коюу үчүн 1, өткөн убакыт үчүн 2 басыңыз"); }
void displayResult ()
{float h, m, s, ms; көпкө чейин кол коюлбаган; elapsed = аяктаган-баштоо; h = int (өткөн/3600000); үстүнөн = өткөн%3600000; m = int (60000 ашык); ашык =%60000дөн жогору; s = int (1000ден жогору); ms =%1000ден жогору; Serial.print ("Чийки убакыт:"); Serial.println (өткөн); Serial.print ("Өткөн убакыт:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (мс, 0); Serial.println ("ms"); Serial.println (); }
боштук цикл ()
{if (digitalRead (2) == HIGH) {start = millis (); кечигүү (200); // чыгаруу үчүн Serial.println ("Башталды…"); } if (digitalRead (3) == HIGH) {даяр = миллис (); кечигүү (200); // дисплейден чыгаруу DisplayResult (); }}
Кечиктирүү () чалуулары өчүргүчтөрдү жок кылуу үчүн колдонулат - бул милдеттүү эмес жана аларды колдонуу сиздин жабдыктарыңызга жараша болот. Сүрөт эскиздин сериялык мониторунун мисалы болуп саналат - секундомер иштей баштады, андан кийин эки баскычты убакыт аралыгында алты жолу басуу.
3 -кадам: Спидометр…
Эгерде сизде белгиленген аралыктын башында жана аягында сенсор болсо, ылдамдыкты эсептөөгө болот: ылдамдык = аралык ÷ убакыт.
Сиз ошондой эле дөңгөлөктүү кыймылдын спидометрин жасай аласыз, мисалы велосипед. Учурда бизде баш аламан велосипед жок, бирок биз муну кантип жасоону сүрөттөп бере алабыз - бул абдан жөнөкөй. (Жоопкерчиликтен баш тартуу - муну өз тобокелиңизге ж.б.у.с.)
Биринчиден, керектүү математиканы карап көрөлү. Сиз дөңгөлөктүн айланасын билишиңиз керек. Аппараттык - сенсор керек болот. Мисалы - камыш которгуч жана магнит. Камыш которгучту кадимкидей ачык баскыч катары карап көрүңүз жана адаттагыдай эле 10к Ом тартылып турган резистор менен туташыңыз.
Башкалар холл-эффект сенсорун колдонушу мүмкүн-ар бири өз алдынча). Айлананы эсептөө үчүн математика сабагынан эсиңизде болсун: формуланы колдонуңуз: айлана = 2πr, мында r - айлананын радиусу.
Эми сизде дөңгөлөктүн айланасы бар, бул маанини биздин "туруктуу аралык" катары кароого болот, демек, ылдамдыкты толук айлануу ортосундагы өткөн убакытты өлчөө менен эсептесе болот.
Сиздин сенсор-орнотулгандан кийин-ар бир айлануу басылган кадимкидей ачык баскыч менен бирдей иштеши керек. Биздин эскиз сенсордун ар бир импульсунун ортосундагы убакытты өлчөйт.
Бул үчүн, биздин мисалда сенсордук санарип 2 -пинге туташкан болот - бул ылдамдыкты эсептөө үчүн үзгүлтүккө учуратат. Эскиз башка учурда ылдамдыкты кадимки I2C-интерфейсиндеги ЖК модулда көрсөтөт. I2C интерфейси сунушталат, анткени бул Arduino тактасынан ЖКга 4 зымды гана талап кылат - зымдар азыраак болсо жакшы.
Бул жерде сиздин таанышууңуздун эскизи:
/*Милис () колдонулган негизги спидометр; */
#кошуу "Wire.h" // I2C автобус ЖК үчүн
#кошуу "LiquidCrystal_I2C.h" // I2C шинасынын LCD модулу үчүн - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // 16 дарек жана 2 саптуу дисплей үчүн ЖК дарегин 0x27 деп коюңуз
сүзүү баштоо, бүтүү;
сүзүү өттү, убакыт; float circMetric = 1.2; // сенсордун абалына карата дөңгөлөктүн айланасы (метр менен) float circImperial; // 1 километрди колдонуу = 0.621371192 миля сүзүү ылдамдыгы, speedm; // метрикалык жана империялык эсептелген ылдамдык валдарын кармайт
жараксыз орнотуу ()
{attachInterrupt (0, speedCalc, RISING); // сенсорлор санариптик 2 жогорку (ар бир дөңгөлөктүн айлануусу) баштоо = миллис () жөнөткөндө чакырылган үзгүлтүк; // орнотуу LCD lcd.init (); // lcd lcd.backlight инициализациялоо (); // LCD арткы жарыгын күйгүзүү lcd.clear (); lcd.println ("Каска кий!"); кечигүү (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // MPH эсептөөлөрү үчүн метриканы империяга айландыруу}
боштук speedCalc ()
{elapsed = millis ()-баштоо; баштоо = миллис (); speedk = (3600*circMetric)/өткөн; // км/с speedm = (3600*circImperial)/өткөн; // Миллер саатына}
боштук цикл ()
{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("км/с"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (өткөн)); lcd.print ("ms/rev"); кечигүү (1000); // жарыкты азайтуу үчүн жеке каалооңузду тууралаңыз}
Бул көп деле болуп жаткан жок - дөңгөлөк бир айланууну бүтүргөндө сенсордун сигналы төмөндөн жогоруга өтөт - бул функцияны чакырган speedCalc () функциясын чакырат.
Бул миллис () көрсөткүчүн алат жана андан кийин учурдагы окуу менен мурунку окуу ортосундагы айырманы эсептейт - бул маани аралыкты басып өтүү убактысына айланат (бул сенсорго карата дөңгөлөктүн айланасы - сакталган)
float circMetric = 1.2;
жана метр менен өлчөнөт). Ал акыры ылдамдыгын км/саат жана MPH менен эсептейт. Үзгүлтүктөрдүн ортосунда эскиз ЖКда жаңыртылган ылдамдык маалыматын, ошондой эле кызыгуу үчүн ар бир революция үчүн чийки убакытты көрсөтөт. Чыныгы жашоодо LCDди велосипедге эч ким орнотпойт деп ойлойм, балким LED дисплейи көбүрөөк актуалдуу болмок.
Ал ортодо, бул мисал кандай иштээрин кийинки кыска видеоклипте көрө аласыз. Велосипед дөңгөлөгү менен камыш которгучтун/магниттин айкалышынын ордуна, мен функциянын генераторунан квадрат толкундуу чыгууну сенсордон импульстарды окшоштуруу үчүн үзгүлтүк пинине туташтырдым, андыктан ал кантип иштээри жөнүндө түшүнүк ала аласыз.
4 -кадам:
Бул азырынча millis () колдонулушун жыйынтыктайт. Ошондой эле micros () бар; микросекунддарды эсептеген функция.
Демек, сизде дагы бар - дагы бир практикалык функция, бул дагы көйгөйлөрдү Arduino дүйнөсү аркылуу чечүүгө мүмкүндүк берет. Адаттагыдай эле, азыр көзөмөлдөө үчүн бир нерсе табуу же башка фенанигандарга жетүү сизге жана сиздин фантазияңызга байланыштуу.
Бул пост сизге pmdway.com тарабынан келген - бүткүл дүйнө жүзү боюнча бекер жеткирүү менен, жасоочулар жана электроника ышкыбоздору үчүн.
Сунушталууда:
Акустикалык левитация Arduino Uno менен кадам-кадам (8-кадам): 8 кадам
Акустикалык левитация менен Arduino Uno Step-by-Step (8-кадам): ультрадыбыштуу үн өткөргүчтөр L298N Dc аял адаптеринин электр энергиясы менен камсыздоосу эркек токту Arduino UNOBreadboard Бул кантип иштейт: Биринчиден, сиз Arduino Uno кодун жүктөп бересиз (бул санарип менен жабдылган микроконтроллер) жана аналогдук порттор кодду айландыруу үчүн (C ++)
Arduino UNO менен дронду кантип жасоо керек - Микроконтроллерди колдонуу менен квадрокоптер жасаңыз: 8 кадам (сүрөттөр менен)
Arduino UNO менен дронду кантип жасоо керек | Микроконтроллерди колдонуу менен квадрокоптер жасаңыз: КиришүүМенин Youtube каналыма баш багыңыз Drone - бул абдан кымбат гаджет (продукт) сатып алуу. Бул постто мен аны кантип арзан баада жасоону талкуулайм. Анан кантип ушундай арзан баада өзүңүздүн колуңуз менен жасай аласыз … Индияда бардык материалдар (моторлор, ЭСК
PWM ESP32 менен - Жарыктандыруучу LED EWP 32де PWM менен Arduino IDE менен: 6 кадам
PWM ESP32 менен | ESP 32де PWM менен LEDди караңгылатуу Arduino IDE менен: Бул көрсөтмөлөрдө биз Arduino IDE менен ESP32 менен PWM сигналдарын кантип чыгарууну көрөбүз. PWM негизинен ар кандай MCUдан аналогдук чыгууну өндүрүү үчүн колдонулат жана аналогдук чыгаруу 0Vдан 3.3Vга чейин болушу мүмкүн (esp32 болгон учурда) & тартып
Millis () жана PfodAppты колдонуу менен Arduino Дата/Убакыт Чийүү/Кирүү: 11 кадам
Millis () жана PfodAppты колдонуу менен Arduino Date/Time Plotting/Logging: Ардуино же Android программалоо талап кылынбайт. RTC жана GPS модулдары да колдоого алынган. Убакыт алкактары үчүн автоматтык оңдоо, RTC дрейф жана GPS секирик секунддары киришүү Бул окуу куралы сиздин Arduino millisти кантип колдонууну көрсөтөт ( ) маалыматтарды белгилөө үчүн убакыт белгилери
Дизайн ой жүгүртүү методдору менен картон чөйчөктү долбоорлоо: 7 кадам
Дизайн ой жүгүртүү методдору менен картон чөйчөктү жасаңыз: Саламатсызбы, дизайн ой жүгүртүү ыкмаларына ылайык иштелип чыккан картон чөйчөк, бул жерде. Муну карап көрүңүз жана комментарий бериңиз. Мен сиздин комментарийлериңиз менен долбоорумду өркүндөтөм :) Чоң рахмат ---------------------------- Мерхаба, Дизайн мени ойлонуп