Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Sistem Informasi Lampu Lalu Lintas

Komponen dan persediaan

Arduino Yun
× 1
Arduino UNO
atau papan Arduino lainnya
× 1
Sensor Ultrasonik - HC-SR04 (Generik)
× 1
DS3231 RTC
Jam Waktu Nyata
× 1
LED (generik)
1 x LED Merah, 1 x LED Kuning, 1 x LED Hijau
× 3
Resistor 330 ohm
× 3
Modul 433 MHz
1 x Pemancar, 1 x Penerima
× 1
Perangkat Android
× 1
Kartu SD
× 1
Perangkat Pengembangan Cepat IOTOPIA AllThingsTalk
× 1
Kabel jumper (generik)
× 1

Aplikasi dan layanan online

Arduino IDE
Android Studio
Layanan hosting database MySQL

Tentang proyek ini

Pendahuluan

Lalu lintas memiliki kemampuan untuk mengganggu yang terbaik dari kita dan itu semakin buruk. Bagaimana jika itu bisa diubah dengan lampu lalu lintas yang cerdas? Kami membuat Sistem Informasi Lampu Lalu Lintas yang memungkinkan pengemudi mengetahui kecepatan mana yang harus dia kendarai untuk mencapai persimpangan dan melewati lampu hijau tanpa melebihi batas kecepatan maksimum. Dan saat pengemudi harus menunggu lampu merah yang tak terhindarkan, itu akan memberi tahu dia saat lampu akan berubah menjadi hijau.

Sebuah lampu lalu lintas mengirimkan data tentang berapa lama akan tetap hijau atau waktu sampai lampu hijau berikutnya dll ke database online. GPS atau aplikasi pada ponsel cerdas Anda akan mengambil data dari database dan menghitung kecepatan yang diinginkan untuk melewati lampu hijau. Ini akan menampilkan waktu tunggu yang tersisa hingga akhir fase lampu merah ketika tidak dapat dihindari bahwa Anda harus menunggu.

Contoh

Anda mengemudi di zona 70 km/jam, tetap pada batasnya. Lampu lalu lintas di depan Anda berwarna merah dan lampu akan berubah menjadi hijau dalam 30 detik. Anda berada 500 meter dari lampu lalu lintas, sehingga sistem akan merekomendasikan Anda untuk melanjutkan perjalanan menuju lampu tersebut dengan kecepatan 60 km/jam.

Demonstrasi proyek

Bagaimana kita membuatnya?

Untuk mendemonstrasikan proyek kami, kami membuat lampu lalu lintas dengan Arduino Yun. Lampu lalu lintas terdiri dari 3 LED dan Real-Time-Clock. Lampu akan berubah pada interval tertentu. Arduino Yun menghemat waktu lampu lalu lintas akan berubah menjadi hijau/merah. Kemudian, menjalankan file PHP yang membuat koneksi ke database MySQL online dan memasukkan data yang diterima dari Arduino Yun. Aplikasi Android (dibuat dengan Android Studio) akan mengambil tanggal dari database itu. Ini dilakukan melalui file PHP lain yang mengembalikan data lampu lalu lintas dalam format JSON. Aplikasi menghitung kecepatan yang diinginkan dan akan menampilkan penghitung waktu mundur saat Anda tidak dapat melewati lampu hijau.

Untuk menghitung kecepatan yang diinginkan, aplikasi perlu mengetahui jarak ke lampu lalu lintas. Hal ini dilakukan dengan menghitung jarak menurut koordinat GPS. Namun sayangnya, GPS di smartphone tidak cukup tepat untuk membuktikan konsep kami karena kami bekerja dalam skala kecil. Itu sebabnya kami menggunakan modul rentang ultrasonik (HC-SR04). Arduino Yun menerima jarak antara mobil dan lampu lalu lintas melalui modul RF 433 MHz. Setiap kali Yun menerima pengukuran baru dari Arduino lain, ia memperbarui data dalam database. Sekarang, aplikasi dapat menghitung kecepatan yang diinginkan.

Petunjuk

1) Buat database MySQL online

(Kami menggunakan freemysqlhosting.net )

2) Tambahkan tabel 'TrafficL_data' ke database:

3) Siapkan perangkat keras (pemancar)

Anda dapat menemukan skema 'pemancar Arduino' di sini.

4) Unggah 'Kode Pemancar Arduino' ke Arduino

Anda dapat menemukan kode di sini.

5) Hubungkan Arduino Yun ke jaringan WiFi Anda

6) Akses Server Linux Arduino YUN dengan Putty:

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

Anda dapat menemukan 'MySQL_UpdateTrafficLData.php' di sini.

Jika Anda melihat kesalahan ini:'-ash:nano:not found', Anda harus menginstal 'nano' (ini adalah editor teks dasar):

opkg install nano 

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

Anda dapat menemukan 'MySQL_UpdateDistance.php' di sini.

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

7) Siapkan perangkat keras (penerima Arduino Yun)

Anda dapat menemukan skema 'penerima Arduino Yun' di sini.

8) Unggah 'Arduino Receiver &MySQLdb' ke Arduino Yun

Anda dapat menemukan kode di sini.

9) Buka monitor Serial

Anda akan melihat sesuatu yang serupa:

11) file Android Studio

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

*jangan lupa ganti URL

Anda dapat menemukan 'EchoJSON.php' di sini.

12) Unggah proyek Android Studio ke ponsel cerdas Anda

Instruksi untuk ESP8266 [tambahan]

Dimungkinkan untuk menggunakan modul berbasis ESP8266 daripada Arduino Yun yang lebih mahal:

1. Buat akun di https://www.000webhost.com

2. Buat situs web

3. Buat database baru

4. Unggah 'CreateTable.php' dan 'PostDemo.php' dengan Manajer file. Ubah 'username', 'password' dan 'dbname' di kedua file.

CreateTable.php:

connect_error) { die("Koneksi gagal:" . $conn->connect_error);}// trafficl_data_v2 adalah nama tabel$sql ="BUAT TABEL 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 "Tabel berhasil dibuat!";} else { echo "Kesalahan membuat tabel:" . $conn->error;}$conn->close();?> 

PostDemo.php:

connect_error) { die("Koneksi Database gagal:" . $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 ="PERBARUI `trafficl_data_v2` SET `UnixTime_green_1`='5',`UnixTime_red_1`='6',`UnixTime_green_2`='7',`UnixTime_red_2`='8',`Distance`='99' WHERE 1 "; if ($conn->query($sql) ===TRUE) { echo "Data berhasil dimasukkan!"; } else { echo "Kesalahan:" . $sql . "
" . $sambung->kesalahan; }}else { echo "GAGAL:parameter salah";}$conn->close();?>

5. Buat tabel baru:Pilih 'CreateTable.php' dan klik 'view'

6. Instal paket untuk ESP8266 di arduino

Tambahkan File URL ini--> Preferensi:

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

7.

[PERBARUI 9 Februari 2019]

Pilih papan Anda, port COM ... dan unggah ESP8266PostDemo.ino ke papan berbasis ESP8266 Anda. Saya menggunakan NodeMcu V3 ESP8266 12E. Kode di bawah ini harus bekerja untuk hampir semua papan berbasis ESP8266.

Karena saya tidak lagi memiliki jam, saya telah mengubah kode sehingga database diperbarui setiap 10 detik dengan nilai acak.

ESP8266PostDemo.ino:

#include #include  #include #include #define ARRAYSIZE 4 // 4 argumentconst char* ssid ="yourSSID"; const char* password ="yourPassword";const char* dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // permintaan Anda tujuanconst char* argument_names[ARRAYSIZE] ={"UnixTime_green_1","UnixTime_red_1","UnixTime_green_2","UnixTime_red_2"};const String equals_sign ="=";const String ampersand_sign ="&";batalkan penyiapan() { penundaan(1000); Serial.begin(115200); WiFi.mode(WIFI_OFF); //Mencegah masalah koneksi ulang (memakan waktu terlalu lama untuk terhubung) delay(1000); WiFi.mode(WIFI_STA); //Baris ini menyembunyikan tampilan ESP sebagai hotspot wifi WiFi.begin(ssid, password); Serial.println(""); Serial.print("Menghubungkan"); while (WiFi.status() !=WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Tersambung ke "); Serial.println(ssid); Serial.print("Alamat IP:"); Serial.println(WiFi.localIP()); }void loop() { HTTPClient http; Parameter string =""; parameter +=argument_names[0] +equals_sign+ (int)random(100); for(int i=1; i 

php-file:

connect_error) { die("Koneksi Database gagal:" . $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 ="PERBARUI 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' WHERE id=1"; if ($conn->query($sql) ===BENAR) { echo "OK"; } else { echo "Kesalahan:" . $sql . "
" . $sambung->kesalahan; } }?>

Jika sudah berhasil mengupdate database, Anda bisa memodifikasi prosedur berikut pada kode arduino 'Arduino Receiver &MySQLdb':

  • batalkan MySQL_UpdateTrafficLData()
  • batalkan MySQL_UpdateDistance()

Perhatikan bahwa jika Anda ingin mereplikasi proyek, bukan ide yang baik untuk mengimplementasikan semuanya sekaligus. Pertama coba uji setiap komponen secara terpisah. Jika semuanya bekerja dengan baik, Anda dapat mulai dengan menggabungkan komponen yang berbeda. Jangan ragu untuk meminta bantuan di bagian komentar dan coba jelaskan masalah Anda sedetail mungkin.

Kode

  • Kode Pemancar Arduino
  • Penerima Arduino &MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • EchoJSON
  • MainActivity.java
  • AndroidManifest.xml
  • strings.xml
  • aktivitas_main.xml
Kode Pemancar ArduinoArduino
/* IOTOPIA - 2016-2017 - Traffic Light Information System (Transmitter) * oleh Pieter Luyten &Joppe Smeets * * Kirim jarak ke arduino lain melalui modul RF 433MHz * * Modul RF 433MHz:* tx_pin --> pin 3 * * Modul HC-SR04:* trig_pin --> pin 5 * echo_pin --> pin 6 * */#define tx_pin 3#define trig_pin 5#define echo_pin 6#include  // Library untuk modul RF 433 MHz #include "HCSR04.h" // Perpustakaan untuk modul HC-SR04 HCSR04 ultrasonik(trig_pin,echo_pin); int jarak;char CharMsg[21];void setup() { Serial.begin(9600); vw_setup(2000); // Bit per detik vw_set_tx_pin(tx_pin);}void loop() { jarak =ultrasonik.Ranging(CM); // Ukur jarak dalam cm while(distance <0){ // Hindari pembacaan yang salah, ukur jarak lagi distance =ultrasonik.Ranging(CM); } sprintf(CharMsg, "%d",, jarak); vw_send((uint8_t *)CharMsg, strlen(CharMsg)); // Kirim jarak vw_wait_tx(); // Tunggu hingga seluruh pesan hilang Serial.print("Jarak (cm):"); Serial.println(jarak); delay(250);}
Penerima Arduino &MySQLdbArduino
/* IOTOPIA - 2016-2017 - Sistem Informasi Lampu Lalu Lintas (Receiver + Upload ke MySQLdb) * oleh Pieter Luyten &Joppe Smeets * * Menerima jarak dari arduino lain melalui RF * Mengunggah data lampu lalu lintas dan jarak ke database MySQL * * Modul RF 433MHz:* rx_pin --> pin 3 * * TrafficLight (3 LED):* RedLED --> pin 5 * OrangeLED --> pin 6 * GreenLED --> pin 7 * * DS3231 (Real-Time-Clock) :* SCL --> SCL (pin 3 pada Arduino Yun) * SDA --> SDA (pin 2 pada Arduino Yun) * * Kartu SD - Arduino Yun * Kartu SD (dengan file PHP)--> slot SD terintegrasi* /#define RedLED 5#define OrangeLED 6#define GreenLED 7#define rx_pin 9#include  // RF 433 MHz modules#include  // Alarm#include  // I2C communication#include "RTClib.h" // Jam Waktu Nyata#include  // Jalankan proses Linux di AR9331// UnixTime:Waktu, didefinisikan sebagai jumlah detik yang telah berlalu sejak 1 Januari 1970long UnixTime_green_1; // Lampu hijau berikutnya (dalam UnixTime)long UnixTime_red_1; // Lampu merah berikutnya (dalam UnixTime)long UnixTime_green_2; // Berikutnya tapi satu lampu hijau (dalam UnixTime)long UnixTime_red_2; // Berikutnya tapi satu lampu merah (dalam UnixTime)long s_till_orange; // Detik sampai orangeRTC_DS3231 rtc;char StringReceived[22];boolean i;int interval =5; // dalam jarak detik; // dalam pengaturan cmvoid() { rtc.begin(); //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Serial.begin(9600); Jembatan.mulai(); // Inisialisasi Jembatan vw_setup(2000); // Bit per detik vw_set_rx_pin(rx_pin); vw_rx_start(); Alarm.timerRepeat(interval, UpdateTrafficLData); // Perbarui data lampu lalu lintas (lampu hijau/merah berikutnya ... ) Alarm.timerRepeat(1,PrintCurrentTime); // Cetak waktu sekarang setiap x detik pinMode(LED Hijau, OUTPUT); pinMode(LED Oranye, OUTPUT); pinMode(LED Merah, OUTPUT); digitalWrite(LED Hijau, RENDAH); digitalWrite(LED Oranye, RENDAH); digitalWrite(LED Merah, RENDAH); Serial.println("Pengaturan selesai");}void loop() { Alarm.delay(0); // Penundaan ini harus digunakan sebagai ganti penundaan Arduino normal(), // untuk pemrosesan alarm dan pengatur waktu yang tepat waktu. Anda dapat melewati 0 untuk penundaan minimal. RF_Dengarkan(); }void RF_Listen (){ uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen =VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { int a; for (a =0; a  0) { char c =p.read(); Serial.print(c); } // Pastikan bit terakhir dari data terkirim. Serial.flush();}kosongkan MySQL_UpdateDistance(){ Proses p; p.begin("/mnt/sda1/MySQL_UpdateDistance.php"); p.addParameter(String(jarak)); p.run(); // Baca umpan balik (untuk debugging) while (p.available()> 0) { char c =p.read(); Serial.print(c); } // Pastikan bit terakhir dari data terkirim. Serial.flush();}void PrintCurrentTime() { DateTime sekarang =rtc.now(); SetLEDsTrafficL(); Serial.print(sekarang.jam(), DES); Serial.print(':'); Serial.print(sekarang.menit(), DEC); Serial.print(':'); Serial.print(sekarang.detik(), DES); Serial.print(""); Serial.println(now.unixtime());}void SetLEDsTrafficL() { DateTime now =rtc.now(); s_till_orange =UnixTime_red_1 - sekarang.unixtime(); if (i ==0) { digitalWrite(LED Hijau, RENDAH); digitalWrite(LED Oranye, RENDAH); digitalWrite(LED Merah, TINGGI); } if (i ==1 &&s_till_orange <=3) { digitalWrite(LED Hijau, RENDAH); digitalWrite(LED Oranye, TINGGI); digitalWrite(LED Merah, RENDAH); } if (i ==1 &&s_till_orange> 3) { digitalWrite(LED Hijau, TINGGI); digitalWrite(LED Oranye, RENDAH); digitalWrite(LED Merah, RENDAH); }}
MySQL_UpdateTrafficLData.phpPHP
#!/usr/bin/php-cliconnect_error) { trigger_error('Database connection failed:' . $conn->connect_error, E_USER_ERROR);} $sql="PERBARUI Lalu LintasL_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' WHERE id=1";if($conn->query($sql ) ===false) { trigger_error('SQL salah:' . $sql . ' Error:' . $conn->error, E_USER_ERROR);}else{echo "Data dimasukkan!\n";} ?>
MySQL_UpdateDistance.phpPHP
#!/usr/bin/php-cliconnect_error) { trigger_error('Database connection failed:' . $conn->connect_error, E_USER_ERROR );}$sql="UPDATE TrafficL_data SET Distance='$Distance'WHERE id=1";if($conn->query($sql) ===false) { trigger_error('SQL Salah:' . $sql . ' Kesalahan:' . $conn->error, E_USER_ERROR);}else{echo "Jarak dimasukkan!\n";}?>
EchoJSONPHP
MainActivity.javaJava
paket com.example.xxx.xxx;// ubah xxx xxximport android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import com .android.volley.RequestQueue;impor com.android.volley.Response;impor com.android.volley.VolleyError;impor com.android.volley.toolbox.JsonArrayRequest;impor com.android.volley.toolbox.Volley;impor 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;public class MainActivity extends AppCompatActivity { // Akan menampilkan string "data " yang menyimpan hasil TextView hasil; //Tampilan teks yang menyimpan kecepatan yang direkomendasikan TextView recSpeed; // URL objek yang akan di-parsing String JsonURL ="YourURLdisini"; // String ini akan menampung hasil String data =""; // Mendefinisikan antrian permintaan Volley yang menangani permintaan URL secara bersamaan RequestQueue requestQueue; //objek timer untuk mengupdate data setiap detik //timer timer; //speedLimit (cm/s) private final static double maxSpeed ​​=18; //Kecepatan private double speed yang direkomendasikan; //berapa kali dalam tabel public final static int NUMBER_OF_ENTRIES =2; //array dengan waktu ketika hijau panjang[] unixTimesGreen =new long[NUMBER_OF_ENTRIES]; //array dengan waktu ketika merah panjang[] unixTimesRed =new long[NUMBER_OF_ENTRIES]; //variabel yang menahan jarak private double distance; //variabel untuk mengulang updateTable private final ScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor(); //untuk pengujian:masa depan pribadi timingTask; public void tick(milidetik panjang) { timingTask =scheduler.scheduleAtFixedRate(new Runnable() { public void run() { updateTable(); } }, 0, milidetik, TimeUnit.MILLISECONDS); } @Override protected void onCreate(Bundle saveInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //textViews untuk memberikan hasil ke hasil =(TextView) findViewById(R.id.jsonData); recSpeed ​​=(TextView) findViewById(R.id.recommendedSpeed); //inisialisasi tabel updateTable(); //perbarui aplikasi setiap 100 milidetik tick(500); //untuk bekerja dengan objek timer untuk memperbarui berulang kali /** timer =new Timer("Timer"); timer.schedule(New UpdateTable(),(panjang)100,(panjang)100); */ } //untuk bekerja dengan objek timer untuk memperbarui berulang kali /** private class UpdateTable extends TimerTask{ public void run(){ updateTable(); } } */ private void updateTable(){ //reset String data =""; // Membuat antrian permintaan Voli requestQueue =Volley.newRequestQueue(ini); //untuk pengujian /** // Memasukkan hasil ke dalam TextView yang ditemukan dalam XML layout utama dengan id jsonData results =(TextView) findViewById(R.id.jsonData); */ // Membuat kelas JsonArrayRequest yang disebut arrayreq, meneruskan parameter yang diperlukan //JsonURL adalah URL yang akan diambil dari JsonArrayRequest arrayreq =new JsonArrayRequest(JsonURL, // Parameter kedua Listener menimpa metode onResponse() dan meneruskan //JSONArray sebagai parameter new Response.Listener() { // Mengambil respons dari permintaan JSON @Override public void onResponse(JSONArray response) { try { // Mengambil objek JSON pertama di array luar JSONObject TrafficLObj =response.getJSONObject( 0); // Mengambil "trafficArry" dari objek JSON JSONArray trafficArry =TrafficLObj.getJSONArray("TrafficLArray"); // Iterasi melalui JSON Array mendapatkan objek dan menambahkannya //ke tampilan daftar sampai tidak ada lagi objek di trafficArry for (int i =0; i  maxSpeed) speed =maxSpeed; else speed =distance/((unixTimesGreen[interval]-time)); speed =speed*5; }}
AndroidManifest.xmlXML
// change xxx xxx         
strings.xmlXML
"NooitRood", meaning:"NeverRed"
 NooitRood
activity_main.xmlXML
  

Skema

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)

Proses manufaktur

  1. Lentera Gas
  2. Penunjuk Laser
  3. Kaleidoskop
  4. Sinyal Lalu Lintas
  5. Light-Emitting Diode (LED)
  6. Menghancurkan lampu LED berbasis Zigbee
  7. Desain sistem waktu penerbangan:Ikhtisar sistem
  8. Lampu Lalu Lintas Cerdas
  9. AI Baru Secara Otomatis Mengontrol Sistem High Beam Light Kendaraan
  10. Aksesoris LED –Aksesoris Strip Lampu LED