Programa para hacer un semáforo en arduino, usando la función millis()
// pines leds const byte pinRojoA = 10; const byte pinAmbarA = 9; const byte pinVerdeA = 8; // tiempos de cada luz del semaforo int tiempoRojoA = 5000; int tiempoAmbarA = 2000; int tiempoVerdeA = 4000; unsigned long tiempo; // variables para el parpadero del ambar unsigned long tiempoA = 0; int tpoOnA = 400; int tpoOffA = 300; void setup() { Serial.begin(9600); pinMode(pinRojoA, OUTPUT); pinMode(pinAmbarA, OUTPUT); pinMode(pinVerdeA, OUTPUT); tiempo = millis(); } void loop() { semaforo(); } void parpadeo() { if (millis() - tiempoA < tpoOnA) { digitalWrite(pinAmbarA, HIGH); } else if (millis() - tiempoA < tpoOnA + tpoOffA) { digitalWrite(pinAmbarA, LOW); } else tiempoA = millis(); } void semaforo() { // verde if (millis() - tiempo < tiempoVerdeA) { // Serial.println("VERDE"); digitalWrite(pinRojoA, LOW); digitalWrite(pinAmbarA, LOW); digitalWrite(pinVerdeA, HIGH); // ambar } else if (millis() - tiempo < tiempoVerdeA + tiempoAmbarA) { parpadeo(); digitalWrite(pinRojoA, LOW); digitalWrite(pinVerdeA, LOW); // rojo } else if (millis() - tiempo < tiempoVerdeA + tiempoAmbarA + tiempoRojoA) { // Serial.println("ROJO"); digitalWrite(pinRojoA, HIGH); digitalWrite(pinAmbarA, LOW); digitalWrite(pinVerdeA, LOW); } else { tiempo = millis(); } }
Dos archivos: trama_semafono.ino (principal) y semaforo.h (pestaña)
#include "semaforo.h" int ledPin = 13; int a0 = A0; int va0 = 0; int a1 = A1; int va1 = 0; float T = 0; float H = 100; unsigned long tpo; int retardo = 200; void setup() { Serial.begin(9600); Serial.println("CARLOS -----"); pinMode(ledPin, OUTPUT); iniciarSemaforo(); tpo = millis(); } void loop() { semaforo(); // simular cambios en temperatura y humedad T++; if (T > 100) T = 0; H--; if (H == 0) H = 100; va0 = analogRead(a0); va1 = analogRead(a1); String trama = "_A0" + String(va0) + "_A1" + String(va1); trama += "_H" + String(H) + "_T" + String(T); trama += "_D" + String(pinRojoA) + String(digitalRead(pinRojoA)); trama += "_D" + String(pinAmbarA) + String(digitalRead(pinAmbarA)); trama += "_D" + String(pinVerdeA) + String(digitalRead(pinVerdeA)); if (millis()-tpo > retardo){ Serial.println(trama); tpo = millis(); } } void serialEvent() { while (Serial.available()) { char car = (char)Serial.read(); Serial.println(car); if (car == '1') { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } }
// pines leds const byte pinRojoA = 10; const byte pinAmbarA = 9; const byte pinVerdeA = 8; // tiempos de cada luz del semaforo int tiempoRojoA = 5000; int tiempoAmbarA = 2000; int tiempoVerdeA = 4000; unsigned long tiempo; // variables para el parpadero del ambar unsigned long tiempoA = 0; int tpoOnA = 400; int tpoOffA = 300; void iniciarSemaforo() { Serial.println("iniciar Semaforo"); pinMode(pinRojoA, OUTPUT); pinMode(pinAmbarA, OUTPUT); pinMode(pinVerdeA, OUTPUT); tiempo = millis(); // tiempoA = millis(); } void parpadeo() { if (millis() - tiempoA < tpoOnA) { digitalWrite(pinAmbarA, HIGH); } else if (millis() - tiempoA < tpoOnA + tpoOffA) { digitalWrite(pinAmbarA, LOW); } else tiempoA = millis(); } void semaforo() { // verde if (millis() - tiempo < tiempoVerdeA) { // Serial.println("VERDE"); digitalWrite(pinRojoA, LOW); digitalWrite(pinAmbarA, LOW); digitalWrite(pinVerdeA, HIGH); // ambar } else if (millis() - tiempo < tiempoVerdeA + tiempoAmbarA) { parpadeo(); digitalWrite(pinRojoA, LOW); digitalWrite(pinVerdeA, LOW); // rojo } else if (millis() - tiempo < tiempoVerdeA + tiempoAmbarA + tiempoRojoA) { // Serial.println("ROJO"); digitalWrite(pinRojoA, HIGH); digitalWrite(pinAmbarA, LOW); digitalWrite(pinVerdeA, LOW); } else { tiempo = millis(); } }