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)