Система интеллектуальной парковки
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 3 |
Приложения и онлайн-сервисы
| ||||
| ||||
|
Об этом проекте
Найти бесплатную парковку в таком перегруженном городе, как Бангалор, очень сложно. Здесь, если кто-то хочет выйти из дома на личном автомобиле, первое, что ему приходит в голову, - это парковка, на которой он будет припарковать свою машину. В большинстве случаев люди идут на стоянку и обнаруживают, что все парковочные места заполнены, и тогда ему приходится искать другую стоянку. Так что это большая проблема, и многие люди опасаются парковать его машину, когда он выходит на своей машине.
Итак, я подумал, как решить эту проблему, и, наконец, мне удалось создать интеллектуальную систему парковки на основе облачных вычислений, и я надеюсь, что ее внедрение может решить проблему с парковкой в моем городе. ARTIK Cloud - действительно хорошая и подходящая платформа для такой работы.
Используя эту систему, пользователь сможет легко найти свободную парковку с помощью мобильного или веб-приложения из любого места. Система обновляет данные о парковке каждые 30 секунд.
В этом проекте я покажу вам, как легко построить такую умную систему. Однозначно я буду использовать платформу ARTIK Cloud, самую крутую облачную платформу IoT. Прежде чем вдаваться в подробности, посмотрите демонстрационное видео моего демонстрационного проекта.
Для этой демонстрационной системы вам нужно создать только одно новое устройство на платформе Samsung Artik Cloud. Я покажу это здесь. Я назвал свои устройства радужной парковкой и храню данные о парковке, такие как свободные места на парковке. Raspi отправляет информацию о парковке в соответствии с заданными правилами.
Этапы этого проекта:
1. Создание одного устройства на Artik Cloud Platform
2. Создание одного приложения в Artik Cloud
3. Создание одного правила в Artik Cloud
4. Подготовка Arduino
5. Подключение датчиков
6. Подготовка Raspberry Pi
7. Разработка веб-приложений
Итак, начнем по порядку. Первое первым. Начнем с создания нового устройства на облачной платформе Артик.
Шаг 1. Создание нового устройства в Artik Cloud Platform
А) Войдите в свою учетную запись Samsung и нажмите «РАЗРАБОТЧИК» в правом верхнем углу.
Б) На ПАНЕЛИ выберите ТИПЫ УСТРОЙСТВ и нажмите НОВЫЙ
В) На ДИСПЛЕЕ УСТРОЙСТВА введите имя устройства и укажите УНИКАЛЬНОЕ ИМЯ, затем нажмите СОЗДАТЬ ТИП УСТРОЙСТВА.
D) Нажмите + НОВЫЙ МАНИФЕСТ
E) Введите ИМЯ ПОЛЯ для данных вашего датчика, которые вы загрузите и сохраните здесь, и укажите ТИП ДАННЫХ как целое число. Затем нажмите, чтобы СОХРАНИТЬ.
F) Затем нажмите ДАЛЕЕ:ДЕЙСТВИЯ НА УСТРОЙСТВЕ
G) Сделайте действие или выберите из СТАНДАРТНЫХ ДЕЙСТВИЙ. Нажмите, чтобы СОХРАНИТЬ. Для нашего проекта действий не потребуется. Затем нажмите ДАЛЕЕ:АКТИВНЫЙ МАНИФЕСТ.
H) Взгляните на поля устройства и снова нажмите ДАЛЕЕ:АКТИВНЫЙ МАНИФЕСТ.
I) Поздравляю! вы успешно создали свое первое устройство. Теперь вам необходимо подключить устройство к облаку Артик. Итак, приступим.
J) Перейдите в MY ARTIK CLOUD из правого верхнего угла.
K) Щелкните MY ARTIK CLOUD и выберите УСТРОЙСТВА.
L) Нажмите, чтобы + Добавить другое устройство.
M) Введите имя только что созданного устройства и щелкните по нему.
N) Нажмите кнопку ПОДКЛЮЧИТЬ УСТРОЙСТВО ...
O) Ваше устройство подключено к ОБЛАКУ.
P) Нажмите здесь. Создайте токен, запишите свой ИДЕНТИФИКАТОР УСТРОЙСТВА и ЖЕТОН УСТРОЙСТВА. Последнее потребуется каждый раз, когда вы захотите подключиться к своему устройству с физических устройств, веб-приложений или приложений для Android.
Шаг 2:Создание правила в Artik Cloud
На этом этапе мы создадим правило, в котором мы установим некоторые условия, в соответствии с которыми Artik Cloud будет генерировать действие, когда условие выполняется, а устройства и приложения, подписанные на действие, получают сообщение мгновенно.
А) Выберите ПРАВИЛА в меню МОЙ АРТИК ОБЛАКО и нажмите НОВОЕ ПРАВИЛО
Б) В поле выбора IF выберите поле данных для устройства и установите значение и условие. Затем выберите действие для конкретного устройства в поле ТО. Вы можете установить постоянное значение параметра или выбрать значение из данных другого устройства. Чтобы определить поле данных с другого устройства, щелкните значок загрузки, показанный в красном поле.
В) Выберите устройство в раскрывающемся списке, а затем выберите поле данных.
D) Затем нажмите СОХРАНИТЬ ПРАВИЛО.
Шаг 3. Подготовка Arduino
Основная работа Arduino в моем проекте - это сбор данных с датчиков, подключенных к парковочным станциям, и отправка данных в Raspberry pi через последовательный порт. Здесь я использовал Arduino Mega, реализованную для одной стоянки. мы можем подключить больше плат Arduino для разных парковочных станций. Здесь я использовал ультразвуковые датчики, и их можно использовать в любом месте.
Для ультразвуковых датчиков использовались цифровые выводы Arduino. Скетч Arduino Ультразвуковые датчики прилагаются. Загрузите соответствующий эскиз на свою плату Arduino.
Подробности об ультразвуковом датчике можно найти здесь.
Шаг 4:Подключение датчиков
Для подключения всех датчиков к Arduino см. Раздел схемы.
Шаг 5:Подготовка Raspberry Pi
Я предполагаю, что у вас уже есть опыт работы с Raspberry pi. В Интернете доступно множество руководств для начинающих.
Начнем работу с Raspberry Pi. Raspberry pi работает как клиент WebSocket и взаимодействует с облаком Artik по протоколу WebSocket. Для программирования я использовал Node.js. В отличие от Python Node не предустановлен на Raspberry Pi.
А). Установите Node и npm на Raspberry pi, используя следующие команды в терминале.
sudo apt-get updatesudo apt-get install nodejs npm
Б). Установите клиент WebSocket ws на raspberry pi
npm install --save ws
В). Установите последовательный порт на Raspberry Pi
npm установить последовательный порт
Если вы успешно выполнили все три шага, ваш пи готов к взаимодействию с Arduino через последовательный порт и облако Artik с помощью websocket. Как я сказал ранее, для двух стоянок требуются две малиновые писи. Итак, загрузите исходный код для этого с Github. Вы можете использовать ftp-клиент, например FileZilla, для загрузки кода на raspberry pi. Не забудьте изменить DEVICE ID &DEVICE TOKEN в исходном коде.
D) После загрузки кода на raspberry pi запустите код, введя следующую команду в окно терминала.
sudo node staff-parking.js
Шаг 6. Разработка веб-приложения
Для разработки веб-приложений использовались HTML и JavaScript. Для связи с облаком Artik здесь я снова использовал протокол WebSocket. Для интеграции карты в свое приложение я использовал Google Map API.
Загрузите папку веб-приложения с моего Github и измените ИДЕНТИФИКАТОР УСТРОЙСТВА и ЖЕТОН УСТРОЙСТВА, указав свой собственный идентификатор устройства и токен. Используйте идентификатор устройства, которое генерирует действие при получении новых данных (в моем случае - edison). Откройте websocket.html в веб-браузере и наслаждайтесь. Смотрите демонстрационное видео ...
Код
- Raspberry Pi (штатная парковка)
- Arduino (сонар)
- Веб-приложение (HTML)
- Веб-приложение (на стороне клиента)
Raspberry Pi (штатная парковка) JavaScript
Исходный код для Raspberry Pi// передача данных о парковке персонала var webSocketUrl ="wss://api.artik.cloud/v1.1/websocket? Ack =true"; var device_id ="Your Device id"; // парковка персонала ID УСТРОЙСТВАvar device_token ="Токен вашего устройства"; // парковка персонала ТОКЕН УСТРОЙСТВА // требуется модуль websocket для подключения // выполнить следующие две команды к вашему терминалу pi // sudo apt-get update // npm install websocketvar WebSocket =require ('ws'); var isWebSocketReady =false; var data =""; var ws =null; // требуется модуль последовательного порта для raspberry pi // выполнить следующую команду на терминале // npm install serialportvar serialport =require ("serialport"); var SerialPort =serialport.SerialPort; var sp =new SerialPort ("/ dev / ttyACM0", {// для последовательной связи с arduino baudrate:9600, // мы используем UNO, поэтому скорость передачи равна 9600, вам может потребоваться изменить в соответствии с парсером вашей модели:serialport.parsers.readline (" \ n ")}); var parking_state =0; // переменная для проверки парковки state_gate / ** * Получает текущее время в миллисекундах * / function getTimeMillis () {return parseInt (Date.now (). toString ());} / ** * Создайте соединение / websocket и настройте вывод GPIO * / function start () {// Создайте соединение WebSocket isWebSocketReady =false; ws =новый WebSocket (webSocketUrl); // эта функция вызывается при успешном соединении ws.on ('open', function () {console.log ("WebSocket connection is open ...."); // вы должны зарегистрироваться для успешной передачи данных // регистрация предназначена для регистр аутентификации или безопасной передачи данных ();}); ws.on ('message', function (data) {// этот цикл вызывается всякий раз, когда клиент отправляет какое-либо сообщение handleRcvMsg (data); // данные отправляются в функцию handleRcvMsg ()}); ws.on ('close', function () {console.log ("Соединение с WebSocket закрыто ....");}); } / ** * Отправляет сообщение о регистрации в конечную точку / websocket * /// Клиент будет работать только тогда, когда устройство будет зарегистрировано здесь function register () {console.log ("Регистрация устройства в соединении WebSocket"); попробуйте {var registerMessage ='{"type":"register", "sdid":"' + device_id + '", "Authorization":"bearer' + device_token + '", "cid":"' + getTimeMillis () + ' "} '; console.log ('Отправка сообщения о регистрации' + registerMessage + '\ n'); ws.send (registerMessage, {маска:истина}); isWebSocketReady =true; } catch (e) {console.error ('Не удалось зарегистрировать сообщения. Ошибка при регистрации сообщения:' + e.toString ()); }} // данные после получения отправляются сюда для обработки // в нашем случае эта функция не будет использоваться, так как мы не получим никаких действий // в raspberry pi. Это для будущих изменений. Function handleRcvMsg (msg) {// вам нужно проанализировать полученную строку var msgObj =JSON.parse (msg); если (msgObj.type! ="действие") return; // Ранний возврат; var actions =msgObj.data.actions; var actionName =действия [0] .name; console.log («Полученное действие» + actionName); // вы должны знать свои зарегистрированные действия, чтобы выполнять соответствующие действия if (actionName.toLowerCase () =="settext") {// делать что-то здесь после получения 'Parking_state' console.log ('получение распознанного действия' + actionName); } else {// этот цикл выполняется, если получено какое-то незарегистрированное действие // поэтому вы должны регистрировать каждое действие в cloud console.log ('Ничего не делать после получения нераспознанного действия' + actionName); возвращение; }} / ** * Отправить одно сообщение в ARTIK Cloud * /// Эта функция отвечает за отправку команд в облако // функция sendStateToArtikCloud (парковка) отправляет количество свободных парковочных мест в облако artik, функция sendStateToArtikCloud (Parking_slot) {try {ts =', "ts":' + getTimeMillis (); var data ={"Parking_slot":Parking_slot // установка значения парковки из аргумента в нашу облачную переменную "Parking_value"}; var payload ='{"sdid":"' + device_id + '"' + ts + ', "data":' + JSON.stringify (data) + ', "cid":"' + getTimeMillis () + '"}'; console.log ('Отправка полезной нагрузки' + полезной нагрузки + '\ n'); ws.send (полезная нагрузка, {маска:истина}); } catch (e) {console.error ('Ошибка при отправке сообщения:' + e.toString () + '\ n'); }} function exitClosePins () {console.log ('Выйти и уничтожить все контакты!'); process.exit (); } start (); // выполняется каждый раз, когда данные получены от arduino (запрограммированная задержка 30 секунд от arduino) sp.on ("open", function () {sp.on ('data', function (data) {console .log ("Последовательный порт получил данные:" + data); // sendStateToArtikCloud (data); // свободное место для парковки var Parking_slot =parseInt (data); sendStateToArtikCloud (Parking_slot);});}); process.on (' SIGINT ', exitClosePins);
Arduino (сонар) C / C ++
Исходный код для сопряжения с датчиком сонара с использованием Arduino#define echoPin1 2 // Вывод эхо-сигнала для сонара 1 # define trigPin1 3 // Триггерный вывод для сонара 1 # define echoPin2 4 // Вывод эхо-сигнала для сонара 2 #define trigPin2 5 // Триггерный контакт для сонара 2 # define echoPin3 6 // Echo Pin для сонара 3 # define trigPin3 7 // Триггерный контакт для сонара 3 // # define echoPin4 9 // Echo Pin для сонара 4 // # define trigPin4 8 // Триггерный контакт для сонара 4длительность1, дистанция1; // Длительность, используемая для вычисления расстояния long duration2, distance2; long duration3, distance3; // long duration4, distance4; int count =0; int freeSlot =0; void setup () {Serial.begin (9600); // инициируем последовательную связь с raspberry pi pinMode (trigPin1, OUTPUT); // запускаем вывод как вывод pinMode (echoPin1, INPUT); // вывод эхо-сигнала как входной pinMode (trigPin2, OUTPUT); pinMode (echoPin2, ВХОД); pinMode (trigPin3, ВЫХОД); pinMode (echoPin3, ВХОД); // pinMode (trigPin4, OUTPUT); // pinMode (echoPin4, INPUT); } void loop () {/ * Следующий цикл trigPin / echoPin используется для определения расстояния до ближайшего объекта путем отражения от него звуковых волн. * / / * Для срабатывания контакта * требуется сигнал высокого уровня не менее 10 микросекунд. * _____ * | | * -------------! ! --------- * ..... | 10us | ........ * модуль затем выдает восемь импульсных сигналов 40 кГц и ожидает приема эха * / digitalWrite (trigPin1, LOW); delayMicroseconds (2); digitalWrite (trigPin1, HIGH); delayMicroseconds (10); digitalWrite (trigPin1, LOW); // функция pulseIn () определяет ширину импульса во времени // длительность импульса пропорциональна расстоянию до препятствия длительность1 =pulseIn (echoPin1, HIGH); digitalWrite (trigPin2, LOW); delayMicroseconds (2); digitalWrite (trigPin2, HIGH); delayMicroseconds (10); digitalWrite (trigPin2, LOW); duration2 =pulseIn (echoPin2, HIGH); digitalWrite (trigPin3, LOW); delayMicroseconds (2); digitalWrite (trigPin3, HIGH); delayMicroseconds (10); digitalWrite (trigPin3, LOW); duration3 =pulseIn (echoPin3, HIGH); // digitalWrite (trigPin4, LOW); // delayMicroseconds (2); // digitalWrite (trigPin4, HIGH); // delayMicroseconds (10); // digitalWrite (trigPin4, LOW); // duration4 =pulseIn (echoPin4, HIGH); // расстояние =(время высокого уровня, скорость звука (340M / S) / 2, // в сантиметрах =uS / 58 distance1 =duration1 / 58.2; if (distance1 <10) distance1 =1; else distance1 =0; distance2 =duration2 /58.2; if (distance2 <10) distance2 =1; else distance2 =0; distance3 =duration3 / 58.2; if (distance3 <10) distance3 =1; else distance3 =0; // distance4 =duration4 / 58.2; // if (distance4 <10) // distance4 =1; // else distance4 =0; // добавляем результат от всех датчиков для подсчета общего количества машин =distance1 + distance2 + distance3;; // свободный слот =общий слот - общий свободный слот автомобилей =3 - count; // номер общего слота отправляется на raspberry pi через usb Serial.println (freeSlot); // статус обновляется каждые 30 секунд delay (5000); // freeSlot =0; // distance1 =0; // distance2 =0; // distance3 =0; // distance4 =0;}
Веб-приложение (HTML) HTML
Исходный код для интерфейсного веб-приложенияОблачная интеллектуальная система парковки ARTIK Система интеллектуальной парковки на основе облака ARTIK
Парковка для персонала
Рядом с основным Cmapus
Получение данных ... 1
Парковка для студентов / гостей
Парадные ворота, возле банка Union
Получение данных ... Консоль вывода
Веб-приложение (на стороне клиента) JavaScript
// взаимодействие в реальном времени возможно с использованием websocket // Обратите внимание на ws :. Это новая схема URL-адресов для подключений WebSocket. // Также существует wss:для безопасного соединения через WebSocket, аналогично // https:используется для защищенных HTTP-соединений. // Вы можете получить его на странице документации Artik Cloud var wsUri ="wss://api.artik.cloud/v1 .1 / websocket? Ack =true "; var device_id =" Идентификатор вашего устройства "; // raspi3 ID УСТРОЙСТВАvar device_token ="Токен вашего устройства"; // raspi3 УСТРОЙСТВО TOKENvar output; var attributes_log; var websocket; function init () {// document.getElementById () записать что-нибудь на html-страницу output =document.getElementById ("output"); attribute_log =document.getElementById ("журнал_атрибутов"); if (browserSupportsWebSockets () ===false) {// проверяем, поддерживает ли браузер протокол websocket или нет writeToScreen («Извините! Ваш веб-браузер не поддерживает WebSockets. Попробуйте использовать последние версии Google Chrome или Firefox»); var element =document.getElementById ("websocketelements"); element.parentNode.removeChild (элемент); возвращение; //} // Вы открываете соединение WebSocket, просто вызывая конструктор WebSocket websocket =new WebSocket (wsUri); // Когда соединение открыто, функция вызывается автоматически websocket.onopen =function () {// writeAttributeValues ('onOpen Event Fired'); writeToScreen («Успешно подключено к системе парковки»); // после открытия соединения требуется регистрация для безопасной передачи данных register (); }; // вызывается при получении нового сообщения websocket.onmessage =function (evt) {onMessage (evt); }; // при получении ошибки // Вы можете обрабатывать любые возникающие ошибки, прослушивая событие ошибки. websocket.onerror =функция (эвт) {onError (эвт); };} function onClose (evt) {// Закончив работу с WebSocket, вы можете разорвать соединение с помощью метода close (). websocket.close (); // writeAttributeValues ('событие onClose сработало'); writeToScreen ("DISCONNECTED");} // Когда сообщение получено, событие message запускается. функция onMessage (evt) {writeToScreen (' ОТВЕТ:' + evt.data + ''); // writeAttributeValues ('событие onMessage запущено'); handleRcvMsg (evt.data); // данные отправляются в функцию handleRcvMsg ()} function onError (evt) {writeToScreen (' ERROR:' + evt.data); // writeAttributeValues ('onError Event Fired');} function doSend (message) {// Чтобы отправить сообщение через соединение WebSocket, вы вызываете метод send () в своем экземпляре WebSocket websocket.send (message); // writeAttributeValues ('событие onSend запущено'); writeToScreen ("SENT:" + message);} функция writeAttributeValues (префикс) {var pre =document.createElement ("p"); pre.style.wordWrap ="слово-пауза"; pre.innerHTML ="ИНФОРМАЦИЯ" + getCurrentDate () + "" + префикс + " readyState:" + websocket.readyState + "bufferedAmount:" + websocket.bufferedAmount + "";; attribute_log.appendChild (pre);} функция writeToScreen (сообщение) {var pre =document.createElement ("p"); pre.style.wordWrap ="слово-пауза"; pre.innerHTML =сообщение; output.appendChild (pre);} функция getCurrentDate () {var now =new Date (); var datetime =now.getFullYear () + '/' + (now.getMonth () + 1) + '/' + now.getDate (); datetime + ='' + now.getHours () + ':' + now.getMinutes () + ':' + now.getSeconds (); return datetime;} функция browserSupportsWebSockets () {if ("WebSocket" в окне) {return true; } else {вернуть ложь; }} function getTimeMillis () {return parseInt (Date.now (). toString ());} function register () {writeToScreen ("Регистрация устройства в соединении WebSocket"); попробуйте {var registerMessage ='{"type":"register", "sdid":"' + device_id + '", "Authorization":"bearer' + device_token + '", "cid":"' + getTimeMillis () + ' "} '; writeToScreen ('Отправка регистрового сообщения' + registerMessage + '\ n'); websocket.send (registerMessage, {маска:истина}); isWebSocketReady =true; //document.getElementById("rainbow").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Вместимость:" + ' 50 ' + "Бесплатное место:" + ' '+" 50 "; //document.getElementById("indigo").innerHTML ="Вместимость:60, свободное место:5"; } catch (e) {writeToScreen ('Не удалось зарегистрировать сообщения. Ошибка при регистрации сообщения:' + e.toString ()); }} // данные после получения отправляются сюда для обработки function handleRcvMsg (msg) {// сообщение получено в виде следующей строки // {"actions":[{"name":"setText", "parameters":{"text" :"4", "text2":"5"}}]} // вам нужно его разобрать var msgObj =JSON.parse (msg); если (msgObj.type! ="действие") return; // Ранний возврат; var actions =msgObj.data.actions; var rainbowData =действия [0] .parameters.text; var indigoData =действия [0] .parameters.text2; console.log («Полученное действие» + действия); document.getElementById ("радуга"). innerHTML ="Вместимость:50, свободный слот:" + rainbowData; document.getElementById ("индиго"). innerHTML ="Емкость:60, свободный слот:" + indigoData; }
Soucre Code для интеллектуальной системы парковки
Весь необходимый код и файлы включены в этот репозиторий Github. Https://github.com/husinul/Smart-Car-ParkingСхема
Производственный процесс
- С# конструктор
- С# с использованием
- Умный бармен
- Система управления зданием:ваш билет в умный город
- Умные системы управления освещением для теплиц снижают затраты
- Умная система лазерной резки распознает различные материалы
- Понимание конвейерной системы
- Понимание системы автомобильного домкрата
- Понимание системы подвески
- Почему мой автомобильный обогреватель работает только во время вождения?