Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Verkeerslichtinformatiesysteem

Componenten en benodigdheden

Arduino Yun
× 1
Arduino UNO
of een ander Arduino-bord
× 1
Ultrasone sensor - HC-SR04 (algemeen)
× 1
DS3231 RTC
Real-time klok
× 1
LED (generiek)
1 x rode led, 1 x gele led, 1 x groene led
× 3
Weerstand 330 ohm
× 3
433 MHz-modules
1 x zender, 1 x ontvanger
× 1
Android-apparaat
× 1
SD-kaart
× 1
AllThingsTalk IOTOPIA Rapid Development-kit
× 1
Jumperdraden (algemeen)
× 1

Apps en online services

Arduino IDE
Android Studio
MySQL-databasehostingservice

Over dit project

Inleiding

Het verkeer heeft het vermogen om de beste van ons te irriteren en het wordt erger. Wat als dat kan met intelligente verkeerslichten? We creëerden een Traffic Light Information System dat de bestuurder laat weten met welke snelheid hij moet rijden om op de kruising te komen en het groene licht te passeren zonder de maximumsnelheid te overschrijden. En als de chauffeur moet wachten op het onvermijdelijke rode licht, laat het hem weten wanneer het licht op groen gaat.

Een verkeerslicht stuurt gegevens over hoe lang het groen blijft of de tijd tot het volgende groene licht etc. naar een online database. Een gps of een applicatie op je smartphone haalt gegevens op uit de database en berekent de gewenste snelheid om het groene licht te passeren. Het toont de resterende wachttijd tot het einde van de roodlichtfase wanneer het onvermijdelijk is dat u moet wachten.

Voorbeeld

U rijdt in een 70 km/u-gebied en houdt u aan de limiet. Het stoplicht voor u is rood en het licht staat op het punt om over 30 seconden groen te worden. U bevindt zich op 500 meter van het stoplicht, dus het systeem zal u aanraden om met 60 km/u richting het stoplicht te rijden.

Projectdemonstratie

Hoe hebben we het gemaakt?

Om ons project te demonstreren, hebben we een verkeerslicht gemaakt met de Arduino Yun. Het verkeerslicht bestaat uit 3 LED's en een Real-Time-Clock. De lichten zullen met een bepaald interval veranderen. De Arduino Yun bespaart de tijd dat het stoplicht op groen/rood springt. Vervolgens voert het een PHP-bestand uit dat verbinding maakt met de online MySQL-database en de gegevens invoegt die zijn ontvangen van de Arduino Yun. Een Android-app (gemaakt met Android Studio) haalt de datum uit die database. Dit gebeurt via een ander PHP-bestand dat de verkeerslichtgegevens in JSON-indeling retourneert. De app berekent de gewenste snelheid en geeft een afteltimer weer als je het groene licht niet kunt passeren.

Om de gewenste snelheid te berekenen, moet de app de afstand tot het stoplicht weten. Dit wordt gedaan door de afstand te berekenen aan de hand van de GPS-coördinaten. Maar helaas is een gps in een smartphone niet precies genoeg om ons concept te bewijzen omdat we op kleine schaal werken. Daarom hebben we gebruik gemaakt van de ultrasone meetmodule (HC-SR04). De Arduino Yun ontvangt de afstand tussen de auto en het verkeerslicht via 433 MHz RF-modules. Elke keer dat de Yun een nieuwe meting ontvangt van de andere Arduino, worden de gegevens in de database bijgewerkt. Nu kan de app de gewenste snelheid berekenen.

Instructies

1) Maak een online MySQL-database

(We gebruikten freemysqlhosting.net )

2) Voeg een tabel 'TrafficL_data' toe aan de database:

3) De hardware (zender) instellen

Het schema 'Arduino zender' vind je hier.

4) Upload 'Arduino-zendercode' naar de Arduino

De code vind je hier.

5) Verbind de Arduino Yun met je wifi-netwerk

6) Toegang tot Linux Server van Arduino YUN met Putty:

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

Je kunt 'MySQL_UpdateTrafficLData.php' hier vinden.

Als u deze fout ziet:'-ash:nano:niet gevonden', moet u 'nano' installeren (dit is een eenvoudige teksteditor):

opkg installeer nano 

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

Je kunt 'MySQL_UpdateDistance.php' hier vinden.

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

7) De hardware instellen (Arduino Yun-ontvanger)

Het schema 'Arduino Yun receiver' vind je hier.

8) Upload 'Arduino Receiver &MySQLdb' naar de Arduino Yun

De code vind je hier.

9) Open de seriële monitor

Je zou iets soortgelijks moeten zien:

11) Android Studio-bestanden

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

*vergeet niet de URL te wijzigen

Je kunt 'EchoJSON.php' hier vinden.

12) Upload het Android Studio-project naar uw smartphone

Instructies voor ESP8266 [aanvullend]

Het is mogelijk om een ​​op ESP8266 gebaseerde module te gebruiken in plaats van de duurdere Arduino Yun:

1. Maak een account aan op https://www.000webhost.com

2. Maak een website

3. Maak een nieuwe database

4. Upload 'CreateTable.php' en 'PostDemo.php' met Bestandsbeheer. Wijzig 'gebruikersnaam', 'wachtwoord' en 'dbnaam' in beide bestanden.

CreateTable.php:

connect_error) { die("Verbinding mislukt:" . $conn->connect_error);}// trafficl_data_v2 is de naam van de tabel$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 "Tabel succesvol aangemaakt!";} else { echo "Fout bij maken van tabel:" . $conn->fout;}$conn->close();?> 

PostDemo.php:

 connect_error) { die ("Database-verbinding mislukt:" . $ 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 ="UPDATE `trafficl_data_v2` SET `UnixTime_green_1`='5',`UnixTime_red_1`='6',`UnixTime_green_2`='7',`UnixTime_red_2`='8',`Distance`='99' WAAR 1 "; if ($conn->query($sql) ===TRUE) { echo "Gegevens succesvol ingevoegd!"; } else { echo "Fout:" . $sql. "
" . $conn->fout; }}else { echo "FAILED:onjuiste parameters";}$conn->close();?>

5. Maak een nieuwe tabel:Selecteer 'CreateTable.php' en klik op 'view'

6. Installeer de pakketten voor de ESP8266 in arduino

Voeg dit URL-bestand toe --> Voorkeuren:

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

7.

[UPDATE 9 februari 2019]

Selecteer je bord, COM-poort ... en upload ESP8266PostDemo.ino naar je op ESP8266 gebaseerde bord. Ik gebruik een NodeMcu V3 ESP8266 12E. De onderstaande code zou moeten werken voor bijna alle ESP8266-gebaseerde boards.

Omdat ik geen klok meer bij de hand heb, heb ik de code gewijzigd zodat de database elke 10 seconden wordt bijgewerkt met willekeurige waarden.

ESP8266PostDemo.ino:

#include #include  #include #include #define ARRAYSIZE 4 // 4 argumentenconst char* ssid ="yourSSID"; const char* wachtwoord ="uwWachtwoord";const char* dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // uw verzoek destinationconst char* argument_names[ARRAYSIZE] ={"UnixTime_green_1","UnixTime_red_1","UnixTime_green_2","UnixTime_red_2"};const String equals_sign ="=";const String ampersand_sign ="&";void setup() { vertraging (1000); Serieel.begin(115200); WiFi.modus (WIFI_OFF); //Voorkomt herverbindingsprobleem (duurt te lang om verbinding te maken) vertraging (1000); WiFi.mode(WIFI_STA); // Deze regel verbergt de weergave van ESP als wifi-hotspot WiFi.begin (ssid, wachtwoord); Serieel.println(""); Serial.print("Verbinden"); while (WiFi.status() !=WL_CONNECTED) { delay(500); Serieel.print("."); } Serieel.println(""); Serial.print("Verbonden met "); Serieel.println(ssid); Serial.print("IP-adres:"); Serial.println(WiFi.localIP()); }void loop() { HTTPClient http; Stringparameter =""; parameter +=argument_names[0] +equals_sign+ (int)random(100); for(int i=1; i 

php-bestand:

connect_error) { die("Databaseverbinding mislukt:". $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 ="UPDATE 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) ===TRUE) { echo "OK"; } else { echo "Fout:" . $sql. "
" . $conn->fout; } }?>

Als het u gelukt is de database bij te werken, kunt u de volgende procedures wijzigen in de arduino-code van 'Arduino Receiver &MySQLdb':

  • Maak MySQL_UpdateTrafficLData() ongeldig
  • nietig MySQL_UpdateDistance()

Houd er rekening mee dat als u het project wilt repliceren, het geen goed idee is om alles in één keer te implementeren. Probeer eerst elk onderdeel apart te testen. Als ze allemaal goed werken, kun je beginnen met het combineren van de verschillende componenten. Voel je vrij om hulp te vragen in het commentaargedeelte en probeer je probleem zo gedetailleerd mogelijk te beschrijven.

Code

  • Arduino-zendercode
  • Arduino-ontvanger en MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • EchoJSON
  • MainActivity.java
  • AndroidManifest.xml
  • strings.xml
  • activity_main.xml
Arduino-zendercodeArduino
/* IOTOPIA - 2016-2017 - Verkeerslicht Informatie Systeem (zender) * door Pieter Luyten &Joppe Smeets * * Stuur afstand naar een andere arduino via RF 433MHz modules * * RF 433MHz module:* tx_pin --> pin 3 * * HC-SR04-module:* trig_pin --> pin 5 * echo_pin --> pin 6 * */#define tx_pin 3#define trig_pin 5#define echo_pin 6#include  // Bibliotheek voor RF 433 MHz-modules #include "HCSR04.h" // Bibliotheek voor HC-SR04 moduleHCSR04 ultrasoon (trig_pin,echo_pin); int afstand;char CharMsg[21];void setup() {Serial.begin(9600); vw_setup(2000); // Bits per sec vw_set_tx_pin (tx_pin);} ongeldige lus () {afstand =ultrasoon. Variërend (CM); // Meet de afstand in cm while(distance <0){ // Vermijd valse metingen, meet de afstand opnieuw distance =ultrasoon.Ranging (CM); } sprintf(CharMsg, "%d", afstand); vw_send((uint8_t *)CharMsg, strlen(CharMsg)); // Stuur de afstand vw_wait_tx(); // Wacht tot het hele bericht verdwenen is Serial.print("Afstand (cm):"); Serial.println(afstand); vertraging(250);}
Arduino-ontvanger en MySQLdbArduino
/* IOTOPIA - 2016-2017 - Traffic Light Information System (Ontvanger + Upload naar MySQLdb) * door Pieter Luyten &Joppe Smeets * * Ontvang afstand van een andere arduino via RF * Upload verkeerslichtgegevens en afstand naar MySQL-database * * RF 433MHz module:* rx_pin --> pin 3 * * Verkeerslicht (3 LED's):* Rode LED --> pin 5 * Oranje LED --> pin 6 * Groene LED --> pin 7 * * DS3231 (Real-Time-Clock) :* SCL --> SCL (pin 3 op Arduino Yun) * SDA --> SDA (pin 2 op Arduino Yun) * * SD-kaart - Arduino Yun * SD-kaart (met PHP-bestand) --> geïntegreerd SD-slot* /#define RedLED 5#define OrangeLED 6#define GreenLED 7#define rx_pin 9#include  // RF 433 MHz modules#include  // Alarms#include  // I2C communicatie#include "RTClib.h" // Real Time Clock#include  // Voer Linux-processen uit op de AR9331// UnixTime:Tijd, gedefinieerd als het aantal seconden dat is verstreken sinds 1 januari 1970long UnixTime_green_1; // Volgende groen licht (in UnixTime) lange UnixTime_red_1; // Volgende rood licht (in UnixTime) lange UnixTime_green_2; // Op één na groen licht (in UnixTime) lange UnixTime_red_2; // Op één na rood licht (in UnixTime) lang s_till_orange; // Seconden tot orangeRTC_DS3231 rtc;char StringReceived[22];boolean i;int interval =5; // in seconden afstand; // in cmvoid setup() { rtc.begin(); //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Serieel.begin(9600); Brug.begin(); // Initialiseer Bridge vw_setup (2000); // Bits per sec vw_set_rx_pin (rx_pin); vw_rx_start(); Alarm.timerRepeat(interval, UpdateTrafficLData); // Update verkeerslichtgegevens (volgende groen/rood licht ...) Alarm.timerRepeat (1,PrintCurrentTime); // Print de huidige tijd elke x seconden pinMode (GreenLED, OUTPUT); pinMode (OranjeLED, UITGANG); pinMode (Rood LED, UITGANG); digitalWrite (Groene LED, LAAG); digitalWrite (OranjeLED, LAAG); digitalWrite (Rood LED, LAAG); Serial.println("Setup voltooid");}void loop() { Alarm.delay(0); // Deze vertraging moet worden gebruikt in plaats van de normale Arduino delay(), // voor tijdige verwerking van alarmen en timers. U kunt 0 doorgeven voor minimale vertraging. RF_Luister (); }nietig 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(); Serieafdruk(c); } // Zorg ervoor dat het laatste stukje gegevens wordt verzonden. Serial.flush();}void MySQL_UpdateDistance(){ Proces p; p.begin("/mnt/sda1/MySQL_UpdateDistance.php"); p.addParameter(String(afstand)); p.run(); // Lees feedback (voor foutopsporing) while (p.available()> 0) { char c =p.read(); Serieafdruk(c); } // Zorg ervoor dat het laatste stukje gegevens wordt verzonden. Serial.flush();}void PrintCurrentTime() { DateTime now =rtc.now(); SetLEDsTrafficL(); Serial.print(nu.uur(), DEC); Serieel.print(':'); Serial.print(nu.minute(), DEC); Serieel.print(':'); Serial.print(nu.second(), DEC); Serieel.print(" "); Serial.println(now.unixtime());}void SetLEDsTrafficL () { DateTime now =rtc.now(); s_till_orange =UnixTime_red_1 - now.unixtime(); if (i ==0) { digitalWrite (Groene LED, LAAG); digitalWrite (OranjeLED, LAAG); digitalWrite (Rood LED, HOOG); } if (i ==1 &&s_till_orange <=3) { digitalWrite (GreenLED, LOW); digitalWrite (OranjeLED, HOOG); digitalWrite (Rood LED, LAAG); } if (i ==1 &&s_till_orange> 3) { digitalWrite (Groene LED, HOOG); digitalWrite (OranjeLED, LAAG); digitalWrite (Rood LED, LAAG); }}
MySQL_UpdateTrafficLData.phpPHP
#!/usr/bin/php-cliconnect_error) {trigger_error('Database-verbinding mislukt:' . $conn->connect_error, E_USER_ERROR);} $sql="UPDATE 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 idn=1";ifry($($($) ) ===false) { trigger_error('Wrong SQL:' . $sql . ' Error:' . $conn->error, E_USER_ERROR);}else{echo "Gegevens ingevoegd!\n";} ?>
MySQL_UpdateDistance.phpPHP
#!/usr/bin/php-cliconnect_error) { trigger_error('Database-verbinding mislukt:' . $conn->connect_error, E_USER_ERROR );}$sql="UPDATE TrafficL_data SET Distance='$Distance'WHERE id=1";if($conn->query($sql) ===false) { trigger_error('Wrong SQL:' . $sql . ' Error:' . $conn->error, E_USER_ERROR);}else{echo "Afstand ingevoegd!\n";}?>
EchoJSONPHP
MainActivity.javaJava
pakket com.example.xxx.xxx;// change 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;public class MainActivity breidt AppCompatActivity uit {// Toont de string "data " die de resultaten bevat TextView-resultaten; // De tekstweergave met de aanbevolen snelheid TextView recSpeed; // URL van te ontleden object String JsonURL ="YourURLhere"; // Deze string bevat de resultaten String data =""; // Definiëren van de Volley-verzoekwachtrij die het URL-verzoek gelijktijdig afhandelt RequestQueue requestQueue; // timer-object om de gegevens elke seconde bij te werken // Timer-timer; //De speedLimit (cm/s) privé finale statische dubbele maxSpeed ​​=18; //De aanbevolen snelheid privé dubbele snelheid; // aantal keren in de tabel openbare definitieve statische int NUMBER_OF_ENTRIES =2; //array met de tijden waarop het groen is lang [] unixTimesGreen =nieuw lang [NUMBER_OF_ENTRIES]; //array met de tijden waarop het rood is lang [] unixTimesRed =nieuw lang [NUMBER_OF_ENTRIES]; //variabele die de afstand privé dubbele afstand houdt; //variabelen voor het herhalen van updateTable private final ScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor (); //voor testen:privé Future timingTask; public void tick (lange milliseconden) {timingTask =scheduler.scheduleAtFixedRate(new Runnable() { public void run() {updateTable();}}, 0, milliseconden, TimeUnit.MILLISECONDS); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //textViews om resultaten naar resultaten te casten =(TextView) findViewById (R.id.jsonData); recSpeed ​​=(TextView) findViewById(R.id.recommendedSpeed); // initialiseer tabel updateTable(); // update app elke 100 milliseconden tick (500); // voor het werken met een timerobject om herhaaldelijk bij te werken /** timer =new Timer ("Timer"); timer.schedule(nieuwe UpdateTable(),(long)100,(long)100); */ } // voor het werken met timer-object om herhaaldelijk bij te werken /** privéklasse UpdateTable breidt TimerTask uit {public void run(){ updateTable(); } } */ private void updateTable(){ //reset String data =""; // Creëert de Volley-verzoekwachtrij requestQueue =Volley.newRequestQueue (this); //voor het testen /** // Castt resultaten naar de TextView die wordt gevonden in de XML van de hoofdlay-out met id jsonData results =(TextView) findViewById(R.id.jsonData); */ // Het creëren van de JsonArrayRequest-klasse genaamd arrayreq, waarbij de vereiste parameters worden doorgegeven //JsonURL is de URL die moet worden opgehaald van JsonArrayRequest arrayreq =new JsonArrayRequest(JsonURL, // De tweede parameter Listener overschrijft de methode onResponse() en geeft //JSONArray door als een parameter nieuwe Response.Listener() {// Neemt het antwoord van het JSON-verzoek @Override public void onResponse(JSONArray response) {try { // Haalt het eerste JSON-object op in de buitenste array JSONObject TrafficLObj =response.getJSONObject( 0); // Haalt "trafficArry" op uit het JSON-object JSONArray trafficArry =TrafficLObj.getJSONArray ("TrafficLArray"); // Herhaalt de JSON-array om objecten op te halen en toe te voegen // aan de lijstweergave totdat er geen objecten meer zijn trafficArry for (int i =0; i  maxSpeed) snelheid =maxSpeed; anders snelheid =afstand/((unixTimesGreen[interval]-tijd)); snelheid =snelheid*5; }}
AndroidManifest.xmlXML
// verander xxx xxx         
strings.xmlXML
"NooitRood", wat betekent:"NeverRed"
 NooitRood
activity_main.xmlXML
  

Schema's

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)

Productieproces

  1. Gaslantaarn
  2. Laseraanwijzer
  3. Caleidoscoop
  4. Verkeerssignaal
  5. Light Emitting Diode (LED)
  6. Scheuren in een Zigbee-gebaseerd LED-licht
  7. Time of flight systeemontwerp:systeemoverzicht
  8. Slim verkeerslicht
  9. Nieuwe AI regelt automatisch het grootlichtsysteem van het voertuig
  10. Ebook over robotlassysteem werpt licht op investeringsoverwegingen
  11. LED-accessoires –LED-lichtstripaccessoires