ci siamo ... questo codice funziona egregiamente, migliorabile come consigliava giustamente gpb01, ma direi che come prima release è buona.
qui sotto il codice, se dovesse servire a qualcuno:
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <math.h>
#include <GSM.h>
#include <string.h>
#include <stdlib.h>
// Variabili Dichiarazione
// Display
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 6, 5, 4, 9);
// Temperatura Desiderata
float SetPoint = 20.5;
boolean Manuale = false;
int Btn;
boolean Caldaia = false;
float TempAmb;
int RELEPin = 12;
// PIN Number for the SIM
#define PINNUMBER ""
// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;
// Array to hold the number a SMS is retreived from
char senderNumber[14];
char sms_ok1[14] = {"+3939399"};
// Funzione traduzione Temp Locale
float Thermister(int RawADC) {
float Temp;
Temp = log(((10240000/RawADC) - 10000));
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15; // Convert Kelvin to Celcius
// Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}
/*
// RAM libera
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
*/
void InviaSMS(byte Type) {
char msg_sms[70] = "";
char buffer[20] = "";
dtostrf(TempAmb, 3, 1, buffer);
switch (Type) {
case 1:
strcpy(msg_sms, "TempAtt: ");
strcat(msg_sms, buffer);
strcat(msg_sms, " - ACCENSIONE caldaia a: ");
dtostrf(SetPoint, 3, 1, buffer);
strcat(msg_sms, buffer);
break;
case 2:
strcpy(msg_sms, "TempAtt: ");
strcat(msg_sms, buffer);
strcat(msg_sms, "- SPEGNIMENTO caldaia");
break;
}
sms.beginSMS(senderNumber);
sms.print(msg_sms);
sms.endSMS();
}
void DisegnaLCD(float TempAmb){
display.clearDisplay();
display.setTextSize(1);
// Scrivo la temperatura rilevata dal sensore
display.setCursor(0,0);
display.print("TempAmb:");
display.setCursor(54,0);
display.print(TempAmb);
// Scrivo la temperatura impostata da pulsanti
display.setCursor(0,10);
display.print("TempOtt:");
display.setCursor(54,10);
display.print(SetPoint);
// Scrivo lo stato del Termostato Interno
display.setCursor(0,20);
display.print("Manuale:");
display.setCursor(65,20);
if (Manuale) {
display.print("ON");
} else {
display.print("OFF");
}
//Scrivo lo stato della Caldaia
display.setCursor(0,30);
display.print("Caldaia:");
display.setCursor(65,30);
if (Caldaia) {
display.print("ON");
} else {
display.print("OFF");
}
/*
// Scrivo lo stato del GSM
display.setCursor(0,40);
display.print("GSM: " + scannerNetworks.getCurrentCarrier() + " " + scannerNetworks.getSignalStrength() + " [0-31]");
*/
display.setCursor(0,40);
display.print("GSM: ");
display.setCursor(65,40);
display.print("ON");
// Mando tutto al display
display.display();
}
void AccendiCaldaia() {
// Devo eccitare il rele
digitalWrite(RELEPin, LOW);
// Mostro a schermo lo stato caldaia
Caldaia = 1;
}
void SpegniCaldaia() {
// Spengo il rele
digitalWrite(RELEPin, HIGH);
Caldaia = 0;
}
void setup() {
pinMode(RELEPin, OUTPUT);
//Spengo la caldaia
digitalWrite(RELEPin, HIGH);
display.begin();
display.setContrast(60);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.print("TERMOSTATO GSM");
display.setCursor(10,30);
display.print("GSM On ...");
display.display();
// initialize serial communications and wait for port to open:
Serial.begin(9600);
// connection state
boolean notConnected = true;
// scannerNetworks.begin();
// Start GSM connection
while(notConnected) {
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else delay(1000);
}
/*
Serial.print("RAM: ");
Serial.println(freeRam());
*/
}
void loop() {
// Varibili
char c;
// variabili per il controllo del mittente
boolean equal_1, equal_2;
byte i;
// String messaggio;
char cmd[5];
char msg[60] = "";
boolean accendo, spengo;
char accendo_cmd[11] = {"Caldaia ON"};
char spengo_cmd[12] = {"Caldaia OFF"};
byte TypeOp;
// Controllo L'INPUT dei pulsanti
Btn = analogRead(1);
if (Btn < 1000) {
// Cambio stato Controllo Manuale
if ( (Btn >650) && (Btn <700) ) {
Manuale = !Manuale;
}
// ---
if (Btn < 20 ) {
SetPoint -= 0.5;
}
// +++
if ( (Btn >500) && (Btn <520) ) {
SetPoint += 0.5;
}
}
TempAmb = Thermister(analogRead(0));
// Controllo se devo accendere la caldaia manualmente
if (Manuale) {
if (TempAmb < SetPoint) {
AccendiCaldaia();
} else {
SpegniCaldaia();
}
} else {
SpegniCaldaia();
}
DisegnaLCD(TempAmb);
// Verifico il segnale e l'operatore
// Signal = scannerNetworks.getSignalStrength();
// If there are any SMSs available()
if (sms.available()) {
/*
Serial.print("RAM: ");
Serial.println(freeRam());
*/
// Get remote number
sms.remoteNumber(senderNumber, 14);
equal_1 = true;
i = 0;
while ( (equal_1) && (i<13) ) {
if (senderNumber[i] != sms_ok1[i]) equal_1=false;
i++;
}
if ( (equal_1) ) {
// An example of message disposal
// Any messages starting with # should be discarded
if(sms.peek()=='#') {
sms.flush();
}
// Read message bytes and print them
i = 0;
while(c=sms.read()) {
msg[i] = c;
i++;
}
i = 0;
accendo = true;
while ( (accendo) && (i<10) ) {
if (msg[i] != accendo_cmd[i]) accendo=false;
i++;
}
if (accendo) {
SpegniCaldaia();
for (i=0; i<=4; i++) {
cmd[i] = msg[i+10];
}
SetPoint = atof(cmd);
Manuale = true;
AccendiCaldaia();
TypeOp = 1;
}
i = 0;
spengo = true;
while ( (spengo) && (i<12) ) {
if (msg[i] != spengo_cmd[i]) spengo=false;
i++;
}
if (spengo) {
Manuale = false;
SpegniCaldaia();
TypeOp = 2;
}
// Delete message from modem memory
sms.flush();
delay(500);
InviaSMS(TypeOp);
} else {
Serial.println("Messaggio scartato");
// Delete message from modem memory
sms.flush();
}
}
delay(500);
}
Mi sarebbe piaciuto aggiungere i riferimenti alla qualità del segnale, ma il troppo uso della memoria rende instabile il software già al primo sms.
Il prossimo step sarà quello di sostituire il sensore di temperatura con un TMP36 evitando quindi l'uso di quella funzione non propriamente ottimizzata e quindi anche , spero, con un risparmio di memoria
grazie gpb