اگر می خواهید میکروکنترلر را "مکث" کنید، تنها کاری که باید انجام دهید این است که یک دستورالعمل تاخیر را در محل مورد نظر برنامه وارد کنید. اگر می خواهید از کلمات دیگری مانند فشار دادن یک دکمه استفاده کنید، این یک ابزار مفید است. و در اینجا لازم است نوعی از چندوظیفه ای اجرا شود.



بنابراین، با افزودن چند خط کد به برنامه های خود، به نوبه خود، شما را به برنامه نویس بهتری تبدیل می کند و پتانسیل آردوینو شما را افزایش می دهد. برای این کار باید نحوه استفاده از تابع millis را یاد بگیرید.


اگر متوجه شدید که تابع تاخیر توسط برنامه آردوینو شما استفاده می شود، در این ساعت به هیچ وجه کار نمی کند. به جای اینکه کل برنامه خود را برای مدت طولانی تکمیل کنیم، یاد می گیریم که چند ساعت قبل از اتمام آن گذشته است. این، البته، به تابع اضافی millis() و بسیاری از دوستان بزرگ برای ذخیره داده های ما متکی است. برای اینکه درک همه چیز آسان باشد، از اولین طرح اولیه به نام "Blink" شروع می کنیم و در این حالت آن را با یک LED بدون سایه روشن می کنیم.


هسته اصلی این برنامه مانند هر برنامه استاندارد دیگری برای آردوینو است. اکنون تمام خطوط ورودی/خروجی مورد نیاز پاک شده اند (مثلاً خط 13 برای LED). در اینجا برای ذخیره خط تولید LED نیز به یک تغییر دهنده نوع صحیح نیاز خواهیم داشت. روی LOW تنظیم می شود و بقیه قسمت های LED خاموش می شوند. سپس بیایید آن را "previousMillis" به نوع "unsigned long" بنامیم. در VIDMIN VID “int” dovgі Zmіnni بدون علامت، 32 bіti است، Tsarnoye برای مارها، قوطی ارزشمند بزرگ - Yak Potziyaniy، Yaki Minor Poleskuvati، اسکله ها سالم نیستند. هنگامی که چراغ LED دوباره روشن می شود، از Milllis قبلی تغییر دهید تا در زمان صرفه جویی شود. همان نوع "const long" است، همچنین 32 بیتی است، اما مقدار را تغییر نمی دهد، همانطور که در مورد ثابت ها (در این مورد برای ثابت بازه) وجود دارد. ما آن را روی 1000 و vikorystvo را به عنوان یک ساعت مکث تنظیم می کنیم که در میلی ثانیه اندازه گیری می شود.


const int ledPin = 13; // نمایشگر LED قابل توجه // متغیرها تغییر خواهند کرد: int ledState = LOW; // ledState روی حالت LED بدون علامت طولانی قبلی تنظیم شده استMillis = 0; // اگر LED جدید روشن باشد یک ساعت صرفه جویی کنید // ثابت ها تغییر نمی کنند: فاصله زمانی طولانی = 1000 // فاصله لحظه ای در میلی ثانیه void setup() ( // تنظیم خط 13 خروجی pinMode (ledPin, OUTPUT); )

سپس وارد یک چرخه بی پایان می شویم. به یاد داشته باشید که ما می خواهیم به یاد بیاوریم که از آخرین لحظه ما چند ساعت گذشته است، در مورد ما 1000 میلی ثانیه. به محض اینکه دستورالعمل ها گذشت، ساعت تغییر تنظیمات دیود ساطع کننده نور فرا رسیده است.


ابتدا یک "میلیز فعلی" یا "millis()" بدون علامت را وارد می کنیم که به معنای ساعت جاری بر حسب میلی ثانیه است. این به ما کمک می کند تا بفهمیم که تفاوت بین ساعت دقیق و ساعت پیشرفته 1000 میلی ثانیه است. برای کسانی که می گوییم: "اگر ساعت دقیق منهای ساعت قبل، اگر LED ما می درخشد، بزرگتر یا برابر با مقدار اختصاص داده شده ما 1000 میلی ثانیه است، ساعت دقیقه لحظه ای باقی مانده را مانند ساعت قبلی ذخیره کنید." این به ما کمک می کند حدس بزنیم چند ساعت از آخرین دقیقه چرخه گذشته است. سپس اگر LED روشن شد، آن را روی HIGH و در غیر این صورت روی LOW قرار دهید. سپس با استفاده از دستور digitalWrite آسیاب برش را به ال ای دی وصل کنید.


void loop() (جاری طولانی بدون علامت = millis(); if (currentMillis - previousMillis >= بازه) ( // ذخیره ساعت تغییر LED باقیمانده previousMillis = currentMillis؛ // اگر LED خاموش است، آن را روشن کنید و همچنین اگر (ledState == LOW) ( ledState = HIGH; ) other ( ledState = LOW; ) // خروجی به LED digitalWrite (ledPin، ledState))

اول از همه، یک مبتدی که به آردوینو تسلط دارد با این واقعیت روبرو می شود که قدرت تابع delay() غیرقابل قبول است - برنامه ها را مسدود می کند. برنامه های زیادی در اینترنت وجود دارد که از این عملکرد استفاده می کنند، اما رکود عملی نشان می دهد که بهتر است بدون آن انجام شود.

من به عنوان یک تازه کار دوچرخه خودم را با اجرای قفل غیر انسدادی ساختم. روستا به این صورت ایستاده بود:

  • از شبه مانیتورینگ اطمینان حاصل کنید تا مراحل مختلف در زمان خود و در فواصل زمانی خاص خود تکمیل شوند و یکدیگر را مسدود نکنید.
  • Bulo دستی koristuvatsya tsim.
  • می تواند مانند یک کتابخانه طراحی شود و به راحتی پروژه های دیگر را بدون کپی پیست شامل شود.
با توجه به اینکه بیشتر کتابخانه‌های آردوینو از یک OOP ساخته شده‌اند، تصمیم گرفتم برای نوشتن یک کلاس SmartDelay که می‌تواند از GitHub به عنوان یک فایل فشرده برای افزودن به IDE آردوینو یا ایجاد یک کلون git استخراج شود، خود را خسته نکنم ~/ Arduino/libraries/

نتیجه این شد.

#عبارتند از SmartDelay foo (1000000UL); // در میکروثانیه حلقه void () (اگر (foo.Now()) (// کد در اینجا بر اساس فاصله زمانی در میکروثانیه است، مقادیر ​​در سازنده بیشتر است. ) // کد بیشتر )
متد Now() true را برمی گرداند زیرا بازه سپری شده است. و اینجا دوباره همان فاصله شروع می شود. بنابراین، Now() اکنون به طور خودکار "شارژ می شود".

چراغ LED چشمک زن کلاسیک را می توان یکباره به یک چراغ چشمک زن کاهش داد. به عنوان مثال، لامپ ها به قسمت های پایینی 12 و 11 متصل می شوند و هر بار در فواصل زمانی 1 ثانیه و 777 میلی ثانیه روشن می شوند.

#عبارتند از SmartDelay led12 (1000000UL)؛ SmartDelay led11 (777000UL); راه اندازی () ( pinMode(12,OUTPUT)؛ pinMode(11,OUTPUT)؛ ) byte led12state=0; بایت led11state=0; حلقه خالی () (اگر (led12.Now()) ( digitalWrite(12,led12state); led12state=!led12state; ) if (led11.Now()) ( digitalWrite(11,led11state); led11state=!led11state; ))
چرخه همچنین می تواند برای روشن کردن LED ها بدون مسدود کردن کد پیکربندی شود.

واضح است که این یک جایگزین کامل برای delay () است که جریان کارها را در ساعت کند می کند و شما را ملزم به نوشتن برنامه ای به عنوان MCA (مکانیسم ماشین حالت پایانی) می کند. برای ذخیره مرحله و به روشی دیگر به محل مورد نیاز کد مراجعه کنید.

نسخه قدیمی:

Action1(); تاخیر (1000); action2(); تاخیر (500); action3(); ...
گزینه جدید:

وضعیت بایت = 0; SmartDelay d(); ... سوئیچ (وضعیت) ( case 0: action1(); d.Set(1000000UL); state=1; break; case 1: if (d.Now()) ( action2(); d.Set(500000UL) ) state=2 ) break; case 2: if (d.Now()) ( action3(); d.Stop(); state=0; ) break; )...
متد Set(interval) بازه جدیدی را تنظیم می کند و فاصله قبلی را می چرخاند. شما می توانید به سادگی با استفاده از متد Get() به فاصله زمانی نگاه کنید.

Stop() پردازش را بازنشانی می کند و Now() دوباره false می شود.

Start() کار را تجدید می کند و Now() مانند قبل شروع به کار می کند.

اگر به جای توقف کامل نیاز به کاهش سرعت برای یک ساعت دارید، از متد Wait() استفاده کنید. به عنوان مثال، اگر LED 12 می درخشد، اما با فشار دادن دکمه نمی درخشد، کافی است کد زیر را به loop() در برنامه ای با دو دیود دیگر اضافه کنید:

اگر (digitalRead(9)) led12.Wait(); ...
بنابراین، با سطح بالای سیگنال در 9 شماره، دیود در 12 قابل توجه نخواهد بود و در صورت ظاهر شدن 0 ادامه نخواهد داشت.

اگر به عنوان مثال در پشت چنین "تایمر" صفحه ای وجود دارد و دکمه ها به صورت موازی رنگ می شوند ، پس از فشار دادن دکمه ، باید صفحه یا بخشی از صفحه را رنگ کنید و منتظر پایان فاصله نباشید. برای این منظور از متد Reset() استفاده می شود که پس از هر حمله ای فراخوانی Now() true می شود. مثلا:

نمایشگر SmartDelay (1000000UL)؛ void loop() ( if (btClick()) display.Reset(); // وقتی روی دکمه کلیک می کنید، باید صفحه را رنگ کنید. if (display.Now()) screenRedraw(); // صفحه را رنگ کنید )
فقط اشکالاتی در این وجود دارد که شفادهنده میکروثانیه پوشانده نشده است، اما در غیر این صورت، کد باید پاک شود. من آن را دوست ندارم زیرا Reset() خراب است، هنوز در حال فکر کردن هستم.

تابع millis() به شما امکان می دهد ساعتی را که از شروع برنامه رشته ای گذشته است تغییر دهید. این تابع مقادیر را در قالب طولانی بدون علامت می چرخاند و به شما امکان می دهد تا 50 روز از لحظه راه اندازی برنامه مقادیر را وارد کنید. بعد از این ساعت دوباره شروع می شود. در زیر مثالی از تابع millis() آورده شده است:

مدت طولانی بدون امضا؛ void setup())( Serial.begin(9600); ) void loop())( Serial.print("On hour:"); time = millis(); // ساعت را به خاطر بسپار Serial.println(time);/ / ارسال اطلاعات از طریق تاخیر پورت سریال (1000)؛

در برنامه انتخاب شده، هر ثانیه پورت مانیتور اطلاعاتی در مورد ساعتی که از لحظه راه اندازی برنامه گذشته است را دریافت می کند. در حالی که ساعت بر حسب میلی ثانیه اندازه گیری می شود، مقدار پوسته بر 1000 تقسیم می شود. دقت قرائت به پایداری تشدید کننده کوارتز آردوینو بستگی دارد.

تابع میکرو ()

تابع micros () مشابه تابع millis () است، تفاوت در دقت اندازه گیری است. تابع اضافی micros() ساعتی را که از شروع برنامه thread می گذرد را در میکروثانیه می گیرد. دکتر میکروثانیه های تازه شده پس از 70 دقیقه برداشته می شود. در زیر مثالی از تابع micros() آورده شده است:

مدت طولانی بدون امضا؛ void setup())( Serial.begin(9600); ) void loop())( Serial.print("ساعت در هنگام راه اندازی:")؛ time = micros(); Serial.print(time); Serial.println(" µs ) ")؛ تأخیر (1000)؛ )

درست مانند یک برنامه کاربردی با تابع millis()، اطلاعات مربوط به ساعت جاری در هر ثانیه به پورت مانیتور ارسال می شود، تفاوت فقط در این واقعیت است که در این مورد ساعت در میکروثانیه اندازه گیری می شود.

تاخیر تابع ()

تابع delay() به شما این امکان را می دهد که اجرای یک برنامه رشته ای را برای یک ساعت مشخص به تاخیر بیندازید. دستور دستور به شکل زیر است:

// تاخیر فرمان (500); // خاموش شدن برای 0.5 ثانیه // تاخیر فرمان (1000); //خاموش شدن برای 1 ثانیه

ساعت بر حسب میلی ثانیه (1 ثانیه = 1000 میلی ثانیه) نشان داده شده است. این پارامتر می تواند از نوع long unsigned باشد که در محدوده 0 تا 4294967295 قرار دارد. در زیر مثالی از دستور delay() آورده شده است:

#define ledPin 13 void setup() (pinMode(ledPin,13); ) void loop() (digitalWrite(ledPin,HIGH)؛ //روشن کردن تاخیر LED(500)؛ //بررسی 500ms (0.5 ثانیه) digitalWrite( ledPin ,LOW //تاخیر LED (1000 //بررسی 1000 میلی ثانیه)

هنگامی که برنامه اشاره دارد، LED به مدت 0.5 ثانیه روشن می شود، سپس برای 1 ثانیه خاموش می شود و به همین ترتیب تا زمانی که آردوینو روشن شود.

تابع تاخیرMicroseconds()

تابع delayMicroseconds() نوعی تابع delay() است. تفاوت بستگی به کمیت و دقت بسته به ساعت دارد. تابع delay() به شما امکان می دهد ساعت را با دقت حداکثر 1 میلی ثانیه و همچنین delayMicroseconds() را با دقت حداکثر 1 میکروثانیه تنظیم کنید.

مقادیری که می توان در پارامتر مشخص کرد در بازه 0 تا 16383 است. برای بازه های زمانی طولانی تر، می توانید از تابع delay() استفاده کنید یا از delayMicroseconds() چندین بار استفاده کنید.

#define outPin 8 void setup() ( pinMode(outPin, OUTPUT); // پین 8 به عنوان خروجی ) void loop() ( digitalWrite(outPin, HIGH); // پین 8 تاخیر زیادMicroseconds(50)؛ // مکث 50 میکروثانیه digitalWrite(outPin, LOW) // پین 8 کم تاخیر(50)؛

این دستگاه یک پیچ و خم با دوره زمانی 100 میکروثانیه و نرخ پر شدن 50 درصد تولید می کند.

پیرایش در آردوینو نقش بسیار مهمی دارد. بدون آنها کار با ساده ترین دستگاه Blink که برای مدتی با LED می درخشد غیرممکن است. اما اکثر برنامه نویسان مبتدی اطلاعات کمی در مورد تاخیر زمانی دارند و تنها از تاخیر آردوینو استفاده می کنند، بدون اینکه از عوارض این دستور اطلاع داشته باشند. در این مقاله در مورد عملکردهای ساعت و ویژگی های استفاده از آنها در هسته آردوینو IDE صحبت خواهم کرد.

در آردوینو تعدادی دستور مختلف وجود دارد که کار با یک ساعت و مکث را نشان می دهد:

  • تاخیر انداختن()
  • delayMicroseconds()
  • millis()
  • micros()

آنها در دقت متفاوت هستند و ویژگی های خود را توسعه می دهند، همانطور که هنگام نوشتن کد انجام می دهند.

توابع Vikoristannya تاخیر آردوینو

نحو

تاخیر آردوینو ساده ترین دستوری است که بیشتر توسط مبتدیان استفاده می شود. در اصل، این خاموش شدن است که ربات را با یک برنامه شروع می کند، تعداد میلی ثانیه در بازوها نشان داده شده است. (در یک ثانیه 1000 میلی ثانیه وجود دارد.) حداکثر مقدار می تواند 4294967295 میلی ثانیه باشد که تقریباً 50 dib است. بیایید به یک مثال ساده نگاهی بیندازیم که به وضوح این دستورات را به ربات نشان می دهد.

Void setup() (pinMode(13، OUTPUT)؛ ) void loop() (digitalWrite(13، HIGH)؛ // ارسال یک سیگنال بالا به پین ​​13 delay(10000)؛ // مکث 10000ms یا 10 ثانیه digitalWrite13، LOW) ; // ارسال یک سیگنال کم به 13 پین تاخیر (10000)؛ // مکث 10000 میلی‌ثانیه یا 10 ثانیه)

در روش برپاییبیان شده است که دوشنبه 13 به عنوان یک راه خروج، ویکورستوویتس خواهد بود. در قسمت اصلی برنامه یک سیگنال بالا به پین ​​ارسال می شود و سپس با تاخیر 10 ثانیه ای. برای این ساعت برنامه متوقف می شود. سپس یک سیگنال کم داده می شود و خاموش شدن دوباره شروع می شود و همه چیز دوباره شروع می شود. در نتیجه، می توانیم تعیین کنیم که 5 یا 0 به پین ​​ارسال شود.

لازم است به وضوح درک کنید که در طول یک ساعت مکث برای تاخیر اضافی، برنامه ربات شروع می شود، برنامه داده های لازم را از سنسورها حذف نمی کند. این بزرگترین نقص عملکرد تاخیر در آردوینو است. برای وقفه اضافی می توانید این مبادله را دور بزنید، اما در آمار در مورد آن صحبت خواهیم کرد.

قنداق تاخیری با چراغ های LED

مثالی از مدارها برای نشان دادن تابع تاخیر.
شما می توانید مدار را با یک LED و یک مقاومت استفاده کنید. سپس شاهد چشمک زن استاندارد - LED خواهیم بود. برای این کار روی پینی که به عنوان خروجی تعیین کرده ایم باید LED را به کنتاکت مثبت وصل کنید. من پایه LED را از طریق یک مقاومت تقریباً 220 اهم وصل می کنم (کمی بیشتر ممکن است) و آن را به زمین وصل می کنم. بنابراین، قطبیت با شگفتی در درون آن امکان پذیر است. خانم بزرگ در وسط با یک منهای و دختر کوچک با یک مثبت متصل است. اگر LED جدید است، قطبیت را می توان با طول پین ها تعیین کرد: پایه بلند مثبت است، پایه کوتاه منهای است.

تاخیر عملکرد میکرو ثانیه

این تابع یکی دیگر از آنالوگ های تاخیر است، با این تفاوت که واحدهای آن میلی ثانیه نیستند، بلکه میکروثانیه هستند (در 1 ثانیه 1،000،000 میکروثانیه وجود دارد). حداکثر مقدار 16383 خواهد بود که بیش از 16 میلی ثانیه است. ساختمان جداگانه برابر با 4 است، بنابراین عدد همیشه مضربی از چهار خواهد بود. من باسن را به این صورت کنار هم می گذارم:

DigitalWrite (2، HIGH); // ارسال یک سیگنال بالا به 2 پین delayMicroseconds(16383); // مکث 16383 µs digitalWrite(2, LOW); // ارسال یک سیگنال کم به 2 پین delayMicroseconds(16383); // مکث 16383 میکروثانیه

مشکل DelayMicroseconds مانند تاخیر است - این عملکردها اساساً برنامه را "آویزان" می کنند و به معنای واقعی کلمه برای ده ساعت منجمد می شوند. کار با پورت ها، خواندن اطلاعات از حسگرها و انجام عملیات ریاضی دشوار است. برای فلاشرها، این گزینه مناسب است، مگر اینکه توسعه دهندگان از آنها برای پروژه های بزرگ استفاده نکنند، زیرا چنین شکست هایی در آنجا مورد نیاز نیست. بنابراین، توابع جالب بسیاری وجود دارد که در زیر توضیح داده شده است.

تابع تاخیر تعویض میلیس

تابع millis() به شما این امکان را می دهد که خاموش شدن را بدون تاخیر در آردوینو خاموش کنید و در نتیجه چند روش پیشرفته را معرفی کنید. حداکثر مقدار پارامتر میلیس مانند تابع تاخیر است (4294967295ms یا 50dB).

به‌خاطر این میلی‌س، ما بر کل طرح تأکید نمی‌کنیم، بلکه به سادگی نشان می‌دهیم که چند بار آردوینو می‌تواند همان بلوک کدی را که می‌خواهیم کاهش دهیم، به سادگی «منهای» کند. در واقع، تاخیر میلیس به خودی خود معنایی ندارد. این دستور به سادگی تعداد میلی ثانیه هایی را که از شروع کار میکروکنترلر گذشته است را به ما می گوید. با یک حلقه تماس پوستی، ما خودمان ساعتی را که از بقیه مکالمه به کدمان گذشته است اندازه می‌گیریم و اگر اختلاف ساعت کمتر از مکث لازم باشد، کد نادیده گرفته می‌شود. به محض اینکه اختلاف برای مکث مورد نیاز بیشتر شد، کد را نهایی می کنیم، ساعت جاری را برای میلیس بعدی کم می کنیم و آن را به خاطر می سپاریم - آن ساعت یک نقطه شروع جدید خواهد بود. در چرخه بعدی یک نقطه جدید وجود خواهد داشت و ما دوباره کد را نادیده می گیریم تا زمانی که اختلاف جدید بین millis و مقدار ذخیره شده قبلی ما به مکث لازم برسد.

خاموش شدن بدون معطلی با کمک میلیس منجر به کد بزرگتری می شود و با این کمک می توانید LED را چشمک بزنید و طرح را بدون وقفه در سیستم متوقف کنید.

محور یک قنداق است که به وضوح فرمان روبات را نشان می دهد:

زمان‌بندی طولانی بدون امضا؛ // تغییر برای ذخیره نقطه در زمان void setup() ( Serial.begin(9600); ) void loop() ( /* در آن نقطه آنالوگ مربوط به delay() شروع می شود ما تفاوت بین لحظه فعلی و لحظه را محاسبه می کنیم. در نقطه ای که قبلاً ذخیره شده بود، تفاوت مقدار مورد نیاز بیشتر است، پس از آن کد نیازی نداریم */ if (millis) - زمان بندی > 10000) (// 10000 را با مقدار مکثی که نیاز دارید جایگزین کنید. = millis();

حال وارد تغییر زمان می شویم که باعث صرفه جویی در چند میلی ثانیه می شود. پس از محاسبه، مقدار متغیر 0 است. اساساً، برنامه ذهن را بررسی می کند: چند میلی ثانیه از شروع میکروکنترلر منهای عدد نوشته شده در متغیر زمان بندی بزرگتر از، کمتر از 10 000، عمل از اعلان نمایش داده شده در مانیتور پورت تکمیل شده و مقدار زمان دقیق در حافظه ثبت می شود. در نتیجه اجرای برنامه به مدت 10 ثانیه، مانیتور پورت 10 ثانیه نمایش داده می شود. این روش به شما امکان می دهد بدون معطلی LED را چشمک بزنید.

تاخیر عملکرد میکرو

این تابع می تواند دستور تاخیر را بدون استفاده از دستور تاخیر لغو کند. مانند میلی‌ثانیه عمل می‌کند، اما چیزی که اهمیت دارد میلی‌ثانیه نیست، بلکه میکروثانیه‌ها با فاصله 4 میکروثانیه است. حداکثر مقدار 4294967295 میکروثانیه یا 70 ثانیه است. اگر مقدار تغییر کند، به سادگی به 0 بازنشانی می شود، این را فراموش نکنید.

خلاصه

پلتفرم آردوینو چندین راه برای سفارشی کردن پروژه شما ارائه می دهد. برای تأخیر بیشتر، می توانید به سرعت طرح ویدیویی را متوقف کنید، در غیر این صورت ربات میکروکنترلر را مسدود خواهید کرد. استفاده از دستور millis به شما این امکان را می دهد که بدون تاخیر از آردوینو استفاده کنید، اما نیاز به برنامه نویسی کمی دارد. بسته به پیچیدگی پروژه خود کوتاه ترین روش را انتخاب کنید. به عنوان یک قاعده، برای طرح های ساده و زمانی که زمان کمتر از 10 ثانیه است، از تاخیر استفاده کنید. از آنجایی که منطق ربات پیچیده است و تلاش زیادی لازم است، بهتر است تاخیر را جایگزین میلی‌لیس کنید.

ویتایو، آندری. حتی قبل از اینکه چمدان خود را تحویل دهید، شواهد و مدارک آنچه را که جمع کرده اید را بدانید. این واقعا به وظایف کمک می کند. خوب، من شروع به تسلط بر آردوینو کردم و امیدوارم پیشرفت کنم. مهمتر این است که از کمک های خارجی نتایج بهتری بگیرم. از این به بعد، کار من این بود که یک ربات در طول خط ایجاد کنم. Zrobiv همه چیز معجزه آسا است. گذشته از آن، با ارائه گزینه های اضافی به آنها، متوجه نشدند که چرا پاسخ صحیح به خط را متوقف کرده اند. با لمس این مقاله و فهمیدن دلیل آن.

حالا من غذا را پیش روی شما دارم: برای طرح های ارزان تر و آماده، مشکلات پزشکی با تاخیر، چه کاری باید انجام دهم، این عملکرد کجاست که به میلیس تبدیل شود؟ اگر چنین است، پس من می فهمم که کل طرح باید دوباره انجام شود؟ و کاملاً مشخص نیست که چگونه می توان میلیس را در جهان vikoristovat کرد؟ دیاکیو.

//ربات با عملکرد عبور از اسموتی سفید

// **********************نصب موتورهای جدید ********************** * *

int MotorLeftSpeed ​​= 5; //موتور Livy (A) SWIDKIST - ENA

int MotorLeftForward = 4; // موتور چپ (A) FORWARD - IN1

int MotorLeftBack = 3; // موتور چپ (A) BACK - IN2

int MotorRightForward = 8; // موتور راست (B) FORWARD - IN3

int MotorRightBack = 7; // موتور سمت راست (B) BACK - IN4

int MotorRightSpeed ​​= 9; // موتور راست (B) SHVIDKIST - ENB

// **********************نصب سنسور التراسونیک************************ ****** *

int trigPinL = 14; // تعداد سنسور اولتراسونیک تریگ سمت چپ را مشخص کنید

int echoPinL = 15; // تعداد سنسور اولتراسونیک اکو سمت چپ را مشخص کنید

int trigPinC = 10; // تعداد سنسور اولتراسونیک تریگ مرکزی را مشخص کنید

int echoPinC = 11; // تعداد سنسور اولتراسونیک اکو مرکزی را مشخص کنید

int trigPinR = 12; // تعداد نمایشگر سنسور اولتراسونیک ماشه سمت راست را مشخص کنید

int echoPinR = 13; // تعداد سنسور اولتراسونیک اکو سمت راست را مشخص کنید

// ********************* نصب سنسورهای خط اضافی ******************

const int LineSensorLeft = 19; // ورودی سنسور خط چپ

const int LineSensorRight = 18; // ورودی سنسور خط سمت راست

int SL; // وضعیت حسگر سمت چپ

int SR; // وضعیت سنسور سمت راست

// *********************نصب دزدگیر نوری و صوتی***************

int Light = 2; // تعیین شماره زنگ نور

int Zumm = 6; // عددی را که باید نمایش داده شود را روی buzzer تنظیم کنید

int ledState = LOW; // برای این منظور منبع تغذیه LED نصب شده است

طولانی قبلیMillis = 0; // ساعت باقیمانده اختلاط مجدد LED را ذخیره کنید

فاصله طولانی = 300; // فاصله بین روشن/پایین کردن LED (0.3 ثانیه)

// *********************تغییر اندازه گیری فاصله توسط سنسورها***************

بدون علامت int impulseTimeL=0;

بدون علامت int impulseTimeC=0;

بدون علامت int impulseTimeR=0;

طولانی distL=0; //فاصله اندازه گیری شده توسط حسگر اولتراسونیک سمت چپ

long distC=0; //فاصله اندازه گیری شده توسط سنسور اولتراسونیک مرکزی

long distR=0; // فاصله اندازه گیری شده توسط سنسور اولتراسونیک مناسب

//******************************** برپایی ************ *** *****************

Serial.begin(9600); // راه اندازی پورت سریال (سرعت 9600)

//**************** تنظیم کنتاکت های موتور****************

pinMode (MotorRightBack، OUTPUT)؛ // موتور سمت راست (B) BACK

pinMode (MotorRightForward، OUTPUT)؛ // موتور راست (B) FORWARD

pinMode (MotorLeftBack، OUTPUT)؛ //موتور Livy (A) BACK

pinMode (MotorLeftForward، OUTPUT)؛ // موتور نور (A) FORWARD

تاخیر (مدت)؛

//**************** مخاطبین سنسورهای دود را تنظیم می کند***************

pinMode (LineSensorLeft، INPUT)؛ // پین اختصاص داده شده به سنسور خط چپ

pinMode (LineSensorRight، INPUT)؛ // پین اختصاص داده شده به سنسور خط سمت راست

//****************تنظیم حالت های سنسورهای اولتراسونیک**************************** **

pinMode (trigPinL، OUTPUT)؛ // حالت روباتیک را برای نمایش سنسور اولتراسونیک تریگ چپ تنظیم کنید

pinMode (echoPinL، INPUT)؛ // حالت روباتیک را برای نمایش سنسور اولتراسونیک اکو سمت چپ تنظیم کنید

pinMode (trigPinC، OUTPUT)؛ // حالت ربات را برای نمایش سنسور اولتراسونیک مرکزی تریگ تنظیم کنید

pinMode (echoPinC، INPUT)؛ // حالت ربات را برای نمایش سنسور اولتراسونیک اکو مرکزی تنظیم کنید

pinMode (trigPinR، OUTPUT)؛ // حالت ربات را برای نمایش سنسور اولتراسونیک تریگ سمت راست تنظیم کنید

pinMode (echoPinR، INPUT)؛ // حالت ربات را برای نمایش سنسور اولتراسونیک اکو مناسب تنظیم کنید

// ******************تنظیم مخاطبین برای آلارم نور و صدا************************ ******************

pinMode (Zumm، OUTPUT)؛ // حالت ربات را برای نمایش آژیر تنظیم کنید

pinMode (نور، OUTPUT)؛ // حالت روباتیک را برای نمایش هشدار نور تنظیم کنید

// ***************** دستورات اساسی برای راک ******************

void forward (int a, int sa) // FORWARD

analogWrite (MotorRightSpeed، sa)؛

analogWrite (MotorLeftSpeed, sa);

void right (int b, int sb) // ROTATE RIGHT (یک طرف)

digitalWrite (MotorRightBack، LOW)؛

digitalWrite (MotorLeftBack، LOW)؛

digitalWrite (MotorLeftForward، HIGH);

analogWrite (MotorLeftSpeed، sb)؛

خالی به چپ (int k، int sk) // چرخش به چپ (یک طرف)

digitalWrite (MotorRightBack، LOW)؛

digitalWrite (MotorRightForward، HIGH);

analogWrite (MotorRightSpeed، sk)؛

digitalWrite (MotorLeftBack، LOW)؛

توقف خالی (int f) // STOP

digitalWrite (MotorRightBack، LOW)؛

digitalWrite (MotorRightForward، LOW)؛

digitalWrite (MotorLeftBack، LOW)؛

digitalWrite (MotorLeftForward، LOW)؛

// *********************************نمای از راه دور**************** ******* *

void izmdistL() // مقدار فاصله با سنسور اولتراسونیک سمت چپ

digitalWrite (trigPinL، HIGH)؛

digitalWrite (trigPinL، LOW)؛ // پالس 10 میلی‌ثانیه در خروجی سنسور اولتراسونیک تریگ سنسور ارتعاش

impulseTimeL = pulseIn(echoPinL، HIGH); // خواندن خروجی از سنسور اولتراسونیک

distL=impulseTimeL/58; // می توان بیش از حد سانتی متر شارژ کرد

void izmdistC() // اندازه گیری فاصله توسط سنسور اولتراسونیک مرکزی

digitalWrite (trigPinC، HIGH)؛

digitalWrite (trigPinC، LOW)؛ // پالس 10 میلی‌ثانیه به خروجی سنسور ارتعاش اولتراسونیک

impulseTimeC = pulseIn(echoPinC، HIGH); // خواندن خروجی از سنسور اولتراسونیک

distC=impulseTimeC/58; // می توان بیش از حد سانتی متر شارژ کرد

void izmdistR() // اندازه گیری فاصله توسط سنسور اولتراسونیک مرکزی

digitalWrite (trigPinR، HIGH)؛

digitalWrite (trigPinR، LOW)؛ // پالس 10 میلی‌ثانیه در خروجی سنسور اولتراسونیک تریگ سنسور ارتعاش

impulseTimeR = pulseIn(echoPinR، HIGH); // خواندن خروجی از سنسور اولتراسونیک

distR=impulseTimeR/58; // می توان بیش از حد سانتی متر شارژ کرد

//************************************ LOOP ************ *********************

// ********************** حالت راه رفتن در خط ************************ *************

// ********************* زنگ نور و صدا***************

تن (Zumm, 900); // صدا را با فرکانس 900 هرتز روشن کنید

تن (Zumm, 900); // صدا را با فرکانس 800 هرتز روشن کنید

جریان طولانی بدون علامتMillis = millis();

if (currentMillis - previousMillis > interval) //بررسی می کند که آیا بازه مورد نیاز سپری نشده است یا خیر

previousMillis = فعلیMillis; // یک ساعت از وقفه باقی مانده را ذخیره کنید

اگر (ledState == LOW) // اگر LED روشن نباشد، مشتعل می شود و با این حال

ledState = HIGH;

digitalWrite (Light، ledState)؛ // خروجی را طوری تنظیم کنید که LED خاموش یا خاموش شود

// ************************ فاصله ویمیر*********************** **************

Serial.println(distL);

Serial.println(distC);

Serial.println(distR);

if (distL>50 && distC>50 && distR>50) // اگر فاصله تخمینی بیش از 50 سانتی متر باشد - idemo

SL = digitalRead (LineSensorLeft); // سیگنال را از حسگر سیاه سمت چپ بخوانید

SR = DigitalRead (LineSensorRight); // سیگنال را از حسگر مشکی سمت راست بخوانید

// ******************************** قدم زدن در امتداد خط سیاه *********** ************

// روبات روی اسموتی - بیایید مستقیم برویم

اگر (SL == LOW & SR == LOW) // BILIY - BILIY - IDEMO DIRECT

فوروارد (10, 100); // مستقیم (ساعت، سرعت)

// ربات در تاریکی شروع به حرکت می کند - کنترل شده

در غیر این صورت اگر (SL == LOW & SR == High) // سیاه - سفید - به چپ بپیچید

چپ (10، 100)؛ // چرخش به چپ (ساعت، سرعت)

در غیر این صورت اگر (SL == بالا و SR == کم) // سفید - سیاه - به راست بپیچید

راست (10، 100)؛ // چرخش به راست (ساعت، سرعت)

// FINISH - ROBOT حسگرها را به بدن پمپ می کند

دیگری اگر (SL == HIGH & SR == HIGH) // BLACK - BLACK - STOP

توقف (50)؛ // متوقف کردن

else // اگر فاصله فعلی کمتر باشد یا فاصله سنتی حداقل باشد - هزینه