11 de maig 2015

Proposta de programació


Programació

Inclusió de la llibreria Servo:
#include <Servo.h>  // llibreria per treballar amb servos
Definició 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;  // LDR
Definició 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 llum
Funció 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