Pessoal como eu faço para todo o código abaixo funcionar no único arduino.

Exibições: 1238

Responder esta

Respostas a este tópico

O problema são os delays, este comando para toda a execução do código durante o tempo definido. No meu casa uso millis(), Exp:

Para definir a variável: unsigned long Tempo_inicial = millis();

Depois coloca dentro de um laço como este:

  while ((Tempo_presente – Tempo_inicial) > 20000)

Talvez alguém aqui do fórum com mais experiente possa ajustar o seu código.

Tenho duvida se dar para usar millis() em todos os delays

Defina "Funcionar" para o seu problema.

Qual o comportamento esperado e qual algoritmo você está usando nesse código?

Acho que o problema esta no delay ele pausa o sistema e não tem como fazer servo motor funcionar encostando imã no reed switch

Use if com millis, faz o código checando se é tempo de mudar o sinal (led), muda ou não o estado do led, e segue o executando o restante do código, completando o ciclo. 

Já tentei usar if mas não sei porque não funciona poderia me ajudar com o código por favor?

O desafio é fazer o semáforo funcionar sem uso de delays, se eu conseguir algum progresso, posto aqui! 

Tente com este código, não esqueça de mudar os pinos.

// Projeto 2 – Semáforo
int Ledcarroverde = 8; // Declaramos uma variável inteira com valor igual a 10 (conectada no pino 10 do Arduino)
int Ledcarroamarelo = 6; // Declaramos uma variável inteira com valor igual a 9 (conectada no pino 9 do Arduino)
int Ledcarrovermelho = 2; // Declaramos uma variável inteira com valor igual a 8(conectada no pino 8 do Arduino)
int Ledpedestreverde = 7;
int Ledpedestrevermelho = 9;
unsigned long tempo_inicial;
unsigned long tempo_presente;
boolean fase1;
boolean fase2;
boolean fase3;
boolean fase4;
void setup() {
pinMode(Ledcarrovermelho, OUTPUT); // Define vermelhoPin como pino de saída
pinMode(Ledcarroamarelo, OUTPUT); // Define amareloPin como pino de saída
pinMode(Ledcarroverde, OUTPUT); // Define verdePin como pino de saída
pinMode(Ledpedestreverde, OUTPUT);
pinMode(Ledpedestrevermelho, OUTPUT);
tempo_inicial = millis();
Serial.begin(9600);
//digitalWrite(Ledcarroverde, LOW);
//digitalWrite(Ledcarroamarelo, LOW);
//digitalWrite(Ledcarrovermelho, LOW);
fase1 = false;
fase2 = false;
fase3 = false;
fase4 = false;
}

void loop() {
tempo_presente = millis();
if (tempo_presente - tempo_inicial == 0 and fase1 == false){
digitalWrite(Ledcarroverde, HIGH);
digitalWrite(Ledcarrovermelho, LOW);
digitalWrite(Ledcarroamarelo, LOW);
digitalWrite(Ledpedestrevermelho, HIGH);
digitalWrite(Ledpedestreverde, LOW);
fase1 = true;
Serial.println("if 1");
}
if (tempo_presente - tempo_inicial == 10000 and fase2 == false){
digitalWrite(Ledcarroverde, LOW);
digitalWrite(Ledcarroamarelo, HIGH);
digitalWrite(Ledcarrovermelho, LOW);
digitalWrite(Ledpedestrevermelho, HIGH);
digitalWrite(Ledpedestreverde, LOW);
fase2 = true;
Serial.println("if 2");
}
if (tempo_presente - tempo_inicial == 15000 and fase3 == false){
digitalWrite(Ledcarroamarelo, LOW);
digitalWrite(Ledcarrovermelho, HIGH);
digitalWrite(Ledcarroverde, LOW);
digitalWrite(Ledpedestrevermelho, LOW);
digitalWrite(Ledpedestreverde, HIGH);
fase3 = true;
Serial.println("if 3");
}

if (tempo_presente - tempo_inicial == 20000 and fase4 == false){
Serial.println("if 4");
digitalWrite(Ledcarroamarelo, LOW);
//digitalWrite(Ledcarrovermelho, LOW);
digitalWrite(Ledcarroverde, LOW);
digitalWrite(Ledpedestreverde, LOW);
for (int contador = 0; contador < 20; contador ++){
for (int contador2 = 0; contador2 < 15000; contador2 ++)
digitalWrite(Ledpedestrevermelho, LOW);
for (int contador3 = 0; contador3 < 15000; contador3 ++)
digitalWrite(Ledpedestrevermelho, HIGH);
fase4 = true;
}

tempo_inicial = millis();
fase1 = false;
fase2 = false;
fase3 = false;
fase4 = false;
}

}

Obrigado funcionou perfeitamente

Infelizmente o código não está bom, só depois que postei para você é que notei que código trava, de certo é por algo relacionado com o valor de millis, que cada vez é mais alto e gera algum tipo estouro  em alguma das variáveis relacionada a ele. Não consegui achar uma forma de contornar, pesquisei algo para resetar o valor de millis mais não encontrei.

Seu problema está no algoritmo. Você está muito focado em código e não está pensando na lógica/algoritmo.

Descreva o funcionamento do sistema, pense no bom e velho pseudocódigo que daí a programação é mamão com açúcar, ainda mais com Arduino.

Mais ou menos assim

Etapa 1 - Verde carro aceso.

Etapa 2 - Apaga verde para carro e acende o amarelo.

Etapa 3 - Apaga o amarelo e acende o vermelho para carro.

Etapa 4 - Apaga vermelho pedestre e acende o verde.

Etapa 5 - Apaga o verde pedestre e o vermelho pedestre começa piscar.

Etapa 6 - O vermelho pedestre fica aceso.

Etapa 7 - Acende novamente verde carro.

Acho que não tem como usar todos esses processos sem usar um único delay.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço