0
Hello,
I created an Arduino code to represent the functioning of a semaphore, however I am also using same code to (at the same time) send PWM signals to another device.
The code is working, but I noticed that the control of the semaphore colors are not flowing naturally as it should.
So I would like to know what could be done to solve this problem.
OBS.: I tried to change the value of the variables tempoVermelhoand tempoVerde, but I still couldn’t get the traffic light flowing.
// Definição dos pinos de saída para os LEDs do semáforo
#define VERMELHO 10
#define AMARELO 9
#define VERDE 8
// Definindo um valor máximo para a repetição de cada procedimento no Loop
#define MAX_LOOP 40000
// Variavel responsável por realizar a contagem dos procedimentos realizados no Loop
int interacao = 0;
// Variáveis de controle do tempo gasto em cada cor do semáforo
int tempoVermelho = MAX_LOOP * 0.4;
int tempoVerde = MAX_LOOP * 0.8;
void setup() {
// Definição dos pinos dos LEDs como saídas digitais
pinMode(VERMELHO, OUTPUT);
pinMode(AMARELO, OUTPUT);
pinMode(VERDE, OUTPUT);
// Inicialização da comunicação serial
Serial.begin(9600);
// Chamando a função que altera o PWM
pwmSetup();
}
void loop() {
analogWrite(3, 34);
analogWrite(11, map(analogRead(A1), 0, 1023, 0, 255));
// Laço responsável por deixar o sinal fechado enquanto "interacao" for menor que a metade de "MAX_LOOP"
if(interacao >= 0 && interacao < (tempoVermelho)){
semaforoFecahdo();
}
// Laço responsável por deixar o sinal aberto enquanto "interacao" for menor que 75% de "MAX_LOOP"
else if(interacao >= (tempoVermelho) && interacao < (tempoVerde)){
semaforoAberto();
}
// Laço responsável por deixar o sinal fechado enquanto "interacao" for menor que "MAX_LOOP"
else if(interacao >= (tempoVerde) && interacao < MAX_LOOP){
semaforoAtencao();
}
// Incrementando o valor da variável "interacao"
interacao++;
// Condição responsável por zera a variável "interacao" quando a mesma atinge o valor da variável "MAX_LOOP"
if(interacao == MAX_LOOP){
interacao = 0;
}
}
// Método chamado no Setup para definir o PWM para 31khz de frequência
void pwmSetup() {
pinMode(3 , OUTPUT); //OCR2B 3 e 11 são pinos de PWM do Arduino
pinMode(11, OUTPUT); //OCR2A
// Alterando os registradores para que a frequencia do PWM seja de 31250hz
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS20);
OCR2A = 0;
OCR2B = 0;
}
// Métodos auxiliares para o controle de acionamento dos LEDs do semáforo
void semaforoFecahdo(){
digitalWrite(VERMELHO, HIGH);
digitalWrite(AMARELO, LOW);
digitalWrite(VERDE, LOW);
}
void semaforoAberto(){
digitalWrite(VERMELHO, LOW);
digitalWrite(AMARELO, LOW);
digitalWrite(VERDE, HIGH);
}
void semaforoAtencao(){
digitalWrite(VERMELHO, LOW);
digitalWrite(AMARELO, HIGH);
digitalWrite(VERDE, LOW);
}
it would be nice if you quote if ever made any attempt to solve the problem. This helps in community response.
– josivan