TriggerT: Intervallometro – quarta parte

Continuo la serie di articoli dedicati al progetto di Alessandro: il TriggerT proseguendo nella spiegazione del codice, lungo e articolato necessario al corretto funzionamento del tuo trigger.

Circuito TriggerT

Lo sketch è identico a quello presentato negli articoli precedenti:

TriggerT: Trigger multiuso – prima parte

TriggerT: Trigger multiuso – seconda parte

TriggerT: Trigger multiuso – terza parte

te lo riporto perché tu possa averlo sotto gli occhi intento che lo analizziamo.

Oggi iniziamo dall’intervallometro, la prima funzione da Trigger che incontri, negli articoli precedenti ti sei concentrato sulla costruzione, le variabili e la gestione dei menu, è tempo di mettere mano al codice e comprendere come funziona l’intervallometro per poterlo adattare alle tue esigenze:

// *-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-*
// |                                                                       |
// |                      -_-TriggerT by Travis9011 -_-                    |
// |                                                                       |
// |             ©2012 www.snapadventure.it - Alessandro Travi             |
// |                                                                       |
// *-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-*

#include <LiquidCrystal.h>  //Libreria per LCD

#define ENTER  11            //Pin a cui e' collegato il tasto Enter
#define ESC  10             //Pin a cui e' collegato il tasto Esc
#define BACKLIGHT  9
#define MENO  8            //Pin a cui e' collegato il tasto Meno
#define OPTION  1
#define PIU  0          //Pin a cui e' collegato il tasto Piu 

boolean piu_set = LOW, meno_set = LOW, option_set = LOW;
unsigned int n_piu, n_meno;
byte i = 0;
int NScatti=300;
int NScattiSetting;
unsigned int principale = 0, principale1=0, principale2=0, principale3=0, principale4=0, mode=0;
boolean piu = LOW, meno = LOW, enter, esc, option;//Variabili associate ai quattro pulsanti nella modalita' scorrimento pagine
boolean piu0 = LOW, meno0 = LOW, enter0;
boolean set = LOW;//Entra nella modalita' settaggio
boolean set0 = LOW;

boolean setenter = LOW;//Entra nella modalita' settaggio
long tempo_btn = 0, debounce = 190;  //Tempo tra due letture successive di un bottone (300 ms)

unsigned long contaimpulsopiu =0;
unsigned long contaimpulsomeno =0;

unsigned long currentTime;
unsigned long loopTime; 

/*=========== Variabili Macchina Fotografica =========================================================================================================*/

int shutter_on = 200;//tempo di pressione per attivare la cam, da settare intorno i 100 e 300
int lampo = 100;
long otturatore = 0; //posa B
long attesa = 0, attesas = 0, attesal = 0, attesaPIR = 0;
float shutter_off = 4000; // tempo di attesa intervallo
float shutter_off_setting=0;
long shutter_offL = 0;
long shutter_off_settingL=0;

int light =0;
int passaggio=0;
int wakeup = 300; //tempo per il fuoco
int wakewait = 200; //tempo risveglio / scatto
int outpin = 12; //uscita per lo scatto

int flash = 16;//uscita flash
int LDR = 5; //analogico
int SUONO = 4; //analogico
int EXT = 3; //analogico
int EXT_DIGIT = 17; //digitale
int letturaLDR = 0;
int letturaSuono = 0;
int letturaSuonoimp = 0;
int sensSuono = 100, sensSuonosetting = 3;
int sensLDR = 60, sensLDRsetting = 3;
int sensLDRLaser = 25, sensLDRLasersetting = 3;
int sogliaLDR = 0;
int sogliaSuono = 0;
int setsensorLuce = 0,setsensorSuono = 0,setsensorLaser = 0;
int setmod = 0, setmodL = 0, setmodPIR = 0;

/*SIMBOLI*/

byte symbolstop[8] = {
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
B00000,
};
byte symbolplay[8] = {
B00000,
B10000,
B11000,
B11100,
B11000,
B10000,
B00000,
};

byte symbolnormal[8] = {
B00000,
B01110,
B11111,
B11111,
B11111,
B01110,
B00000,
};

byte symbolmod[8] = {
B00000,
B00100,
B01110,
B11111,
B01110,
B00100,
B00000,
};

byte symbolsens[8] = {
B00000,
B01110,
B01110,
B01110,
B01110,
B01110,
B00000,
};

byte symbolsensno[8] = {
B00000,
B01110,
B01010,
B01010,
B01010,
B01110,
B00000,
};

//Display LCD
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

void setup()
{
  currentTime = millis();
  loopTime = currentTime;
  pinMode(BACKLIGHT, OUTPUT);
  digitalWrite(BACKLIGHT, HIGH);
  lcd.begin(8, 2);

  pinMode(ENTER, INPUT);
  pinMode(ESC, INPUT);
  pinMode(PIU, INPUT);
  pinMode(MENO, INPUT);
  pinMode(OPTION, INPUT);
  pinMode(SUONO,INPUT);
  pinMode(outpin, OUTPUT); 

  pinMode(flash, OUTPUT);

  NScattiSetting=NScatti;
  lcd.createChar(1, symbolstop);
  lcd.createChar(2, symbolplay);
  lcd.createChar(3, symbolmod);
  lcd.createChar(4, symbolnormal);
  lcd.createChar(5, symbolsens);
  lcd.createChar(6, symbolsensno);

  lcd.setCursor(0,0);
  lcd.print("TriggerT");
  lcd.setCursor(0,1);
  lcd.print("  v1.5  ");
  delay(3000);
  lcd.setCursor(0,0);
  lcd.print("   by   ");
   lcd.setCursor(0,1);
  lcd.print(" Travis ");
  delay(2000);
  lcd.clear();

}

void loop(){

  shutter_off_setting=shutter_off;
  backlight();
//LETTURA PULSANTI
if(set == LOW)
  {
    piu = digitalRead(PIU);
    meno = digitalRead(MENO);
    option = digitalRead(OPTION);
  }
  enter = digitalRead(ENTER);
  esc = digitalRead(ESC);

  //Se premo PIU incremento di uno il contatore pagine
  if(meno == HIGH && millis() - tempo_btn > debounce)
  {

    tempo_btn = millis();
    if(principale >= 0 && principale < 5){
    principale++;}

    if(principale1 >= 0 && principale1 < 5){
      principale1++;}
    if(principale2 >= 0 && principale2 < 6){
      principale2++;}
    if(principale3 >= 0 && principale3 < 6){
      principale3++;}
    if(principale4 >= 0 && principale4 < 4){
      principale4++;}

    if(principale == 4){
      principale = 0;}
    if(principale1 == 4){
      principale1 = 0;}
    if(principale2 == 5){
      principale2 = 0;}
    if(principale3 == 5){
      principale3 = 0;}
    if(principale4 == 3){
      principale4 = 0;}
  }

  //Se premo MENO decremento il contatore pagine
  if(piu == HIGH && millis() - tempo_btn > debounce)
  {

    tempo_btn = millis();
    if(principale > 0 && principale < 5){
    principale--;}
    if(principale1 > 0 && principale1 < 5){
      principale1--;
   }
   if(principale2 > 0 && principale2 < 6){
     principale2--;
   }
   if(principale3 > 0 && principale3 < 5){
     principale3--;
   }
   if(principale4 > 0 && principale4 < 4){
     principale4--;
   }
 }

  //Se premo ESC torno alla schermata Home uscendo anche da tutti i sottomenu
  if(esc == HIGH && millis() - tempo_btn > debounce)  //Quando premo "esc" torno alla schermata HOME
  {

    tempo_btn = millis();
    if(mode==0){
    principale = 0;}

    else if(mode==1){
    principale1 = 0;}

    else if(mode==2){
    principale2 = 0;}

    else if(mode==3){
    principale3 = 0;}

    else if(mode==4){
    principale4 = 0;}

    set = LOW;
  }

   if(option == HIGH && millis() - tempo_btn > debounce && mode >= 0 && mode < 5)  //Quando premo "esc" torno alla schermata HOME
  {

    principale=0;
    principale1=0;
    principale2=0;
    principale3=0;
    principale4=0;
    tempo_btn = millis();
     mode++;
     if(mode == 5)
      mode = 0;

  }

  /*----------------------------INTERVALLOMETRO-------------------------*/
  if(mode==0){
  switch (principale)
  {
  case 0:    //Schermata HOME

    // codice per pagina nr. 0 (HOME)
    lcd.setCursor(0,0);
    lcd.print("Timer         ");
    lcd.setCursor(0,1);
    lcd.print("Scatti               ");

if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      NScatti=NScattiSetting;
      tempo_btn = millis();
      set = !set;
    }

   if(set == HIGH)
    {
      digitalWrite(BACKLIGHT, LOW);
      if(NScatti!=0 && otturatore == 0){

        NScatti--; //decrementa numero scatti mancante
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Next:");

        lcd.setCursor(0,1);
        lcd.print("Fine:");
        lcd.print(NScatti);

        delay(wakewait); //Prepara per lo scatto
        scatto();

        shutter_off_setting=shutter_off_setting-1000;
        while (shutter_off_setting > 0){
          lcd.setCursor(5,0);
          shutter_off_settingL=shutter_off_setting;
          lcd.print(shutter_off_settingL/1000);
          lcd.print("\"");
          lcd.print("           ");
          shutter_off_setting = shutter_off_setting-500;
          delay(500);

        }

       }

       else if(NScatti!=0 && otturatore != 0){

        NScatti--; //decrementa numero scatti mancante
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Next:");

        lcd.setCursor(0,1);
        lcd.print("Fine:");
        lcd.print(NScatti);

        delay(wakewait); //Prepara per lo scatto
        lcd.setCursor(8,0);
        lcd.print("B");
        digitalWrite(outpin, HIGH); //Scatta
        delay(otturatore+500); //tempo otturatore aperto
        digitalWrite(outpin, LOW); //Stop scatto

        shutter_off_setting=shutter_off_setting-500;
        while (shutter_off_setting > 0){
          lcd.setCursor(5,0);
          shutter_off_settingL=shutter_off_setting;
          lcd.print(shutter_off_settingL/1000);
          lcd.print("\"");
          lcd.print("                      ");
          shutter_off_setting = shutter_off_setting-500;
          delay(500);

        }

       }

        else if(NScatti==0){
          digitalWrite(BACKLIGHT, HIGH);
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Finito!     ");
          lcd.setCursor(0,1);
          lcd.print("A casa!      ");
          delay(4000);

          set = !set;
        }
    }

    break;

    case 1:

    lcd.setCursor(0,0);
    lcd.print("Set Int            ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;

        shutter_off=shutter_off+1000;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( shutter_off > 0 )
          shutter_off=shutter_off-1000;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(shutter_off<60000){
    shutter_offL =shutter_off;
    lcd.print(shutter_offL/1000);
    lcd.print("\"");

                       }

    else conversioneminutif(shutter_off);

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 2:

    lcd.setCursor(0,0);
    lcd.print("N Scatti            ");

  if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;

    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;

      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

   if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        NScattiSetting++;

        contaimpulsopiu++;

        if (contaimpulsopiu>10) { 

          NScattiSetting=NScattiSetting+10;

            }

        }
        else if(piu_set == LOW){ contaimpulsopiu=0;}

       if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;

        meno_set = !meno_set;
        if( NScattiSetting > 0 )
        {
          NScattiSetting--;
        contaimpulsomeno++;

        if (contaimpulsomeno>10) {
        NScattiSetting=NScattiSetting-10;
          if(NScattiSetting<0){NScattiSetting=0;}
                                  }
        }

      }

   else if(meno_set == LOW){ contaimpulsomeno=0;}
    }

    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    lcd.print(NScattiSetting);

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

    break;

    case 3:   // Set Bulb
    lcd.setCursor(0,0);
    lcd.print("Bulb                      ");

  if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;

    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        otturatore=otturatore+1000;
        contaimpulsopiu++;
        if(contaimpulsopiu>15){
        otturatore=otturatore+10000;
        }

        }
        else if(piu_set == LOW){contaimpulsopiu=0;}

       if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( otturatore > 0 )
          otturatore=otturatore-1000;
          contaimpulsomeno++;
        if(contaimpulsomeno>15){
        otturatore=otturatore-10000;
        }
      }
      else if(meno_set == LOW){contaimpulsomeno=0;}
    }

    lcd.setCursor(0,1);  

    if(otturatore!=0 && otturatore<60000) {
     lcd.print(otturatore/1000);
     lcd.print("\"");

     }

     if(otturatore>=60000){

       conversioneminuti(otturatore);

                           }

    if(otturatore == 0) lcd.print("No");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

      break;
     }//switch
   }//if

   /*-------------------------------Trigger LUCE---------------------------*/
   if(mode==1){
  switch (principale1)
  {
  case 0:    //Schermata HOME

  option_set = digitalRead(OPTION);
  meno_set = digitalRead(MENO);
  piu_set = digitalRead(PIU);

    // codice per pagina nr. 0 (HOME)
    lcd.setCursor(0,0);
    lcd.print("Trigger     ");

if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {

      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      if(setsensorLuce==0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(LDR);
      sogliaLDR=letturaLDR+sensLDR;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(LDR);
      if(letturaLDR > sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Luce!        ");
        delay(attesa);
        scatto();

        delay(800);

    }}

    }//if sensore Interno

    else if(setsensorLuce!=0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(EXT);
      sogliaLDR=letturaLDR+sensLDR;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(EXT);
      if(letturaLDR > sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Luce!        ");
        delay(attesa);
        scatto();

        delay(1000);

    }}

    }//if sensore ESTERNO

   }
    lcd.setCursor(0,1);
    if(set == LOW){
      passaggio=0;
      lcd.print("Luce   ");

    lcd.write(1);
    lcd.print("            ");}
    else{
      lcd.print("Luce   ");

    lcd.write(2);
    lcd.print("            ");}

    break;

    case 1:

    lcd.setCursor(0,0);
    lcd.print("Sensore         ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(setsensorLuce < 1)
        setsensorLuce++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( setsensorLuce > 0 )
          setsensorLuce--;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(setsensorLuce==0){
    lcd.print("In");
    }
    else lcd.print("Ext");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 2:

    lcd.setCursor(0,0);
    lcd.print("Sensib.              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(sensLDRsetting < 5)
        sensLDRsetting++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( sensLDRsetting > 0 )
          sensLDRsetting--;
      }
    }
    lcd.setCursor(0,1);
    //lcd.print(sensLDRsetting);

    if(sensLDRsetting==0){sensLDR=350; lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6);}

    else if(sensLDRsetting==1){sensLDR=225; lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6);}
    else if(sensLDRsetting==2){sensLDR=100; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6);}
    else if(sensLDRsetting==3){sensLDR=60; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6);}
    else if(sensLDRsetting==4){sensLDR=30;lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6);}
    else if(sensLDRsetting==5){sensLDR=15; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5);}

    if(set == LOW){

      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{

      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 3:

    lcd.setCursor(0,0);
    lcd.print("Delay              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if (attesa<1000){
        attesa=attesa+10;

        contaimpulsopiu++;}

        if (contaimpulsopiu>10) { 

          attesa=attesa+30;
          if (attesa>1000){attesa=1000;}

            }

        }
        else if(piu_set == LOW){ contaimpulsopiu=0;}

       if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;

        meno_set = !meno_set;
        if( attesa > 0 )
        {
          attesa=attesa-10;
        contaimpulsomeno++;

        if (contaimpulsomeno>10) {
        attesa=attesa-30;
          if(attesa<0){attesa=0;}
                                  }
        }

      }

   else if(meno_set == LOW){ contaimpulsomeno=0;}
    }

    lcd.setCursor(0,1);  //Scrivo il numero di scatti

     if(attesa==1000){lcd.print(attesa/1000); lcd.print("\"   ");}
     else{lcd.print(attesa); lcd.print("ms   ");}

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

     }//switch
   }//if

   /*-------------------------------Trigger SUONO-------------------------------*/
   if(mode==2){
  switch (principale2)
  {
  case 0:    //Schermata HOME

    option_set = digitalRead(OPTION);
    meno_set = digitalRead(MENO);
    piu_set = digitalRead(PIU);
    lcd.setCursor(0,0);
    lcd.print("Trigger     ");

if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {

      tempo_btn = millis();
      set = !set;
    }

   if(set == HIGH)
    { 

   /*----------------------Sensore INT e Modalità Reflex-----------------*/
      if(setsensorSuono==0 && setmod==1){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaSuonoimp=analogRead(SUONO);
      letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      sogliaSuono=letturaSuono+sensSuono;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaSuonoimp=analogRead(SUONO);
        letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      if(letturaSuono > sogliaSuono){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Suono!        ");
        delay(attesas);
        scatto();

        delay(800);

        }}

    }// IF sensore e modalità

  /*----------------------Sensore EXT e Modalità Reflex-----------------*/
    else if(setsensorSuono==1 && setmod==1){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaSuonoimp=analogRead(EXT);
      letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      sogliaSuono=letturaSuono+sensSuono;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaSuonoimp=analogRead(EXT);
        letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      if(letturaSuono > sogliaSuono){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Suono!        ");
        delay(attesas);
        scatto();

        delay(800);

        }}

    }// IF sensore e modalità

   /*----------------------Sensore INT e Modalità Flash-----------------*/
    else if(setsensorSuono==0 && setmod==0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaSuonoimp=analogRead(SUONO);
      letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      sogliaSuono=letturaSuono+sensSuono;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaSuonoimp=analogRead(SUONO);
        letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      if(letturaSuono > sogliaSuono){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Suono!        ");
        delay(attesas);
         lampeggio();

        delay(800);

        }}

    }// IF sensore e modalità

  /*----------------------Sensore EXT e Modalità Flash-----------------*/
    else if(setsensorSuono==1 && setmod==0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaSuonoimp=analogRead(EXT);
      letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      sogliaSuono=letturaSuono+sensSuono;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaSuonoimp=analogRead(EXT);
        letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      if(letturaSuono > sogliaSuono){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Suono!        ");
        delay(attesas);
        lampeggio();

        delay(800);

        }}

    }// IF sensore e modalità

  /*----------------------Sensore INT e Modalità Mista-----------------*/
    else if(setsensorSuono==0 && setmod==2){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaSuonoimp=analogRead(SUONO);
      letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      sogliaSuono=letturaSuono+sensSuono;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaSuonoimp=analogRead(SUONO);
        letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      if(letturaSuono > sogliaSuono){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Suono!        ");
        delay(attesas);
        misto();

        delay(800);

        }}

    }// IF sensore e modalità

  /*----------------------Sensore EXT e Modalità Mista-----------------*/
    else if(setsensorSuono==1 && setmod==2){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaSuonoimp=analogRead(EXT);
      letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      sogliaSuono=letturaSuono+sensSuono;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaSuonoimp=analogRead(EXT);
        letturaSuono = constrain(abs(letturaSuonoimp - 512)-25,0,512);
      if(letturaSuono > sogliaSuono){
        lcd.setCursor(0,0);
        lcd.print("Soglia       ");
        lcd.setCursor(0,1);
        lcd.print("Suono!        ");
        delay(attesas);
        misto();

        delay(800);

        }}

    }// IF sensore e modalità

    }

        lcd.setCursor(0,1);
    if(set == LOW){
      passaggio=0;
      lcd.print("Suono  ");

    lcd.write(1);
    lcd.print("            ");}
    else{
      lcd.print("Suono  ");

    lcd.write(2);
    lcd.print("            ");}

    break;

    case 1:

    lcd.setCursor(0,0);
    lcd.print("Set Mod         ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(setmod < 2)
        setmod++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( setmod > 0 )
          setmod--;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(setmod==0){lcd.print("Flash            ");}
    else if(setmod==1){ lcd.print("Reflex       ");}
    else lcd.print("Ref+Fl     ");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 2:

    lcd.setCursor(0,0);
    lcd.print("Sensore         ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(setsensorSuono < 1)
        setsensorSuono++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( setsensorSuono > 0 )
          setsensorSuono--;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(setsensorSuono==0){
    lcd.print("In");
    }
    else lcd.print("Ext");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 3:

  lcd.setCursor(0,0);
    lcd.print("Sensib.              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(sensSuonosetting < 5)
        sensSuonosetting++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( sensSuonosetting > 0 )
          sensSuonosetting--;
      }
    }
    lcd.setCursor(0,1);

    if(sensSuonosetting==0){sensSuono=350; lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6);}

    else if(sensSuonosetting==1){sensSuono=220; lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6);}
    else if(sensSuonosetting==2){sensSuono=150; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6);}
    else if(sensSuonosetting==3){sensSuono=100; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6);}
    else if(sensSuonosetting==4){sensSuono=50;  lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6);}
    else if(sensSuonosetting==5){sensSuono=15;  lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5);}

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 4:

    lcd.setCursor(0,0);
    lcd.print("Delay              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if (attesas<1000){
        attesas=attesas+10;

        contaimpulsopiu++;}

        if (contaimpulsopiu>10) { 

          attesas=attesas+30;
          if (attesas>1000){attesas=1000;}

            }

        }
        else if(piu_set == LOW){ contaimpulsopiu=0;}

       if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;

        meno_set = !meno_set;
        if( attesas > 0 )
        {
          attesas=attesas-10;
        contaimpulsomeno++;

        if (contaimpulsomeno>10) {
        attesas=attesas-30;
          if(attesas<0){attesas=0;}
                                  }
        }

      }

   else if(meno_set == LOW){ contaimpulsomeno=0;}
    }

    lcd.setCursor(0,1);  //Scrivo il numero di scatti

     if(attesas==1000){lcd.print(attesas/1000); lcd.print("\"   ");}
     else{lcd.print(attesas); lcd.print("ms   ");}

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

     }//switch
   }//if

   /*-------------------------------Trigger LASER----------------------------*/
    if(mode==3){
  switch (principale3)
  {
  case 0:    //Schermata HOME

  option_set = digitalRead(OPTION);
  meno_set = digitalRead(MENO);
  piu_set = digitalRead(PIU);

    // codice per pagina nr. 0 (HOME)
    lcd.setCursor(0,0);
    lcd.print("Trigger     ");

if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {

      tempo_btn = millis();
      set = !set;
    }

   if(set == HIGH)
    {
      /*------Mod Laser Sensore interno e scatto flash---------*/
      if(setmodL==0 && setsensorLaser==0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(LDR);
      sogliaLDR=letturaLDR-sensLDRLaser;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(LDR);
      if(letturaLDR < sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Barriera       ");
        lcd.setCursor(0,1);
        lcd.print("Fermata!        ");
        delay(attesal);
        lampeggio();

        delay(800);

    }}
      }
       /*------Mod Laser Sensore interno e scatto Reflex---------*/
      if(setmodL==1 && setsensorLaser==0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(LDR);
      sogliaLDR=letturaLDR-sensLDRLaser;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(LDR);
      if(letturaLDR < sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Barriera       ");
        lcd.setCursor(0,1);
        lcd.print("Fermata!        ");
        delay(attesal);
        scatto();

        delay(800);

    }}
      }

      /*------Mod Laser Sensore esterno e scatto flash---------*/
      if(setmodL==0 && setsensorLaser==1){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(EXT);
      sogliaLDR=letturaLDR-sensLDRLaser;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(EXT);
      if(letturaLDR < sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Barriera       ");
        lcd.setCursor(0,1);
        lcd.print("Fermata!        ");
        delay(attesal);
        lampeggio();

        delay(800);

    }}
      }
       /*------Mod Laser Sensore esterno e scatto Reflex---------*/
      if(setmodL==1 && setsensorLaser==1){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(EXT);
      sogliaLDR=letturaLDR-sensLDRLaser;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(EXT);
      if(letturaLDR < sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Barriera       ");
        lcd.setCursor(0,1);
        lcd.print("Fermata!        ");
        delay(attesal);
        scatto();

        delay(800);

    }}
      }

       /*------Mod Laser Sensore interno e scatto Misto---------*/
      if(setmodL==1 && setsensorLaser==0){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(LDR);
      sogliaLDR=letturaLDR-sensLDRLaser;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(LDR);
      if(letturaLDR < sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Barriera       ");
        lcd.setCursor(0,1);
        lcd.print("Fermata!        ");
        delay(attesal);
        misto();

        delay(800);

    }}
      }

      /*------Mod Laser Sensore esterno e scatto Misto---------*/
      if(setmodL==1 && setsensorLaser==1){
     if(passaggio==0 || option_set == HIGH){
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Calib...");
      letturaLDR=analogRead(EXT);
      sogliaLDR=letturaLDR-sensLDRLaser;
      delay(1500);
      passaggio++;
    }

      else if(passaggio =!0){
        letturaLDR=analogRead(EXT);
      if(letturaLDR < sogliaLDR){
        lcd.setCursor(0,0);
        lcd.print("Barriera       ");
        lcd.setCursor(0,1);
        lcd.print("Fermata!        ");
        delay(attesal);
        misto();

        delay(800);

    }}
      }

   }
    lcd.setCursor(0,1);
    if(set == LOW){
      passaggio=0;
      lcd.print("Laser  ");

    lcd.write(1);
    lcd.print("            ");}
    else{
      lcd.print("Laser  ");

    lcd.write(2);
    lcd.print("            ");}

    break;

    case 1:

    lcd.setCursor(0,0);
    lcd.print("Set Mod         ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(setmodL < 2)
        setmodL++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( setmodL > 0 )
          setmodL--;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(setmodL==0){lcd.print("Flash            ");}
    else if(setmodL==1){lcd.print("Reflex       ");}
    else lcd.print("Ref+Fl");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

    case 2:

    lcd.setCursor(0,0);
    lcd.print("Sensore         ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(setsensorLaser < 1)
        setsensorLaser++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( setsensorLaser > 0 )
          setsensorLaser--;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(setsensorLaser==0){
    lcd.print("In");
    }
    else lcd.print("Ext");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 3:

    lcd.setCursor(0,0);
    lcd.print("Sensib.              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(sensLDRLasersetting < 5)
        sensLDRLasersetting++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( sensLDRLasersetting > 0 )
         sensLDRLasersetting--;
      }
    }
    lcd.setCursor(0,1);

    if(sensLDRLasersetting==0){sensLDRLaser=25; lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6);}

    else if(sensLDRLasersetting==1){sensLDRLaser=20; lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6); lcd.write(6);}
    else if(sensLDRLasersetting==2){sensLDRLaser=15; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6); lcd.write(6);}
    else if(sensLDRLasersetting==3){sensLDRLaser=10; lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6); lcd.write(6);}
    else if(sensLDRLasersetting==4){sensLDRLaser=5;  lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(6);}
    else if(sensLDRLasersetting==5){sensLDRLaser=2;  lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5); lcd.write(5);}

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 4:

    lcd.setCursor(0,0);
    lcd.print("Delay              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if (attesal<1000){
        attesal=attesal+10;

        contaimpulsopiu++;}

        if (contaimpulsopiu>10) { 

          attesal=attesal+30;
          if (attesal>1000){attesal=1000;}

            }

        }
        else if(piu_set == LOW){ contaimpulsopiu=0;}

       if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;

        meno_set = !meno_set;
        if( attesal > 0 )
        {
          attesal=attesal-10;
        contaimpulsomeno++;

        if (contaimpulsomeno>10) {
        attesal=attesal-30;
          if(attesal<0){attesal=0;}
                                  }
        }

      }

   else if(meno_set == LOW){ contaimpulsomeno=0;}
    }

    lcd.setCursor(0,1);  //Scrivo il numero di scatti

     if(attesal==1000){lcd.print(attesal/1000); lcd.print("\"   ");}
     else{lcd.print(attesal); lcd.print("ms   ");}

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

     }//switch
   }//if

   /*-------------------------------Trigger Movimento----------------------------*/
    if(mode==4){
  switch (principale4)
  {
  case 0:    //Schermata HOME

  option_set = digitalRead(OPTION);
  meno_set = digitalRead(MENO);
  piu_set = digitalRead(PIU);

    // codice per pagina nr. 0 (HOME)
    lcd.setCursor(0,0);
    lcd.print("Trigger     ");

if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {

      tempo_btn = millis();
      set = !set;
    }

   if(set == HIGH)
    {
      pinMode(EXT_DIGIT, INPUT);
      int valorePIR = digitalRead(EXT_DIGIT);
      /*------Mod Movimento scatto flash---------*/
      if(setmodPIR==1){

        if(valorePIR == HIGH){ //was motion detected
         lcd.setCursor(0,0);
        lcd.print("Mov.       ");
        lcd.setCursor(0,1);
        lcd.print("Rilevato        ");
        delay(attesaPIR);
        lampeggio();

        delay(3500);
  }
    }

       /*------Mod Movimento scatto Reflex---------*/
      if(setmodPIR==0){

        if(valorePIR == HIGH){ //was motion detected
         lcd.setCursor(0,0);
        lcd.print("Mov.       ");
        lcd.setCursor(0,1);
        lcd.print("Rilevato        ");
        delay(attesaPIR);
        scatto();

        delay(3500);
  }
      }

       /*------Mod Movimento scatto Misto---------*/
      if(setmodPIR==2){

        if(valorePIR == HIGH){ //was motion detected
         lcd.setCursor(0,0);
        lcd.print("Mov.       ");
        lcd.setCursor(0,1);
        lcd.print("Rilevato        ");
        delay(attesaPIR);
        misto();

        delay(3500);
  }
      }

   }
    lcd.setCursor(0,1);
    if(set == LOW){
      passaggio=0;
      lcd.print("PIR    ");

    lcd.write(1);
    lcd.print("            ");}
    else{
      lcd.print("PIR    ");

    lcd.write(2);
    lcd.print("            ");}

    break;

    case 1:

    lcd.setCursor(0,0);
    lcd.print("Set Mod         ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if(setmodPIR < 2)
        setmodPIR++;
      }

      if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( setmodPIR > 0 )
          setmodPIR--;
      }
    }
    lcd.setCursor(0,1);  //Scrivo il numero di scatti
    if(setmodPIR==0){lcd.print("Reflex            ");}
    else if(setmodPIR==1){lcd.print("Flash       ");}
    else lcd.print("Ref+Fl");

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

  case 2:

    lcd.setCursor(0,0);
    lcd.print("Delay              ");

    if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
    {
      tempo_btn = millis();
      set = !set;
    }

    if(set == HIGH)
    {
      //Abilita l'ingresso in modalita' configurazione
      n_piu = 0;
      n_meno = 0;
      //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      piu_set = digitalRead(PIU);
      meno_set = digitalRead(MENO);

      if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if (attesaPIR<1000){
        attesaPIR=attesaPIR+10;

        contaimpulsopiu++;}

        if (contaimpulsopiu>10) { 

          attesaPIR=attesaPIR+30;
          if (attesaPIR>1000){attesaPIR=1000;}

            }

        }
        else if(piu_set == LOW){ contaimpulsopiu=0;}

       if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;

        meno_set = !meno_set;
        if( attesaPIR > 0 )
        {
          attesaPIR=attesaPIR-10;
        contaimpulsomeno++;

        if (contaimpulsomeno>10) {
        attesaPIR=attesaPIR-30;
          if(attesaPIR<0){attesaPIR=0;}
                                  }
        }

      }

   else if(meno_set == LOW){ contaimpulsomeno=0;}
    }

    lcd.setCursor(0,1);  //Scrivo il numero di scatti

     if(attesaPIR==1000){lcd.print(attesaPIR/1000); lcd.print("\"   ");}
     else{lcd.print(attesaPIR); lcd.print("ms   ");}

    if(set == LOW){
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(4);
      lcd.print("            ");}
    else{
      lcd.print("         ");
      lcd.setCursor(7,1);
      lcd.write(3);
      lcd.print("            ");}

  break;

     }//switch
   }//if

}//loop

  void conversioneminutif(float valorentrataf){

long minuti=0;
long secondi=0;

        secondi = valorentrataf/1000;
        minuti=secondi/60;
        secondi=secondi-(minuti*60);
         lcd.setCursor(0,1);
         lcd.print(minuti);
         lcd.print("'");
         lcd.print(secondi);
         lcd.print("\"");
}

void conversioneminuti(long valorentrata){

long minuti=0;
long secondi=0;

        secondi = valorentrata/1000;
        minuti=secondi/60;
        secondi=secondi-(minuti*60);
         lcd.setCursor(0,1);
         lcd.print(minuti);
         lcd.print("'");
         lcd.print(secondi);
         lcd.print("\"");
}

void backlight(){

  currentTime = millis();
  if(currentTime >= (loopTime + 10000)){
    digitalWrite(BACKLIGHT, LOW);   // toggles the LED on/off
    loopTime = millis();  // Updates loopTime
  }

  if(enter == HIGH || esc == HIGH || option == HIGH || piu == HIGH || meno == HIGH || option_set == HIGH || piu_set == HIGH || meno_set == HIGH){loopTime=millis(); digitalWrite(BACKLIGHT, HIGH);}

}

void scatto(){
        digitalWrite(outpin, HIGH); //Scatta
        delay(shutter_on); //Attendi fine scatto
        digitalWrite(outpin, LOW); //Stop scatto
             }

void lampeggio(){
        digitalWrite(flash, HIGH); //Scatta
        delay(lampo); //Attendi fine scatto
        digitalWrite(flash, LOW); //Stop scatto
            }

void misto(){
        digitalWrite(outpin, HIGH); //Scatta
        digitalWrite(flash, HIGH); //Scatta
        delay(shutter_on); //Attendi fine scatto
        digitalWrite(flash, LOW); //Stop scatto
        digitalWrite(outpin, LOW); //Stop scatto
}

Nel precedente articolo ti sei fermato alla linea 273, in questo articolo partiamo dalla riga successiva contenente del codice la 278:

linea 278: verifica il valore della variabile mode;

linea 279: se il valore verificato alla linea 278 è 0 entra nella condizione, avrai già intuito che la prima modalità ( con valore 0 ) è l’intervallometro, il comando switch, già visto in precedenza, verifica il valore della variabile principale con una serie di condizioni specificate con il comando case e chiuse dal comando break;

linea 281: confronta il valore di principale presente alla linea 279 con il valore 0, se principale == 0 allora esegue i comandi che seguono. Dal commento di Alessandro puoi dedurre che ci troviamo nella prima schermata che chiama home;

linea 284: posiziona il cursore sulla prima linea del display e sul primo carattere;

linea 285: scrivi la stringa “Timer          “;

linea 286: sposta il cursore sulla prima colonna della seconda linea;

linea 287: scrivi la stringa “Scatti                   “;

linea 289: è una sintassi che hai già incontrato, serve a determinare se un bottone è stato premuto in un dato intervallo di tempo, in questa linea il bottone che si aspetta sia stato premuto è enter;

linea 291: se il bottone enter è stato premuto imposta il valore della variabile NScatti come NScattiSetting;

linea 292: anche questa operazione l’hai già incontrata, imposta il tempo di pressione uguale al valore in millisecondi ricavandolo dalla funzione millis();

linea 293: esegui una negazione del valore della variabile set,in pratica se set è HIGH la porti a LOW e viceversa. Di default se non sei in modalità setting questa variabile è impostata a LOW, altrimenti il suo valore passa ad HIGH come in questo caso;

linea 296: verifica che la variabile set sia impostata a HIGH vuol dire che hai premuto enter nel passaggio precedente entrando di fatto nella sotto-modalità del TriggerT;

linea 298: porta a LOW il valore del pin blacklight, se ricordi lo schema di collegamento questo pin è collegato attraverso un transistor al terminale negativo della retroilluminazione dell’LCD per cui portarlo a LOW equivale ad accendere il display;

linea 299: verifica che il valore di Nscatti sia diverso da 0 e che quello dell’otturatore sia a 0;

linea 301: se la condizione alla linea 299 è verificata allora decrementa il valore di NScatti di un valore, ricorda che la notazione Variabile++ incrementa di un punto il valore di Variabile e Variabile– decrementa di un punto il medesimo valore;

linee 302-304: pulisci i testi presenti sull’LCD, posiziona il cursore alla colonna 0 della riga 0 e scrive la stringa “Next:”

linee 306-308: posiziona il cursore alla prima colonna della seconda riga del display e scrivi “Fine:” seguito dal numero di scatti riportati nella variabile NScatti;

linea  310: attendi il tempo impostato come wakewait, se controlli nella seconda parte di questa serie di articoli troverai che questo valore indica il tempo necessario a far risvegliare la macchina fotografica dalla modalità di risparmio energetico;

linea 311: scatta, per farlo chiama la funzione scatto() scritta da Alessandro e che vedrai quando arriveremo alla linea 2091;

linea 313: decrementa la variabile shutter_off_setting di un valore pari a 1000;

linea 314: inizia un ciclo di tipo while la condizione è che il valore di shutter_off_setting sia maggiore di 0;

linea 315: posiziona il cursore alla quinta colonna della prima riga, dopo la stringa “Next:” scritta precedentemente;

linea 316: imposta il valore di shutter_off_settingL identico a quelo di shutter_off_setting in pratica usi una variabile temporanea per immagazzinare il valore prima di decrementarlo;

linea 317: scrivi il vaore di shtter_off_settingL diviso 1000 sul display;

linee 318-319: scrivi sul display ” seguito da 11 spazi, in pratica hai scritto il simbolo dei secondi dopo il valore 🙂

linea 320: decrementa di 500 ( mezzo secondo calcolato in millisecondi ) il valore di shutter_off_setting;

linea 321: attendi 1/2 secondo ( 500 millisecondi ) prima di ripetere il ciclo while;

quello che hai ottenuto con le linee 314-321 è un conta tempo alla rovescia di 500 millisecondi alla volta;

linea 327: la condizione di elseif è verificata solo quando quella di if non trova riscontro, per cui in questa linea testi che il valore di NScatti non sia 0 e che anche quello dell’otturatore non sia a 0;

linea 329: se la condizione di elseif è verificata decrementi il valore di NScatti come già visto alla linea 301;

linee 330-336: sono identiche a quelle descritte alla linee 302-308;

linea 338: attende il tempo di risveglio della macchina fotografica;

linea 339: posiziona il cursore all’ottava colonna della prima riga;

linea 340: printa il valore “B”;

linea 341: porta ad HIGH il valore di outpin a cui è collegato lo scatto della macchina fotografica, hai aperto l’otturatore;

linea 342: attendi il tempo di apertura dell’otturatore impostato più 500 millisecondi;

linea 343: chiudi l’otturatore portando a LOW il valore del pin outpin;

linee 345-353: esegui le stese operazioni viste alle linee 314-321;

linea 359: se gli scatti sono uguali a 0 esegui le linee che seguono;

linea 360: spegni il display portando ad HIGH il valore del pin connesso alla retroilluminazione;

linee 361-365: scrivi sul display sulla prima riga “Finito!    ” e sulla seconda “A casa!    “;

linea 366: attendi 4 secondi prima di proseguire;

linea 368: inverti il valore di set, siccome è HIGH portalo a LOW;

linea 374: verifica che principale sia impostata a 1 ed esegui le linee contenute tra questa e la linea 433;

linee 376-377: pulisci il display e scrivi “Set Int:     “;

linea 379: verifica la pressione del bottone enter se è stato premuto esegue le linee 381 e 382;

linea 381: reimposta il valore di tempo_btn come millis();

linea 382: inverte il valore di set essendo stata impostata a LOW alla fine delle operazioni precedenti lo riporta ad HIGH per entrare nella modalità di setting;

linea 385: verifica che set sia impostato ad HIGH, significa che hai premuto enter e sei entrato nella modalità di impostazioni ( setting );

linee 387-392: imposta le variabili n_piu ed n_meno  a 0 e predisponi la lettura dei pulsanti piu e meno con il comando digitalRead assegnando il valore alle rispettive variabili piu_set e meno_set;

linee 394-401: verifica che il pulsante più sia stato premuto ed in caso positivo incrementa il valore di n_piu di 1, inverte il valore di piu_set ossia il valore letto dal pulsante ed infine incrementa il valore di shutter_off di 1000 millisecondi;

linee 403-410: sono linee identiche alle linee 394-401 con l’unica differenza che si opera sulle variabili meno e che c’è un controllo alla linea 408 che impedisce a shutter_off di arrivare a valori negativi;

linea 412: posiziona il cursore alla prima colonna della prima riga;

linea 413: verifica che il valore di shutter_off sia minore di 60000 in quanto 60000/1000 = 60 secondi se supera tale valore allora non può essere più scritto con la notazione secondi ma deve essere scritto come: minuti secondi;

linee 414-416: scrivi sul display il valore in secondi impostato nella variabile shutter_off;

linea 420: siccome il valore di shutter_off è superiore a 60000 usa la funzione conversioneminuti() per scrivere il valore sull’LCD, puoi trovare questa funzione alla linea 2049 dello sketch;

linee 422-431: verifica il valore della variabile i set e se è HIGH o LOW crive rispettivamente sul display 3 o 4;

linea 453: verifica che il valore di principale sia 2;

linee 437-438: imposta il cursore alla prima colonna della prima riga e scrive “N scatti           “;

linee 440-445: sono identiche alle linee 379-383 viste sopra;

linee 447-455: sono identiche alle linee 385-392;

linea 457: verifica la pressione del pulsante piu;

linee 459-461:  sono identiche alla linee 405-406 viste sopra;

linea 462: incrementa il valore di NscattiSertting;

linea 464: incrementa il valore di contaimpulsopiu;

linee 466-470: verifica che il valore contampulsopiu sia maggiore di 10 in tal caso incrementa il valore di NScattiSetting di 10; in pratica ogni volta che incrementi NScattiSetting incermenti anche contaimpulsopiu ed l raggiungimento di 10 di quest’ultimo valore il valore di NScattiSetting si incrementa di ulteriori 10;

linea 473: se il valore letto sul bottone piu è LOW resetta il valore di contaimpulsopiu;

linee 475-494: esegui le stesse operazioni viste alla linee 457-473 ma decrementando il valore dei contatori e degli scatti alla pressione del pulsante meno;

linee 497-509: sono linee identiche alle linee 422-431;

linea 513: verifica che il valore della variabile principale sia 3;

linee 514-515: imposta il cursore alla prima colonna della prima riga del display LCD e scrivi “Bulb            ”

linee 517-522: verifica la pressione del bottone enter ed in caso di pressione entra in modalità di configurazione;

linee 524-531: sono linee identiche alla linee 447-455;

linea 533: verifica la pressione del bottone piu;

linee 535-537: reimposta il valore di tempo_btn, incrementa il valore di  n_piu e inverte il valore di piu_set;

linea 538: incrementa il valore della variabile otturatore di 1000;

linea 539: incrementa il valore di contaimpulsopiu di uno;

linee 540-542: verifica che il valore di contaimpulsopiu sia maggiore di 15 ed incrementa di 10000 il valore della variabile otturatore;

linea 545: se il valore letto sul pulsante è LOW reimposta il valore di contaimpulsopiu;

linee 547-559: esegue le medesime operazioni delle linee 533-545 con la differenza di invertire il conteggio decrementando le variabili e di lavorare sl bottone meno;

linea 562: imposta il cursore sulla prima colonna della seconda riga del display LCD;

linea 564-574: verifica il valore della variabile otturatore se il valore è inferiore a 60000 lo scrivi con la notazione in secondi, se il valore è superiore a 60000 lo scrive con la funzione conversioneminuti() che trasforma il valore nella notazione: minuti secondi;

linea 576: se il valore della variabile otturatore è 0 scrivi sul display “No”;

linee 578-587: sono identiche alle linee 500-509 viste in precedenza;

Per questo articolo abbiamo concluso, il tuo trigger ha ora un intervallometro e sai come utilizzarlo e come eseguire le modifiche che ti occorrono per personalizzarlo ed adattarlo al tuo progetto.

Buon divertimento !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/triggert-trigger-multiuso-quarta-parte.html

2 comments

    • niko_la on 28 Set 2012 at 05:18
    • Reply

    ciao,
    mi scuso anticipatamente per la domanda che sto per farti, sicuramente colpa della mia ignoranza con arduino..!!
    ma collegando il tutto (tranne i sensori, essendo interessato a testare l’intervallometro, non li ho messi e mi sono fermato ai fotoaccoppiatori!! spero che non sia per questo..) oltre alle scritte introduttive si blocca sulla schermata “Timer Scatti” ed i pulsanti non funzionano tranne il “MENO” (che se tengo premuto fa intravedere una scritta in maniera molto veloce tipo “Timer 300” o “Bulb4” “) ed il tasto “ENTER” che fa iniziare il conto alla rovescia…!!

    ti sembra qualcosa di familiare e risolvibile..??
    o sono io troppo ignorante e sfigato..??
    grazie in anticipo per la cortese attenzione..!!

    1. Ciao Nikola,
      nessuno nasce con la conoscenza, ce la facciamo tutti con l’esperienza e lo studio, diceva mio nonno.
      Non preoccuparti non tutto riesce al primo colpo, ti consiglio di verificare che la parte elettronica sia costruita in modo corretto, magari è solo qualche pulsante che non fa il suo dovere.
      Per testare i pulsanti trovi decine di articoli nel blog o nella sezione “Corso Arduino”, giro la domanda ad Alessandro che ha realizzato il progetto perchè possa aiutarti.

      Mauro

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.