SISTEMA INTEL·LIGENT DE REGULACIÓ DE TRÀNSIT TERRESTRE I FLUVIAL AMB ARDUINO.
TECNOLOGIA 4ESO - 1 BATX Institut Bellvitge. Curs 2015-16

CIRCUIT 2

Recepcio de dades - Fanals analògics - Semàfors RGB


Fanals analògics: l'encesa dels fanals és inversament proporcional al nivell de llum ambiental llegit per LDR.
Semàfors: els comportaments depenen de les dades rebudes pel port sèrie (enviades per la placa a la qual estan connectats els sensor d'ultrasons).
S'ha substituït el color groc per parpadeig del verd sense delay.

Esquema de connexions:
Utilizem 6 LEDs blancs d'alta luminositat (3 a cada costat del pont), 2 LEDs RGB (1 per a cada semàfor), 3 resistències de 100  i un sensor de llum (LDR + resistència de 10 kΩ)


* per comoditat de muntatge les connexions reals són: vermell-pin 8, verd-pin 9, fanals-pin 10
* pin 0-RX connectat a 1-TX placa 1

Diagrama de flux:

Valors amb que treballem
const int vermell = 8;           // semàfor vermell
const int verd = 9;              // semàfor verd
const int Fanals = 10;      // leds fanals
const int PinSensor = A5;  // sensor de llum (LDR)
char dada;                 // byte entrant pel port sèrie (caràcter)

int ValorSensor;            // per desar la lectura sensor de llum
const int MinSensor = 30;   // valor segons la calibració prèvia "a ull"
const int MaxSensor = 300;  // valor segons la calibració prèvia "a ull"
int intensitat;             // per assignar intensitat d'il·luminació als fanals

// càlculs matemàtics: y = x*k + n (intensitat = (ValorSensor*k) + n
// float: variable amb valor decimal
float k1 = 0-255;
float k2 = MaxSensor-MinSensor;
float k = k1 / k2;  // k = (0-255)/(MaxSensor-MinSensor);
float n = -MaxSensor*k;

// variables per al parpadeig sense delay:
int EstatLed = LOW;  // estat inicial del LED, apagat
long TempsPrevi = 0; // per guardar el temps des que el LED va ser actualitzat
long interval = 200; // interval (temps) de parpadeig
Configuració
void setup()
{
  Serial.begin(9600);  // comunicació sèrie per rebre dades
  pinMode(vermell,OUTPUT);
  pinMode(verd,OUTPUT);
  digitalWrite(verd,HIGH);
}
El programa
void loop()
{
  ValorSensor = analogRead (PinSensor);  // captura de la lectura del sensor
  assigna_intensitat();                  // funció que assigna valor a la variable
  analogWrite (Fanals, intensitat);      // encesa dels fanals

  if (Serial.available() > 0)  dada = Serial.read();  // desa la dada rebuda
  if(dada == 'A')  encen_verd(); 
  if((dada == 'B')||(dada == 'F'))  parpadeig();   
  if((dada == 'C')||(dada == 'D')||(dada == 'E'))  encen_vermell();  
  
  // mostra_dades();  // per depuració
  delay (10);  // per estabilitzar
}
Funcions
void assigna_intensitat()
{
  if (ValorSensor < MinSensor) intensitat = 255;
  else if (ValorSensor > MaxSensor) intensitat = 0;
  else intensitat = int((ValorSensor*k)+n); // cast per transformar en int la operació amb valors float
}

void encen_verd()
{
  digitalWrite(verd,HIGH);
  digitalWrite(vermell,LOW);
}

void encen_vermell()
{
  digitalWrite(verd,LOW);
  digitalWrite(vermell,HIGH);
}

void parpadeig()
{
  digitalWrite(vermell,LOW);
  unsigned long TempsActual = millis();  // captura del temps actual
 
  if(TempsActual - TempsPrevi > interval) 
  {
    TempsPrevi = TempsActual;  // actualitza la variable   
    // canvia l'estat del LED:
    if (EstatLed == LOW) EstatLed = HIGH;
    else EstatLed = LOW; 
    digitalWrite(verd, EstatLed);  //assigna al LED l'estat que li toqui
  }
}

void mostra_dades()
{
  Serial.print ("ValorSensorLLum = ");
  Serial.println (ValorSensor);
  Serial.print ("Intensitat = ");
  Serial.println (intensitat);
}

No hay comentarios:

Publicar un comentario