Съдържание:

Проверка на отчета за трафика (NL) с килим: 6 стъпки
Проверка на отчета за трафика (NL) с килим: 6 стъпки

Видео: Проверка на отчета за трафика (NL) с килим: 6 стъпки

Видео: Проверка на отчета за трафика (NL) с килим: 6 стъпки
Видео: How Not To Die: The Role of Diet in Preventing, Arresting, and Reversing Our Top 15 Killers 2024, Ноември
Anonim
Проверка на отчета за трафика (NL) с килим
Проверка на отчета за трафика (NL) с килим

В тази инструкция ще опиша как да се изгради изтривалка, която да проверява отчетите за трафика на холандските магистрали. След като излезете навън върху изтривалката си и има задръстване по маршрута ви, постелката ще се превърне в червен цвят. Когато няма задръстване, постелката ще стане зелена.

Ще работя върху NodeMCU 1.0 (ESP0-12E модул). Кодът за този проект може да работи и на други устройства (например платки Arduino). Този проект се основава на холандски източник за отчети за трафика, ANWB.

Какво ни трябва за този проект:

- NodeMCU - Кабелни проводници - LED светлина или лента - Аналогов сензор (алуминиево фолио, гъба) - Wi -Fi връзка - Килим за врата

Стъпки, които трябва да предприемем:

1. Свържете NodeMCu към Wi-Fi 2. Заявете данни чрез HTTPS от ANWB.nl 3. Превърнете данните в използваема информация 4. Инсталирайте спусъка 5. Дизайн обратна връзка

Стъпка 1: Свържете NodeMCU към Wi-Fi

Тази стъпка ще покаже как да направите успешен HTTPSRequest, за да видите дали устройството е свързано с интернет.

Първо инсталирайте библиотеката ESP8266 в IDE на Arduino, Отворете от примери ESP8266>

Попълнете своите идентификационни данни за Wi-Fi в горната част на кода си, както е показано по-долу:

const char* ssid = "YOUR_SSID";

const char* password = "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“, пътя, от който е взета информацията:

String url = "/feeds/gethf";!! Ако използвате друг източник, използвайте пътя към вашия източник!

Когато качвате кода, трябва да получите отговор с всички данни от www.anwb.nl/feeds/gethf. Този код се записва в низ, наречен line.

Стъпка 3: Превърнете данните в използваема информация

Досега кодът се изпълняваше само при стартиране или нулиране на NodeMCU, защото целият код е във функцията за настройка. За да настроите тригера да изпълнява кода непрекъснато, трябва да промените позицията на кода, който изпълнява HTTPS заявката. Под функцията цикъл добавяте друга функция. Нарекох го void Extract

ExtraData () {

}

Копирайте част от кода от функцията за настройка в ExtraData (). Започнете със следния ред до края на настройката:

if (! client.connect (хост, Кодът вече е във вашата нова функция, така че премахнете копирания код от функцията за настройка.

След това извикайте функцията extraData във функцията цикъл и добавете известно забавяне, за да дадете на nodeMCU време за почивка:

void loop () {

extraData (); забавяне (30000); // това ще бъде премахнато по -късно, когато имаме аналогов сензор}

Тъй като данните, които получавате, се съхраняват в низ и са необходими само части от този низ, трябва да напишете няколко цикъла for.

Първо проверете всички позиции на думата „път“. След думата „път“следва името на пътя (A1, A2 и т.н.).

Преди да започнете да пишете for цикли, трябва да декларирате някои променливи, които ще използвате:

int noOfPos = 0;

логическо hasRunOnce = false; int от = 0; int roadArray [20];

Сега е време да напишем няколко цикъла. Написах циклите for в долната част на функцията extraData. Опитах се да го разделя на отделни функции, но не успях да го накарам да работи.

За контур № 1: намерете позициите на думата път в низовия ред:

for (int i = 0; i <line.length (); i ++) {int pos = line.indexOf ("път \": ", от); roadArray [noOfPos] = pos; noOfPos+= 1; from = pos + 1; if (hasRunOnce == true && pos == line.indexOf ("road \": ")) {i = line.length (); } hasRunOnce = true; }

След това проверете на какви пътища има задръстване, като използвате позициите на цикъла for отгоре. Позицията на името на пътищата винаги е една и съща и започва 7 знака и завършва 10 знака след думата път.

Сега определяме името на масиваOfRoadArray, което ще бъде попълнено в следващия цикъл for:

Име на низOFRoadArray [20];

За контур № 2: Намерете всички имена на пътищата с входа от for цикъл №. 1

for (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]); във втория цикъл for като:

for (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, трябва да декларирате булева стойност като глобална променлива. Логическото, наречено trafficJam, по подразбиране е false и ще се промени, ако функцията ExtraData ще върне true за задръстване. Следният код върви над.ino файла:

логически trafficJam = false;

За контур № 3: Проверете дали пътят, в този случай A1, е в списъка с задръствания.

for (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// промяна на A1 на път в ваша полза trafficJam = true;}

Ако отпечатате trafficJam в серийния монитор, знаете дали има задръстване на A1 или не.

Поставете този код в долната част на функцията ExtraData:

Serial.println (trafficJam); // вижте дали има задръстване

С тази информация ще работим допълнително върху обратната връзка на системата в стъпка 5.

Стъпка 4: Инсталирайте тригера

Инсталирайте тригера
Инсталирайте тригера
Инсталирайте тригера
Инсталирайте тригера
Инсталирайте тригера
Инсталирайте тригера

Тъй като вече можем да извлечем данните успешно от източника, е време да изградим сензор, който да задейства nodeMCU да изпълнява функцията ExtraData. Избрах да направя аналогов сензор от изтривалката си. Можете да промените спусъка, като използвате друг сензор.

Изграждане на аналогов сензор

Използвах 2 броя алуминиево фолио, две джъмперни жици и гъба.

Пробийте дупка в гъбата, това е мястото, където алуминиевите фолиа ще контактуват. Залепете алуминиево фолио от двете страни на гъбата. Свържете джъмперните проводници към алуминиевото фолио. Свържете проводниците на джъмпера към nodeMCU. Едната страна към A0-пина, а другата към V3-пина. Поставете гъбата под изтривалката си и току -що сте сменили изтривалката си в сензор. Страхотно!

Кодът за отчитане на стойността от сензора, за да се види дали някой стои на изтривалката:

int sensorValue = analogRead (A0);

if (sensorValue == 1024) {ExtraData (); }

Когато алуминиевото фолио осъществява контакт (когато някой стои на постелката), sensorValue е 1024. Това води до задействане на функцията extraData (). И точно това искаме системата да направи.

Стъпка 5: Дизайн обратна връзка

Използвах LED лента, за да дам обратна връзка на потребителя. Когато има задръстване, светлината ще оцвети в червено. Когато пътят е добър, той ще стане зелен. Използвах библиотеката adapruit neopixel, за да контролирам LED лентата си.

Напишете този код в горната част на файла, за да се уверите, че LED лентата е дефинирана:

#включва

#дефинирайте PIXEL_PIN D5 #дефинирайте PIXEL_COUNT 10 #дефинирайте PIXEL_TYPE NEO_GRB + NEO_KHZ800 Adafruit_NeoPixel пиксели = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

Напишете следния код във функцията за настройка:

// неопиксел

pixels.begin (); pixels.show ();

И следният код във функцията цикъл:

if (trafficJam == true) {

за (int i; i <PIXEL_COUNT; i ++) {пиксели.setPixelColor (i, 255, 0, 0); // червени пиксели.show (); забавяне (200); }} else {for (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 0, 255, 0); // зелени пиксели.show (); забавяне (200); }

В горния код има функция if/else. Когато функцията ExtraData връща наличието на задръстване, LED лентата ще стане червена. Ако не, LED лентата ще стане зелена.

Стъпка 6: Стартирайте кода

Ако изпълним пълния код сега, сензорът и светлината трябва да работят. Когато застанете на изтривалката, сензорът ще се свърже и функцията ExtraData ще стартира. Когато в масива от имена на пътища, пътят, който търсим, присъства, LED лентата ще стане червена, сигнализирайки задръстване. Ако не е в масива, LED лентата ще стане зелена и вие знаете, че сте готови!

Приятно пътуване и благодаря за четенето. Надявам се, че сте намерили вдъхновение или информация. Ако имате обратна връзка, не се колебайте да отговорите!

Препоръчано: