Luci e temperatura

Ciao
Ho iniziato un piccolo progetto del classico controller per acquario, nulla di troppo sofisticato, ma essendo alle prime armi mi trovo in grossa difficoltà con lo sketch.
A blocchi sono riuscito a realizzare piu o meno tutto, ora il problema sta nel mettere tutto assieme.
Ho un Arduino uno e vorrei poter controllare attraverso un lcd, la temperatura modificando le soglie min e max, e comandare l'accensione e spegnimento delle luci con il fading.
Come ho detto, ho fatto innumerevoli prove, e cercato in rete copiando qua e là, ma a sto punto sono fermo e sono costretto a chiedere indicazioni.
Qualcuno con molta pazienza è disposto ad indicarmi come fare e che cosa devo correggere, diciamo un passo alla volta?
Grazie infinite

/***********************************************************
Progetto Acqua Control ver. 0.1 
Licenza Common Creative
***********************************************************/
 
#include <LiquidCrystal.h> //libreria per LCD        
#include <OneWire.h>       //libreria per il sensore ds18b20
#include <DallasTemperature.h>  //libreria per conversione valori
#include <Wire.h>
#include <EEPROM.h>
#include "RTClib.h"
//RTC_DS1307 rtc;
RTC_Millis rtc;

/**********************************************************/
 
#define BUTTON A0             //definisco i bottoni al pin analogico di arduino A0
#define BACKLIGHT 10          
#define MOTDTIME 5000
#define LCDTIME  10000
#define SETMODETIME 2000
#define DEBUG
#define ONE_WIRE_BUS 2        // Il terminale data del sensore è connesso alla porta 2 di Arduino
/**********************************************************/
 
char line0[16] = "Welcome to";
char line1[16] = "Acqua Control";
 
/**********************************************************/
 
int SELECT[]  =  {720,760};
int LEFT[]    =  {480,520};
int RIGTH[]   =  {0,20};
int UP[]      =  {120,160};
int DOWN[]    =  {300,350};
 
int buttonPress  =  0;

int BC337=12;	         //Pin7 = BC337     Connessione transistor al pin 7
int PLAFO=10;            //pin 10 plafoniera led bianco
int brightness = 0;    // how bright the LED is - questa fa parte delle luci
int fadeAmount = 5;     //valore di incremento/decremento luci
int tx = 20;                //temperatura di soglia

/**********************************************************/
 
unsigned long timeToBlacklight  =  0;
unsigned long timeToSetMode     =  0;
unsigned long timeSetting       =  0;
 
/**********************************************************/
 
boolean blacklightStatus = false;
 
/**********************************************************/
 
byte symbolselect[8] = {B00001,B00011,B00111,B01111,B00111,B00011,B00001};
byte symbolplay[8]   = {B10000,B11000,B11100,B11110,B11100,B11000,B10000};
byte symbolstop[8]   = {B00000,B11111,B11111,B11111,B11111,B11111,B00000};
byte symbolpause[8]  = {B00000,B10001,B10001,B10001,B10001,B10001,B00000};

byte grado[8] = {0b00010,0b00101,0b00010,0b00000,0b00000,0b00000,0b00000,0b00000};     //creo i dati per il carattere °
 
 
/**********************************************************/
char* principale[4]  =  {"Temperatura","Luci","Data"};
 
/**********************************************************/

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); 
LiquidCrystal lcd(8,9,4,5,6,7);
 
/**********************************************************/
 
void setup() {
 
  #ifdef DEBUG
    Serial.begin( 9600 );
    Serial.println("Avvio");
  #endif
 
  /**********************************************************/
  sensors.begin();
  
   Wire.begin();
      Serial.begin(9600);
      // following line sets the RTC to the date & time this sketch was compiled
      rtc.adjust(DateTime(__DATE__, __TIME__));
      
  /**********************************************************/    
 
  pinMode( BACKLIGHT,OUTPUT );
  digitalWrite( BACKLIGHT,LOW );
 
  /**********************************************************/
 
  lcd.begin(16, 2);
  lcd.createChar(1, symbolselect);
  lcd.createChar(2, symbolplay);
  lcd.createChar(3, symbolstop);
  lcd.createChar(4, symbolpause);
  lcd.createChar(0, grado);     //associo i dati del ° al carattere custom 0
  
  /**********************************************************/
  
  
  
  /**********************************************************/
  
  digitalWrite( BACKLIGHT,HIGH );
  lcd.setCursor(0,0);
  lcd.print(line0);
  lcd.setCursor(0,1);
  lcd.print(line1);
  delay( MOTDTIME );
  lcdBlacklightOff();
}
 
/**********************************************************/
 
void loop() {
 
  /**********************************************************/
 
  #ifdef DEBUG
    Serial.print( " Button: " );           Serial.print( analogRead( BUTTON ) );
    Serial.print( " TimeToBlecklight " );  Serial.print( timeToBlacklight );
    Serial.print( " TimeToSetHour " );     Serial.println( timeToSetMode );
  #endif
  
  /**********************************************************/ 
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperatura di: ");
  lcd.setCursor(4,1);
  lcd.print (sensors.getTempCByIndex(0));
  lcd.write((byte)0);  
  lcd.print ("C");
  delay( SETMODETIME );
  
  if (sensors.getTempCByIndex(0) >= tx)
  digitalWrite (BC337, LOW);
  else	if (sensors.getTempCByIndex(0) <= tx)
  digitalWrite (BC337, HIGH);
  

   if (buttonPress >= 0){       //se il pulsantepiù vieno premuto verso il negativo
      tx = tx ++;                           //la variabile temperatura di soglia tx incrementa di una unita
      lcd.clear();               //cancello il display
      lcd.print("Temperatura di");         //scrivo un testo
      lcd.setCursor(0, 1);                 //riposiziono il cursore
      lcd.print("soglia: ");            //scrivo di nuovo un testo
      lcd.print(tx,DEC);            //scrivo il valore impostato della temperatura di soglia
      lcd.write((byte)0);            //scrivo il °
      lcd.print ("C");                      //scrivo il C di Celsius
      delay(1000);                          //ritardo di 1 secondi per la lettura
   }
 
   if (buttonPress <= 0){                       //se il pulsantemeno vieno premuto verso il negativo
      tx = tx --;                           //la variabile temperatura di soglia tx decrementa di una unità
      lcd.clear();               //cancello il display
      lcd.print("Temperatura di");         //scrivo un testo
      lcd.setCursor(0, 1);                 //riposiziono il cursore
      lcd.print("soglia: ");            //scrivo di nuovo un testo
      lcd.setCursor(10, 1);            //riposiziono il cursore
      lcd.print(tx,DEC);            //scrivo il valore impostato della temperatura di soglia
      lcd.write((byte)0);            //scrivo il °
      lcd.print ("C");                      //scrivo il C di Celsius
      delay(1000);                          //ritardo di 1 secondi per la lettura
   }

La seconda parte...

  DateTime now = rtc.now();
    
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print(now.day(), DEC);       
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.setCursor(4, 1);
    //lcd.print(' ');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    //lcd.println();
    delay(1000); 
    

   /**********************************************************/
  
  if ( ctrlButton( analogRead( BUTTON ) ) == 0 || ctrlButton( analogRead( BUTTON ) ) > 1 ) { timeToSetMode = millis(); }
  if (timeToSetMode > 0 && SETMODETIME < (millis() - timeToSetMode) ) { menuMode(); timeToSetMode = 0; }
 
  /**********************************************************/
 
  buttonPress = ctrlButton( analogRead( BUTTON ) );
 
  /**********************************************************/
 
  if (  (blacklightStatus) && LCDTIME < (millis() - timeToBlacklight) ) { lcdBlacklightOff(); }
 
  /**********************************************************/
 
  /*char line0[16] = " Welcome to  ";
  char line1[16] = " Acqua Control";
 
  /**********************************************************/
 
  /*lcd.setCursor(0,0);
  lcd.print(line0);
  lcd.setCursor(0,1);
  lcd.print(line1);
  */
  
  /**********************************************************/
  
  analogWrite(PLAFO, brightness);    // set the brightness of pin 10
  
    // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;
  

  
   // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }
  
  
  
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
  
}
 
  /**********************************************************/



 
int ctrlButton( int button ) {
 
  buttonPress = 0;
  if ( SELECT[0] <= button && button <= SELECT[1] )  { buttonPress = 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] )      { buttonPress = 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] )    { buttonPress = 3; }
  if ( UP[0] <= button && button <= UP[1] )          { buttonPress = 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] )      { buttonPress = 5; }
 
  if (buttonPress > 0) {
    digitalWrite( BACKLIGHT,HIGH );
    blacklightStatus = true;
    timeToBlacklight = millis();
  }
 
  return buttonPress;
}
 
/**********************************************************/
 
void lcdBlacklightOff() {
  digitalWrite( BACKLIGHT,LOW );
  blacklightStatus = false;
  timeToBlacklight = 0;
  lcd.clear();
}
 
/**********************************************************/
 
void menuMode() {
 
  /**********************************************************/
 
  #ifdef DEBUG
    Serial.println( "Menu Mode" );
  #endif
 
  /**********************************************************/
 
  boolean setMode  = true;
  int setModeLevel = 0;
  timeSetting      = 0;
  lcd.clear();
 
  /**********************************************************/
 
  delay( 1000 );
 
  /**********************************************************/ 
 
  while ( setMode ) {
 
    /**********************************************************/
 
    if ( ctrlButton( analogRead( BUTTON ) ) != 0 ) { timeSetting = millis(); }
 
    if ( (ctrlButton( analogRead( BUTTON )) == 5 ) && setModeLevel < 3 ) { lcd.clear(); setModeLevel++; }
    if ( (ctrlButton( analogRead( BUTTON )) == 4 ) && setModeLevel > 0 ) { lcd.clear(); setModeLevel--; }
 
    if ( (setModeLevel % 2) == 0 ) {
      lcd.setCursor(0,0);
      lcd.print( principale[setModeLevel] );
      lcd.setCursor(0,1);
      lcd.print( principale[(setModeLevel+1)] );  
 
      lcd.setCursor(15,0);
      lcd.write(1);
      lcd.setCursor(15,1);
      lcd.print(" ");
    } else {
      lcd.setCursor(0,0);
      lcd.print( principale[(setModeLevel-1)] );
      lcd.setCursor(0,1);
      lcd.print( principale[setModeLevel] );  
 
      lcd.setCursor(15,0);
      lcd.print(" ");
      lcd.setCursor(15,1);
      lcd.write(1);
    }
 
    if ( ctrlButton( analogRead( BUTTON )) == 1 ) {
      if ( setModeLevel == 0 ) { Temperatura(); }
      if ( setModeLevel == 1 ) { Luci();     }
      if ( setModeLevel == 2 ) { Data();        }
      //if ( setModeLevel == 3 ) { ok();        }
 
      setMode = false;
      timeSetting = 0;
    }
 
    if (timeSetting > 0 && (SETMODETIME*2) < (millis() - timeSetting) ) { setMode = false; }
    delay(200);
  }
 
  /**********************************************************/
 
  lcd.clear();
}
 
/**********************************************************/
 
void Temperatura() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print( "Soglia Max. " );
  lcd.setCursor(0,1);
  lcd.print( "Soglia Min" );     
  delay( 10000 );
}

/**********************************************************/
 
//void luci() {
  
// }
/**********************************************************/
 
void Luci() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print( "Alba " );
  lcd.setCursor(0,1);
  lcd.print( "Tramonto" );    
 
  delay( SETMODETIME );
}
 
/**********************************************************/
 
void Data() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print( "Menu " );
  lcd.setCursor(0,1);
  lcd.print( "Avvio" );    
 
  delay( SETMODETIME );
}

Quando lo sketch è molto lungo puoi allegare il file al post.
Puoi vedere le istruzioni nel topic [Regolamento].

Si avevo letto il regolamento, ma ho pensato fosse piu comodo e immediato inserirlo come codice.
Se ci sono problemi cancella pure...

No, nessun problema.
Era solo un consiglio. :wink: