Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Système d'information sur les feux de circulation

Composants et fournitures

Arduino Yun
× 1
Arduino UNO
ou toute autre carte Arduino
× 1
Capteur à ultrasons - HC-SR04 (Générique)
× 1
DS3231 RTC
Horloge en temps réel
× 1
LED (générique)
1 x LED rouge, 1 x LED jaune, 1 x LED verte
× 3
Résistance 330 ohm
× 3
Modules 433 MHz
1 x émetteur, 1 x récepteur
× 1
Appareil Android
× 1
Carte SD
× 1
Kit de développement rapide AllThingsTalk IOTOPIA
× 1
Câbles de raccordement (générique)
× 1

Applications et services en ligne

Arduino IDE
Android Studio
Service d'hébergement de base de données MySQL

À propos de ce projet

Présentation

Le trafic a la capacité d'irriter les meilleurs d'entre nous et c'est de pire en pire. Et si cela pouvait être changé avec des feux de circulation intelligents ? Nous avons créé un système d'information sur les feux de circulation qui permet au conducteur de savoir à quelle vitesse il doit conduire pour arriver à la jonction et passer le feu vert sans dépasser la limite de vitesse maximale. Et lorsque le conducteur doit attendre l'inévitable feu rouge, cela lui permet de savoir quand le feu est sur le point de passer au vert.

Un feu de circulation envoie des données sur la durée pendant laquelle il restera vert ou jusqu'au prochain feu vert, etc. à une base de données en ligne. Un GPS ou une application sur votre smartphone va récupérer les données de la base de données et calculer la vitesse souhaitée pour passer le feu vert. Il affichera le temps d'attente restant jusqu'à la fin de la phase de feu rouge quand il est inévitable que vous deviez attendre.

Exemple

Vous roulez dans une zone de 70 km/h en respectant la limite. Le feu de circulation devant vous est rouge et le feu est sur le point de passer au vert dans 30 secondes. Vous êtes à 500 mètres du feu, le système vous recommandera donc de vous diriger vers le feu à 60 km/h.

Démonstration du projet

Comment avons-nous fait?

Pour démontrer notre projet, nous avons créé un feu de circulation avec l'Arduino Yun. Le feu de circulation se compose de 3 LED et d'une horloge en temps réel. Les lumières changeront à un intervalle donné. L'Arduino Yun économise le temps que le feu de circulation passe au vert/rouge. Ensuite, il exécute un fichier PHP qui établit une connexion à la base de données MySQL en ligne et insère les données reçues de l'Arduino Yun. Une application Android (créée avec Android Studio) récupérera la date de cette base de données. Cela se fait via un autre fichier PHP qui renvoie les données des feux de circulation au format JSON. L'application calcule la vitesse souhaitée et affiche un compte à rebours lorsque vous ne pouvez pas passer le feu vert.

Pour calculer la vitesse souhaitée, l'application doit connaître la distance jusqu'au feu de circulation. Cela se fait en calculant la distance en fonction des coordonnées GPS. Mais malheureusement, un GPS dans un smartphone n'est pas assez précis pour prouver notre concept car nous travaillons à petite échelle. C'est pourquoi nous avons utilisé le module de télémétrie à ultrasons (HC-SR04). L'Arduino Yun reçoit la distance entre la voiture et le feu de circulation via des modules RF 433 MHz. Chaque fois que le Yun reçoit une nouvelle mesure de l'autre Arduino, il met à jour les données dans la base de données. Maintenant, l'application est capable de calculer la vitesse souhaitée.

Instructions

1) Créez une base de données MySQL en ligne

(Nous avons utilisé freemysqlhosting.net )

2) Ajoutez une table 'TrafficL_data' à la base de données :

3) Configurer le matériel (émetteur)

Vous pouvez trouver le schéma « émetteur Arduino » ici.

4) Télécharger le « Code du transmetteur Arduino » sur l'Arduino

Vous pouvez trouver le code ici.

5) Connectez l'Arduino Yun à votre réseau WiFi

6) Accédez au serveur Linux d'Arduino YUN avec Putty :

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

Vous pouvez trouver 'MySQL_UpdateTrafficLData.php' ici.

Si vous voyez cette erreur :'-ash:nano:not found', vous devez installer 'nano' (il s'agit d'un éditeur de texte basique) :

opkg install nano 

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

Vous pouvez trouver 'MySQL_UpdateDistance.php' ici.

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

7) Configurer le matériel (récepteur Arduino Yun)

Vous pouvez trouver le schéma 'Récepteur Arduino Yun' ici.

8) Téléchargez 'Arduino Receiver &MySQLdb' sur l'Arduino Yun

Vous pouvez trouver le code ici.

9) Ouvrez le moniteur série

Vous devriez voir quelque chose de similaire :

11) Fichiers Android Studio

  • activity_main.xml
  • ActivitéMain.java*
  • AndroidManifest.xml
  • chaînes.xml

*n'oubliez pas de changer l'URL

Vous pouvez trouver 'EchoJSON.php' ici.

12) Téléchargez le projet Android Studio sur votre smartphone

Instructions pour ESP8266 [supplémentaire]

Il est possible d'utiliser un module basé sur ESP8266 au lieu du plus cher Arduino Yun :

1. Créez un compte sur https://www.000webhost.com

2. Créer un site Web

3. Créez une nouvelle base de données

4. Téléchargez « CreateTable.php » et « PostDemo.php » avec le gestionnaire de fichiers. Modifiez « nom d'utilisateur », « mot de passe » et « dbname » dans les deux fichiers.

CreateTable.php :

connect_error) { die("Connection failed:" . $conn->connect_error);}// trafficl_data_v2 is le nom de la table$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 "La table a été créée avec succès !";} else { echo "Erreur lors de la création de la table :" . $conn->error;}$conn->close();?> 

PostDemo.php :

connect_error) { die("Database Connection failed:" . $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' O 1 "; if ($conn->query($sql) ===TRUE) { echo "Les données ont été insérées avec succès !"; } else { echo "Erreur :" . $sql. "
" . $conn->erreur ; }}else { echo "ÉCHEC :paramètres incorrects";}$conn->close();?>

5. Créez une nouvelle table :sélectionnez 'CreateTable.php' et cliquez sur 'view'

6. Installez les packages pour l'ESP8266 dans arduino

Ajoutez ce fichier URL--> Préférences :

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

7.

[MISE À JOUR 9 février 2019]

Sélectionnez votre carte, votre port COM... et téléchargez ESP8266PostDemo.ino sur votre carte basée sur ESP8266. J'utilise un NodeMcu V3 ESP8266 12E. Le code ci-dessous devrait fonctionner pour presque toutes les cartes basées sur ESP8266.

Comme je n'ai plus d'horloge sous la main, j'ai modifié le code pour que la base de données soit mise à jour toutes les 10 secondes avec des valeurs aléatoires.

ESP8266PostDemo.ino :

#include #include  #include #include #define ARRAYSIZE 4 // 4 argumentsconst char* ssid ="yourSSID"; const char* mot de passe ="yourPassword";const char* dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // votre demande 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() { délai(1000); Serial.begin(115200); WiFi.mode (WIFI_OFF); // Empêche le problème de reconnexion (prend trop de temps pour se connecter) delay(1000); WiFi.mode(WIFI_STA); //Cette ligne masque l'affichage d'ESP en tant que point d'accès wifi WiFi.begin(ssid, mot de passe); Serial.println(""); Serial.print("Connexion"); while (WiFi.status() !=WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connecté à "); Serial.println(ssid); Serial.print("Adresse IP :"); Serial.println(WiFi.localIP()); }boucle vide() { HTTPClient http; Paramètre de chaîne ="" ; paramètre +=argument_names[0] +equals_sign+ (int)random(100); for(int i=1; i 

fichier php :

connect_error) { die("Echec de la connexion à la base de données :" . $conn->connect_error); } si (!empty($_POST["UnixTime_green_1"]) &&!empty($_POST["UnixTime_red_1"]) &&!empty($_POST["UnixTime_green_2"]) &&!vide($_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 "Erreur :" . $sql. "
" . $conn->erreur ; } } ?>

Si vous avez réussi à mettre à jour la base de données, vous pouvez modifier les procédures suivantes dans le code arduino de 'Arduino Receiver &MySQLdb' :

  • annuler MySQL_UpdateTrafficLData()
  • void MySQL_UpdateDistance()

Notez que si vous souhaitez répliquer le projet, ce n'est pas une bonne idée de tout mettre en œuvre à la fois. Essayez d'abord de tester chaque composant séparément. S'ils fonctionnent tous bien, vous pouvez commencer par combiner les différents composants. N'hésitez pas à demander de l'aide dans la section des commentaires et essayez de décrire votre problème aussi précisément que possible.

Code

  • Code du transmetteur Arduino
  • Récepteur Arduino et MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • EchoJSON
  • ActivitéMain.java
  • AndroidManifest.xml
  • chaînes.xml
  • activity_main.xml
Code du transmetteur ArduinoArduino
/* IOTOPIA - 2016-2017 - Traffic Light Information System (Transmitter) * par Pieter Luyten &Joppe Smeets * * Envoyer la distance à un autre arduino via des modules RF 433MHz * * Module RF 433MHz :* tx_pin --> broche 3 * * Module HC-SR04 :* trig_pin --> pin 5 * echo_pin --> pin 6 * */#define tx_pin 3#define trig_pin 5#define echo_pin 6#include  // Bibliothèque pour modules RF 433 MHz #include "HCSR04.h" // Bibliothèque pour le module HC-SR04 HCSR04 ultrasonic(trig_pin,echo_pin); int distance;char CharMsg[21];void setup() { Serial.begin(9600); vw_setup(2000); // Bits par seconde vw_set_tx_pin(tx_pin);}void loop() { distance =ultrasonic.Ranging(CM); // Mesurer la distance en cm while(distance <0){ // Eviter les fausses lectures, mesurer à nouveau la distance distance =ultrasonic.Ranging(CM); } sprintf(CharMsg, "%d,", distance); vw_send((uint8_t *)CharMsg, strlen(CharMsg)); // Envoie la distance vw_wait_tx(); // Attendez que tout le message disparaisse Serial.print("Distance (cm):"); Serial.println(distance); retard (250);}
Récepteur Arduino &MySQLdbArduino
/* IOTOPIA - 2016-2017 - Traffic Light Information System (Receiver + Upload to MySQLdb) * par Pieter Luyten &Joppe Smeets * * Recevoir la distance d'un autre arduino via RF * Charger les données des feux de circulation et la distance dans la base de données MySQL * * Module RF 433MHz :* rx_pin --> broche 3 * * TrafficLight (3 LED) :* RedLED --> broche 5 * OrangeLED --> broche 6 * GreenLED --> broche 7 * * DS3231 (Real-Time-Clock) :* SCL --> SCL (broche 3 sur Arduino Yun) * SDA --> SDA (broche 2 sur Arduino Yun) * * Carte SD - Arduino Yun * Carte SD (avec fichier PHP) --> slot SD intégré* /#define RedLED 5#define OrangeLED 6#define GreenLED 7#define rx_pin 9#include  // Modules RF 433 MHz#include  // Alarmes#include  // I2C communication#include "RTClib.h" // Horloge temps réel#include  // Exécute les processus Linux sur l'AR9331// UnixTime :Temps, défini comme le nombre de secondes écoulées depuis le 1er janvier 1970long UnixTime_green_1 ; // Prochain feu vert (dans UnixTime)long UnixTime_red_1; // Prochain feu rouge (dans UnixTime)long UnixTime_green_2; // Suivant mais un feu vert (dans UnixTime)long UnixTime_red_2; // Suivant mais une lumière rouge (dans UnixTime)long s_till_orange; // Secondes jusqu'à orangeRTC_DS3231 rtc;char StringReceived[22];boolean i;int interval =5; // en secondesint distance ; // dans cmvoid setup() { rtc.begin(); //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Serial.begin(9600); Pont.begin(); // Initialiser le pont vw_setup(2000); // Bits par seconde vw_set_rx_pin(rx_pin); vw_rx_start(); Alarm.timerRepeat(intervalle, UpdateTrafficLData); // Mettre à jour les données des feux de circulation (prochain feu vert/rouge...) Alarm.timerRepeat(1,PrintCurrentTime); // Affiche l'heure actuelle toutes les x secondes pinMode(GreenLED, OUTPUT); pinMode(OrangeLED, SORTIE); pinMode (LED rouge, SORTIE); digitalWrite (GreenLED, LOW); digitalWrite(OrangeLED, LOW); digitalWrite(RedLED, LOW); Serial.println("Configuration terminée");}boucle void() { Alarm.delay(0); // Ce délai doit être utilisé à la place du délai Arduino normal (), // pour un traitement rapide des alarmes et des minuteries. Vous pouvez passer 0 pour un délai minimal. RF_Ecouter (); }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); } // Assurez-vous que le dernier bit de données est envoyé. Serial.flush();}void MySQL_UpdateDistance(){ Process p; p.begin("/mnt/sda1/MySQL_UpdateDistance.php"); p.addParameter(String(distance)); p.run(); // Lire les commentaires (pour le débogage) while (p.available()> 0) { char c =p.read(); Serial.print(c); } // Assurez-vous que le dernier bit de données est envoyé. Serial.flush();}void PrintCurrentTime() { DateTime now =rtc.now(); SetLEDsTrafficL(); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); 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(); if (i ==0) { digitalWrite(GreenLED, LOW); digitalWrite(OrangeLED, LOW); digitalWrite (LED rouge, ÉLEVÉ); } if (i ==1 &&s_till_orange <=3) { digitalWrite(GreenLED, LOW); digitalWrite(OrangeLED, HAUT); digitalWrite(RedLED, LOW); } if (i ==1 &&s_till_orange> 3) { digitalWrite(GreenLED, HIGH); digitalWrite(OrangeLED, LOW); digitalWrite(RedLED, LOW); }}
MySQL_UpdateTrafficLData.phpPHP
#!/usr/bin/php-cliconnect_error) { trigger_error('La connexion à la base de données a échoué :' . $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 id=1">query($conn-sql ) ===false) { trigger_error('Mauvais SQL :' . $sql . ' Erreur :' . $conn->error, E_USER_ERROR);}else{echo "Données insérées !\n";} ?>
MySQL_UpdateDistance.phpPHP
#!/usr/bin/php-cliconnect_error) { trigger_error('Echec de la connexion à la base de données :' . $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 . ' Erreur :' . $conn->error, E_USER_ERROR);}else{echo "Distance insérée !\n";}?>
EchoJSONPHP
MainActivity.javaJava
package 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 extend AppCompatActivity { // Affiche la chaîne "data " qui contient les résultats TextView ; //Le textview qui contient la vitesse recommandée TextView recSpeed; // URL de l'objet à analyser String JsonURL ="YourURLhere"; // Cette chaîne contiendra les résultats String data =""; // Définition de la file d'attente de requêtes Volley qui gère la requête d'URL simultanément RequestQueue requestQueue; //objet timer pour mettre à jour les données toutes les secondes //timer timer; //Le speedLimit (cm/s) privé final statique double maxSpeed ​​=18; //La vitesse recommandée privée double vitesse ; //nombre de fois dans la table public final static int NUMBER_OF_ENTRIES =2; // tableau avec les moments où il est vert long[] unixTimesGreen =new long[NUMBER_OF_ENTRIES]; // tableau avec les moments où il est rouge long[] unixTimesRed =new long[NUMBER_OF_ENTRIES]; //variable qui contient la distance private double distance; //variables pour répéter updateTable private final ScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor(); //pour tester :private Future timingTask; public void tick(long millisecondes) { timingTask =scheduler.scheduleAtFixedRate(new Runnable() { public void run() { updateTable(); } }, 0, millisecondes, TimeUnit.MILLISECONDS); } @Override protected void onCreate(Bundle protectedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //textViews pour convertir les résultats en résultats =(TextView) findViewById(R.id.jsonData); recSpeed ​​=(TextView) findViewById(R.id.recommendedSpeed); //initialise la table updateTable(); //mettre à jour l'application toutes les 100 millisecondes (500 ); //pour travailler avec un objet timer pour mettre à jour à plusieurs reprises /** timer =new Timer("Timer"); timer.schedule(new UpdateTable(),(long)100,(long)100); */ } //pour travailler avec l'objet timer pour mettre à jour à plusieurs reprises /** la classe privée UpdateTable étend TimerTask{ public void run(){ updateTable(); } } */ private void updateTable(){ //reset String data =""; // Crée la file d'attente de requêtes Volley requestQueue =Volley.newRequestQueue(this); //pour tester /** // Convertit les résultats dans le TextView trouvé dans la mise en page principale XML avec l'id jsonData result =(TextView) findViewById(R.id.jsonData); */ // Création de la classe JsonArrayRequest appelée arrayreq, en passant les paramètres requis // JsonURL est l'URL à récupérer à partir de JsonArrayRequest arrayreq =new JsonArrayRequest(JsonURL, // Le deuxième paramètre Listener remplace la méthode onResponse() et passe //JSONArray en tant que paramètre new Response.Listener() { // Prend la réponse de la demande JSON @Override public void onResponse(JSONArray response) { try { // Récupère le premier objet JSON dans le tableau externe JSONObject TrafficLObj =response.getJSONObject( 0); // Récupère "trafficArry" à partir de l'objet JSON JSONArray trafficArry =TrafficLObj.getJSONArray("TrafficLArray"); // Itère dans le tableau JSON pour obtenir des objets et les ajouter // à la vue de liste jusqu'à ce qu'il n'y ait plus d'objets dans trafficArry for (int i =0; i  maxSpeed) speed =maxSpeed ; sinon vitesse =distance/((unixTimesGreen[interval]-time)); vitesse =vitesse*5 ; }}
AndroidManifest.xmlXML
// modifier xxx xxx         
strings.xmlXML
"NooitRood", meaning:"NeverRed"
 NooitRood
activity_main.xmlXML
  

Schémas

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)

Processus de fabrication

  1. Lanterne à gaz
  2. Pointeur laser
  3. Kaléidoscope
  4. Feux de signalisation
  5. diode électroluminescente (DEL)
  6. Déchirer une lumière LED basée sur Zigbee
  7. Feu de circulation intelligent
  8. La nouvelle IA contrôle automatiquement le système d'éclairage des feux de route du véhicule
  9. Accessoires LED – Accessoires pour bandes lumineuses LED