TriggerT: sensore Luce – quinta parte

Sei arrivato alla quinta parte del progetto TriggerT di Alessandro, in questo articolo leggerai il commento alle righe di codice che gestiscono il sensore di luce.

triggert

sensore LDR interno

Se ti sei perso i precedenti articoli puoi seguirli qui:

TriggerT: Trigger multiuso – prima parte

TriggerT: Trigger multiuso – seconda parte

TriggerT: Trigger multiuso – terza parte

TriggerT: Intervallometro – quarta parte

Come sempre ti riporto l’intero sketch così che tu possa copiarlo nel tuo progetto e la trattazione riga per riga ti serve se vuoi apportare delle modifiche al progetto per renderlo più adatto 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
            }

le righe di codice sono sempre molte, è un progetto complesso, per cui iniziamo subito dalla linee dove ci siamo fermati:

linea 594: come hai già visto alla linea 278 il valore della variabile mode definisce la funzione ( o modalità ) in cui vuoi operare, se l’intervallometro era innescato dal valore 0 il trigger di luce è la modalità 1;

linea 595: anche in questa modalità hai un menu di gestione e la variabile che definsce in quale schermata di menu deve posizionarsi il trigger è principale1 similmente all’intervallometro dove la variabile utilizzata per tener traccia del menu era principale. Qual’è il vantaggio di utilizzare due variabili per scorrere e schermate del menu? Il principale vantaggio è che trovandoti in una funzione del TriggerT e cambiando su un’altra avrai per ogni funzione una sorta di punto di rientro identico a quello di uscita, ossi a saprai per ogni funzione in che menu eri prima di uscire cambiando modalità, la seconda è che non devi resettare le variabili ad ogni cambio di funzione, se usassi una sola variabile e non eseguissi i reset cambiando funzione ti troveresti ad entrare direttamente in un menu specifico della funzione quando il tuo intento era di impostare un parametro prima dell’esecuzione della funzione ed invece sei entrato nel menu di avvio;

linea 597: lo dice il commento stesso, se il valore di principale1 è 0 sei nella schermata Home della funzione;

linee 599-601: leggi i valori dei pulsanti option, più e meno ed assegna il loro valore alle rispettive variabili;

linee 604-605: posiziona il cursore alla posizione (0,0) primo carattere della prima riga e scrivi: “Trigger:    “;

linea 607: verifica la pressione del pulsante enter, la pressione di questo pulsante ti porta nella sotto-schermata di home;

linea 610: resetta il valore della variabile tempo_btn usata per il debounce del pulsante;

linea 611: inverte il valore della variabile set che utilizzi per entrare nella modalità operativa;

linea 614: verifica il valore di set se HIGH entra nella modalità operativa del sensore di Luce;

linea 616: verifica il valore della variabile sensorLuce in funzione della quale definisci se utilizzare il sensore interno o il sensore esterno, il valore 0 indica di utilizzare il sensore interno;

linea 617: esegui una doppia verifica che il valore della variabile passaggio sia 0 o che il tasto opzione sia premuto, in pratica se si verifica una di queste condizioni stai impostando la soglia di sensibilità del sensore interno;

linee 618-620: imposti il display per scrivere “Calib…”;

linea 621: leggi il valore analogico sul pin a cui è collegato il sensore di luce;

linea 622: imposta la soglia come valore letto sul sensore sommato al valore di sensibilità impostato. Questo passaggio è importante perchè il valore di soglia non è impostato in modo arbitrario ma in relazione alla luce dell’ambiente in cui il triggerT sta operando, la misura del valore di luce percepito dall’ambiente alla linea 621 serve proprio a questa taratura;

linea 623: attendi un secondo e 1/2;

linea 624: incrementa il valore di passaggio a 1, questo ti consente di passare alla fase successiva;

linea 627: il valore 1 della variabile passaggio indica che puoi iniziare ad operare, ma sopratutto indica che hai già eseguito la taratura del sensore luce;

linea 628: leggi il valore dell’LDR con il comando analogRead( pin );

linea 629: se il valore letto dall’LDR è maggiore della soglia impostata allora hai registrato una attività;

linee 630-633: scrivi sulla prima riga del display “Soglia    ” e sulla seconda “Luce!    “;

linea 634: attendi il tempo impostato nella variabile attesa;

linea 635: scatta !!! si richiamando la funzione di scatto;

linea 637: attendi 800 millisecondi dopo lo scatto;

linee 643-668: eseguono le medesime operazioni appena viste per il sensore esterno, ossia quando il valore della variabile sensoreLuce è diverso da 0;

linea 671: riporta il cursore del display al carattere 0 della seconda linea;

linee 672-682: in funzione del valore della variabile set scrivi sul display il valore in byte 1 o 2;

linea 686: sei nel menu 2 ossia quello in cui il valore della variabile principale1 è 1;

linee 688-689: scrivi sukl display alla prima riga la stringa “Sensore         “;

linee 691-695: verifica la pressione del pulsante enter;

linea 697: se hai premuto enter sei nella modalità di configurazione del sensore luce;

linee 700-704: resetta il valore delle variabili n_piu ed n_meno e leggi il valore dai pin connessi ai pulsanti piu e meno assegnando a piu_set e meno_set il valore letto;

linea 706: verifica la pressione del pulsante piu;

linea 708: reimposta il valore di tempo_btn;

linea 709: incrementa di 1 il valore della variabile n_piu;

linea 710: inverti il valore della variabile piu_set in modo che non risulti premuto;

linee 711-713: se il valore di sensorLuce è minore di 1 incrementi il suo valore, stai impostando quale sensore vuoi utilizzar tra interno ed esterno;

linee 715-722: esegue le stesse operazioni viste alla linee 706-713 ma per il pulsante meno e decrementando il valore della variabile sensorLuce;

linee 724-728: in funzione del valore della variabile sensorLuce scrive sul display In o  Ext per indicarti che stai definendo come sensore da utilizzare quello interno o esterno;

linee 730-739: in funzione del valore della variabile set scrivi sul display il valore in byte 3 o 4;

linea 743: inizia qui il terzo menu del sensore di luce, se il valore di principale1 è 2 esegui le istruzioni successive;

linee 745-746: scrivi sulla prima riga del display “Sensib.            “;

linee 748-752: verifica la pressione del pulsante enter resettando il valore della variabile tempo_btn e invertendo il valore di set;

linea 754: se set ha valore HIGH entra nella sotto schermata;

linee 757-761: sono identiche alle linee 700-704;

linee 763-779: sono identiche alle linee 706-722 con la sola differenza che in questa modalità non imposti il valore del sensore da utilizzare ma le soglie di sensibilità del sendore che utilizzerai;

linee 784-790: in funzione del valore assunto dalla variabile  sensLDRsetting imposti la soglia di sensibilità del sensore, impostando la variabile sensLDR;

linee 793-803: scrivi sul display il valore in byte di 3 o 4 in funzione del valore della variabile set;

linea 807: quando il valore della variabile principale1 è 3 entri in questo menu;

linee 809-810: scrivi sulla prima linea del display la stringa “Delay     “;

linee 812-816: controlla la pressione del pulsante enter;

linea 818: entra nella modalità di configurazione del tempo di attesa;

linee 821-825: sono identiche alle linee 757-761 e 704-704;

linea 827: controlla la pressione del pulsante piu;

linee 829-831: esegui le stesse operazioni già viste in precedenza alla pressione del pulsante piu;

linee 832-835: se il valore della variabile attesa è minore di 1000 incrementa di 10 in 10 il valore della stessa variabile e incrementa di 1 il valore della variabile contaimpulsopiu;

linee 837-844: quando il vaore di contaimpulsopiu raggiunge il valore 10 il valore di attesa si incrementa di 30 in 30. se il valore di attesa supera i 1000 viene reimpostato a 1000;

linea 845: se il valore letto sul pulsante piu è LOW imposta il valore di contaimpulsopiu a 0;

linee 847-867: eseguono la stessa operazione vista per il pulsante piu ma applicata al pulsante meno;

linee 871-872: se il valore di attesa è 1000 scrive sul display il valore di attesa diviso 1000, in caso contrario scrive il valore così come è impostato;

linee 874-883: in funzione del valore della variabile set scrive sul display il valore in byte di 3 o 4;

linea 887: chiude il comando switch che definisce la posizione del menu in funzione della variabile principale1;

linea 888: chiude l’if che definisce la modalità di sensore di luce;

Spero che anche questa spiegazione sia chiara e che tu ti senta in grado di modificare lo sketch per adattarlo alle tue esigenze, variando ad esempio la velocità di incremento del valore di attesa di 50 in 50 o altre modifiche a te utili;

 

Buon divertimento !!!

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/triggert-sensore-luce-quinta-parte.html

14 commenti

Vai al modulo dei commenti

  1. grazie veramente di tutto, questa guida era quello che cercavo da tanto tempo complimenti per l’impegno, professionalità e passione che ci metti.
    ho fatto tutto come descritto più volte, almeno credo di non aver sbagliato qualcosa, ma anch io ho quel problema che ha postato tempo fa un’altro lettore cioe quello che il meno mi fa girare il menu velocemente e enter va in modalita scatti time laps senza controllo. perfavore aiuto grazie di tutto comunque.

    1. Ciao Cono, purtroppo non essendo un mio progetto non ho mai provato ad assemblarlo o testarlo, lascio online il tuo commento perché l’autore o qualche altro appassionato che lo ha risolto possa risponderti.

      1. Grazie Mauro molto gentile.

  2. Ciao Mauro, ma non hai più continuato l’analisi dello sketch di questo bel progetto? ho conosciuto in un forum fotografico Alessandro, l’ideatore, ma l’analisi che stai facendo tu mi pare davvero molto dettagliata e ben fatta…come mai è stata abbandonata? Siamo a 900 righe su più di 2000, un’analisi del resto del codice sarebbe d’aiuto per molti che stanno tentando di riprodurre questo apparecchio !!

    1. Ciao Giorgio,
      ho interrotto la descrizione in primo luogo a causa del ripetersi delle istruzioni sempre uguali che ho reputato superflue descrivere ciclicamente; in secondo luogo a causa di un decremento di interesse su quell’articolo e sul blog stesso da parte di appassionati non interessati alla fotografia.

    • Cono il 18 Maggio 2014 alle 16:55
    • Rispondi

    Ciao Giorgio ma a te funziona?

    1. Ciao Cono, no…oggi ho iniziato a mettere mani con i componenti (ho aspettato un mesetto che alcuni pezzi arrivassero dalla cina) e non mi trovo con il funzionamento…nello specifico mi da problemi sin dall’inizio bloccando la schermata sulla scritta “timer scatti”…ora vedrò di studiare bene il codice e capire dove è l’inghippo…

      1. Ottimo Giorgio !!! spirito giusto per risolvere i problemi.
        Se alla fine vorrai pubblicare le modifiche e commentarle sarò felice di offrirti spazio sul blog.

    • Cono il 18 Maggio 2014 alle 16:57
    • Rispondi

    Mauro io non finirò mai di ringraziarti per tutto fin ora.

    1. Ciao Cono,
      io faccio il possibile 🙂

    • Rosario il 3 Luglio 2014 alle 21:07
    • Rispondi

    Ciao Mauro, sarebbe possibile “avere” uno sketch (estrapolato dalll stesso triggerT) per gestire la retroilluminazione dell’lcd alla pressione dei pulsanti ? Grazie in anticipo.

    1. Ciao Rosario,
      puoi estrapolare quello che ti occorre da uno dei miei articoli sul Dolly.
      Se non ricordo male ho anche pubblicato un articolo introduttivo in cui spiego come funziona li menu e la retro illuminazione.

    • Davide il 30 Dicembre 2016 alle 09:03
    • Rispondi

    Ciao Mauro. ho un dubbio su come si connette alla macchina fotografica. I cavi che sono in uscita per la reflex bisogna saldarli a un jack?

    1. Ciao Davide,
      solitamente si, tuttavia io non sono un tecnico delle macchine fotografiche e ti consiglio di verificare sul manuale o di contattare un centro assistenza.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

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