فهرست مطالب:

بررسی گزارش ترافیک (NL) با درب: 6 مرحله
بررسی گزارش ترافیک (NL) با درب: 6 مرحله

تصویری: بررسی گزارش ترافیک (NL) با درب: 6 مرحله

تصویری: بررسی گزارش ترافیک (NL) با درب: 6 مرحله
تصویری: تکچرخ 2024, جولای
Anonim
بررسی گزارش ترافیک (NL) با Doormat
بررسی گزارش ترافیک (NL) با Doormat

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

من روی NodeMCU 1.0 (ماژول ESP0-12E) کار خواهم کرد. کد این پروژه می تواند روی دستگاه های دیگر نیز کار کند (به عنوان مثال بردهای آردوینو). این پروژه بر اساس یک منبع هلندی برای گزارش ترافیک ، ANWB است.

آنچه برای این پروژه نیاز داریم:

- NodeMCU - سیم های بلوز - چراغ یا نوار LED - سنسور آنالوگ (فویل آلومینیوم ، اسفنج) - اتصال Wi -Fi - درب ورودی

گام هایی که باید برداریم:

1. NodeMCu را به Wi-Fi متصل کنید 2. درخواست داده از طریق HTTPS از ANWB.nl 3. تبدیل داده ها به اطلاعات قابل استفاده 4. راه اندازی 5. راه اندازی 5. بازخورد طراحی

مرحله 1: NodeMCU را به Wi-Fi وصل کنید

این مرحله نحوه انجام موفقیت آمیز HTTPS را نشان می دهد تا ببینید آیا دستگاه به اینترنت متصل است یا خیر.

ابتدا ، کتابخانه ESP8266 را در Arduino IDE نصب کنید. از نمونه های ESP8266> HTTPSRequest باز کنید.

مطابق تصویر زیر ، اعتبارنامه Wi-Fi خود را در بالای کد خود وارد کنید:

const char* ssid = "YOUR_SSID"؛

const char* رمز عبور = "YOUR_PASS"؛

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

مرحله 2: درخواست داده از HTTPS از ANWB.nl

در مرحله دوم ، منبع داده را از پیش فرض به منبع مورد نیاز برای این پروژه تغییر می دهید: ANWB.nl.

در بالای کد خود ، char* host را به www.anwb.nl (یا منبع دیگری که می خواهید اطلاعات خود را از آن دریافت کنید) تغییر دهید:

const char* host = "www.anwb.nl"؛!! اگر از منبع دیگری استفاده می کنید ، مرحله 3 با کد من متفاوت است. مرحله 3 برای بازیابی اطلاعات قابل استفاده نیاز به کدگذاری خاصی دارد!

در مرحله بعد ، url رشته را در تنظیمات تابع به "/feeds/gethf" ، مسیری که اطلاعات از آن گرفته شده است ، تغییر دهید:

url رشته = "/feeds/gethf"؛!! اگر از منبع دیگری استفاده می کنید از مسیر منبع خود استفاده کنید!

هنگام بارگذاری کد ، باید با تمام داده ها از www.anwb.nl/feeds/gethf پاسخی دریافت کنید. این کد در رشته ای به نام line ذخیره می شود.

مرحله 3: تبدیل داده ها به اطلاعات قابل استفاده

تا به حال ، کد فقط در هنگام راه اندازی یا بازنشانی NodeMCU اجرا می شد ، زیرا همه کد در عملکرد راه اندازی است. برای تنظیم ماشه برای اجرای مداوم کد ، باید موقعیت کدی را که درخواست HTTPS را اجرا می کند تغییر دهید. در زیر تابع حلقه ، یک تابع دیگر اضافه می کنید. من آن را void extractData نامیده ام:

extractData () {

}

بخشی از کد را از تابع setup در extractData () کپی کنید. تا پایان عملکرد راه اندازی با خط زیر شروع کنید:

if (! client.connect (میزبان ،

کد اکنون در عملکرد جدید شما قرار دارد ، بنابراین کد کپی شده را از عملکرد راه اندازی حذف کنید.

در مرحله بعد ، تابع extractData را در تابع حلقه فراخوانی کرده و مقداری تأخیر اضافه کنید تا به nodeMCU زمان استراحت داده شود:

حلقه خالی () {

extractData ()؛ تاخیر (30000) ؛ // بعداً وقتی سنسور آنالوگ داریم حذف می شود}

از آنجا که داده هایی که دریافت می کنید در یک رشته ذخیره می شود و فقط قسمتهایی از این رشته مورد نیاز است ، باید چند حلقه برای حلقه ها بنویسید.

ابتدا همه موقعیت های کلمه "جاده" را بررسی کنید. بعد از کلمه "جاده" ، نام جاده (A1 ، A2 ، و غیره) دنبال می شود.

قبل از شروع به نوشتن حلقه های for ، باید متغیرهایی را که می خواهید استفاده کنید اعلام کنید:

int noOfPos = 0 ؛

boolean hasRunOnce = false؛ int از = 0 ؛ int roadArray [20]؛

اکنون وقت آن است که چند حلقه بنویسیم. من حلقه های for را در پایین تابع extractData نوشته ام. سعی کردم آن را به توابع جداگانه تقسیم کنم ، اما نتوانستم کار کنم.

برای حلقه شماره 1: موقعیت کلمه road را در خط رشته بیابید:

برای (int i = 0؛ i <line.length ()؛ i ++) {int pos = line.indexOf ("road \": "، from)؛ roadArray [noOfPos] = pos؛ noOfPos+= 1؛ from = pos + 1 ؛ if (hasRunOnce == true && pos == line.indexOf ("road \": ")) {i = line.length ()؛ } hasRunOnce = true؛ }

در مرحله بعد ، با استفاده از موقعیت های حلقه for از بالا ، در چه جاده هایی ترافیک وجود دارد. موقعیت نام جاده ها همیشه یکسان است و از 7 حرف شروع می شود و پس از کلمه جاده 10 کاراکتر به پایان می رسد.

حالا نام آرایه را تعریف می کنیم

نام رشته OFRoadArray [20]؛

برای حلقه شماره 2: همه نام جاده ها را با ورودی حلقه شماره پیدا کنید. 1

برای (int k = 0؛ k <20؛ k ++) {int pos = roadArray [k]؛ int positionOfRoadName = pos + 7؛ int endOfPositionOfRoadName = pos + 10؛ nameOfRoadArray [k] = line.substring (positionOfRoadName، endOfPositionOfRoadName) ؛ }

نام آرایهOfRoudArray باید با تمام ترافیک های سیگنال شده پر شود.

در مرحله بعد ، شما بررسی می کنید که آیا جاده شما در محدوده جاده هایی با ترافیک قرار دارد یا خیر. برای دریافت مسیرها در داده ، نامOfRoadArray را چاپ کنید. این کار را با افزودن Serial.println (nameOfRoadArray [k]) انجام دهید. به حلقه دوم برای حلقه مانند:

برای (int k = 0؛ k <20؛ k ++) {int pos = roadArray [k]؛ int positionOfRoadName = pos + 7؛ int endOfPositionOfRoadName = pos + 10؛ nameOfRoadArray [k] = line.substring (positionOfRoadName، endOfPositionOfRoadName) ؛ Serial.println (nameOfRoadArray [k]) ؛ }

اگر درست باشد ، تمام جاده ها را با مانع ترافیک در مانیتور سریال مشاهده خواهید کرد.

قبل از نوشتن آخرین حلقه For ، باید یک boolean را به عنوان یک متغیر جهانی اعلام کنید. بولین ، که trafficJam نامیده می شود ، به طور پیش فرض غلط است و اگر تابع extractData برای یک ترافیک تابع true برگردد ، تغییر می کند. کد زیر در بالای فایل.ino قرار دارد:

boolean trafficJam = false؛

برای حلقه شماره 3: بررسی کنید که آیا جاده ، در این مورد A1 ، در لیست ترافیک قرار دارد.

برای (int l = 0؛ l <20؛ l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// تغییر A1 به جاده مورد علاقه ترافیکJam = true؛}

اگر trafficJam را در مانیتور سریال چاپ می کنید ، می دانید که در A1 ترافیک وجود دارد یا خیر.

این کد را در انتهای تابع extractData قرار دهید:

Serial.println (trafficJam) ؛ // ببینید آیا ترافیک وجود دارد یا خیر

با استفاده از این اطلاعات ، ما در مرحله 5 روی بازخورد سیستم بیشتر کار می کنیم.

مرحله 4: Trigger را نصب کنید

Trigger را نصب کنید
Trigger را نصب کنید
Trigger را نصب کنید
Trigger را نصب کنید
Trigger را نصب کنید
Trigger را نصب کنید

از آنجایی که اکنون می توانیم داده ها را با موفقیت از منبع بازیابی کنیم ، وقت آن است که یک سنسور بسازیم که nodeMCU را برای اجرای تابع extractData فعال کند. من انتخاب کردم که یک سنسور آنالوگ از روی درب من بسازم. می توانید با استفاده از سنسور دیگری ماشه را تغییر دهید.

ساخت سنسور آنالوگ

من از 2 قطعه فویل آلومینیومی ، دو سیم جامپر و یک اسفنج استفاده کردم.

سوراخی در اسفنج ایجاد کنید ، این جایی است که ورقه های آلومینیومی با آن تماس پیدا می کنند. فویل آلومینیومی را در دو طرف اسفنج بچسبانید. سیم های بلوز را به فویل آلومینیومی وصل کنید. سیم های بلوز را به nodeMCU وصل کنید. یک طرف به پین A0 و طرف دیگر به پین V3. اسفنج را زیر تخت درب خود بگذارید و به تازگی تخت خود را به سنسور تغییر داده اید. عالی!

کد برای خواندن مقدار از سنسور برای دیدن اینکه آیا کسی روی تخت ایستاده است:

int sensorValue = analogRead (A0) ؛

if (sensorValue == 1024) {extractData ()؛ }

هنگامی که فویل آلومینیومی در تماس است (هنگامی که شخصی روی تشک ایستاده است) ، سنسور Value 1024 است. این منجر به شلیک تابع extractData () می شود. و این دقیقاً همان چیزی است که ما می خواهیم سیستم انجام دهد.

مرحله 5: طراحی بازخورد

من از یک نوار LED برای بازخورد دادن به کاربر استفاده کردم. وقتی ترافیک ایجاد می شود ، چراغ قرمز می شود. وقتی جاده برای رفتن خوب باشد ، سبز می شود. من از کتابخانه adopruit neopixel برای کنترل نوار LED خود استفاده کردم.

این کد را در بالای فایل خود بنویسید تا مطمئن شوید LEDstrip تعریف شده است:

#عبارتند از

#تعریف PIXEL_PIN D5 #تعریف PIXEL_COUNT 10 #تعریف PIXEL_TYPE NEO_GRB + NEO_KHZ800 پیکسل Adafruit_NeoPixel = Adafruit_NeoPixel (PIXEL_COUNT ، PIXEL_PIN ، PIXEL_TYPE) ؛

کد بعدی را در تابع setup بنویسید:

// نئوپیکسل

pixels.begin ()؛ pixels.show ()؛

و کد زیر در تابع حلقه:

if (trafficJam == true) {

برای (int i؛ i <PIXEL_COUNT؛ i ++) {pixels.setPixelColor (i، 255، 0، 0)؛ // پیکسل های قرمز. نمایش ()؛ تأخیر (200) ؛ }} else {for (int i؛ i <PIXEL_COUNT؛ i ++) {pixels.setPixelColor (i، 0، 255، 0)؛ // پیکسل های سبز. نمایش ()؛ تأخیر (200) ؛ }

در کد بالا تابع if/else وجود دارد. هنگامی که تابع extractData حضور یک ترافیک را برمی گرداند ، نوار LED قرمز می شود. در غیر این صورت ، نوار LED سبز می شود.

مرحله 6: کد را اجرا کنید

اگر ما اکنون کد کامل را اجرا کنیم ، سنسور و نور باید کار کنند. وقتی روی تخت در ایستاده اید ، سنسور متصل می شود و عملکرد extractData اجرا می شود. هنگامی که در مجموعه ای از نام جاده ها ، جاده ای که ما به دنبال آن هستیم ، وجود داشته باشد ، نوار LED قرمز می شود و نشان دهنده یک ترافیک است. اگر در آرایه نیست ، LEDstrip سبز می شود و شما می دانید که خوب هستید!

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

توصیه شده: