Doppio LOOP


salve. ho creato un termostato con arudino per la mia caldaia. mi piace come sistema domani gli prendo una mille fori e lo faccio standalone in scatola.
unica pecca volevo fagli fare la lettura della temperatura in tempi piu ritardati tipo 10-20 secondi... pero qui ce il problmema..c'è il set-up della temperatura che funziona con 2 tasti...up--down.. e quando premo il valore impostato mi viene visualizzato dopo 20 secondi... visto che ho messo il delay prima della lettura della temperatura.. come potrei separare tale funzione con tempi diversi? la lettura che me la faccia dai 10 secondi in su.... il resto refresh display e altro 1-2 secondi
per rendervi l'idea ecco lo skech:
code: [select]

#include <liquidcrystal.h>
//lcd setup
#define rs  12
#define en  11
#define d7  5 
#define d6  4
#define d5  3
#define d4  2
#define off 7
#define on  6
#define tempp  9
#define tempm  8


#define lm35_pin 2

float vref = 1.1;                       
float tempc;
int tempsoglia = 20;
int reading;

liquidcrystal lcd( rs, en, d7, d6, d5, d4 );

void setup()
{
  lcd.begin( 4, 20 );           
  lcd.setcursor( 0, 0 );
  pinmode(13, output);
 
 
  analogreference( internal );
  analogread( lm35_pin );     
 
   
  pinmode(off, output);
  pinmode(on, output);
   
  pinmode(tempp, input);
  pinmode(tempm, input);
   
  pinmode(13, output);
 
  delay(200);
 //test
  lcd.setcursor( 0, 0 );     
  lcd.print( "......:welcome:.....");
  lcd.setcursor( 0, 1 );     
  lcd.print( "........:test:......");
  lcd.setcursor( 0, 2 );   
  lcd.print( "........:test:......");
 
 
  delay(1000);
  digitalwrite(on, high);
  digitalwrite(off, low);
  digitalwrite(13, high);
  lcd.setcursor( 0, 3 );
  lcd.print( "....run......run....");
 
  delay(1500);
 
  digitalwrite(off, high);
  digitalwrite(on, low);
  digitalwrite(13, low);
  lcd.setcursor( 0, 3 );
  lcd.print( "....off......off....");
 
  delay(2000);
  lcd.clear();
  digitalwrite(off, low);
  digitalwrite(on, low);
  digitalwrite(13, low);
   
  delay(1000);
}

void loop()
{
 
  float temp = readtemp();
  sendtemptolcd( temp );   
   
  if(digitalread(tempm) == high){ tempsoglia--; }
  if(digitalread(tempp) == high){ tempsoglia++; }
   
}

float readtemp()
{
  tempc = analogread(lm35_pin);       
tempc = (5.0 * tempc * 100)/1024.0;
reading = analogread(lm35_pin);
tempc = reading / 10.0;
}

void sendtemptolcd( float temp )
{
  lcd.clear();               
  lcd.setcursor( 0, 0 );   
  lcd.print( "......:welcome:.....");
  lcd.setcursor( 0, 1 );     
  lcd.print( "temp read:");
  lcd.setcursor( 11, 1 );     
  lcd.print( temp );         
  lcd.print( ' ' );         
  lcd.print( (char) 223 );   
  lcd.print( 'c' );
  lcd.setcursor( 0, 2 );
  lcd.print( "temp set: ");
  lcd.print( ' ' );           
  lcd.print(tempsoglia);
  lcd.print( ".00 " );         
  lcd.print( (char) 223 );   
  lcd.print( 'c' );

  if(temp <= tempsoglia){
    digitalwrite(on, high);
    digitalwrite(off, low);
    delay(500);
    lcd.setcursor( 0, 3 );
    lcd.print( "....run......run....");
    digitalwrite(13, high);
  }else{
    digitalwrite(off, high);
    digitalwrite(on, low);
    delay(500);
    digitalwrite(13, low);
    lcd.setcursor( 0, 3 );
    lcd.print( "....off......off....");
  }
   
    delay(500);
   
}

impara ad eliminare la delay() (... che è una istruzione "bloccante") ed al suo posto introduci l'utilizzo della millis() (... che ti permette di mettere in piedi una logica non bloccante).

studiati come fare qui, poi qui ed infine un esempio qui.

inizia con qualche cosa di semplice, per capire bene come fare e poi, appresa bene la tecnica, applica il tutto al tuo programma ;)

guglielmo


Arduino Forum > International > Italiano > Software (Moderator: leo72) > Doppio LOOP


arduino

Comments

Popular posts from this blog

invalid use of void expresion in FlexiTimer2 library

error: a function-definition is not allowed here before '{' token

LED Strip Code