Hello,
I created an Arduino code to represent the functioning of a semaphore, however I am also using the same code to (at the same time) send PWM signals to another device.
The code is working, but I could see that the trigger control of the semaphore colors is not flowing naturally as it should.
So I'd like to know what could be done to solve this problem.
NOTE: I have tried to change the value of the variables tempoVermelho
and tempoVerde
, but I still could not give fluidity to the semaphore.
// 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); }