Gestión inteligente del tráfico con el Internet de las cosas (4 / 4 paso)

Paso 4: programación

El programa será un proyecto siempre en evolución. Si desea tener acceso a una versión actualizada, sugeriría bifurcar el código desde mi repositorio de GitHub en el siguiente enlace:

https://github.com/TheInventorMan/IntelligentTraff...

Sin embargo, he pegado el código de abajo para su conveniencia, aunque esto solo es para el dispositivo local que se mantendrá en el vehículo. Los archivos del servidor se encuentran en el repositorio.

Para aquellos de ustedes que estén interesados, aquí es un esquema básico del algoritmo que utiliza el sistema:

  1. GPS recibe la posición, velocidad, rumbo y tiempo
  2. Dispositivo solicita datos de servidor mediante el dongle 3G
  3. Servidor responde con una secuencia de datos, similar a la de una sentencia NMEA (pero bueno, es un protocolo fácil)
  4. Flujo de datos es analizado y dispuesto en una matriz de 2-D, que contiene la ubicación de las señales, horarios, desplazamientos, etc..
  5. Con esta información, el dispositivo determina que señal se acerca.
  6. La ventana de luz verde se determina y medidas contra la velocidad de la corriente
  7. Dispositivo le solicita conductor para acelerar, frenar o mantener la velocidad para coger la ventana verde de la señal.

En el futuro, esto podría ampliarse para incluir señales no programado (los con bobinas de inducción debajo de la carretera), así como un "buffer de seguridad" de aproximadamente 3 segundos cuando el vehículo va * apenas * hacerlo más allá de la señal. Esta manera, el conductor nunca funcionará cualquier luces amarillas (peligrosas); habrá tiempo de sobra.

mraa de importación;
importación matemáticas;

Inicialización del puerto

var GPS = mraa. UART(0); var 3G = mraa. USB(0); no funciona todavía, un controlador USB host puerto llevará a cabo en su lugar var incremento = mraa.gpio(2); mantener la var = mraa.gpio(3); disminuir var = mraa.gpio(4); GPS.setBaudRate(9600);

Constantes

var earthRadius = 6371000; radio de la tierra en metros var degToRad = 0.01745329251; Radianes por grado var radToDeg = 57.2957795131; Grados por radián

function getLocation() {//Uses la $GPGGA mensajes para determinar la actual situación var GPSLocation = [0,0,0,0]; while(1) {if(GPS.dataAvailable()) {var buffer = GPS.readStr(512); if (buffer.find("GPGGA")! = -1) {var rawNmea = buffer.substring(buffer.search("GPGGA"), buffer.search("\n")); var nmeaList = rawNmea.strip().split(","); var tiempo = nmeaList [1]; var latraw = nmeaList [2]; var latdir = nmeaList [3]; var lonraw = nmeaList [4]; var londir = nmeaList [5]; var lat = (latraw.substring(0,2)) + (latraw.substring(2)) 60; var lon = (lonraw.substring(0,3)) + (lonraw.substring(3,0)) 60; si (londir == "W") {lon = lon * -1;} si (latdir == "S") {lat = lat * -1; } var alt = nmeaList [9]; GPSLocation = [lat, lon, alt, tiempo]; volver GPSLocation; getVelocity() de función}}}} {//Uses $GPVTG los mensajes para determinar la velocidad y la dirección var GPSVel = [0,0]; while(1) {if(GPS.dataAvailable()) {var buffer = GPS.readStr(512); si (buffer.find("GPVTG")! = -1) {var nmeaData = buffer.substring(buffer.search("GPVTG"), buffer.search("\n")); var nmeaList = nmeaData.strip().split(","); var hdg = nmeaList [1]; var rawVel = nmeaList [7]; var vel = rawVel / 3,6; GPSVel = [hdg, vel]; volver GPSVel; } } } }

function getLights() {var luces = [7] [10]; //array de tiempos del semáforo, luces más cercanas 10, 7 parámetros. Lat, Lon, NTime, tiempo, TimeOffset, rumbo, distancia / / requestData(); if(3G.dataAvailable()) {var buffer = 3G.readStr(512); si (buffer.find("$$")! = -1) {lightData = buffer.substring(buffer.search("$$"), buffer.search("\n")); //light información especificación sigue esquema de GPS, con "$$" que denota el comienzo de una frase. lightList = nmeaData.strip().split(","); para (i = 0; i

función computeDistance (Latdeg1, Londeg1, Latdeg2, Londeg2) {var y+LAT1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad; var distancia = 2 * earthRadius * Math.asin(sqrt((Math.sin(Lat2-Lat1/2)) ^ 2 + (Math.cos(Lat1) * Math.cos(Lat2) * (Math.sin(Lon2-Lon1/2))^2))); //Use fórmula de haversine para calcular distancia}

función computeHeading (Latdeg1, Londeg1, Latdeg2, Londeg2) {var y+LAT1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad; var y = Math.sin(Lon2-Lon1) * Math.cos(Lat2); var x = Math.cos(Lat1)*Math.sin(Lat2) - Math.sin(Lat1)*Math.cos(Lat2)*Math.cos(Lon2-Lon1); var título = Math.atan2 (y, x).toDegrees(), partida vuelta;}

While(1) de secuencia principal {var temp [4]; var currLat; var currLon; var currHdg; var currSpd; var luces; var tiempo; var Dir; var currSignal; var t1, t2; temp = getLocation(); currLat = temp [0]; currLon = temp [1]; tiempo = temp [3]; temp = getVelocity(); currHdg = temp [0]; currSpd = temp [1]; Luces = getLights(); para (i = 0; i < Lights.length(); i ++) {var hdg = computeHeading (currLat, currLon, luces [0] [i], Lights[1][i]); if (hdg > 180) {luces [5] [i] = 180 - computeHeading (currLat, currLon, luces [0] [i], Lights[1][i]);} otro {luces [5] [i] = computeHeading (currLat, currLon, luces [0] [i], Lights[1][i]);} Luces [6] [i] = computeDistance (currLat, currLon, luces [0] [i], Lights[1][i]); Si (luces [6] [i] < Lights[6][currSignal]) {currSignal = i;}} Si (hdg < 45 || hdg > 315 || 135 < hdg < 225) {//north-south tráfico Dir = 0;} else {Dir = 1;} si (Dir == 0) {t1 = luces [4] [currSignal] + % del tiempo (luces [2] [currSignal] + Lights[3][currSignal]); puede que deba fijarse t2 = luces [4] [currSignal] + % del tiempo (luces [2] [currSignal] + Lights[3][currSignal]) + luces [2] [currSignal]; } else {t1 = luces [4] [currSignal] + % del tiempo (luces [2] [currSignal] + Lights[3][currSignal]); T2 = tiempo % luces [4] [currSignal] (luces [2] [currSignal] + Lights[3][currSignal]) + luces [3] [currSignal]; } Si (t1 > Lights[6][currSignal]) {\\increase velocidad increase.write(1); maintain.write(0); decrease.write(0);} else if (t1 == Lights[6][currSignal]) {\\maintain velocidad increase.write(0); maintain.write(1); decrease.write(0);} else {\\decrease velocidad increase.write(0); maintain.write(0); decrease.write(1);}

}

Artículos Relacionados

HackerBoxes 0006: Internet de las cosas (IoT) proyectos con el fotón partícula

HackerBoxes 0006: Internet de las cosas (IoT) proyectos con el fotón partícula

Hackear el Internet de las cosas! Este mes, suscriptores de HackerBoxes están trabajando con el aglomerado de IoT de fotón a dispositivos de control por Internet, sensor de recoger datos por Internet, almacenar datos en la nube y mucho más.Este Instr
Internet de las cosas con frambuesa Pi - 1

Internet de las cosas con frambuesa Pi - 1

Cuando yo era nuevo en IOT (Internet de las cosas), vi que había apenas cualquier tutoriales que fueron lo suficientemente simples como para un principiante comprender y probar. Había a mucha jerga técnica, o el hardware era demasiado complejo.Ahora
Control electrodomésticos con teléfono e Internet de las cosas menores de 6 años $

Control electrodomésticos con teléfono e Internet de las cosas menores de 6 años $

Siempre quise encender mi televisor mientras tendido en mi sofá, o después de un día cansador cuando termine de leer un libro, para apagar mi luz.Lo hice antes con un Hc-05 y remoto de la tv.Actualización: Esta entrada es aceptada para IOT desafío as
Internet de las cosas con frambuesa Pi-2

Internet de las cosas con frambuesa Pi-2

Se trata de un seguimiento a mi anterior instructivo Internet de las cosas con frambuesa Pi - 1.(Si no está familiarizado con los servidores web, PHP codificación y los conceptos básicos de Internet, se debe probablemente atraviesa parte 1 primera.)E
Mascarilla con miel y todas las cosas naturales.

Mascarilla con miel y todas las cosas naturales.

he utilizado miel, leche y aceite. Asegúrese de lavate la cara primero.  Tiene ningún maquillaje en! Permite que comience la diversión-ness. Lo siento sobre mi cara fea cuando estoy enfrente de una cámara me gusta hacer caras feas.  : pPaso 1: miel.
Experimento del gráfico de sensor con escudo Amarino y Amarino toolkit

Experimento del gráfico de sensor con escudo Amarino y Amarino toolkit

este experimento hace que el uso de Amarino escudo de buildcircuit.comSi nunca has trabajado con Amarino, recomiendo que visite la Página de Amarino y comprender los conceptos básicos de Amarino.En este experimento, se alimenta la señal del sensor de
Programación del puerto serie con NET

Programación del puerto serie con NET

Serial puertos proporcionan una manera fácil de comunicarse entre muchos tipos de hardware y su ordenador. Son relativamente fáciles de usar y son muy comunes entre periféricos y sobre todo DIY proyectos. Muchas plataformas como Arduino han construid
Cesta de lavadero del Pacífico Sur

Cesta de lavadero del Pacífico Sur

cómo hacer un carrito de lavandería propPaso 1: El primer paso para hacer un carro de lavandería del Pacífico Sur debe medir 4 piezas de 2 por 4 que son de 4 pies de largo, cuatro más que debe ser de 3 pies de altura y cuatro piezas más 2 pies de anc
Traje de piloto de peligro blanco de gitano de la costa del Pacífico

Traje de piloto de peligro blanco de gitano de la costa del Pacífico

Desde que vi la costa del Pacífico, quise crear mi juego de coche propio. Así que hice algunas búsquedas y lamentablemente no podía encontrar ningún patrón que podría utilizar. Así que fui sólo a mano alzada como uno de los usuarios en el sitio therp
Monitoreo de uso residencial del agua mediante la lectura de contador del agua municipal con sensor de efecto Hall + Arduino

Monitoreo de uso residencial del agua mediante la lectura de contador del agua municipal con sensor de efecto Hall + Arduino

si quieres controlar tu consumo de agua, como parte de un proyecto de monitoreo y DIY domótica inteligente, entonces este instructable puede ayudarle a lograr ese objetivo. La solución aquí es no invasiva, utiliza su medidor de agua municipal existen
Striker Eureka del Pacífico Jaeger traje

Striker Eureka del Pacífico Jaeger traje

bueno, es Halloween otra vez!El año pasado, mi horario de trabajo me hizo miss por la oportunidad de hacer ideas locas de mis hijos en trajes. Así que cuando mi horario parecía prometedor este año pedí los cuatro monstruos que querían ser.  Tres de e
Enojado «Escala de Jacob de» relámpago Prop del científico

Enojado «Escala de Jacob de» relámpago Prop del científico

has visto escaleras de Jacob en las películas de Frankenstein: ya sabes, el gizmo con las cosas de dos antena pegándose para arriba y un brillante arco de electricidad entre ellos, y haciendo que malvado sonido crepitante. Nada dice de "Científico lo
Estarcir gráficos con pintura eléctrico

Estarcir gráficos con pintura eléctrico

con nuestro nuevo Tablero táctil, puede activar touch en sonido prácticamente cualquier material, pero también puede hacer frescos gráficos interactivos también!  De una manera rápida de probar algo ¿por qué no hacer una plantilla? Este tutorial te m
LEGO del Pacífico Jaeger

LEGO del Pacífico Jaeger

hice un Jaeger de Lego basada en la nueva película de la costa del Pacífico. ¡ Combina muchos detalles sobre los jaegers y ponerlos en uno! Para empezar, mi jaeger tiene el pecho de peligro gitano con el reactor nuclear en frente pero también incorpo