Questo è il codice di partenza:
/* IDE 1.0.1
modified by Ettore Massimo Albani
*/
#include <SPI.h>
#include <Ethernet.h>
#define APIKEY "XXXXXXXXXXXXXXXXXXXXXXXXXX"
#define FEEDID XXXXXX
#define USERAGENT "TEST 2"
byte mac[] = {
0xDE, 0xAD, 0xBC, 0xEF, 0xFE, 0xBD};
IPAddress ip(192, 168, 11, 21);
EthernetClient client;
char server[] = "api.cosm.com";
unsigned long lastConnectionTime = 0;
boolean lastConnected = false;
const unsigned long postingInterval = 10000;
String DataString = "";
char Buffer[10];
int otherSensorReadingAria = 0;
int otherSensorReadingCaldaia = 0;
int otherSensorReadingResistenza2Kw = 0;
int caldaiaON = 0; //*INGRESSO digitale PER CONTROLLO WEB STATO CALDAIA
int Ventola = 0; //*INGRESSO digitale PER CONTROLLO WEB STATO VENTOLA
int ResistenzaON = 0; //*INGRESSO digitale PER CONTROLLO WEB STATO resistenza
const float AnaRef = 5.0; // valore tensione (5V)
const unsigned int Risoluzione = 1024; // risoluzione (10 bit)
const float RangeMin = 2.0; // temperatura minima °C sensore LM35DZ (alim. 5V, out con res. 2k in serie)
const float RangeMax = 100.0; // temperatura massima °C sensore LM35DZ (alim. 5V, out con res. 2k in serie)
const float Incremento = 0.01; // incremento (10 mV/°C)
float Volt = 0; // valore sensori analogici in volt
const float Isteresi = 1.0; // isteresi (1 °C)
float TempAria = 0.0; // temperatura aria
float TempAriaMin = 2.0; // soglia inferiore temperatura aria (min 2 °C = RangeMin)
float TempAriaMax = 30.0; // soglia superiore temperatura aria (max 100 °C = RangeMax)
float TempAcquaOUTtermosolare = 0.0; // temperatura acqua
float TempAcquaMin = 2.0; // soglia inferiore temperatura acqua (min 2 °C)
float TempAcquaMax = 43.0; // soglia superiore temperatura acqua (max 100 °C)
float TempAcquaINGTermosolare = 0.0; // temperatura acqua in ingresso al termosolare
extern unsigned long timer0_millis;
float mela;
void setup() {
mela=1;
analogReference(DEFAULT); // DEFAULT (5V), INTERNAL (1,1V), EXTERNAL (0÷5V)
pinMode(A0, INPUT); // NB sensore di temperatura aria
pinMode(A1, INPUT); // sensore di temperatura acqua
pinMode(A2, INPUT); // sensore di temperatura acqua ingresso termosolare
pinMode(2, OUTPUT); // D2 uscita per relè in parallelo alla resistenza da 2Kw installata sul bollitore
pinMode(3, INPUT); //*D3 ingresso controllo stato ventola da D5
pinMode(4, INPUT); //*D4 ingresso controllo stato caldaia da D6
pinMode(5, OUTPUT); //*USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO VENTOLA
pinMode(6, OUTPUT); //*USCITA IN PARALLELO AL RELE ACQUA PER VISUALIZZAZIONE WEB STATO CALDAIA
pinMode(7, OUTPUT); // relay ventola ON/OFF
pinMode(8, OUTPUT); // relay caldaia ON/OFF
pinMode(9, INPUT); // D10 ingresso per relè in parallelo alla resistenza da 2Kw installata sul bollitore
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) { // start the Ethernet connection
Ethernet.begin(mac, ip); // DHCP failed, so use a fixed IP address
Serial.println("Failed to configure Ethernet using DHCP");
}
}
void loop() {
digitalWrite(2, HIGH);
Ventola = digitalRead(3);
caldaiaON = digitalRead(4);
ResistenzaON = digitalRead(9);
Volt = analogRead(A0) * 0.5;
TempAria = Volt;
delayMicroseconds(120);
Volt = analogRead(A1) * 0.5;
TempAcquaOUTtermosolare = ((Volt)+3); // temperatura acqua in °C +X°C PER COMPENSAZIONE TERMOMETRO TRIVALVOLA
delayMicroseconds(120); // 120 µs (min time reading = 100 µs x channel)
Volt = analogRead(A2) * 0.5; // valore sensore acqua in volt
TempAcquaINGTermosolare = ((Volt)+3); // temperatura acqua in °C +X°C PER COMPENSAZIONE TERMOMETRO TRIVALVOLA
delayMicroseconds(120); // 120 µs (min time reading = 100 µs x channel)
Serial.print("Temp. Aria: ");
Serial.println(TempAria, 1);
otherSensorReadingAria = Ventola;
Serial.print("Temp. Acqua: ");
Serial.println(TempAcquaOUTtermosolare, 1);
otherSensorReadingCaldaia = caldaiaON;
Serial.print("Temp. Acqua Ing Termosolare: ");
Serial.println(TempAcquaINGTermosolare);
if (TempAria > (TempAriaMax + Isteresi)) {
digitalWrite(7, HIGH); // relay ventola ON
digitalWrite(5, HIGH); //*VENTILAZIONE ATTIVATA
Serial.println("Aria calda - Ventola ON");
}
else if (TempAria < (TempAriaMax - Isteresi)) {
digitalWrite(7, LOW); // relay ventola OFF
digitalWrite(5, LOW); //*VENTILAZIONE DISATTIVATA
Serial.println("Aria fredda - Ventola OFF");
}
if ((TempAcquaOUTtermosolare > (TempAcquaMax + Isteresi)) && mela==1) (timer0_millis = 0, mela = 0 );
if (TempAcquaOUTtermosolare > (TempAcquaMax + Isteresi) && (millis()>30000)) {
digitalWrite(8, LOW); // relay caldaia OFF
digitalWrite(6, LOW); //*USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
Serial.println("Acqua Calda - Caldaia OFF");
}
else if (TempAcquaOUTtermosolare < (TempAcquaMax - Isteresi)) {
digitalWrite(8, HIGH); // relay caldaia ON
digitalWrite(6, HIGH); //*USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
mela=1;
Serial.println("Acqua fredda - Caldaia ON");
}
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting...");
client.stop();
}
if (millis() < lastConnectionTime) lastConnectionTime = millis(); // evita il blocco dopo 50gg poiché millis() si azzer
if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
DataString = "TempAria,";
DataString += FloatFormat(TempAria, 10, 1, false, true);
DataString += "\nVentola,";
DataString += otherSensorReadingAria;
DataString += "\nResistenzaON,";
DataString += FloatFormat(ResistenzaON, 10, 1, false, true);
DataString += "\nTempAcquaINGTermosolare,";
DataString += FloatFormat(TempAcquaINGTermosolare, 10, 1, false, true);
DataString += "\nTempAcquaOUTtermosolare,";
DataString += FloatFormat(TempAcquaOUTtermosolare, 10, 1, false, true);
DataString += "\nCaldaia,";
DataString += otherSensorReadingCaldaia;
sendData(DataString);
}
lastConnected = client.connected();
}
void sendData(String thisData) {
if (client.connect(server, 80)) {
Serial.println("connecting...");
client.print("PUT /v2/feeds/");
client.print(FEEDID);
client.println(".csv HTTP/1.1");
client.println("Host: api.cosm.com");
client.print("X-ApiKey: ");
client.println(APIKEY);
client.print("User-Agent: ");
client.println(USERAGENT);
client.print("Content-Length: ");
client.println(thisData.length());
client.println("Content-Type: text/csv");
client.println("Connection: close");
client.println();
client.println(thisData);
Serial.println(thisData);
}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
Serial.println();
Serial.println("disconnecting...");
client.stop();
}
// note the time that the connection was made or attempted:
lastConnectionTime = millis();
}
String FloatFormat(float X, char Size, unsigned char Decimal, boolean Plus, boolean AutoReduce) {
char Buffer[Size + 1];
String Z = dtostrf(X, Size, Decimal, Buffer);
if (Plus && X > 0) Z[Z.lastIndexOf(' ')] = '+';
if (AutoReduce) Z.trim();
return Z;
}