Este es el primer código que creo para Arduino. Realmente es el primer código que escribo desde que hace años abandoné mi Spectrum y su Basic, y desde entonces los lenguajes y técnicas de programación han cambiado un «poquito». Este es el código:

 

// Configuración del 595
//Pin conectado a la patilla ST_CP del 74HC595
int latchPin = 8;
//Pin conectado a la patilla SH_CP of 74HC595
int clockPin = 9;
//Pin conectado a la patilla DS of 74HC595
int dataPin = 7;
//Intervalo de la secuencia
int intervalo =  1000;
//Pin de sonido
int sonido = 13;

void setup() {
//Configurar como salida los pines de control de 74HC595
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() {
//Apaga todos los leds
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
digitalWrite(latchPin, HIGH);
delay (100);
//Enciende el primer led rojo y da un tono
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B10000000);
digitalWrite(latchPin, HIGH);
tone(sonido, 440, intervalo);
delay(intervalo);
//Enciende los dos primeros leds rojos y da un tono
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B11000000);
digitalWrite(latchPin, HIGH);
tone(sonido, 540, intervalo);
delay (intervalo);
//Enciende los tres leds rojos y da un tono
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B11100000);
digitalWrite(latchPin, HIGH);
tone(sonido, 640, intervalo);
delay (intervalo);
//Apaga los leds rojos y enciende el verde
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B00010000);
digitalWrite(latchPin, HIGH);
tone(sonido, 740, intervalo*2);
delay (intervalo*2);

//Apaga todos los leds
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
digitalWrite(latchPin, HIGH);
}

Esto hace que se enciendan las luces del semáforo como en la F1: una roja, dos rojas, tres rojas y una verde con un periodo de un segundo, que se puede ajustar fácilmente modificando la variable «intervalo».

También se hace sonar un tono del altavoz con cada paso del semáforo, diferente con el verde. Su ajuste es más complicado, pues hay que cambiar las frecuencias de los tonos en el propio código (quizás eso lo cambie en un futuro) pero también se pueden cambiar.

// Configuración del 595
//Pin conectado a la patilla ST_CP del 74HC595
int latchPin = 8;
//Pin conectado a la patilla SH_CP of 74HC595
int clockPin = 9;
//Pin conectado a la patilla DS of 74HC595
int dataPin = 7;
//Intervalo de la secuencia
int intervalo =  1000;
//Pin de sonido
int sonido = 13;

void setup() {
//Configurar como salida los pines de control de 74HC595
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() {
//Apaga todos los leds
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
digitalWrite(latchPin, HIGH);
delay (100);
//Enciende el primer led rojo y da un tono
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B10000000);
digitalWrite(latchPin, HIGH);
tone(sonido, 440, intervalo);
delay(intervalo);
//Enciende los dos primeros leds rojos y da un tono
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B11000000);
digitalWrite(latchPin, HIGH);
tone(sonido, 540, intervalo);
delay (intervalo);
//Enciende los tres leds rojos y da un tono
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B11100000);
digitalWrite(latchPin, HIGH);
tone(sonido, 640, intervalo);
delay (intervalo);
//Apaga los leds rojos y enciende el verde
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B00010000);
digitalWrite(latchPin, HIGH);
tone(sonido, 740, intervalo*2);
delay (intervalo*2);

//Apaga todos los leds
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
digitalWrite(latchPin, HIGH);
}