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 parpadeigConfiguració
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