Inclusió de la llibreria Servo:
#include <Servo.h> // llibreria per treballar amb servosDefinició dels pins utilitzats
int vermell = 1; // leds vermells semàfors int groc = 2; // leds grocs semàfors int verd = 3; // leds verds semàfors int alarma = 4; // brunzidor int fanals = 9; // leds fanals Servo barrera_1; // servo barrera. pin 5 Servo barrera_2; // servo barrera. pin 10 Servo pont_1; // servo pont. pin 6 Servo pont_2; // servo pont. pin 11 int trig_1 = 7; // trig ultrasons arrivada vaixell int echo_1 = 8; // echo ultrasons arrivada vaixell int trig_2 = 12; // trig ultrasons marxa vaixell int echo_2 = 13; // echo ultrasons marxa vaixell int sensor_llum = A1; // LDRDefinició de consignes (variables)
int vaixell_arriva = 40; // distància a la qual es comença a detectar vaixell int vaixell_apropa= 20; // distància a la qual ha de pujar el pont int vaixell_marxa = 20; // distància a la qual ha de baixar el pont long durada_1,distancia_1; // per al càlcul de distància long durada_2,distancia_2; // per al càlcul de distància int barrera_abaix = 0; // posició servo int barrera_adalt = 90; // posició servo int pont_abaix = 0; // posició servo int pont_adalt = 90; // posició servo int to_alarma = 1000; // freqüència del to brunzidor int temps= 3000; // pausa entre acció barreres / pont int nit = 200; // llindar llum mínima int dia = 800; // llindar llum màxima int llum; // per desar la lectura del sensor de llumFunció inicial:
void setup() { pinMode(vermell,OUTPUT); pinMode(groc,OUTPUT); pinMode(verd,OUTPUT); pinMode(alarma,OUTPUT); pinMode(trig_1,OUTPUT); pinMode(trig_2,OUTPUT); pinMode(echo_1,INPUT); pinMode(echo_2,INPUT); Serial.begin(9600); }Funció per detecció de vaixell que arriva:
void detecta_arriva() { // detecció de vaixell que arriva: digitalWrite (trig_1,LOW); delayMicroseconds (2); digitalWrite (trig_1,HIGH); delayMicroseconds (10); digitalWrite (trig_1,LOW); durada_1 = pulseIn (echo_1,HIGH); distancia_1 = durada_1 / 58.2; }Funció per detecció de vaixell que marxa:
void detecta_marxa() { // detecció de vaixell que marxa: digitalWrite (trig_2,LOW); delayMicroseconds (2); digitalWrite (trig_2,HIGH); delayMicroseconds (10); digitalWrite (trig_2,LOW); durada_2 = pulseIn (echo_2,HIGH); distancia_2 = durada_2 / 58.2; }Funció que defineix les accions si el vaixell està molt aprop del pont:
void accions_apropa() { // semàfor vermell digitalWrite(vermell,HIGH); digitalWrite(groc,LOW); digitalWrite(verd,LOW); tone(alarma,to_alarma); // baixa barreres barrera_1.attach(5); barrera_2.attach(10); barrera_1.write(90); barrera_2.write(90); delay(temps); // puja pont pont_1.attach(6); pont_2.attach(11); pont_1.write(90); pont_2.write(90); }Funció que defineix les accions si es comença a detectar que arriva un vaixell:
void accions_arriva() { digitalWrite(vermell,LOW); digitalWrite(groc,HIGH); digitalWrite(verd,LOW); tone(alarma,to_alarma); }Funció que defineix les accions si el vaixell marxa:
void accions_marxa() { // baixa pont pont_1.write(0); pont_2.write(0); pont_1.detach(); pont_2.detach(); delay(temps); // semàfor àmbar digitalWrite(vermell,LOW); digitalWrite(groc,HIGH); digitalWrite(verd,LOW); // puja barreres barrera_1.write(0); barrera_2.write(0); barrera_1.detach(); barrera_2.detach(); }Funció que defineix les accions si cap dels sensors detecta vaixell:
void condicions_inicials() { digitalWrite(vermell,LOW); digitalWrite(groc,LOW); digitalWrite(verd,HIGH); noTone(alarma); }Amb tot aixó, el bucle principal del programa:
void loop() { detecta_arriva(); // detecció de vaixell que arriva // si el vaixell ja està molt a prop del pont: if (distancia_1 < vaixell_apropa) { accions_apropa(); } else { // si es comença a detectar vaixell que arriva: if (distancia_1 < vaixell_arriva) { accions_arriva(); } else // si no arriva cap vaixell: { detecta_marxa(); // detecció de vaixell que marxa // si hi ha vaixell marxant: if (distancia_2 < vaixell_marxa) { accions_marxa(); } // si ni arriva ni marxa cap vaixell: else { condicions_inicials(); } } } // detecció de nivell de llum llum = analogRead(sensor_llum); if (llum < nit) { analogWrite(fanals,255); } else { if (llum > dia) { analogWrite(fanals,0); } else { analogWrite (fanals,map(llum,0,1023,0,255)); } } delay(50); }
Cap comentari:
Publica un comentari a l'entrada