Оглавление:

Проверка отчета о трафике (NL) с ковриком: 6 шагов
Проверка отчета о трафике (NL) с ковриком: 6 шагов

Видео: Проверка отчета о трафике (NL) с ковриком: 6 шагов

Видео: Проверка отчета о трафике (NL) с ковриком: 6 шагов
Видео: 14 июня 2023 г. 2024, Ноябрь
Anonim
Проверка отчета о трафике (NL) с ковриком
Проверка отчета о трафике (NL) с ковриком

В этом руководстве я опишу, как построить дверной коврик, который будет проверять отчеты о дорожном движении на голландских автомагистралях. Как только вы выйдете на коврик и на вашем маршруте возникнет пробка, коврик станет красного цвета. Когда пробок нет, коврик станет зеленым.

Я буду работать над NodeMCU 1.0 (модуль ESP0-12E). Код этого проекта может работать и на других устройствах (например, на платах Arduino). Этот проект основан на голландском источнике сообщений о дорожном движении - ANWB.

Что нам понадобится для этого проекта:

- NodeMCU - Перемычки - Светодиодная подсветка или полоса - Аналоговый датчик (алюминиевая фольга, губка) - Подключение Wi-Fi - Коврик

Шаги, которые мы должны предпринять:

1. Подключите NodeMCu к Wi-Fi 2. Запросите данные через HTTPS с ANWB.nl 3. Превратите данные в полезную информацию 4. Установите триггер 5. Обратная связь по проекту

Шаг 1. Подключите NodeMCU к Wi-Fi

Этот шаг покажет, как выполнить успешный HTTPSRequest, чтобы узнать, подключено ли устройство к Интернету.

Сначала установите библиотеку ESP8266 в Arduino IDE. Откройте из примеров ESP8266>

Введите свои учетные данные Wi-Fi в верхней части кода, как показано ниже:

const char * ssid = "ВАШ_SSID";

const char * пароль = "ВАШ ПАСС";

Загрузите код на свое устройство и проверьте, подключается ли 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 () {

}

Скопируйте часть кода из функции настройки в extractData (). Начните со следующей строки до конца функции настройки:

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

Затем вызовите функцию extractData в функции цикла и добавьте некоторую задержку, чтобы дать nodeMCU время отдохнуть:

void loop () {

extractData (); задержка (30000); // это будет удалено позже, когда у нас будет аналоговый датчик}

Поскольку данные, которые вы получаете, хранятся в строке, и требуются только части этой строки, вам нужно написать пару циклов for.

Сначала проверьте все позиции слова «дорога». После слова «дорога» следует название дороги (A1, A2 и т. Д.).

Перед тем, как приступить к написанию циклов for, вам нужно объявить некоторые переменные, которые вы собираетесь использовать:

int noOfPos = 0;

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

Пришло время написать несколько циклов. Я написал циклы for в нижней части функции extractData. Я пытался разделить его на отдельные функции, но не смог заставить его работать.

Для цикла №1: найдите в строке строки слова «дорога»:

for (int i = 0; i <line.length (); i ++) {int pos = line.indexOf ("road \": ", from); roadArray [noOfPos] = pos; noOfPos + = 1; from = pos + 1; если (hasRunOnce == true && pos == line.indexOf ("дорога \": ")) {я = line.length (); } hasRunOnce = true; }

Затем проверьте, на каких дорогах есть пробки, используя положение петли сверху. Положение названия дорог всегда одинаковое и начинается с 7 символов и заканчивается 10 символами после слова «дорога».

Теперь мы определяем массив nameOfRoadArray, который будет заполнен в следующем цикле for:

Строка nameOfRoadArray [20];

Для петли №2: Найдите все названия дорог с входными данными из петли №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); }

Массив nameOfRoudArray должен быть заполнен всеми известными пробками.

Далее вы собираетесь проверить, входит ли ваша дорога в массив дорог с пробками. Выведите nameOfRoadArray, чтобы получить дороги в данных. Сделайте это, добавив Serial.println (nameOfRoadArray [k]); во второй цикл 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 и изменится, если функция extractData вернет true для пробки. Следующий код находится поверх файла.ino:

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

Для петли № 3: проверьте, находится ли дорога, в данном случае A1, в списке пробок.

for (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// измените A1 на дорогу вашей благосклонности trafficJam = true;}

Если вы печатаете пробку в мониторе последовательного порта, вы знаете, есть пробка на A1 или нет.

Поместите этот код в конец функции extractData:

Serial.println (пробка); // посмотрим, есть ли пробка

С этой информацией мы собираемся продолжить работу над обратной связью системы на шаге 5.

Шаг 4: Установите триггер

Установите триггер
Установите триггер
Установите триггер
Установите триггер
Установите триггер
Установите триггер

Поскольку теперь мы можем успешно извлекать данные из источника, пришло время создать датчик, который будет запускать nodeMCU для запуска функции extractData. Я решил сделать аналоговый датчик из коврика. Вы можете изменить триггер, используя другой датчик.

Создание аналогового датчика

Я использовал 2 куска алюминиевой фольги, две перемычки и губку.

Просверлите отверстие в губке, это место соприкосновения алюминиевой фольги. Приклейте алюминиевую фольгу с двух сторон губки. Подключите перемычки к алюминиевой фольге. Подключите перемычки к nodeMCU. Одна сторона к контакту A0, а другая - к контакту V3. Положите губку под коврик, и вы только что превратили коврик в датчик. Потрясающие!

Код для считывания значения с датчика, чтобы увидеть, стоит ли кто-нибудь на коврике:

int sensorValue = аналоговое чтение (A0);

если (sensorValue == 1024) {extractData (); }

Когда алюминиевая фольга контактирует (когда кто-то стоит на коврике), значение sensorValue равно 1024. Это приводит к срабатыванию функции extractData (). И это именно то, что мы хотим, чтобы система делала.

Шаг 5: обратная связь с дизайном

Я использовал светодиодную полосу для обратной связи с пользователем. Когда есть пробка, световой сигнал становится красным. Когда дорога будет готова, она станет зеленой. Я использовал библиотеку adafruit neopixel для управления своей светодиодной лентой.

Напишите этот код в верхней части файла, чтобы убедиться, что светодиодная полоса определена:

#включают

#define PIXEL_PIN D5 #define PIXEL_COUNT 10 #define PIXEL_TYPE NEO_GRB + NEO_KHZ800 Adafruit_NeoPixel пикселей = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

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

// неопиксель

pixel.begin (); pixel.show ();

И следующий код в функции цикла:

if (trafficJam == true) {

для (int я; я <PIXEL_COUNT; я ++) {пикселей.setPixelColor (я, 255, 0, 0); // красные пиксели.show (); задержка (200); }} else {для (int я; я <PIXEL_COUNT; я ++) {пикселей.setPixelColor (я, 0, 255, 0); // зеленые пиксели.show (); задержка (200); }

В приведенном выше коде есть функция if / else. Когда функция extractData возвращает наличие пробки, светодиодная полоса становится красной. В противном случае светодиодная полоса станет зеленой.

Шаг 6: запустите код

Если мы запустим полный код сейчас, датчик и свет должны работать. Когда вы стоите на коврике, датчик подключается и запускается функция extractData. Когда в массиве названий дорог присутствует искомая дорога, светодиодная полоса станет красной, сигнализируя о пробке. Если его нет в массиве, светодиодная полоса станет зеленой, и вы поймете, что все готово!

Удачного путешествия и спасибо за чтение. Надеюсь, вы нашли вдохновение или информацию. Если у вас есть отзывы, не стесняйтесь отвечать!

Рекомендуемые: