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

Информационная система светофора

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

Ардуино Юн
× 1
Arduino UNO
или любая другая плата Arduino
× 1
Ультразвуковой датчик - HC-SR04 (общий)
× 1
DS3231 RTC
Часы реального времени
× 1
LED (общий)
1 красный светодиод, 1 желтый светодиод, 1 зеленый светодиод
× 3
Резистор 330 Ом
× 3
Модули 433 МГц
1 передатчик, 1 приемник
× 1
Android-устройство
× 1
SD-карта
× 1
AllThingsTalk IOTOPIA Rapid Development Kit
× 1
Перемычки (общие)
× 1

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

IDE Arduino
Android Studio
Служба хостинга баз данных MySQL

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

Введение

Трафик может раздражать лучших из нас, и ситуация становится только хуже. Что, если это можно изменить с помощью интеллектуальных светофоров? Мы создали информационную систему светофора, которая позволяет водителю узнать, с какой скоростью ему нужно двигаться, чтобы добраться до перекрестка и проехать на зеленый свет, не превышая максимально допустимой скорости. А когда водителю приходится ждать, пока не загорится красный свет, он сообщает ему, когда свет вот-вот станет зеленым.

Светофор отправляет данные о том, как долго он будет оставаться зеленым или время до следующего зеленого светофора и т. Д., В онлайн-базу данных. GPS или приложение на вашем смартфоне будет извлекать данные из базы данных и вычислять желаемую скорость, чтобы пройти зеленый свет. Он будет отображать оставшееся время ожидания до конца фазы красного света, когда вам неизбежно придется ждать.

Пример

Вы едете в зоне со скоростью 70 км / ч, придерживаясь предела. Светофор перед вами красный, а через 30 секунд он станет зеленым. Вы находитесь в 500 метрах от светофора, поэтому система порекомендует вам двигаться в сторону светофора со скоростью 60 км / ч.

Демонстрация проекта

Как мы это сделали?

Чтобы продемонстрировать наш проект, мы создали светофор с Arduino Yun. Светофор состоит из 3 светодиодов и часов реального времени. Свет будет меняться с заданным интервалом. Arduino Yun экономит время, когда светофор становится зеленым / красным. Затем он запускает файл PHP, который подключается к онлайн-базе данных MySQL и вставляет данные, полученные от Arduino Yun. Приложение Android (созданное с помощью Android Studio) получит дату из этой базы данных. Это делается через другой файл PHP, который возвращает данные светофора в формате JSON. Приложение рассчитывает желаемую скорость и отображает таймер обратного отсчета, когда вы не можете пройти зеленый свет.

Чтобы рассчитать желаемую скорость, приложению необходимо знать расстояние до светофора. Это делается путем расчета расстояния по координатам GPS. Но, к сожалению, GPS в смартфоне недостаточно точен, чтобы подтвердить нашу концепцию, потому что мы работаем в небольших масштабах. Вот почему мы использовали ультразвуковой дальномер (HC-SR04). Arduino Yun получает информацию о расстоянии между автомобилем и светофором через радиочастотные модули 433 МГц. Каждый раз, когда Yun получает новое измерение от другого Arduino, он обновляет данные в базе данных. Теперь приложение может рассчитать желаемую скорость.

Инструкции

1) Создайте онлайн-базу данных MySQL

(Мы использовали freemysqlhosting.net)

2) Добавьте в базу данных таблицу TrafficL_data:

3) Настройте оборудование (передатчик)

Вы можете найти схему «передатчика Arduino» здесь.

4) Загрузите код передатчика Arduino в Arduino

Вы можете найти код здесь.

5) Подключите Arduino Yun к своей сети Wi-Fi .

6) Доступ к Linux-серверу Arduino YUN с помощью Putty:

  opkg update opkg install php5-mod-mysqli opkg install php5-cli nano /mnt/sda1/MySQL_UpdateTrafficLData.php  

Вы можете найти "MySQL_UpdateTrafficLData.php" здесь.

Если вы видите эту ошибку:«-ash:nano:not found», вам необходимо установить «nano» (это базовый текстовый редактор):

  opkg install nano  

  chmod 755 /mnt/sda1/MySQL_UpdateTrafficLData.php/mnt/sda1/MySQL_UpdateTrafficLData.phpnano /mnt/sda1/MySQL_UpdateDistance.php  

Вы можете найти "MySQL_UpdateDistance.php" здесь.

  chmod 755 /mnt/sda1/MySQL_UpdateDistance.php/mnt/sda1/MySQL_UpdateDistance.php  

7) Настройте оборудование (приемник Arduino Yun)

Вы можете найти схему «приемника Arduino Yun» здесь.

8) Загрузите Arduino Receiver &MySQLdb в Arduino Yun

Вы можете найти код здесь.

9) Откройте монитор последовательного порта .

Вы должны увидеть нечто подобное:

11) Файлы Android Studio

  • activity_main.xml
  • MainActivity.java *
  • AndroidManifest.xml
  • strings.xml

* не забудьте изменить URL

Вы можете найти "EchoJSON.php" здесь.

12) Загрузите проект Android Studio на свой смартфон

Инструкции для ESP8266 [дополнительно]

Можно использовать модуль на базе ESP8266 вместо более дорогого Arduino Yun:

1. Создайте учетную запись на https://www.000webhost.com

2. Создайте веб-сайт

3. Создайте новую базу данных

4. Загрузите «CreateTable.php» и «PostDemo.php» с помощью файлового менеджера. Измените «имя пользователя», «пароль» и «имя базы данных» в обоих файлах.

CreateTable.php:

   connect_error) {die ("Connection failed:". $ conn-> connect_error);} // trafficl_data_v2 есть имя таблицы $ sql ="CREATE TABLE trafficl_data_v2 (UnixTime_green_1 INT (12) NOT NULL, UnixTime_red_1 INT (12) NOT NULL, UnixTime_green_2 INT (12) NOT NULL, UnixTime_red_2 INT (12) NOT NULL, Distance INT (12)» NOT NULL, id INT (6) UNSIGNED AUTO_INCREMENT PRIMARY KEY) "; if ($ conn-> query ($ sql) ===TRUE) {echo" Таблица успешно создана! ";} Else {echo" Ошибка при создании таблицы:" . $ conn-> error;} $ conn-> close ();?>  

PostDemo.php:

   connect_error) {die ("Ошибка подключения к базе данных:". $ Conn-> connect_error); } if (! empty ($ _ POST ['UnixTime_green_1']) &&! empty ($ _ POST ['UnixTime_red_1']) &&! empty ($ _ POST ['UnixTime_green_2']) &&! empty ($ _ POST ['UnixTime_red_2']) ) {$ UnixTime_green_1 =$ _POST ['UnixTime_green_1']; $ UnixTime_red_1 =$ _POST ['UnixTime_red_1']; $ UnixTime_green_2 =$ _POST ['UnixTime_green_2']; $ UnixTime_red_2 =$ _POST ['UnixTime_red_2']; $ sql ="ОБНОВЛЕНИЕ` trafficl_data_v2` SET `UnixTime_green_1` ='5',` UnixTime_red_1` ='6', `UnixTime_green_2` ='7',` UnixTime_red_2` ='8', `Distance` ='99 'ГДЕ 1 "; if ($ conn-> query ($ sql) ===TRUE) {echo "Данные успешно вставлены!"; } else {echo "Ошибка:". $ sql. «
». $ conn-> ошибка; }} else {echo "FAILED:неверные параметры";} $ conn-> close ();?>

5. Создайте новую таблицу:выберите «CreateTable.php» и нажмите «просмотреть»

.

6. Установите пакеты для ESP8266 в arduino

Добавьте этот URL-файл -> Настройки:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

7.

[ОБНОВЛЕНИЕ от 9 февраля 2019 г.]

Выберите свою плату, COM-порт ... и загрузите ESP8266PostDemo.ino на свою плату на базе ESP8266. Я использую NodeMcu V3 ESP8266 12E. Приведенный ниже код должен работать почти для всех плат на базе ESP8266.

Поскольку у меня больше нет часов, я изменил код, чтобы база данных обновлялась каждые 10 секунд случайными значениями.

ESP8266PostDemo.ino:

  #include  #include  #include  #include  #define ARRAYSIZE 4 // 4 аргументаconst char * ssid ="yourSSID"; const char * password ="yourPassword"; const char * dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // адрес назначения вашего запросаconst char * имя_аргумента [ARRAYSIZE] ={"UnixTime_green_1", "UnixTime_red_1", "UnixTime_green_2", "UnixTime_red_2"}; const String equals_sign ="="; const String ampersand_sign ="&"; void setup () {задержка (1000); Serial.begin (115200); WiFi.mode (WIFI_OFF); // Предотвращает проблему повторного подключения (подключение занимает слишком много времени) delay (1000); WiFi.mode (WIFI_STA); // Эта строка скрывает просмотр ESP как точки доступа Wi-Fi WiFi.begin (ssid, password); Serial.println (""); Serial.print («Подключение»); в то время как (WiFi.status ()! =WL_CONNECTED) {задержка (500); Serial.print ("."); } Serial.println (""); Serial.print («Подключено к»); Serial.println (ssid); Serial.print ("IP-адрес:"); Serial.println (WiFi.localIP ()); } void loop () {HTTPClient http; Строковый параметр =""; параметр + =имя_аргумента [0] + знак_величия + (целое число) случайный (100); for (int i =1; i  

php-файл:

   connect_error) {die ("Ошибка подключения к базе данных:". $ Conn-> connect_error); } if (! empty ($ _ POST ["UnixTime_green_1"]) &&! empty ($ _ POST ["UnixTime_red_1"]) &&! empty ($ _ POST ["UnixTime_green_2"]) &&! empty ($ _ POST ["UnixTime_red_2"]) ) {$ UnixTime_green_1 =$ _POST ["UnixTime_green_1"]; $ UnixTime_red_1 =$ _POST ["UnixTime_red_1"]; $ UnixTime_green_2 =$ _POST ["UnixTime_green_2"]; $ UnixTime_red_2 =$ _POST ["UnixTime_red_2"]; $ sql ="ОБНОВИТЬ TrafficL_data SET UnixTime_green_1 ='$ UnixTime_green_1', UnixTime_red_1 ='$ UnixTime_red_1', UnixTime_green_2 ='$ UnixTime_green_2', UnixTime_red_2 ='$ UnixTime_red_2' WHERE1"; if ($ conn-> query ($ sql) ===TRUE) {echo "ОК"; } else {echo "Ошибка:". $ sql. «
». $ conn-> ошибка; }}?>

Если вам удалось обновить базу данных, вы можете изменить следующие процедуры в коде arduino «Arduino Receiver &MySQLdb»:

  • void MySQL_UpdateTrafficLData ()
  • void MySQL_UpdateDistance ()

Обратите внимание:если вы хотите воспроизвести проект, не рекомендуется реализовывать все сразу. Сначала попробуйте протестировать каждый компонент отдельно. Если все они работают хорошо, вы можете начать с комбинирования различных компонентов. Не стесняйтесь обращаться за помощью в разделе комментариев и постарайтесь описать вашу проблему как можно подробнее.

Код

  • Код передатчика Arduino
  • Приемник Arduino и MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • EchoJSON
  • MainActivity.java
  • AndroidManifest.xml
  • strings.xml
  • activity_main.xml
Код передатчика Arduino Arduino
 / * IOTOPIA - 2016-2017 - Информационная система светофора (передатчик) * от Питера Люйтена и Йоппе Смитса * * Передача расстояния до другого Arduino через модули RF 433 МГц * * Модуль RF 433 МГц:* tx_pin -> контакт 3 * * Модуль HC-SR04:* trig_pin -> pin 5 * echo_pin -> pin 6 * * / # define tx_pin 3 # define trig_pin 5 # define echo_pin 6 # include  // Библиотека для модулей RF 433 МГц #include "HCSR04.h" // Библиотека для модуля HC-SR04HCSR04 ultrasonic (trig_pin, echo_pin); int расстояние; char CharMsg [21]; void setup () {Serial.begin (9600); vw_setup (2000); // Бит в секунду vw_set_tx_pin (tx_pin);} void loop () {distance =ultrasonic.Ranging (CM); // Измерьте расстояние в см while (distance <0) {// Избегайте ложных показаний, снова измерьте расстояние distance =ultrasonic.Ranging (CM); } sprintf (CharMsg, "% d,", расстояние); vw_send ((uint8_t *) CharMsg, strlen (CharMsg)); // Отправляем расстояние vw_wait_tx (); // Ждем, пока не исчезнет все сообщение Serial.print ("Distance (cm):"); Serial.println (расстояние); задержка (250);} 
Приемник Arduino и MySQLdb Arduino
 / * IOTOPIA - 2016-2017 - Информационная система светофора (приемник + загрузка в MySQLdb) * от Pieter Luyten &Joppe Smeets * * Получение расстояния от другого Arduino через RF * Загрузка данных светофора и расстояния в базу данных MySQL * * Модуль RF 433MHz:* rx_pin -> контакт 3 * * TrafficLight (3 светодиода):* RedLED -> контакт 5 * OrangeLED -> контакт 6 * GreenLED -> контакт 7 * * DS3231 (часы реального времени) :* SCL -> SCL (вывод 3 на Arduino Yun) * SDA -> SDA (вывод 2 на Arduino Yun) * * SD-карта - Arduino Yun * SD-карта (с файлом PHP) -> встроенный слот для SD * / # определить RedLED 5 # определить OrangeLED 6 # определить GreenLED 7 # определить rx_pin 9 # включить  // модули RF 433 МГц # include  // Аварийные сигналы # include  // I2C общение # include "RTClib.h" // Часы реального времени # include  // Запуск процессов Linux на AR9331 // UnixTime:время, определяемое как количество секунд, прошедших с 1 января 1970 г. long UnixTime_green_1; // Следующий зеленый свет (в UnixTime) long UnixTime_red_1; // Следующий красный свет (в UnixTime) long UnixTime_green_2; // Дальше один зеленый свет (в UnixTime) long UnixTime_red_2; // Дальше один красный свет (в UnixTime) long s_till_orange; // Секунды до оранжевого RTC_DS3231 rtc; char StringReceived [22]; boolean i; int interval =5; // расстояние в секундах; // в cmvoid setup () {rtc.begin (); //rtc.adjust(DateTime(F(__DATE__), F (__ TIME__))); Serial.begin (9600); Bridge.begin (); // Инициализируем мост vw_setup (2000); // Бит в секунду vw_set_rx_pin (rx_pin); vw_rx_start (); Alarm.timerRepeat (интервал, UpdateTrafficLData); // Обновление данных светофора (следующий зеленый / красный свет ...) Alarm.timerRepeat (1, PrintCurrentTime); // Выводить текущее время каждые x секунд pinMode (GreenLED, OUTPUT); pinMode (OrangeLED, ВЫХОД); pinMode (RedLED, ВЫХОД); digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, LOW); digitalWrite (RedLED, LOW); Serial.println ("Настройка завершена");} void loop () {Alarm.delay (0); // Эту задержку следует использовать вместо обычной задержки Arduino (), // для своевременной обработки сигналов тревоги и таймеров. Вы можете передать 0 для минимальной задержки. RF_Listen (); } void RF_Listen () {uint8_t buf [VW_MAX_MESSAGE_LEN]; uint8_t buflen =VW_MAX_MESSAGE_LEN; если (vw_get_message (buf, &buflen)) {int a; for (a =0; a  0) {char c =p.read (); Serial.print (c); } // Убедитесь, что последний бит данных отправлен. Serial.flush ();} void MySQL_UpdateDistance () {Процесс p; p.begin ("/ mnt / sda1 / MySQL_UpdateDistance.php"); p.addParameter (String (расстояние)); p.run (); // Считываем отзыв (для отладки) while (p.available ()> 0) {char c =p.read (); Serial.print (c); } // Убедитесь, что последний бит данных отправлен. Serial.flush ();} недействительным PrintCurrentTime () {DateTime now =rtc.now (); SetLEDsTrafficL (); Serial.print (now.hour (), DEC); Серийный принт (':'); Serial.print (now.minute (), DEC); Серийный принт (':'); Serial.print (now.second (), DEC); Serial.print (""); Serial.println (now.unixtime ());} void SetLEDsTrafficL () {DateTime now =rtc.now (); s_till_orange =UnixTime_red_1 - now.unixtime (); если (я ==0) {digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, LOW); digitalWrite (RedLED, HIGH); } if (i ==1 &&s_till_orange <=3) {digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, HIGH); digitalWrite (RedLED, LOW); } если (i ==1 &&s_till_orange> 3) {digitalWrite (GreenLED, HIGH); digitalWrite (OrangeLED, LOW); digitalWrite (RedLED, LOW); }} 
MySQL_UpdateTrafficLData.php PHP
 #! / usr / bin / php-cli  connect_error) {trigger_error ('Ошибка подключения к базе данных:'. $ conn-> connect_error, E_USER_ERROR);} $ sql ="ОБНОВЛЕНИЕ TrafficL_data SET UnixTime_green_1 ='$ UnixTime_green_1', UnixTime_red_1 ='$ UnixTime_red_1', UnixTime_green_2 ='$ UnixTime_green_2', UnixTime_red_2 ='$ UnixTime_red_2' $ if ) ===false) {trigger_error ('Неверный SQL:'. $ sql. 'Error:'. $ conn-> error, E_USER_ERROR);} else {echo "Данные вставлены! \ n";}?> 
MySQL_UpdateDistance.php PHP
 #! / usr / bin / php-cli  connect_error) {trigger_error (' Ошибка подключения к базе данных:'. $ conn-> connect_error, E_USER_ERROR );} $ sql ="ОБНОВИТЬ TrafficL_data SET Distance ='$ Distance'WHERE id =1"; if ($ conn-> query ($ sql) ===false) {trigger_error (' Неверный SQL:'. $ sql. 'Ошибка:'. $ Conn-> error, E_USER_ERROR);} else {echo "Расстояние вставлено! \ N";}?> 
EchoJSON PHP
  
MainActivity.java Java
 package com.example.xxx.xxx; // изменить xxx xxximport android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import com .android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonArrayRequest; import com.android.volley.toolbox.Volley; import org. json.JSONArray; import org.json.JSONException; import org.json.JSONObject; // import java.text.DateFormat; import java.util.Date; import java.util.Timer; // import java.util.TimerTask; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; открытый класс MainActivity расширяет AppCompatActivity {// Будет отображать строковые данные "который содержит результаты TextView results; // Текстовое представление с рекомендованной скоростью TextView recSpeed; // URL анализируемого объекта String JsonURL ="YourURLhere"; // Эта строка будет содержать результаты String data =""; // Определение очереди запросов Volley, которая одновременно обрабатывает URL-запрос RequestQueue requestQueue; // объект таймера для обновления данных каждую секунду // Timer timer; // Ограничение скорости (см / с) private final static double maxSpeed ​​=18; // Рекомендуемая скорость private double speed; // количество раз в таблице public final static int NUMBER_OF_ENTRIES =2; // массив с временами, когда он зеленый long [] unixTimesGreen =new long [NUMBER_OF_ENTRIES]; // массив с временами, когда он красный long [] unixTimesRed =new long [NUMBER_OF_ENTRIES]; // переменная, содержащая расстояние private double distance; // переменные для повторения updateTable private final ScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor (); // для тестирования:private Future  TimingTask; public void tick (длинные миллисекунды) {TimingTask =scheduler.scheduleAtFixedRate (new Runnable () {public void run () {updateTable ();}}, 0, миллисекунды, TimeUnit.MILLISECONDS); } @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // textViews для преобразования результатов в результаты =(TextView) findViewById (R.id.jsonData); recSpeed ​​=(TextView) findViewById (R.id.recommendedSpeed); // инициализируем таблицу updateTable (); // обновляем приложение каждые 100 миллисекунд Tick (500); // для работы с объектом таймера многократно обновлять / ** timer =new Timer ("Timer"); timer.schedule (new UpdateTable (), (long) 100, (long) 100); * /} // для работы с объектом таймера для многократного обновления / ** частный класс UpdateTable extends TimerTask {public void run () {updateTable (); }} * / private void updateTable () {// сбросить String data =""; // Создает очередь запросов Volley requestQueue =Volley.newRequestQueue (this); // для тестирования / ** // Преобразует результаты в TextView, найденные в основном XML макета с идентификатором jsonData results =(TextView) findViewById (R.id.jsonData); * / // Создание класса JsonArrayRequest с именем arrayreq с передачей необходимых параметров // JsonURL - это URL-адрес, который нужно получить из JsonArrayRequest arrayreq =new JsonArrayRequest (JsonURL, // Второй параметр Listener переопределяет метод onResponse () и передает // JSONArray в качестве параметра new Response.Listener  () {// Принимает ответ от запроса JSON @Override public void onResponse (JSONArray response) {try {// Извлекает первый объект JSON во внешнем массиве JSONObject TrafficLObj =response.getJSONObject ( 0); // Извлекает "trafficArry" из объекта JSON JSONArray trafficArry =TrafficLObj.getJSONArray ("TrafficLArray"); // Итерирует по массиву JSON, получая объекты и добавляя их // в представление списка, пока в нем больше не останется объектов. trafficArry for (int i =0; i  maxSpeed) speed =maxSpeed; иначе скорость =расстояние / ((unixTimesGreen [интервал] -время)); скорость =скорость * 5; }} 
AndroidManifest.xml XML
   // изменить xxx xxx         
strings.xmlXML
"NooitRood", meaning:"NeverRed"
 NooitRood
activity_main.xmlXML
  

Схема

RF 433MHz module:
tx_pin --> pin 3

HC-SR04 module:
trig_pin --> pin 5
echo_pin --> pin 6 RF 433MHz module:
rx_pin --> pin 3

TrafficLight (3 LEDs):
RedLED --> pin 5
OrangeLED --> pin 6
GreenLED --> pin 7

DS3231 (Real-Time-Clock):
SCL --> SCL (pin 3 on Arduino Yun)
SDA --> SDA (pin 2 on Arduino Yun)

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

  1. Газовый фонарь
  2. Лазерная указка
  3. Калейдоскоп
  4. Сигнал трафика
  5. Светоизлучающий диод (светодиод)
  6. Разрыв в светодиодном фонаре на основе Zigbee
  7. Проектирование системы времени полета:обзор системы
  8. Умный светофор
  9. Новый ИИ автоматически управляет системой дальнего света автомобиля
  10. Аксессуары для светодиодов – Аксессуары для светодиодных лент