apertura e chiusura di una tenda in base alla temperatura, alcuni problemi
ciao 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 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 40 la tenda si apre
potete aiutarmi?
grazie mille
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 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 40 la tenda si apre
potete aiutarmi?
grazie mille
code: [select]
#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 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 bottoni
delay(100);
//riftemp = constrain(riftemp, 55, 80); // costringe vel nel range -127 +127
riftemp = inc;
switch (lcd_key) // 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 temperature 1 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 not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
serial.print("device not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, parasite power on @ end
byte present = ds.reset();
ds.select(addr);
ds.write(0xbe); // read scratchpad
(int = 0; < 9; i++) { // 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;
}
}
prova ad utilizzare la funzione delay alla fine della lettura dei tasti, dobrebbe funzionare. regola il valore come preferisci.
Arduino Forum > International > Italiano > Software (Moderator: leo72) > apertura e chiusura di una tenda in base alla temperatura, alcuni problemi
arduino
Comments
Post a Comment