Questo è il mio termostato creato per comandare due pompe, una della caldaia a legna e l'altra collegata al pannello solare, il tutto comandato da un arduino mega.
Se ti può servire, (uso arduino da un mese quindi se ci sono errori incredibili, perdonatemi
) :
#include <OneWire.h>
#include <LiquidCrystal.h>
#define BUTTON A0
int diff1 = 5;
int start = 50;
#define T1 31
#define T2 33
#define T3 37
#define T4 35
#define relay 39
#define relay1 41
#define led1 43
#define led2 45
const int inputPin = A0;
uint16_t inputValue = 0;
boolean a = false;
boolean b = false;
boolean c = false;
boolean d = false;
unsigned long previousMillis1 = 0;
const unsigned int interval1 = 30000;
unsigned long previousMillis2 = 0;
const unsigned int interval2 = 1000;
unsigned long previousMillis3 = 0;
const unsigned int interval3 = 30000;
OneWire ds(T1);
OneWire da(T2);
OneWire dd(T3);
OneWire df(T4);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup(void) {
pinMode (relay, OUTPUT);
pinMode (relay1, OUTPUT);
pinMode (led1, OUTPUT);
pinMode (led2, OUTPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(" Accensione ");
delay( 1200 );
}
void loop(void) {
int diff;
int diff2;
float temperature = getTemp();
float temperature1 = getTemp1();
float temperature2 = getTemp2();
float temperature3 = getTemp3();
if (millis() - previousMillis2 >= interval2) {
previousMillis2 = millis();
lcd.clear();
lcd.print("TC:");
lcd.setCursor(3,0);
lcd.print(temperature);
lcd.setCursor(8,0);
lcd.print("T1:");
lcd.setCursor(11,0);
lcd.print(temperature1);
lcd.setCursor(0,1);
lcd.print("TP:");
lcd.setCursor(3,1);
lcd.print(temperature2);
lcd.setCursor(8,1);
lcd.print("T2:");
lcd.setCursor(11,1);
lcd.print(temperature3);
Serial.println(temperature);
}
do{
// check buttons status
inputValue = analogRead(inputPin);
if(inputValue < 100 && inputValue >= 0) inputValue = 1;
// update display text
if(inputValue == 1)
{
diff1--;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Diff.Temp.:");
lcd.print(diff1);
delay(500);
lcd.clear();
}
else
lcd.setCursor(0,0);
}while(inputValue == 1);
do{
// check buttons status
inputValue = analogRead(inputPin);
if(inputValue < 250 && inputValue > 150) inputValue = 2;
if(inputValue == 2)
{
diff1++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Diff Temp:");
lcd.print(diff1);
delay(500);
lcd.clear();
}
else
lcd.setCursor(0,0);
}while(inputValue == 2);
do{
// check buttons status
inputValue = analogRead(inputPin);
if(inputValue < 470 && inputValue > 370) inputValue = 3;
// update display text
if(inputValue == 3)
{
start--;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp.Start:");
lcd.print(start);
delay(500);
lcd.clear();
}
else
lcd.setCursor(0,0);
}while(inputValue == 3);
do{
// check buttons status
inputValue = analogRead(inputPin);
if(inputValue < 670 && inputValue > 570) inputValue = 4;
// update display text
if(inputValue == 4)
{
start++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp.Start:");
lcd.print(start);
delay(500);
lcd.clear();
}
else
lcd.setCursor(0,0);
}while(inputValue == 4);
diff = temperature-temperature1;
if((diff>=diff1)&&(temperature>start)) { digitalWrite(relay,HIGH);
digitalWrite(led1,HIGH); a=true;}
if(((diff<diff1)&&(temperature>start))||(temperature<start)) if (a==true) {
a = false;
previousMillis1 = millis();
b = true;
}
if (millis() - previousMillis1 <= interval1 && b == true) {
digitalWrite(relay,HIGH);
digitalWrite(led1,HIGH);
}
else if (millis() - previousMillis1 >= interval1 && b == true) {
b = false;
digitalWrite(relay,LOW);
digitalWrite(led1,LOW);
}
diff2 = temperature2-temperature1;
if((diff2>=diff1) &&(temperature2>start)) { digitalWrite(relay1,HIGH);
digitalWrite(led2,HIGH); c=true;}
if(((diff2<diff1)&&(temperature2>start))||(temperature2<start)) if (c==true) {
c = false;
previousMillis3 = millis();
d = true;
}
if (millis() - previousMillis3 <= interval3 && d == true) {
digitalWrite(relay1,HIGH);
digitalWrite(led2,HIGH);
}
else if (millis() - previousMillis3 >= interval3 && d == true) {
d = false;
digitalWrite(relay1,LOW);
digitalWrite(led2,LOW);
}
}
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;
}
float getTemp1(){
//returns the temperature from one DS18B20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !da.search(addr)) {
//no more sensors on chain, reset search
da.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;
}
da.reset();
da.select(addr);
da.write(0x44,1); // start conversion, with parasite power on at the end
byte present = da.reset();
da.select(addr);
da.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = da.read();
}
da.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;
}
float getTemp2(){
//returns the temperature from one DS18B20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !dd.search(addr)) {
//no more sensors on chain, reset search
dd.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;
}
dd.reset();
dd.select(addr);
dd.write(0x44,1); // start conversion, with parasite power on at the end
byte present = dd.reset();
dd.select(addr);
dd.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = dd.read();
}
dd.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;
}
float getTemp3(){
//returns the temperature from one DS18B20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !df.search(addr)) {
//no more sensors on chain, reset search
df.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;
}
df.reset();
df.select(addr);
df.write(0x44,1); // start conversion, with parasite power on at the end
byte present = df.reset();
df.select(addr);
df.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = df.read();
}
df.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;
}