Pages: [1]   Go Down
Author Topic: come avere delay diversi??  (Read 774 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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) ;
}
Logged

Dueville (VI)
Online Online
Edison Member
*
Karma: 28
Posts: 1722
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Bernardo, prova a guardarti il blink without delay smiley-wink
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://arduino.cc/en/Tutorial/BlinkWithoutDelay
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?
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2758
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;  

Code:
 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:

Code:
 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
« Last Edit: January 11, 2013, 09:07:27 pm by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: