Efeito Knight Rider com LEDs e velocidade ajustável

Vídeo
Esquema do circuito

Código-fonte
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Efeito Knight Rider com LEDs e velocidade ajustável
4// ─────────────────────────────────────────
5// Um potenciômetro define a velocidade do efeito de LED Knight Rider (vai
6// e volta). A0 é lido a cada passo e o valor 0-1023 vira o tempo de espera
7// (ms).
8//
9// Pinos:
10// D2, D3, D4, D5, D6, D7 -> 6 LEDs (em ordem)
11// Cada LED com um resistor de 330 ohm
12// A0 -> Cursor do potenciômetro
13// (pernas externas em 5V e GND)
14
15int ledPins[] = {2, 3, 4, 5, 6, 7}; // Pinos dos LEDs na ordem de acendimento
16int potValue; // Valor do pot = espera (ms)
17
18void setup() {
19 // Define todos os pinos dos LEDs como saída
20 for(int i = 0; i < 6; i++) {
21 pinMode(ledPins[i], OUTPUT);
22 }
23}
24
25void loop() {
26 // Para frente: D2 a D7
27 for(int i = 0; i < 6; i++) {
28 potValue = analogRead(A0); // Lê a velocidade (0-1023)
29 digitalWrite(ledPins[i], HIGH);
30 delay(potValue); // Espera tantos ms quanto o valor do pot
31 digitalWrite(ledPins[i], LOW);
32 }
33
34 // Para trás: D6 a D3. Os LEDs das pontas são pulados para o retorno parecer contínuo
35 for(int i = 4; i > 0; i--) {
36 potValue = analogRead(A0);
37 digitalWrite(ledPins[i], HIGH);
38 delay(potValue);
39 digitalWrite(ledPins[i], LOW);
40 }
41}
42
Perguntas frequentes
O que este projeto ensina de diferente dos anteriores?
Ele combina a entrada analógica (potenciômetro) com um laço nas duas direções: enquanto a luz vai e volta, o potenciômetro é lido a cada passo e o atraso é atualizado. Essa é a base para mudar o comportamento conforme o valor de um sensor.
A leitura está oscilando. Como estabilizá-la?
Pequenas oscilações nas leituras analógicas são normais. Calcular a média de várias leituras ou usar `map()` para dividir o valor em intervalos maiores (por exemplo, de 10 milissegundos) disfarça as oscilações.
Posso usar outro sensor no lugar do potenciômetro?
Sim, você pode usar um LDR, mas ele não gera uma tensão de saída sozinho. Monte um divisor de tensão com o LDR e um resistor fixo entre 5 V e GND e ligue o ponto de junção dos dois ao A0. Depois, use `map()` no código para converter a faixa medida no intervalo de atraso desejado.
Qual pino analógico devo usar?
No Uno, todos os pinos de A0 a A5 podem ser usados para leituras analógicas. Confira se o pino usado no código corresponde à conexão no circuito; como A4 e A5 também são usados para I2C, escolha A0 se pretende adicionar um display depois.
