apertura e chiusura di una tenda in base alla temperatura, alcuni problemi

Ciao a tutti,
sto realizzando una copertura solare, nient'altro che una tenda con un motore da tapparella, che si apre e chiude in base alla temperatura dell'acqua nel puffer.

sono riuscito a scrivere una parte di codice solo che mi restituisce alcuni errori e non capisco cosa c'è che non va..

il programma funziona cosi:

quando la temperatura dell'acqua arriva alla temperatura di 50 gradi la tenda si chiude
quando scende sotto i 40 la tenda si apre

potete aiutarmi?

grazie mille

#include <OneWire.h>
#include <LiquidCrystal.h>

//#define BACKLIGHT 10
#define RET_OK           0
#define RICHIESTA_SERRANDA_UP      10
#define RICHIESTA_SERRANDA_DOWN    20
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4

int DS18B20_Pin = 2;
int ONOFF = 3;
int SUGIU = 4;
int riftemp;
int inc = 50;
int temp40 = 40;

boolean blacklightStatus = false;
OneWire ds(DS18B20_Pin);
LiquidCrystal lcd(8,9,4,5,6,7);
int lcd_key     = 0;                        // variabili pannello e pulsanti
int adc_key_in  = 0;

int read_LCD_buttons()                      // legge i pulsanti
{
  adc_key_in = analogRead(0);

  if (adc_key_in < 250)  return btnUP;
  if (adc_key_in < 450)  return btnDOWN;
   if (adc_key_in < 650)  return btnLEFT;
  if (adc_key_in < 850)  return btnSELECT; 
                           // in mancanza di input ripota questo
}

void setup(void) {
  pinMode(ONOFF,OUTPUT);
  pinMode(SUGIU,OUTPUT);
//  pinMode( BACKLIGHT,OUTPUT );
  Serial.begin(9600);
 
  lcd.begin(16, 2);
 
  lcd.setCursor(0,0);
  lcd.print("  TERMOSTATO ");
  lcd.setCursor(0,1);
  lcd.print("----------------");
 
  delay( 3000 );
}

/*void lc()
{

  lcd.setCursor(11, 1);
  lcd.print(riftemp);
  digitalWrite( BACKLIGHT,LOW);
}*/
 
void loop(void) 
{
{
lcd_key = read_LCD_buttons();                // legge i bottoni
delay(100);
  //riftemp = constrain(riftemp, 55, 80);             // costringe Vel nel range -127  +127
riftemp = inc;
  switch (lcd_key)                             // a seconda del bottone esegue comando
  {
      case btnSELECT:{
//             digitalWrite( BACKLIGHT,HIGH);
             break;
       }
    case btnUP:
      {
        lcd.setCursor(9, 1);
        lcd.print(">");
        inc++;
        //return lc();
        delay(5);
        break;
      }
   case btnLEFT:
     {
 //    digitalWrite( BACKLIGHT,LOW);
     break;
     }
    case btnDOWN:
      { 
        lcd.setCursor(6, 1);
        lcd.print("<");
        inc--;
        //return lc();
        delay(5);
        break;
      }

  }

 
  float temperature = getTemp();
  Serial.println(temperature);
  lcd.clear(); 
  lcd.setCursor(7,1);
  lcd.print(riftemp);
    lcd.setCursor(0,0);
  lcd.print("Temperatura:   ");
  lcd.setCursor(0,1);
  lcd.print(temperature);
  
if (temperature <= temp40)  
{
PilotaSerranda (RICHIESTA_SERRANDA_UP);
}
else
{
 if (temperature >= riftemp)
 { 
PilotaSerranda (RICHIESTA_SERRANDA_DOWN);
}
}

 
int PilotaSerranda (int iAzione)
{

switch (iAzione){
case RICHIESTA_SERRANDA_UP :
 //if ( ( iStatoAttualePinAtt != STATO_SERRANDA_ON ) || (iStatoAttualePinCmd != STATO_SERRANDA_UP) ) 
 {
 //
 digitalWrite(ONOFF, HIGH);
 delay(1000);
 digitalWrite(SUGIU, HIGH);
 delay(10000);
 lcd.setCursor(13,1);
 lcd.print("SU");
 digitalWrite(ONOFF, LOW);
 delay(1000);
 
 }
 break;
case RICHIESTA_SERRANDA_DOWN:
 {
 // turn LED off:
 digitalWrite(ONOFF, HIGH);
 delay(1000);
 digitalWrite(SUGIU, LOW);
 delay(10000);
 lcd.setCursor(13,1);
 lcd.print("GIU");
 digitalWrite(ONOFF, LOW);
 delay(1000);
 }
 break;
 }
 return RET_OK;
}
 

 
float getTemp()
{
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}
}

copertura.ino (3.27 KB)

Prova ad utilizzare la funzione delay alla fine della lettura dei tasti, dobrebbe funzionare. Regola il valore come preferisci.

perfetto funziona.
grazie

ho modificato il topico iniziale e il titolo spero che possiate aiutarmi.

grazie mille

sto cercando d'imparare

eccomi di nuovo, ho modificato il codice e mi restituisce meno errori, ho inserito anche qualche spiegazione.

ora riuscite a darmi una mano?

#include <OneWire.h>
#include <LiquidCrystal.h>

//#define BACKLIGHT 10
#define RET_OK           0
#define RICHIESTA_SERRANDA_UP      10
#define RICHIESTA_SERRANDA_DOWN    20
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4

int DS18B20_Pin = 2;
int ONOFF = 3;
int SUGIU = 4;
int riftemp;
int inc = 50;
int temp40 = 40;

boolean blacklightStatus = false;
OneWire ds(DS18B20_Pin);
LiquidCrystal lcd(8,9,4,5,6,7);
int lcd_key     = 0;                        // variabili pannello e pulsanti
int adc_key_in  = 0;

int read_LCD_buttons()                      // legge i pulsanti
{
  adc_key_in = analogRead(0);

  if (adc_key_in < 250)  return btnUP;
  if (adc_key_in < 450)  return btnDOWN;
   if (adc_key_in < 650)  return btnLEFT;
  if (adc_key_in < 850)  return btnSELECT; 
                           // in mancanza di input ripota questo
}

void setup(void) {
  pinMode(ONOFF,OUTPUT);
  pinMode(SUGIU,OUTPUT);
//  pinMode( BACKLIGHT,OUTPUT );
  Serial.begin(9600);
 
  lcd.begin(16, 2);
 
  lcd.setCursor(0,0);
  lcd.print("  TERMOSTATO ");
  lcd.setCursor(0,1);
  lcd.print("----------------");
 
  delay( 3000 );
}

/*void lc()
{

  lcd.setCursor(11, 1);
  lcd.print(riftemp);
  digitalWrite( BACKLIGHT,LOW);
}*/
 
void loop(void) 
{ //1
  float temperature = getTemp();
  Serial.println(temperature);
  lcd.clear(); 
  lcd.setCursor(7,1);
  lcd.print(riftemp);
    lcd.setCursor(0,0);
  lcd.print("Temperatura:   ");
  lcd.setCursor(0,1);
  lcd.print(temperature);


    lcd_key = read_LCD_buttons();                // legge i bottoni
    delay(100);                                   //attendi un attimo
    riftemp = inc;                              // 
    switch (lcd_key)                             // a seconda del bottone esegue comando
     {
        case btnSELECT:                   // premi il pulsante SELECT
          {
//             digitalWrite( BACKLIGHT,HIGH);     // accendi il display
             break;
           }
        case btnUP:                   // premi il pulsante SU
          {
             lcd.setCursor(9, 1);
             lcd.print(">");
             inc++;
             delay(5);
             break;
          }
        case btnLEFT:
         {
 //          digitalWrite( BACKLIGHT,LOW);          // spegni il display
            break;
         }
        case btnDOWN:                   // premi il pulsante GIU
         { 
             lcd.setCursor(6, 1);
             lcd.print("<");
             inc--;
             delay(5);
              break;
          }
      }  
  if (temperature <= temp40)  
          {
            PilotaSerranda (RICHIESTA_SERRANDA_UP);
          }
   else
      {
 if (temperature >= riftemp)
          { 
            PilotaSerranda (RICHIESTA_SERRANDA_DOWN);
          }
        }

/* APERTURA E CHIUSURA TENDA*/

  int PilotaSerranda (int iAzione)          
        {

        switch (iAzione)
        {
        case RICHIESTA_SERRANDA_UP :
        //if ( ( iStatoAttualePinAtt != STATO_SERRANDA_ON ) || (iStatoAttualePinCmd != STATO_SERRANDA_UP) ) 
        {
            digitalWrite(SUGIU, HIGH);   // METTI IL SECONDO RELE SU: "SU"
            delay(1000);
            digitalWrite(ONOFF, HIGH);   // METTI IL PRIMO RELE SU: "ON" 
            delay(10000);                // TEMPO DI MOVIMENTAZIONE TENDA
            lcd.setCursor(13,1);
            lcd.print("SU");
            digitalWrite(ONOFF, LOW);   // METTI IL PRIMO RELE SU: "OFF"
            delay(1000);
            break;
         }
      
        case RICHIESTA_SERRANDA_DOWN:
        {
            digitalWrite(SUGIU, LOW);     // METTI IL SECONDO RELE SU: "GIU"
            delay(1000);
            digitalWrite(ONOFF, HIGH);    // METTI IL PRIMO RELE SU: "ON"
            delay(10000);                 // TEMPO DI MOVIMENTAZIONE TENDA
            lcd.setCursor(13,1);
            lcd.print("GIU");
            digitalWrite(ONOFF, LOW);    // METTI IL PRIMO RELE SU: "OFF"
            delay(1000);
         }
          break;
         }
        return RET_OK;
        }
 }
 /* TEMPERATURA*/
float getTemp()
  {
  byte data[12];
  byte addr[8];
 
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}

e questi sono gli errori

Arduino:1.6.7 (Mac OS X), Scheda:"Arduino/Genuino Uno"

/Users/elvisechiara/Desktop/arduio/tempstatic/tempstatic.ino: In function 'void loop()':
tempstatic:108: error: 'PilotaSerranda' was not declared in this scope
             PilotaSerranda (RICHIESTA_SERRANDA_UP);
                                                  ^
tempstatic:114: error: 'PilotaSerranda' was not declared in this scope
             PilotaSerranda (RICHIESTA_SERRANDA_DOWN);
                                                    ^
tempstatic:121: error: a function-definition is not allowed here before '{' token
         {
         ^
tempstatic:199: error: expected '}' at end of input
 }
 ^
exit status 1
'PilotaSerranda' was not declared in this scope

  Questo report potrebbe essere più ricco di informazioni con
  "Mostra un output dettagliato durante la compilazione"
  abilitato in "File > Impostazioni"

tempstatic.ino (4.85 KB)