o sensor, o sinal lá de fora tem que ir de verde, para amarelo e depois vermelho. O semáforo só volta a ficar verde quando houver uma saída no terceiro sensor.
A situação inicial deve ser com o semáforo verde.
Só lembrando que o semáforo fica na parte externa, depois da saída.
Por enquanto meu código é este:
int ledV = 1; // define led verde no pino 1int ledA = 2 ;int ledVM = 3 ;int ss1 = 4; // define sensor no pino 4int ss2 = 5;int ss3 = 6; int mSS1 = 0; // variavel para armazenar valor do ss1int mSS2 = 0; int mSS3 = 0;int mLedVM = 0; // guarda o valor 0 ou 1 (HIGH ou LOW)int x = 0;
void setup() { //Configura parâmetros
pinMode(ledV,OUTPUT); pinMode(ledA,OUTPUT); pinMode(ledVM,OUTPUT); pinMode(ss1,INPUT); pinMode(ss2,INPUT); pinMode(ss3,INPUT); }
void loop(){ //Programa principal mSS1 = digitalRead(ss1); // ler o valor enviado pelo primeiro sensor e salva na memória do sensor 1 mSS2 = digitalRead(ss2); // ler o valor enviado pelo primeiro sensor e salva na memória do sensor 2 mSS3 = digitalRead(ss3); // ler o valor enviado pelo primeiro sensor e salva na memória do sensor 2 if ((mSS1 == 0)&&(mLedVM == 0)){ digitalWrite(ledV, HIGH); // liga o led verde } else { if (mSS1 == 1) { mLedVM = 1; digitalWrite(ledV, LOW); // desliga o led verde digitalWrite(ledA, HIGH); // liga o led amarelo delay(1000); // delay em ms digitalWrite(ledA, LOW); // desliga led amarelo digitalWrite(ledVM, HIGH); // liga o led vermelho delay(2000); // delay em ms mSS3 = 1; } // Fim if }} } // Fim else } // Fim loop
Como proceder?…
Adicionado por MarcioSCunha ao 14:35 em 15 julho 2016
A solução seria mudar isso.
A ideia é fazer um loop unico, que atualize o semaforo e leia a tag (pode ser cada um em sua subfunção), mas nunca com delays() enormes.
Existem ao menos 3 caminhos simples, diga qual mais agrada:
1) use um contador e um delay pequeno. Acione o semaforo conforme o numero do contador.
Por ex, com delay de 100 = 0,1 s vc usa ifs para mudar o farol com 0, 300 (3s) e 400 (4segundos), depois disso zera novamente. Isso funciona, só não é ideal pq gera uma parada tb e gera uma forma imprecisa de contagem de tempo uma vez que o tempo fora do delay() não será computado.
2) use mills(). mills() é uma função que retorna o tempo decorrido desde que o programa começou a rodar. Com ele vc pode anotar o momento em que algo aconteceu (por ex quando vc mudou para verde) e usando a anotação desse momento pode saber quando deve mudar para vermelho.
Funciona super bem, eu (é pessoal) não gosto muito pq prefiro o metodo 3), mas veja mais sobre isso em:
https://labdegaragem.com/profiles/blogs/tutorial-sobre-timer-no-ard...
Tranquilamente esse (o do mills()) é o método mais amplamente usado.
3) use uma interrupção de tempo para gerar uma variável que incrementa a cada 0,1s de forma precisa (por exemplo) e usa esse numero no if() para trocar a cor do leds.
Como é um trabalho para apresentação (vai ser mais bem visto se for usado um método mais cientifico, imagino), sugiro o uso da opção 3.
Veja se dá pra encarar:https://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-...
…
Adicionado por Eduardo ao 21:46 em 6 setembro 2021
e open source é meio nebulosa, dai de uma hora pra outra se sua ideia se tornar algo gigante, pode vir um advogado a sua porta com alguma brecha pedir royalties, não é isso?
Bem, Deixa eu lhe dar meu ponto de vista, pois venho estudando muita coisa nessa área já a algum tempo. Pra começar você precisa ENTENDER O QUE É ARDUINO.
Pra quem tá começando ou um leigo, um arduino é a plaquinha do UNO, pois é o mais vendido e o que mais tem midia.
Já um usuário avançado pega um attiny85, que nem mesmo é da familia principal(atmega), sem o uso de bootloader arduino, logo, o que o caracterizaria como um NÃO ARDUINO, e utiliza apenas a IDE do arduino pra gravar instruções que o farão funcionar, a depender do projeto e da configuração dos fuses até sem cristal ou mais nada, só ele.
Ou seja um simples chip, sem nada, absolutamente nada.
Um exemplo pratico seria fazer funcionar um semaforo temporizado por exemplo, obvio que sem o apoio de um cristal ou RTC o clock será temerario, mas pra exemplo tá otimo
. Bem, pra fazer funcionar esse semaforo, bastaria a estrutura eletrônica, luzes, leds, resistores, capacitores, etc. e no meio da placa um simples chip attiny85. A duvida é? o Code foi compilado usando as facilidades da interface arduino, mas não existe placa arduino apenas um chip, então isso é um arduino ?
Deu pra entender? Arduino não é apenas a plaquinha do UNO, ou do Mega, ou seja lá o que for, para mim a melhor definição de arduino é: Uma filosofia de trabalho eletrônica que envolve software e hardware para facilitar a programação de microcontroladores AVR ATMEL.
Logo, você pode ter produtos inteiros onde apenas o microcontrolador atmel tá lá, e ai vai a questão, o code que tá dentro dele tá em binario, ou seja, linguagem de maquina, e a depender dos fuses que você set ninguem consegue retirar esse code de lá, logo, depois de gravado ninguem tem como saber se você programou ele em Arduino ou em Assembly, deu pra entender ?
Sendo assim, se seu medo é problemas juridicos futuros, passe longe das plaquinhas prontas arduino, mesmo da pro mini que é considerado o arduino de uso profissional, vá direto pra os standalones.
Quanto aos codes usados para programar acredite, depois de gravado, dificilmente alguem terá capacidade de saber se aquilo foi gravado com um code feito na unha em assembly ou de outra forma.
Talvez, eu disse talvez, a unica forma de uma identificação, é a verificação do bootloader arduino presente no code. Mas como a galera já disse aqui, dá pra gravar facilmente codes em chips atmel avr sem o bootloader arduino, e ai fica praticamente impossivel saber de onde veio aquele code.…
Adicionado por Weider Duarte ao 22:36 em 2 agosto 2016
a programação do semáforo seria com um tempo maior para o verde do pedestre sendo que a pessoa que estaria utilizando poderia ser um cadeirante por exemplo.
Sendo assim, não estou conseguindo inserir um looping na programação e também não sei como interromper com um timer pois não podemos parar a qualquer momento o fluxo semafórico.
No programa abaixo em qualquer lugar que eu coloco o semaforo() só lê uma vez e fica esperando o cartão ou dependendo da onde coloco nem lê:
#include <SPI.h>#include <MFRC522.h> #define SS_PIN 53#define RST_PIN 5#define vermelho_pedestre 2#define verde_pedestre 3 #define vermelho_carro 8#define amarelo_carro 9#define verde_carro 10
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
char st[20]; void setup() {
Serial.begin(9600); // Inicia a serial SPI.begin(); // Inicia SPI bus mfrc522.PCD_Init(); // Inicia MFRC522 Serial.println("Aproxime o seu cartao ou chaveiro"); Serial.println(); pinMode(vermelho_pedestre, OUTPUT); pinMode(verde_pedestre, OUTPUT);
pinMode(vermelho_carro,OUTPUT); pinMode(amarelo_carro,OUTPUT); pinMode(verde_carro,OUTPUT);
} void loop() {
// Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { //return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; }
String conteudo= ""; byte letra; for (byte i = 0; i < mfrc522.uid.size; i++) { //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); //Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Mensagem : ");
conteudo.toUpperCase();
if (conteudo.substring(1) == "7B 10 F0 21") //UID 1 - Cartão { Serial.println("Pessoa com mobilidade Reduzida !"); Serial.println(); digitalWrite(verde_pedestre,HIGH); delay(500); digitalWrite(verde_pedestre,LOW); } if (conteudo.substring(1) == "97 A1 7D 34") //UID 2 - Chaveiro { Serial.println("Pessoa com mobilidade Reduzida !"); Serial.println(); digitalWrite(verde_pedestre,HIGH); delay(500); digitalWrite(verde_pedestre,LOW); } }
void semaforo(){//Loop programação padrão
digitalWrite(verde_carro,HIGH);digitalWrite(verde_pedestre,LOW);delay(5000);
digitalWrite(verde_carro,LOW);digitalWrite(amarelo_carro,HIGH);delay(2000);digitalWrite(amarelo_carro,LOW);digitalWrite(vermelho_carro,HIGH);digitalWrite(verde_pedestre,HIGH);digitalWrite(vermelho_pedestre,LOW);delay(3000);digitalWrite(verde_pedestre,LOW);//Alerta para o pedestre!for(int j=0; j<=3; j++){
digitalWrite(vermelho_pedestre,LOW);delay(500);digitalWrite(vermelho_pedestre,HIGH);delay(500);}digitalWrite(vermelho_carro,LOW);}
…
sar transistor depois terei que fazer placa de circuito e vai dar um trabalhão.. rsrs
Meu problema agora está na lógica de programação.
Tenho 9 conjuntos de desvios na maquete, sendo que cada um deles tenho 3 semáforos (um de 3 leds e dois de 2 leds).
Para comandar a maquete terei as seguintes chaves:
- Botão de bloqueio (tipo um botão de emergência que colocará todos os semáforos em vermelho)
- Chave de direção (indica o sentido que o trem anda, direita ou esquerda)
- Uma chave para cada desvio, sendo 9 no total (estas chaves fazem a mudança física do trilho, acionando um servo)
Preciso programar o arduino para que ao acionar a chave do desvio ele verifique a posição da chave de direção e ligue os semaforos numa sequência exata de cores.
Estou tendo problemas agora em verificar simultaneamente a posição de duas chaves (Desvio e direção).
Ex:
Se chave do desvio na posição 1 E
Chave de direção na posição 0
Ligar os leds "x y z"
Não sei se é melhor usar IF ou Switch Case...
O que acha??
Abs!…
mente indicado no chão em relevo), um audio irá se reproduzir avisando se o pedestre pode ou não atravessar. Então quando ele puder atravessar, depois de ser avisado, uma luz azul irá se acender para indicar que pode ter alguém com dificuldade para atravessar a rua, e o tempo do semáforo aumenta, além de um buzzer para guiar a travessia de possíveis outros pedestres indicando que a passagem já está liberada. Ou seja, o botão não faz o semáforo dos motoristas se fechar imediatamente, só reproduz um audio e aguarda o momento do pedestre atravessar para reproduzir um outro áudio.
quanto a questão do audio eu usei o modulo WTV-020, testei separadamente e funcionou.
Mas a dificuldade por enquanto está sendo no acionamento dos botoes. Já que a função "delay" é que controla o tempo que cada led está aceso, eu aciono o botão e não acontece nada. Tentei a função "milis()" mas eu me perdi total para fazer a alternância dos 3 leds e ainda o azul junto com o vermelho quando o botão for acionado( apenas quando a passagem for liberada).
Será que alguem poderia me ajudar nessa?
EDIT:
~~~~~~~~ GALERA:::: FUNCIONOU....
Agradecimentos ao Rui "mineirim RV" - Rui.
segue Sketch completo.…
as
-------
caso queira um pequeno projeto para iniciantes segue abaixo
uma sugestão que iniciantes como eu, normalmente nos aventuramos . . .
e pode fazer alterações de acordo com o seu uso e necessidades . . .
--------
Semáforo
material
3 leds de cores diferentes
3 resistores 220 Ohms
1 protoboard
1 Arduino
--------
código do programa
Semáforo no Arduino com aproveitamento do código do Blink exemplo que acompanha a IDE de desenvolvimento. -->
//--------------------------------código--------------------------------- /* Blink semaforo IDE comp.ver-104*/ //objetos e portas int verde = 13; int amarelo = 12; int vermelho = 11; // void setup() { // inicializa os pinos digitais para saida pinMode(verde, OUTPUT); pinMode(amarelo, OUTPUT); pinMode(vermelho, OUTPUT); } // de cima para baixo . . . void loop() { //Acenda 3 segundos. digitalWrite(verde, HIGH); delay(3000); digitalWrite(verde, LOW); delay(300); // Acende 2 segundos. digitalWrite(amarelo, HIGH); delay(2000); digitalWrite(amarelo, LOW); delay(200); // Acende 1 segundo. digitalWrite(vermelho, HIGH); delay(1000); digitalWrite(vermelho, LOW); delay(100); }
// ----------------------------------------------------------…
O projeto se trata de um semáforo para um cruzamento que fica se repetindo, ai somente quando é apertado um botão o semáforo ira fechar para os carros e abrir para os pedestres.
Eu consegui desenvolver os códigos em parte, porém, o botão tem que ficar sendo pressionado para que funcione, e ele não o lê em qualquer momento do ciclo de repetição do semáforo para carros. Segue abaixo o meu código atual.
#define LED_VD 2#define LED_AM 3#define LED_VM 4#define PED_VD 5#define PED_VM 6#define botao 7int estadoBotao = 0;
void setup() {
pinMode(LED_VM, OUTPUT); pinMode(LED_AM, OUTPUT); pinMode(LED_VD, OUTPUT); pinMode(PED_VD, OUTPUT); pinMode(PED_VM, OUTPUT); pinMode(botao, INPUT);
}void loop() { estadoBotao = digitalRead(botao); if (estadoBotao == HIGH) { digitalWrite(PED_VM, LOW); digitalWrite(PED_VD, HIGH); digitalWrite(LED_VM, HIGH); delay(5000); } else { estadoBotao = digitalRead(botao); digitalWrite(PED_VD, LOW); digitalWrite(LED_VM, LOW); digitalWrite(PED_VM, HIGH); digitalWrite(LED_VD, HIGH); delay(5000); digitalWrite(LED_VD, LOW); digitalWrite(LED_AM, HIGH); delay(5000); digitalWrite(LED_AM, LOW); digitalWrite(LED_VM, HIGH); delay(5000); digitalWrite(LED_VM, LOW);
}}
…
Adicionado por Alex Sandro ao 15:29 em 27 junho 2016
adicionando algumas, o diferencial desse semáforo são os sinalizadores azuis para deficientes 1 em cada semáforo de veiculo.
A ideia eu peguei de um tópico daqui:
http://labdegaragem.com/forum/topics/sem-foro-inteligente-arduino?commentId=6223006%3AComment%3A640676
aos trancos e barrancos consegui fazer do meu modo ( sou iniciante no arduino ou programação em geral)
O problema foi quando tentei adicionar um sensor( na verdade um botão que simula um sensor) que fará a contagem de veículos em cada sinal e adicionará maior tempo ao sinal verde da rua com maior fluxo ( nada complicado, só a contagem, a que tiver mais que 9 veiculos e maior quantidade que a rua oposta recebe mais tempo no sinal verde)
Por nada consigo fazer isso, tentei diversas formas...
Eu tentei não usar o comando "delay" nos ciclos do semáforo, mas admito que não entendi muito bem a lógica usando o "millis" e intervalo ( a pesar de eu ter usado um pouco)
enfim se alguém puder me ajudar, agradeço
meu sketch:
pastebin
OBS: não cheguei a adicionar o Sensor 2, porque não consegui fazer o primeiro funcionar
OBS²: Estou utilizando o Arduino Mega 2560…
eletrônica à um bom tempo nunca mexi com programação anteriormente.
O escopo do projeto é o seguinte, são duas vias de mão unica onde tem a travessia de pedestres.
Quando um pedestre pressionar a botoeira e enviar um sinal de nível alto em um pino que ja foi definido como INPUT, ele deve executar um grupo de instruções onde os semáforos das vias fecham e abre para os pedestres.
Estou usando a função "if" para este grupo de instruções, mas ele ignora o "if" e executa o grupo dentro do loop. alguem poderia me ajudar neste caso?
PS.: estou usando o proteus para simulação.
Segue código
/* SafeWalk versão 2.0 Sistema de controle de trafego que visa maior segurança de travessia para pedestres. */// Luzes Semaforos viasint red_1 = 2;int yel_1 = 3;int gre_1 = 4;
int red_2 = 7;int yel_2 = 6; int gre_2 = 5;
//Luzes semaforo pedestresint redp_1 = 8;int grep_1 = 9;
// Botoeirasint but_1 = 10;int BOT = digitalRead(but_1);
void setup() { pinMode(red_1, OUTPUT); pinMode(yel_1, OUTPUT); pinMode(gre_1, OUTPUT); pinMode(red_2, OUTPUT); pinMode(yel_2, OUTPUT); pinMode(gre_2, OUTPUT); pinMode(redp_1, OUTPUT); pinMode(grep_1, OUTPUT); pinMode(but_1, INPUT); }
void loop () { if (BOT, HIGH); { digitalWrite(red_1, HIGH); digitalWrite(red_2, HIGH); digitalWrite(yel_1, LOW); digitalWrite(yel_2, LOW); digitalWrite(gre_1, LOW); digitalWrite(gre_2, LOW); delay(500); digitalWrite(redp_1, LOW); digitalWrite(grep_1, HIGH); delay(2000); digitalWrite(redp_1, HIGH); digitalWrite(grep_1, LOW); delay(2000); } { //semaforização
digitalWrite(red_2, HIGH); digitalWrite(yel_1, LOW); digitalWrite(red_1, HIGH); delay(1500); digitalWrite(red_2, LOW); digitalWrite(gre_2, HIGH); delay(5000); digitalWrite(gre_2, LOW); digitalWrite(yel_2, HIGH); delay(1000); digitalWrite(yel_2, LOW); digitalWrite(red_2, HIGH); delay(1000); digitalWrite(red_1, LOW); digitalWrite(gre_1, HIGH); delay(5000); digitalWrite(gre_1, LOW); digitalWrite(yel_1, HIGH); delay(1000); } }
…