Práctica: Semaforo Regulado
Na práctica anterior fixemos un semáforo con tres leds, que cambiaba a unha velocidade que nós lle determinamos. Agora, de xeito parecido a como fixemos co Blink, imos facer que esa velocidade poida ser regulada desde un potenciómetro.
Partindo do esquema da práctica anterior, imos agora a conectar na placa un potenciómetro de 10k (valen tamén outros valores, nós é o que temos).
(clica para aumentar)
Como ves, o potenciómetro leva a patilla do medio á entrada A0, e as dos extremos á 5V e a terra (GND). En realidade daría igual que extremo vaia a cada lado.
Regular a velocidade:
Agora imos aproveitar o que xa sabemos de potenciómetros e lecturas para facer que a velocidade de transición do noso semáforo se poida controlar desde o potenciómetro. A única diferencia co programa anterior é que creamos unha nova variable, tempo , na que gardamos a lectura do potenciómetro e que logo pasamos como delay para o semáforo. Este valor o imos multiplicar por 2, xa que, se non, o tempo máximo de transición sería moi pequeno (1023 milisegundos).
//Semaforo con velocidade regulada por potenciometro
//Definimos un pin para cada led, 8 para o verde, 9 amarelo e 10 vermello
//isto define o pin para o led Verde
int ledVerde = 8;
//define o pin para o led Amarelo
int ledAmarelo=9;
//define o pin para o led Vermello
int ledVermello=10;
// o que hai no setup lese unha soa vez
void setup() {
// inicia os pines dos leds como saídas (OUTPUT)
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermello, OUTPUT);
//para poder ler datos no monitor serie
Serial.begin(9600);
}
// o que hai dentro de void loop se executa unha e outra vez
void loop() {
//le o valor en A0, o multiplica por 2 e o garda como 'tempo'
int tempo=analogRead(A0)*2;
//Encende o led Verde
digitalWrite(ledVerde,HIGH);
//Espero co verde aceso durante o valor tempo, indicado polo pote.
delay(tempo);
//Encendo o led amarelo
digitalWrite(ledAmarelo,HIGH);
//Espero un tercio do que tiven o verde aceso, o laranxa nunca dura tanto.
delay(tempo/3);
//apago os leds verde e amarelo e encendo o vermello
digitalWrite(ledVerde,LOW);
digitalWrite(ledAmarelo,LOW);
digitalWrite(ledVermello,HIGH);
//espero co vermello aceso
delay(tempo);
//apago o led vermello
digitalWrite(ledVermello,LOW);
}
Xa está, o teu semáforo agora cambia ao ritmo que ti lle marcas!
Retos:
1 - Que pasa cando facemos que o tempo sexa baixo? Saberías explicar por que?
2 - A duración do semáforo en laranxa non soe depender da duración do verde nin do vermello... poderías facer que o semáforo sempre estivera en laranxa durante un segundo?
3 - Poderías facer que o tempo que o semáforo está en vermello sexa o doble do que está en verde?