Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Система интеллектуальной парковки

Компоненты и расходные материалы

Raspberry Pi 3, модель B
× 1
Arduino Mega 2560
× 1
Ультразвуковой датчик - HC-SR04 (общий)
× 3

Приложения и онлайн-сервисы

Samsung ARTIK Cloud для Интернета вещей
Карты Google
IDE Arduino

Об этом проекте

Найти бесплатную парковку в таком перегруженном городе, как Бангалор, очень сложно. Здесь, если кто-то хочет выйти из дома на личном автомобиле, первое, что ему приходит в голову, - это парковка, на которой он будет припарковать свою машину. В большинстве случаев люди идут на стоянку и обнаруживают, что все парковочные места заполнены, и тогда ему приходится искать другую стоянку. Так что это большая проблема, и многие люди опасаются парковать его машину, когда он выходит на своей машине.

Итак, я подумал, как решить эту проблему, и, наконец, мне удалось создать интеллектуальную систему парковки на основе облачных вычислений, и я надеюсь, что ее внедрение может решить проблему с парковкой в ​​моем городе. 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

Схема


Производственный процесс

  1. С# конструктор
  2. С# с использованием
  3. Умный бармен
  4. Система управления зданием:ваш билет в умный город
  5. Умные системы управления освещением для теплиц снижают затраты
  6. Умная система лазерной резки распознает различные материалы
  7. Понимание конвейерной системы
  8. Понимание системы автомобильного домкрата
  9. Понимание системы подвески
  10. Почему мой автомобильный обогреватель работает только во время вождения?