Progetto funzionante (ma non troppo) Problemi di Timing

Salve a tutti , torno a romper le scatole :slight_smile: .. In breve , sono alle prese con uno sketch che temporizza l'accensione di una striscia led tramite l'invio di segnali ir.

La parte Hardware è composta da:

Arduino Uno
1pulsante

1 Jumper (un cavetto che chiude il circuito come se fosse un'interruttore(all'epoca non avevo a disposizione altri pulsanti/interruttori)) :o

1 led

1 led ir

Per quantoriguarda l'hardware è tutto collegato correttamente infatti funziona tutto come dovrebbe.

Per quanto rigurada la parte "software" lo sketch dovrebbe funzionare cosi' :

1¬į all'accensione si setta tramite il pulsante il numero di ore all'accensione, e se il jumper √® connesso si settano i quarti d'ora.

2¬įtrascorsi 20 secondi dall'accensione (misurati con la funzione millis) passa alla seconda parte dello sketch , quella che io volgarmente chiamo "display" , cio√® mediante il lampeggi del led si pu√≤ visualizzare il tempo all'accensione,(le ore saranno indicate con un lampeggio di 1 secondo, i minuti con lampeggio di 2 sec).

3¬į una volta terminati i lampeggi si avvia un ciclo di "for" con all'interno soltanto un delay di 1 sec, fino al raggiungimento dei secondi settati .

4¬į "e luce f√Ļ" al termine del ciclo for parte la sequenza di accensione ir.

Funziona tutto ,, ma solo se il "countdown" è inferiore alle 7 ore circa .. infatti se setto meno tempo funziona correttamente..

E' da tempo che provo a risolvere , ma oltre al fatto di dover'attendere 7 ore per verificare se le modifiche apportate funzionano , non ho idea di cosa possa trattarsi.

Allego il codice, e mi scuso se nella spiegazione non sono stato ne chiaro ne preciso, ma sono un "pivellino" :slight_smile:

raffy-ree:
Allego il codice, e mi scuso se nella spiegazione non sono stato ne chiaro ne preciso, ma sono un ‚Äúpivellino‚ÄĚ

? ? ? … se il codice lo alleghi veramente, magari qualcuno ti può aiutare :smiley: :smiley: :smiley:

Guglielmo

#define LED 4                // LED collegato al pin digitale 13  
#define BUTTON 9
#define BUTTON2 8            // pin di input dove è collegato il pulsante  
int IRledPin =  13;          // PIN EMETTITORE IR
int  val = 0;                // si userà val per conservare lo stato del pin di input
int  val2 = 0;  
int contatore = 0;  
int contatore2 = 0;
int time;
int tempo;
int LedUP = 1;
int valore = 0;
int displ = 0;
int lampeggi = 0;
int lampeggi2 = 0;
long int ritardi = 0;
long int totcont = 0;
boolean state = true;


void setup() {  
  pinMode(IRledPin, OUTPUT);
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output  
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
  Serial.begin(9600);
  time = millis();             //prendo il tempo iniziale
}  
  
void loop() 

{ 
  digitalWrite(IRledPin ,LOW);
  val2 = digitalRead(BUTTON2);
  if (val2 ==HIGH){
 
    val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  

    if (val == HIGH) {  
    digitalWrite(LED, HIGH);  //accende il led   
    delay(500);
    contatore = contatore + 1;
    Serial.println(contatore); 
  }  
  else {  
    digitalWrite(LED, LOW);   //spegne il led  
  } 
  }

  else {  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  -_____________________se lo switch non è inserito conteggia i minuti
  
  // controlla che l'input sia HIGH (pulsante premuto)  
  if (val == HIGH) {  
    digitalWrite(LED, HIGH);  //accende il led   
    delay(500);
    contatore2 = contatore2 + 1;
    Serial.println(contatore2); 
  }  
  else {  
    digitalWrite(LED, LOW);   //spegne il led  
  }
    
  }


  

  
  //digitalWrite(13, state);
  if((time+20000)<millis())// 20 secondi per impostare le ore all'accensione
  { 
    for (lampeggi;lampeggi<contatore;lampeggi=lampeggi+1)
    {digitalWrite(LED, HIGH);
    delay(1000); 
    digitalWrite(LED, LOW);
    delay(1000);  
      }

         for (lampeggi2;lampeggi2<contatore2;lampeggi2=lampeggi2+1)
    {digitalWrite(LED, HIGH);
    delay(2000); 
    digitalWrite(LED, LOW);
    delay(2000);  
      }
     contatore = contatore * 4;
     totcont = (contatore+contatore2) * 900;
     Serial.println(totcont);
     Serial.println(contatore);
      { 
      
      for (ritardi;ritardi<totcont;ritardi=ritardi+1)
        {//Serial.println(ritardi);
        delay(1000); //if((time+contatore)<millis())//Se è trascorso il tempo allora..
        }
        SendNikonCode();
      }
}  
} 


// PROCEDURA PER L'INVIO DI PULSIONI A 38KHZ AL PIN IR PER UN CERT NUMERO DI MICROSECONDI.____________________________________________________________________________________________________________

void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait
 
  cli();  // this turns off any background interrupts
 
  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds
 
   // so 26 microseconds altogether
   microsecs -= 26;
  }
 
  sei();  // this turns them back on
}
                     


void SendNikonCode() {

  // led ON

delayMicroseconds  ( 1104  ) ; 
pulseIR   ( 9100  ) ;
delayMicroseconds ( 4240  ) ; 

//.................... sono molti di pi√Ļ ma eccedevano i caratteri consentiti dal forum

}
time = millis(); // azzera il conteggio del tempo
}

Scusate , avevo il blocco, mi diceva che avevo inviato troppi post … =?==??

Ciao, ad un primo sguardo correggi int time (non è int ma unsigned long: http://www.arduino.cc/en/Reference/Millis)

Grazie cam9500,, l'ho provato e sembra funzionare , anche se penso non funzionasse per "totcont" era anche questo int e l'ho modificato con unsigned long.. Grazie