Sistema de Informação de Semáforos
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
| ||||
| ||||
|
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:
php // Conecte ao banco de dados e crie a tabela $ servername ="localhost"; $ username ="yourUsername"; $ password ="yourPassword"; $ dbname ="yourDBName"; // Criar conexão $ conn =new mysqli ($ servername, $ username, $ password, $ dbname); // Verifique a conexão se ($ conn-> 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:
php // Conecte-se ao banco de dados e crie um novo registro conforme a solicitação $ servername ="localhost"; $ username ="yourUsername"; $ password ="yourPassword"; $ dbname ="yourDBName"; / / Criar conexão $ conn =new mysqli ($ servername, $ username, $ password, $ dbname); // Verifique a conexãoif ($ conn-> 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:
php // Conecta ao banco de dados $ servername ="localhost"; $ username ="yourUsername"; $ password ="suaSenha"; $ dbname ="yourDBName"; // Cria a conexão $ conn =new mysqli ($ servername, $ username, $ password, $ dbname); // Verifique a conexão if ($ conn-> 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 php $ UnixTime_green_1 =$ argv [1]; $ UnixTime_red_1 =$ argv [2]; $ UnixTime_green_2 =$ argv [3]; $ UnixTime_red_2 =$ argv [4]; $ DBServer ='yourServerName'; $ DBUser ='yourUserName'; $ DBPass ='yourPassword'; $ DBName ='yourUserName'; $ conn =new mysqli ($ DBServer, $ DBUser, $ DBPass, $ DBName); // verifique a conexãoif ($ conn-> 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 php $ Distance =$ argv [1]; $ DBServer ='yourServerName'; $ DBUser ='yourUserName'; $ DBPass ='yourPassword'; $ DBName =' yourDBName '; $ conn =new mysqli ($ DBServer, $ DBUser, $ DBPass, $ DBName); // verifique a conexãoif ($ conn-> 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
phpdefine ('HOST', 'yourServerName'); define ('USER', 'yourUserName'); define ('PASS', 'yourPassword'); define ('DB', 'yourUserName'); $ con =mysqli_connect (HOST, USER, PASS, DB); $ sql ="selecionar * de TrafficL_data"; $ res =mysqli_query ($ con, $ sql); while ($ row =mysqli_fetch_array ($ res, MYSQLI_BOTH)) {printf ('[{"TrafficLArray":[{"UnixTime_green_1":"% s", "UnixTime_red_1":"% s", "UnixTime_green_2":"% s "," UnixTime_red_2 ":"% s "," Distância ":"% s "}]}] ', $ row [' UnixTime_green_1 '], $ row [' UnixTime_red_1 '], $ row [' UnixTime_green_2 '], $ row ['UnixTime_red_2'], $ row ['Distance']);} mysqli_close ($ con); ?>
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
xml version ="1.0" encoding ="utf-8"?>// 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
- Lanterna a gás
- Ponteiro Laser
- Caleidoscópio
- Sinal de trânsito
- Diodo emissor de luz (LED)
- Rasgando uma luz LED baseada em Zigbee
- Projeto do sistema de tempo de vôo:Visão geral do sistema
- Semáforo inteligente
- Novo AI controla automaticamente o sistema de luz de alto feixe do veículo
- Acessórios de LED – Acessórios de faixa de luz de LED