Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Sistema de Informação de Semáforos

Componentes e suprimentos

Arduino Yun
× 1
Arduino UNO
ou qualquer outra placa Arduino
× 1
Sensor ultrassônico - HC-SR04 (genérico)
× 1
DS3231 RTC
Relógio em tempo real
× 1
LED (genérico)
1 x LED vermelho, 1 x LED amarelo, 1 x LED verde
× 3
Resistor 330 ohm
× 3
Módulos de 433 MHz
1 x transmissor, 1 x receptor
× 1
Dispositivo Android
× 1
Cartão SD
× 1
AllThingsTalk IOTOPIA Rapid Development kit
× 1
Fios de jumpers (genérico)
× 1

Aplicativos e serviços online

Arduino IDE
Android Studio
Serviço de hospedagem de banco de dados MySQL

Sobre este projeto





Introdução


O tráfego tem a capacidade de irritar o melhor de nós e está piorando. E se isso puder ser mudado com semáforos inteligentes? Criamos um Sistema de Informações sobre Semáforos que permite ao motorista saber em que velocidade ele deve dirigir para chegar no cruzamento e ultrapassar o semáforo verde sem ultrapassar o limite máximo de velocidade. E quando o motorista tem que esperar pelo inevitável semáforo vermelho, ele avisa quando o semáforo está prestes a ficar verde.

Um semáforo envia dados sobre quanto tempo permanecerá verde ou o tempo até o próximo semáforo verde, etc. para um banco de dados online. Um GPS ou um aplicativo em seu smartphone irá recuperar os dados do banco de dados e calcular a velocidade desejada para passar o sinal verde. Ele exibirá o tempo de espera restante até o final da fase de luz vermelha, quando é inevitável que você terá que esperar.





Exemplo


Você está dirigindo em uma zona de 70 km / h, mantendo o limite. O semáforo à sua frente está vermelho e está prestes a ficar verde em 30 segundos. Você está a 500 metros do semáforo, então o sistema recomendará que você siga em direção ao semáforo a 60 km / h.





Demonstração do projeto





Como o fizemos?


Para demonstrar nosso projeto, criamos um semáforo com o Arduino Yun. O semáforo consiste em 3 LEDs e um relógio de tempo real. As luzes mudarão em um determinado intervalo. O Arduino Yun economiza tempo em que o semáforo ficará verde / vermelho. Em seguida, ele executa um arquivo PHP que faz uma conexão com o banco de dados MySQL online e insere os dados recebidos do Arduino Yun. Um aplicativo Android (criado com o Android Studio) recuperará a data desse banco de dados. Isso é feito por meio de outro arquivo PHP que retorna os dados do semáforo no formato JSON. O aplicativo calcula a velocidade desejada e exibe uma contagem regressiva quando você não consegue passar o sinal verde.

Para calcular a velocidade desejada, o aplicativo precisa saber a distância até o semáforo. Isso é feito calculando a distância de acordo com as coordenadas do GPS. Mas, infelizmente, um GPS em um smartphone não é preciso o suficiente para provar nosso conceito porque estamos trabalhando em pequena escala. É por isso que utilizamos o módulo de alcance ultrassônico (HC-SR04). O Arduino Yun recebe a distância entre o carro e o semáforo por meio de módulos RF de 433 MHz. Cada vez que o Yun recebe uma nova medição do outro Arduino, ele atualiza os dados no banco de dados. Agora, o aplicativo consegue calcular a velocidade desejada.





Instruções


1) Crie um banco de dados MySQL online

(Usamos freemysqlhosting.net)

2) Adicione uma tabela 'TrafficL_data' ao banco de dados:

3) Configure o hardware (transmissor)

Você pode encontrar o esquema 'transmissor Arduino' aqui.

4) Faça upload do 'Código do transmissor Arduino' para o Arduino

Você pode encontrar o código aqui.

5) Conecte o Arduino Yun à sua rede WiFi

6) Acesse o servidor Linux do Arduino YUN com Putty:
  opkg update opkg install php5-mod-mysqli opkg install php5-cli nano /mnt/sda1/MySQL_UpdateTrafficLData.php  

Você pode encontrar 'MySQL_UpdateTrafficLData.php' aqui.

Se você vir este erro:'-ash:nano:não encontrado', você deve instalar o 'nano' (este é um 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  

Você pode encontrar 'MySQL_UpdateDistance.php' aqui.
  chmod 755 /mnt/sda1/MySQL_UpdateDistance.php/mnt/sda1/MySQL_UpdateDistance.php  

7) Configure o hardware (receptor Arduino Yun)

Você pode encontrar o esquema 'receptor Arduino Yun' aqui.

8) Faça upload de 'Arduino Receiver e MySQLdb' para o Arduino Yun

Você pode encontrar o código aqui.

9) Abra o monitor serial

Você deve ver algo semelhante:



11) Arquivos do Android Studio
  • activity_main.xml
  • MainActivity.java *
  • AndroidManifest.xml
  • strings.xml

* não se esqueça de mudar o URL

Você pode encontrar 'EchoJSON.php' aqui.

12) Faça upload do projeto Android Studio em seu smartphone





Instruções para ESP8266 [adicional]


É possível usar um módulo baseado em ESP8266 em vez do mais caro Arduino Yun:

1. Crie uma conta em https://www.000webhost.com

2. Crie um site

3. Crie um novo banco de dados

4. Faça upload de ‘CreateTable.php’ e ‘PostDemo.php’ com o gerenciador de arquivos. Altere ‘nome de usuário’, ‘senha’ e ‘dbname’ em ambos os arquivos.



CreateTable.php:
   connect_error) {die ("Connection failed:". $ conn-> connect_error);} // trafficl_data_v2 é o nome da tabela $ 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) NÃO NULO, id INT (6) CHAVE PRIMÁRIA AUTO_INCREMENT NÃO ASSINADA) "; if ($ conn-> query ($ sql) ===TRUE) {echo" Tabela criada com sucesso! ";} Else {echo" Erro ao criar tabela:" . $ conn-> erro;} $ conn-> close ();?>  

PostDemo.php:
   connect_error) {die ("Falha na conexão do banco de dados:". $ 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 'WHERE 1 "; if ($ conn-> query ($ sql) ===TRUE) {echo "Dados inseridos com sucesso!"; } else {echo "Erro:". $ sql. "
". $ conn-> erro; }} else {echo "FALHOU:parâmetros incorretos";} $ conn-> close ();?>

5. Crie uma nova tabela:Selecione 'CreateTable.php' e clique em 'visualizar'

6. Instale os pacotes para o ESP8266 no arduino

Adicionar este arquivo de URL -> Preferências:

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





7

[ATUALIZAÇÃO em 9 de fevereiro de 2019]

Selecione sua placa, porta COM ... e carregue ESP8266PostDemo.ino para sua placa baseada em ESP8266. Estou usando um NodeMcu V3 ESP8266 12E. O código abaixo deve funcionar para quase todas as placas baseadas em ESP8266.

Como não tenho mais um relógio disponível, mudei o código para que o banco de dados seja atualizado a cada 10 segundos com valores aleatórios.

ESP8266PostDemo.ino:
  #include  #include  #include  #include  #define ARRAYSIZE 4 // 4 argumentsconst char * ssid ="yourSSID"; const char * password ="suaSenha"; const char * dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // sua solicitação 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 () {atraso (1000); Serial.begin (115200); WiFi.mode (WIFI_OFF); // Impede o problema de reconexão (demorando muito para conectar) delay (1000); WiFi.mode (WIFI_STA); // Esta linha oculta a visualização do ESP como ponto de acesso wi-fi WiFi.begin (ssid, senha); Serial.println (""); Serial.print ("Conectando"); enquanto (WiFi.status ()! =WL_CONNECTED) {atraso (500); Serial.print ("."); } Serial.println (""); Serial.print ("Conectado a"); Serial.println (ssid); Serial.print ("endereço IP:"); Serial.println (WiFi.localIP ()); } void loop () {HTTPClient http; Parâmetro String =""; parâmetro + =argumentos_nomes [0] + equals_sign + (int) aleatório (100); para (int i =1; i  

arquivo php:
   connect_error) {die ("Falha na conexão do banco de dados:". $ 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' '; if ($ conn-> query ($ sql) ===TRUE) {echo "OK"; } else {echo "Erro:". $ sql. "
". $ conn-> erro; }}?>

Se você conseguiu atualizar o banco de dados, pode modificar os seguintes procedimentos no código do arduino de 'Arduino Receiver &MySQLdb':
  • void MySQL_UpdateTrafficLData ()
  • void MySQL_UpdateDistance ()

Observe que se você deseja replicar o projeto, não é uma boa ideia implementar tudo de uma vez. Primeiro tente testar cada componente separadamente. Se todos funcionarem bem, você pode começar combinando os diferentes componentes. Sinta-se à vontade para pedir ajuda na seção de comentários e tente descrever seu problema da forma mais detalhada possível.

Código

  • Código do transmissor Arduino
  • Arduino Receiver &MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • EchoJSON
  • MainActivity.java
  • AndroidManifest.xml
  • strings.xml
  • activity_main.xml
Código do transmissor Arduino Arduino
 / * IOTOPIA - 2016-2017 - Traffic Light Information System (Transmitter) * por Pieter Luyten &Joppe Smeets * * Enviar distância para outro arduino via módulos RF 433MHz * * Módulo RF 433MHz:* tx_pin -> pino 3 * * Módulo HC-SR04:* trig_pin -> pino 5 * echo_pin -> pino 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 o módulo HC-SR04HCSR04 ultrasonic (trig_pin, echo_pin); distância interna; CharMsg char [21]; configuração void () {Serial.begin (9600); vw_setup (2000); // Bits por segundo vw_set_tx_pin (tx_pin);} void loop () {distance =ultrasonic.Ranging (CM); // Meça a distância em cm while (distance <0) {// Evite leituras falsas, meça a distância novamente distance =ultrasonic.Ranging (CM); } sprintf (CharMsg, "% d,", distância); vw_send ((uint8_t *) CharMsg, strlen (CharMsg)); // Envia a distância vw_wait_tx (); // Espere até que toda a mensagem desapareça Serial.print ("Distance (cm):"); Serial.println (distância); atraso (250);} 
Receptor Arduino e MySQLdb Arduino
 / * IOTOPIA - 2016-2017 - Traffic Light Information System (Receiver + Upload to MySQLdb) * por Pieter Luyten &Joppe Smeets * * Receba distância de outro Arduino via RF * Upload de dados de semáforo e distância para banco de dados MySQL * * Módulo RF 433 MHz:* rx_pin -> pino 3 * * TrafficLight (3 LEDs):* RedLED -> pino 5 * OrangeLED -> pino 6 * GreenLED -> pino 7 * * DS3231 (Real-Time-Clock) :* SCL -> SCL (pino 3 no Arduino Yun) * SDA -> SDA (pino 2 no Arduino Yun) * * Cartão SD - Arduino Yun * Cartão SD (com arquivo PHP) -> slot SD integrado * / # define RedLED 5 # define OrangeLED 6 # define GreenLED 7 # define rx_pin 9 # include  // Módulos RF 433 MHz # include  // Alarms # include  // I2C comunicação # include "RTClib.h" // Real Time Clock # include  // Executar processos Linux no AR9331 // UnixTime:Tempo, definido como o número de segundos decorridos desde 1º de janeiro de 1970, UnixTime_green_1; // Próxima luz verde (em UnixTime) long UnixTime_red_1; // Próxima luz vermelha (em UnixTime) long UnixTime_green_2; // Próximo, mas uma luz verde (em UnixTime) long UnixTime_red_2; // Próximo, exceto uma luz vermelha (em UnixTime) long s_till_orange; // Segundos até orangeRTC_DS3231 rtc; char StringReceived [22]; boolean i; int interval =5; // em segundosint distância; // em cmvoid setup () {rtc.begin (); //rtc.adjust(DateTime(F(__DATE__), F (__ TIME__))); Serial.begin (9600); Bridge.begin (); // Inicializar a ponte vw_setup (2000); // Bits por segundo vw_set_rx_pin (rx_pin); vw_rx_start (); Alarm.timerRepeat (intervalo, UpdateTrafficLData); // Atualizar os dados do semáforo (próximo semáforo verde / vermelho ...) Alarm.timerRepeat (1, PrintCurrentTime); // Imprime a hora atual a cada x segundos pinMode (GreenLED, OUTPUT); pinMode (OrangeLED, OUTPUT); pinMode (RedLED, OUTPUT); digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, LOW); digitalWrite (RedLED, LOW); Serial.println ("Instalação concluída");} void loop () {Alarm.delay (0); // Este atraso deve ser usado em vez do atraso normal do Arduino (), // para o processamento oportuno de alarmes e temporizadores. Você pode passar 0 para um atraso 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; para (a =0; a  0) {char c =p.read (); Serial.print (c); } // Certifique-se de que o último bit de dados seja enviado. Serial.flush ();} void MySQL_UpdateDistance () {Processo p; p.begin ("/ mnt / sda1 / MySQL_UpdateDistance.php"); p.addParameter (String (distância)); p.run (); // Lê o feedback (para depuração) while (p.available ()> 0) {char c =p.read (); Serial.print (c); } // Certifique-se de que o último bit de dados seja enviado. 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 (RedLED, HIGH); } if (i ==1 &&s_till_orange <=3) {digitalWrite (GreenLED, LOW); digitalWrite (OrangeLED, HIGH); digitalWrite (RedLED, LOW); } if (i ==1 &&s_till_orange> 3) {digitalWrite (GreenLED, HIGH); digitalWrite (OrangeLED, LOW); digitalWrite (RedLED, LOW); }} 
MySQL_UpdateTrafficLData.php PHP
 #! / usr / bin / php-cli  connect_error) {trigger_error ('Falha na conexão do banco de dados:'. $ 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 ='$ 1 UnixTime_red_2'; ) ===false) {trigger_error ('SQL errado:'. $ sql. 'Erro:'. $ conn-> erro, E_USER_ERROR);} else {echo "Dados inseridos! \ n";}?> 
MySQL_UpdateDistance.php PHP
 #! / usr / bin / php-cli  connect_error) {trigger_error (' Falha na conexão do banco de dados:'. $ conn-> connect_error, E_USER_ERROR );} $ sql ="ATUALIZAR TrafficL_data SET Distance ='$ Distance'WHERE id =1"; if ($ conn-> query ($ sql) ===false) {trigger_error (' SQL errado:'. $ sql. 'Erro:'. $ Conn-> erro, E_USER_ERROR);} else {echo "Distância inserida! \ N";}?> 
EchoJSON PHP
  
MainActivity.java Java
 package com.example.xxx.xxx; // alterar 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; classe pública MainActivity estende AppCompatActivity {// Mostra os dados da string " "que contém os resultados TextView results; // O textview que mantém a velocidade recomendada TextView recSpeed; // URL do objeto a ser analisado String JsonURL ="YourURLhere"; // Esta string conterá os resultados String data =""; // Definindo a fila de solicitações do Volley que lida com a solicitação de URL simultaneamente RequestQueue requestQueue; // objeto timer para atualizar os dados a cada segundo // Timer timer; // O speedLimit (cm / s) private final static double maxSpeed ​​=18; // A velocidade recomendada private double speed; // número de vezes na tabela public final static int NUMBER_OF_ENTRIES =2; // array com os tempos em que é verde long [] unixTimesGreen =new long [NUMBER_OF_ENTRIES]; // array com os tempos em que é vermelho long [] unixTimesRed =new long [NUMBER_OF_ENTRIES]; // variável que mantém a distância private double distance; // variáveis ​​para repetir updateTable private final ScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor (); // para teste:private Future  timingTask; public void tick (long milissegundos) {timingTask =scheduler.scheduleAtFixedRate (new Runnable () {public void run () {updateTable ();}}, 0, milissegundos, TimeUnit.MILLISECONDS); } @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // textViews para converter resultados em resultados =(TextView) findViewById (R.id.jsonData); recSpeed ​​=(TextView) findViewById (R.id.recommendedSpeed); // inicializa a tabela updateTable (); // atualiza o aplicativo a cada 100 milissegundos tick (500); // para trabalhar com um objeto timer para atualizar repetidamente / ** timer =new Timer ("Timer"); timer.schedule (novo UpdateTable (), (longo) 100, (longo) 100); * /} // para trabalhar com o objeto timer para atualizar repetidamente / ** classe privada UpdateTable estende TimerTask {public void run () {updateTable (); }} * / private void updateTable () {// reset String data =""; // Cria a fila de solicitação do Volley requestQueue =Volley.newRequestQueue (this); // para teste / ** // Converte os resultados no TextView encontrado no XML do layout principal com id jsonData results =(TextView) findViewById (R.id.jsonData); * / // Criando a classe JsonArrayRequest chamada arrayreq, passando os parâmetros necessários // JsonURL é a URL a ser buscada em JsonArrayRequest arrayreq =new JsonArrayRequest (JsonURL, // O segundo parâmetro Listener substitui o método onResponse () e passa // JSONArray como um parâmetro new Response.Listener  () {// Obtém a resposta da solicitação JSON @Override public void onResponse (resposta JSONArray) {try {// Recupera o primeiro objeto JSON na matriz externa JSONObject TrafficLObj =response.getJSONObject ( 0); // Recupera "trafficArry" do objeto JSON JSONArray trafficArry =TrafficLObj.getJSONArray ("TrafficLArray"); // Itera por meio do array JSON obtendo objetos e adicionando-os // à visualização de lista até que não haja mais objetos em trafficArry for (int i =0; i  maxSpeed) speed =maxSpeed; senão velocidade =distância / ((unixTimesGreen [intervalo] -tempo)); velocidade =velocidade * 5; }} 
AndroidManifest.xml XML
   // alterar 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)

Processo de manufatura

  1. Lanterna a gás
  2. Ponteiro Laser
  3. Caleidoscópio
  4. Sinal de trânsito
  5. Diodo emissor de luz (LED)
  6. Rasgando uma luz LED baseada em Zigbee
  7. Projeto do sistema de tempo de vôo:Visão geral do sistema
  8. Semáforo inteligente
  9. Novo AI controla automaticamente o sistema de luz de alto feixe do veículo
  10. Acessórios de LED – Acessórios de faixa de luz de LED