Practica 05 Semáforo

Programa para hacer un semáforo en arduino, usando la función millis()

semaforo_millis.ino

// 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();
  }
}

trama_semaforo

Dos archivos: trama_semafono.ino (principal) y semaforo.h (pestaña)

trama_semaforo.ino

#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);
    }
  }
}

semaforo.h

// 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();
  }
}