come avere delay diversi??

ciao a tutti ragazzi,
volevo chiedervi una cosa riguardo al delay in generale.
ho costruito su una breadboard un circuito composto da:
rilevatore di temperatura (lm35dz)
display
sensore di luminosità con buzzer(piu' aumenta la luce piu' aumenta la frequenza del suono)
ora ho un problema, il sensore come giusto che sia deve aggiornare la temperatura ogni secondo mentre il sensore di luminosita' dovrebbe rimanere attivo "sempre" (o almeno magari impostare un timer di spegnimento cosi' imparo un'altra funzione),mi accade quindi che ogni secondo il sensore aggiorna la temperatura e che ogni secondo si accende e spegne il buzzer,
volevo quindi chiedervi come fare ad avere 2 delay diversi (non so come si dice) o almeno poter impostare un timer per il buzzer e un delay per il sensore,quindi devono essere indipendenti.Vi posto il codice e vi ringrazio molto.

#include <LiquidCrystal.h>
LiquidCrystal schermo(12, 11, 5, 4, 3, 2);
float vref=1.1;

void setup() {
analogReference( INTERNAL );
analogRead(A0);
schermo.begin(16, 2);
}

void loop() {
int sensorReading=analogRead(A5);
int thisPitch = map(sensorReading, 400, 1000, 120, 1500);
tone(9, thisPitch, 10);
delay(1);
float temp = readTemp();
sendTempToLCD( temp );
}
float readTemp()
{
float temp = 0.0;
int val = 0;
int nread = 5;
float somma = 0.0;
for (int i=0; i<nread; i++)
{
val = analogRead( A0 );
temp = ( 100.0 * vref * val ) / 1024.0;
somma += temp;
}
return ( somma / nread );
}

void sendTempToLCD( float temp )
{
schermo.clear();
schermo.setCursor( 0, 0 );
schermo.print( "Temperatura di: ");
schermo.setCursor( 0, 1 );
schermo.print( temp );
schermo.print( ' ' );
schermo.print( (char) 223 );
schermo.print( 'C' );
delay(1000) ;
}

Ciao Bernardo, prova a guardarti il blink without delay :wink:

ho letto questo argomento,
se ho capito bene, devo usare il sensore come nel sito invece usa il led e il codice mio del buzzer lo devo inserire dove dice
// here is where you'd put code that needs to be running all the time.

// check to see if it's time to blink the LED; that is, if the
// difference between the current time and last time you blinked
// the LED is bigger than the interval at which you want to
// blink the LED.
giusto o sbagliato?

Tutto quello che vuoi eseguire ogni x tempo lo devi mettere dentro le linee tratteggiate

non dimenticare di dichiarare:

long previousMillis = 0;
const long interval = 1000;

  if(millis()- previousMillis > interval) 
{   
    previousMillis = millis();  
    //------------------------------------------------

    // esegui il codice qui dentro ogni tot  ms (che sarebbe la variabile long interval = 1000 = 1 secondo)

    //-------------------------------------------------    
  }

Non ho capito cosa intendi per mettere un timer di spegnimento al sensore, i sensori non si spengono mai, al massimo smetti di eseguire i controlli su di esso.
Se ti servono 2 delay differenti o crei un altro ciclo millis() oppure ci metti un contatore dentro a quello che hai.
Usi la base di intervallo 1000, se ti servono 5 secondi conti fino a 5 dentro al delay fatto con il millis() e poi esegui l'altra funzione.
Con un solo ciclo WithoutDelay ne ottieni 2 senza interruzioni del loop che avresti con delay(1000) o (5000), volendo ne puoi annidiare anche altri, ma poi devi stare attento quando azzeri il conta_cicli, poichè se fai male i calcoli comprometti tutti i ritardi

es:

  byte n_cicli; //<<<<< questa non va dentro al void loop() 
  if(millis()- previousMillis > interval) 
{   
    previousMillis = millis();  
    //------------------------------------------------inizio delay base 1000
    n_cicli++; // incremento il contatore ad ogni secondo

    // metti qui il codice da eseguire ogni  secondo

                 // -------------------------------------inizio secondo delay
                      if(n_cicli == 5 || n_cicli == 10) // se i cicli passati sono 5 quindi 5*1000=5 sec o multipli
                      {
                         // metti qui il codice da eseguire ogni 5 secondi                     
                      }
                 // -------------------------------------fine secondo delay

                 // -------------------------------------inizio terzo delay
                      if(n_cicli == 10) // se i cicli passati sono 10 quindi 10*1000=10 sec 
                      {
                         // metti qui il codice da eseguire ogni 10 secondi
                         n_cicli=0; //quando ho finito di eseguire il codice azzero e ricomincio a contare 
                      }
                 // -------------------------------------fine terzo delay

    //-------------------------------------------------fine delay base 1000    
  }

ciao

Ciao,
potresti editare il tuo messaggio e includere il codice tra i tag [code ]?
Li trovi premendo il simbolo # sopra le faccine.

ok ragazzi vi ringrazio, ho risolto, scusate se ho risposto in ritardo..