Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Sistema de información de semáforos

Componentes y suministros

Arduino Yun
× 1
Arduino UNO
o cualquier otra placa Arduino
× 1
Sensor ultrasónico - HC-SR04 (genérico)
× 1
DS3231 RTC
Reloj en tiempo real
× 1
LED (genérico)
1 x LED rojo, 1 x LED amarillo, 1 x LED verde
× 3
Resistencia de 330 ohmios
× 3
módulos de 433 MHz
1 x transmisor, 1 x receptor
× 1
dispositivo Android
× 1
Tarjeta SD
× 1
Kit de desarrollo rápido AllThingsTalk IOTOPIA
× 1
Cables de puente (genéricos)
× 1

Aplicaciones y servicios en línea

Arduino IDE
Android Studio
Servicio de alojamiento de bases de datos MySQL

Acerca de este proyecto

Introducción

El tráfico tiene la capacidad de irritarnos a los mejores y está empeorando. ¿Y si eso se puede cambiar con semáforos inteligentes? Creamos un Sistema de Información de Semáforo que le permite al conductor saber a qué velocidad necesita conducir para llegar al cruce y pasar la luz verde sin exceder el límite de velocidad máxima. Y cuando el conductor tiene que esperar la inevitable luz roja, le avisa cuando la luz está a punto de cambiar a verde.

Un semáforo envía datos sobre cuánto tiempo permanecerá verde o el tiempo hasta la próxima luz verde, etc. a una base de datos en línea. Un GPS o una aplicación en su teléfono inteligente recuperará datos de la base de datos y calculará la velocidad deseada para pasar la luz verde. Mostrará el tiempo de espera restante hasta el final de la fase de luz roja cuando es inevitable que tenga que esperar.

Ejemplo

Conduces en una zona de 70 km / h, manteniéndote al límite. El semáforo que está delante de usted es rojo y el semáforo está a punto de cambiar a verde en 30 segundos. Se encuentra a 500 metros del semáforo, por lo que el sistema le recomendará que avance hacia el semáforo a 60 km / h.

Demostración del proyecto

¿Cómo lo hemos hecho?

Para demostrar nuestro proyecto, creamos un semáforo con Arduino Yun. El semáforo consta de 3 LED y un reloj de tiempo real. Las luces cambiarán en un intervalo determinado. El Arduino Yun ahorra el tiempo que el semáforo se vuelve verde / rojo. Luego, ejecuta un archivo PHP que se conecta a la base de datos MySQL en línea e inserta los datos recibidos del Arduino Yun. Una aplicación de Android (creada con Android Studio) recuperará la fecha de esa base de datos. Esto se hace a través de otro archivo PHP que devuelve los datos del semáforo en formato JSON. La aplicación calcula la velocidad deseada y mostrará un temporizador de cuenta atrás cuando no pueda pasar la luz verde.

Para calcular la velocidad deseada, la aplicación necesita conocer la distancia al semáforo. Esto se hace calculando la distancia según las coordenadas GPS. Pero desafortunadamente, un GPS en un teléfono inteligente no es lo suficientemente preciso para probar nuestro concepto porque estamos trabajando a pequeña escala. Es por eso que utilizamos el módulo de rango ultrasónico (HC-SR04). El Arduino Yun recibe la distancia entre el automóvil y el semáforo a través de módulos de RF de 433 MHz. Cada vez que el Yun recibe una nueva medición del otro Arduino, actualiza los datos en la base de datos. Ahora, la aplicación puede calcular la velocidad deseada.

Instrucciones

1) Cree una base de datos MySQL en línea

(Usamos freemysqlhosting.net)

2) Agregue una tabla 'TrafficL_data' a la base de datos:

3) Configure el hardware (transmisor)

Puede encontrar el esquema del 'transmisor Arduino' aquí.

4) Cargue el 'Código del transmisor Arduino' al Arduino

Puedes encontrar el código aquí.

5) Conecte el Arduino Yun a su red WiFi

6) Acceda al servidor Linux de Arduino YUN con Putty:

  opkg actualizar opkg instalar php5-mod-mysqli opkg instalar php5-cli nano /mnt/sda1/MySQL_UpdateTrafficLData.php  

Puede encontrar 'MySQL_UpdateTrafficLData.php' aquí.

Si ve este error:'-ash:nano:no encontrado', debe instalar 'nano' (este es un editor de texto básico):

  opkg install nano  

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

Puede encontrar 'MySQL_UpdateDistance.php' aquí.

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

7) Configure el hardware (receptor Arduino Yun)

Puede encontrar el esquema del 'receptor Arduino Yun' aquí.

8) Sube 'Arduino Receiver &MySQLdb' al Arduino Yun

Puedes encontrar el código aquí.

9) Abra el monitor en serie

Debería ver algo similar:

11) Archivos de Android Studio

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

* no olvide cambiar la URL

Puede encontrar 'EchoJSON.php' aquí.

12) Sube el proyecto de Android Studio a tu teléfono inteligente

Instrucciones para ESP8266 [adicional]

Es posible utilizar un módulo basado en ESP8266 en lugar del más caro Arduino Yun:

1. Cree una cuenta en https://www.000webhost.com

2. Cree un sitio web

3. Cree una nueva base de datos

4. Sube "CreateTable.php" y "PostDemo.php" con el Administrador de archivos. Cambie "nombre de usuario", "contraseña" y "dbname" en ambos archivos.

CreateTable.php:

   connect_error) {die ("Connection failed:". $ conn-> connect_error);} // trafficl_data_v2 is el nombre de la tabla $ 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, Distancia INT (12) NOT NULL, id INT (6) UNSIGNED AUTO_INCREMENT PRIMARY KEY) "; if ($ conn-> query ($ sql) ===TRUE) {echo" ¡Tabla creada correctamente! ";} Else {echo" Error al crear la tabla:" . $ conn-> error;} $ conn-> close ();?>  

PostDemo.php:

   connect_error) {die ("Error de conexión a la base de datos:". $ 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', `Distancia` ='99 'DONDE 1 "; if ($ conn-> query ($ sql) ===TRUE) {echo "¡Datos insertados correctamente!"; } else {echo "Error:". $ sql. "
". $ conexión-> error; }} else {echo "FALLÓ:parámetros incorrectos";} $ conn-> close ();?>

5. Cree una nueva tabla:seleccione 'CreateTable.php' y haga clic en 'ver'

6. Instale los paquetes para ESP8266 en arduino

Agregue este archivo URL -> Preferencias:

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

7.

[ACTUALIZACIÓN 9 de febrero de 2019]

Seleccione su placa, puerto COM ... y cargue ESP8266PostDemo.ino a su placa basada en ESP8266. Estoy usando un NodeMcu V3 ESP8266 12E. El siguiente código debería funcionar para casi todas las placas basadas en ESP8266.

Como ya no tengo un reloj a mano, he cambiado el código para que la base de datos se actualice cada 10 segundos con valores aleatorios.

ESP8266PostDemo.ino:

  #include  #include  #include  #include  #define ARRAYSIZE 4 // 4 argumentosconst char * ssid ="yourSSID"; const char * contraseña ="su contraseña"; const char * dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // su solicitud 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 () {retraso (1000); Serial.begin (115200); Modo WiFi (WIFI_OFF); // Evita el problema de la reconexión (tarda demasiado en conectarse) delay (1000); Modo WiFi (WIFI_STA); // Esta línea oculta la visualización de ESP como punto de acceso wifi WiFi.begin (ssid, contraseña); Serial.println (""); Serial.print ("Conectando"); while (WiFi.status ()! =WL_CONNECTED) {retraso (500); Serial.print ("."); } Serial.println (""); Serial.print ("Conectado a"); Serial.println (ssid); Serial.print ("dirección IP:"); Serial.println (WiFi.localIP ()); } bucle vacío () {HTTPClient http; Parámetro de cadena =""; parámetro + =nombre_argumento [0] + signo_igual + (int) aleatorio (100); for (int i =1; i  

archivo php:

   connect_error) {die ("Error en la conexión de la base de datos:". $ Conn-> connect_error); } si (! vacío ($ _ POST ["UnixTime_green_1"]) &&! vacío ($ _ POST ["UnixTime_red_1"]) &&! vacío ($ _ POST ["UnixTime_green_2"]) &&! vacío ($ _ 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 ="ACTUALIZAR 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 ($ conexión-> consulta ($ sql) ===VERDADERO) {echo "OK"; } else {echo "Error:". $ sql. "
". $ conexión-> error; }}?>

Si ha logrado actualizar la base de datos, puede modificar los siguientes procedimientos en el código arduino de 'Arduino Receiver &MySQLdb':

  • anular MySQL_UpdateTrafficLData ()
  • anular MySQL_UpdateDistance ()

Tenga en cuenta que si desea replicar el proyecto, no es una buena idea implementar todo a la vez. Primero intente probar cada componente por separado. Si todos funcionan bien, puede comenzar combinando los diferentes componentes. No dude en pedir ayuda en la sección de comentarios e intente describir su problema de la forma más detallada posible.

Código

  • Código del transmisor Arduino
  • Receptor Arduino y MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • EchoJSON
  • MainActivity.java
  • AndroidManifest.xml
  • strings.xml
  • activity_main.xml
Código del transmisor Arduino Arduino
 / * IOTOPIA - 2016-2017 - Sistema de información de semáforos (transmisor) * de Pieter Luyten &Joppe Smeets * * Enviar distancia a otro arduino a través de módulos RF 433MHz * * Módulo RF 433MHz:* tx_pin -> pin 3 * * Módulo HC-SR04:* trig_pin -> pin 5 * echo_pin -> pin 6 * * / # define tx_pin 3 # define trig_pin 5 # define echo_pin 6 # include  // Biblioteca para módulos RF 433 MHz #include "HCSR04.h" // Biblioteca para módulo HC-SR04 HCSR04 ultrasónico (trig_pin, echo_pin); int distancia; char CharMsg [21]; void setup () {Serial.begin (9600); vw_setup (2000); // Bits por segundo vw_set_tx_pin (tx_pin);} void loop () {distancia =ultrasónico.Rango (CM); // Mide la distancia en cm while (distancia <0) {// Evita lecturas falsas, mide la distancia de nuevo distancia =ultrasónico.Rango (CM); } sprintf (CharMsg, "% d,", distancia); vw_send ((uint8_t *) CharMsg, strlen (CharMsg)); // Envía la distancia vw_wait_tx (); // Espere hasta que todo el mensaje desaparezca Serial.print ("Distancia (cm):"); Serial.println (distancia); retraso (250);} 
Receptor Arduino y MySQLdb Arduino
 / * IOTOPIA - 2016-2017 - Sistema de información de semáforos (Receptor + Subir a MySQLdb) * por Pieter Luyten &Joppe Smeets * * Recibir distancia de otro arduino a través de RF * Cargar datos de semáforo y distancia a la base de datos MySQL * * Módulo RF 433MHz:* rx_pin -> pin 3 * * TrafficLight (3 LED):* RedLED -> pin 5 * OrangeLED -> pin 6 * GreenLED -> pin 7 * * DS3231 (Reloj en tiempo real) :* SCL -> SCL (pin 3 en Arduino Yun) * SDA -> SDA (pin 2 en Arduino Yun) * * Tarjeta SD - Arduino Yun * Tarjeta SD (con archivo PHP) -> ranura SD integrada * / # definir RedLED 5 # definir OrangeLED 6 # definir GreenLED 7 # definir rx_pin 9 # incluir  // Módulos RF 433 MHz # incluir  // Alarmas # incluir  // I2C comunicación # incluye "RTClib.h" // Reloj en tiempo real # incluye  // Ejecuta procesos Linux en el AR9331 // Tiempo Unix:tiempo, definido como el número de segundos que han transcurrido desde el 1 de enero de 1970 durante mucho tiempo UnixTime_green_1; // Siguiente luz verde (en UnixTime) long UnixTime_red_1; // Siguiente luz roja (en UnixTime) long UnixTime_green_2; // Siguiente pero una luz verde (en UnixTime) long UnixTime_red_2; // Siguiente pero una luz roja (en UnixTime) long s_till_orange; // Segundos hasta naranjaRTC_DS3231 rtc; char StringReceived [22]; boolean i; int interval =5; // en segundosint distancia; // en cmvoid setup () {rtc.begin (); //rtc.adjust(DateTime(F(__DATE__), F (__ TIME__))); Serial.begin (9600); Bridge.begin (); // Inicializar Bridge vw_setup (2000); // Bits por segundo vw_set_rx_pin (rx_pin); vw_rx_start (); Alarm.timerRepeat (intervalo, UpdateTrafficLData); // Actualizar los datos del semáforo (siguiente luz verde / roja ...) Alarm.timerRepeat (1, PrintCurrentTime); // Imprime la hora actual cada x segundos pinMode (GreenLED, OUTPUT); pinMode (OrangeLED, SALIDA); pinMode (LED rojo, SALIDA); digitalWrite (GreenLED, BAJO); digitalWrite (OrangeLED, BAJO); escritura digital (LED rojo, BAJO); Serial.println ("Configuración finalizada");} void loop () {Alarm.delay (0); // Este retraso debe usarse en lugar del retraso normal de Arduino (), // para el procesamiento oportuno de alarmas y temporizadores. Puede pasar 0 para un retraso mínimo. RF_Listen (); } 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); } // Asegúrese de que se envíe el último bit de datos. Serial.flush ();} void MySQL_UpdateDistance () {Proceso p; p.begin ("/ mnt / sda1 / MySQL_UpdateDistance.php"); p.addParameter (String (distancia)); p.run (); // Leer comentarios (para depurar) while (p.available ()> 0) {char c =p.read (); Serial.print (c); } // Asegúrese de que se envíe el último bit de datos. Serial.flush ();} void PrintCurrentTime () {DateTime ahora =rtc.now (); SetLEDsTrafficL (); Serial.print (ahora.hora (), DEC); Serial.print (':'); Serial.print (ahora.minuto (), DEC); Serial.print (':'); Serial.print (ahora.segundo (), DEC); Serial.print (""); Serial.println (ahora.unixtime ());} void SetLEDsTrafficL () {DateTime now =rtc.now (); s_till_orange =UnixTime_red_1 - ahora.unixtime (); if (i ==0) {digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, BAJO); escritura digital (LED rojo, ALTO); } if (i ==1 &&s_till_orange <=3) {digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, ALTA); escritura digital (LED rojo, BAJO); } if (i ==1 &&s_till_orange> 3) {digitalWrite (GreenLED, HIGH); digitalWrite (OrangeLED, BAJO); escritura digital (LED rojo, BAJO); }} 
MySQL_UpdateTrafficLData.php PHP
 #! / usr / bin / php-cli  connect_error) {trigger_error ('Error en la conexión de la base de datos:'. $ conn-> connect_error, E_USER_ERROR);} $ sql ="ACTUALIZAR 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_green_2; consulta ) ===false) {trigger_error ('SQL incorrecto:'. $ sql. 'Error:'. $ conn-> error, E_USER_ERROR);} else {echo "¡Datos insertados! \ n";}?> 
MySQL_UpdateDistance.php PHP
 #! / usr / bin / php-cli  connect_error) {trigger_error (' Error en la conexión de la base de datos:'. $ conn-> connect_error, E_USER_ERROR );} $ sql ="ACTUALIZAR TrafficL_data SET Distancia ='$ Distancia'DONDE id =1"; if ($ conn-> query ($ sql) ===false) {trigger_error (' SQL incorrecto:'. $ sql. 'Error:'. $ Conn-> error, E_USER_ERROR);} else {echo "¡Distancia insertada! \ N";}?> 
EchoJSON PHP
  
MainActivity.java Java
 paquete com.example.xxx.xxx; // cambiar 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 extiende AppCompatActivity {// Mostrará la cadena "datos "que contiene los resultados de TextView de resultados; // La vista de texto que tiene la velocidad recomendada TextView recSpeed; // URL del objeto a analizar String JsonURL ="YourURLhere"; // Esta cadena contendrá los resultados String data =""; // Definición de la cola de solicitudes de Volley que maneja la solicitud de URL al mismo tiempo RequestQueue requestQueue; // objeto de temporizador para actualizar los datos cada segundo // Temporizador de temporizador; // El límite de velocidad (cm / s) private final static double maxSpeed ​​=18; // La velocidad recomendada privada doble velocidad; // número de veces en la tabla public final static int NUMBER_OF_ENTRIES =2; // matriz con los tiempos cuando es verde largo [] unixTimesGreen =new long [NUMBER_OF_ENTRIES]; // matriz con los tiempos cuando es rojo largo [] unixTimesRed =new long [NUMBER_OF_ENTRIES]; // variable que mantiene la distancia privada doble distancia; // variables para repetir updateTable private final ScheduledExecutorService planificador =Executors.newSingleThreadScheduledExecutor (); // para probar:Private Future  timingTask; tic vacío público (milisegundos largos) {timingTask =planificador.scheduleAtFixedRate (new Runnable () {public void run () {updateTable ();}}, 0, milisegundos, TimeUnit.MILLISECONDS); } @Override protected void onCreate (Bundle SavedInstanceState) {super.onCreate (SavedInstanceState); setContentView (R.layout.activity_main); // TextViews para enviar resultados a results =(TextView) findViewById (R.id.jsonData); recSpeed ​​=(TextView) findViewById (R.id.recommendedSpeed); // inicializar tabla updateTable (); // actualiza la aplicación cada 100 milisegundos tick (500); // para trabajar con un objeto de temporizador para actualizar repetidamente / ** timer =new Timer ("Timer"); timer.schedule (new UpdateTable (), (largo) 100, (largo) 100); * /} // para trabajar con el objeto del temporizador para actualizar repetidamente / ** la clase privada UpdateTable extiende TimerTask {public void run () {updateTable (); }} * / private void updateTable () {// restablecer String data =""; // Crea la cola de solicitudes de Volley requestQueue =Volley.newRequestQueue (this); // para probar / ** // Transmite los resultados al TextView que se encuentra dentro del XML de diseño principal con id jsonData results =(TextView) findViewById (R.id.jsonData); * / // Creando la clase JsonArrayRequest llamada arrayreq, pasando los parámetros requeridos // JsonURL es la URL que se obtendrá de JsonArrayRequest arrayreq =new JsonArrayRequest (JsonURL, // El segundo parámetro Listener anula el método onResponse () y pasa // JSONArray como parámetro new Response.Listener  () {// Toma la respuesta de la solicitud JSON @Override public void onResponse (JSONArray response) {try {// Recupera el primer objeto JSON en la matriz externa JSONObject TrafficLObj =response.getJSONObject ( 0); // Recupera "trafficArry" del objeto JSON JSONArray trafficArry =TrafficLObj.getJSONArray ("TrafficLArray"); // Itera a través de la matriz JSON obteniendo objetos y agregándolos // a la vista de lista hasta que no haya más objetos en trafficArry for (int i =0; i  maxSpeed) velocidad =maxSpeed; else velocidad =distancia / ((unixTimesGreen [intervalo] -tiempo)); velocidad =velocidad * 5; }} 
AndroidManifest.xml XML
   // cambiar xxx xxx           
strings.xml XML
"NooitRood", que significa:"NeverRed"
   NooitRood   
activity_main.xml XML
  

Esquemas

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)

Proceso de manufactura

  1. Linterna de gas
  2. Puntero láser
  3. Caleidoscopio
  4. Señal de tráfico
  5. Diodo emisor de luz (LED)
  6. Desgarrando una luz LED basada en Zigbee
  7. Diseño del sistema de tiempo de vuelo:descripción general del sistema
  8. Semáforo inteligente
  9. La nueva IA controla automáticamente el sistema de luces altas del vehículo
  10. El libro electrónico del sistema de soldadura robótica arroja luz sobre las consideraciones de inversión
  11. Accesorios LED:accesorios para tiras de luces LED