Grazie Guglielmo ho finalmente risolto tutto (ieri sera fino a mezzanotte e mezza!
).
Riposto il codice ottimizzato per conoscenza, ci sono tre etichette coperte da privacy ("+39numerocellulare", "+39numerocellularemoglie", "+39numeroArduino"):
// Ardu-Does V1.1
//Codice by Andrea76
//28/02/2014 09.09
//Dimensione del file binario dello sketch: 21.312 bytes (su un massimo di 32.256 bytes)
// include la libreria GSM
#include <GSM.h>
//include libreria Temperatura e e umiditÃ
#include <dht11.h>
dht11 DHT;
//definisci pin analogici usati
#define LucePin 0
//definisci pin digitali usati
//#define Pin 0 riservato trasmissione Rx
//#define Pin 1 riservato trasmissione Tx
//#define Pin 2 riservato comunicazione GSM SHIELD
//#define Pin 3 riservato comunicazione GSM SHIELD
#define CancelloPin 4
#define Rele1Pin 5
#define Rele2Pin 6
//#define Pin 7 // riservato GSM SHIELD
//#define Rele3Pin 8
#define RetePin 9
#define DHT11_PIN 10
#define LedRosso 11
#define LedGiallo 12
#define LedVerde 13
// istanza libreria
GSM gsmAccess;
GSM_SMS sms;
// array numero chiamate
char remoteNumber[20];
char checkNumber1[20] = "+39numerocellulare";
char checkNumber2[20] = "+39numerocellularemoglie"; // e si... anche le pretende di usare arduino :astonished:
// Gestione sensori
boolean flgSTS = false;
boolean flgGSM = false;
boolean flgCMD = false;
byte memRete = LOW;
byte memLuce = 0;
byte memTemp = 0;
byte memUmid = 0;
char message[20];
void setup()
{
// settaggio pin di uscita periferiche
pinMode(CancelloPin, OUTPUT);
pinMode(LucePin, INPUT);
pinMode(RetePin, INPUT);
pinMode(Rele1Pin, OUTPUT);
pinMode(Rele2Pin, OUTPUT);
//pinMode(Rele3Pin, OUTPUT);
//pinMode(Rele4Pin, OUTPUT);
pinMode(LedRosso, OUTPUT);
pinMode(LedGiallo, OUTPUT);
pinMode(LedVerde, OUTPUT);
digitalWrite(LedRosso, HIGH);
digitalWrite(LedGiallo, HIGH);
digitalWrite(LedVerde, HIGH);
// attiva comunicazione
Serial.begin(9600);
// Stato connessione
boolean notConnected = true;
Serial.println(F("Verifica GSM in corso..."));
// Avvio connessione GSM
while (notConnected)
{
if (gsmAccess.begin() == GSM_READY)
notConnected = false;
else
{
digitalWrite(LedGiallo, LOW);
delay(500);
digitalWrite(LedGiallo, HIGH);
delay(500);
}
}
Serial.println(F("GSM inizializzato"));
digitalWrite(LedRosso, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedVerde, LOW);
delay(500);
}
void loop()
{
byte i=0;
char c;
message[1]=-127;
//imposto il numero di risposta al default1
for (i = 0; i < 21; i++) remoteNumber[i] = checkNumber1[i];
//Lettura sensori
TempUmd();
if (sms.available())
{
digitalWrite(LedRosso,HIGH);
Serial.println(F("Message received from:"));
// Get remote number
sms.remoteNumber(remoteNumber, 20);
Serial.println(remoteNumber);
// This is just an example of message disposal
// Messages starting with # should be discarded
if(sms.peek()=='#') {
Serial.println(F("SMS Scartato"));
sms.flush();
}
// Read message bytes and print them
i=0;
while (c=sms.read()) {
if (i<21) message[i] = c;
i++;
delay(10);
}
message[i]=0x00; //byte di conclusione stringa array
Serial.println(message);
// delete message from modem memory
sms.flush();
Serial.println(F("SMS Cancellato"));
digitalWrite(LedRosso, LOW);
}
delay(500);
//Se il mittente è lo stesso arduino lo cambia nel default1
if (String(remoteNumber) == "+39numeroArduino") {
for (i = 0; i < 21; i++) remoteNumber[i] = checkNumber1[i];
}
//Controlla se il mittente è uno dei due numeri autorizzati
if ((String(remoteNumber) != String(checkNumber1)) && (String(remoteNumber) != String(checkNumber2))) {
digitalWrite(LedRosso, HIGH);
digitalWrite(LedGiallo, HIGH);
sendSMS(checkNumber1, "Numero sconosciuto: " + String(remoteNumber));
message[1] = -127;
digitalWrite(LedRosso, LOW);
digitalWrite(LedGiallo, LOW);
delay(500);
}
// se c'è un nuovo sms
if (message[1] != -127) {
digitalWrite(LedGiallo, HIGH);
//trasformo tutto l'SMS ricevuto in minuscolo
for (i=0; i < strlen(message); i++) message[i] = tolower(message[i]);
flgCMD = false;
// verifica periferica
if (strcmp(message, "invia gsm") == 0) {
flgCMD = true;
flgGSM = false;
}
if (strcmp(message, "invia parametri") == 0) {
flgCMD = true;
flgSTS = false;
}
if (strcmp(message, "invia rete") == 0) {
flgCMD = true;
if (memRete == HIGH) {
sendSMS(remoteNumber, "Rete 220: Assente");
}
else {
sendSMS(remoteNumber, "Rete 220: OK");
}
}
if (strcmp(message, "apri cancello") == 0) {
flgCMD = true;
digitalWrite(CancelloPin, HIGH);
delay(1000);
digitalWrite(CancelloPin, LOW);
sendSMS(remoteNumber, "Cancello in apertura...");
}
if (strcmp(message, "accendi 1") == 0) {
flgCMD = true;
digitalWrite(Rele1Pin, LOW);
sendSMS(remoteNumber, "Rele' 1 ON");
}
if (strcmp(message, "spegni 1") == 0) {
flgCMD = true;
digitalWrite(Rele1Pin, HIGH);
sendSMS(remoteNumber, "Rele' 1 OFF");
}
if (strcmp(message, "accendi 2") == 0) {
flgCMD = true;
digitalWrite(Rele2Pin, LOW);
sendSMS(remoteNumber, "Rele' 2 ON");
}
if (strcmp(message, "spegni 2") == 0) {
flgCMD = true;
digitalWrite(Rele2Pin, HIGH);
sendSMS(remoteNumber, "Rele' 2 OFF");
}
//se il comando non è riconosciuto risponde con un errore
if (flgCMD == false) {
//Serial.println("Comando non valido!");
sendSMS(remoteNumber, "'" + String(message) + "' non valido!");
}
// pulizia sms appena elaborato
message[1] = -127;
delay(200);
digitalWrite(LedGiallo, LOW);
}
//invio stato GSM
if (flgGSM == false) {
flgGSM = true;
sendSMS(remoteNumber, "Rete GSM OK");
}
//invio parametri sensori
if ((abs(memTemp - DHT.temperature) > 1) || (abs(map(analogRead(LucePin), 0, 1023, 0, 100) - memLuce) > 25) || (flgSTS == false)) {
flgSTS = true;
memTemp = DHT.temperature;
memUmid = DHT.humidity;
memLuce = map(analogRead(LucePin), 0, 1023, 0, 100);
delay(15);
sendSMS(remoteNumber, "Temp.: " + String(memTemp) + " c Umid.: " + String(memUmid) + " % Luce: " + String(memLuce) + " %");
}
//invio stato rete elettrica
if (digitalRead(RetePin) != memRete) {
memRete = digitalRead(RetePin);
if (memRete == HIGH) {
sendSMS(remoteNumber, "Rete 220 Assente");
}
else {
sendSMS(remoteNumber, "Rete 220 Attiva");
}
}
//area test per i 4 pulsanti collegati in alalogico tramite resistenze varie
int keyVal = analogRead(A5);
if(keyVal >= 1000 && keyVal <= 1023){
sendSMS("+39numeroArduino", "Invia gsm");
}
else if(keyVal >= 900 && keyVal <= 999){
sendSMS("+39numeroArduino", "Apri cancello");
}
else if(keyVal >= 500 && keyVal <= 600){
sendSMS("+39numeroArduino", "Accendi 1");
}
else if(keyVal >= 41 && keyVal <= 50){
sendSMS("+39numeroArduino", "Spegni 1");
}
digitalWrite(LedVerde, HIGH);
delay(200);
digitalWrite(LedVerde, LOW);
delay(200);
}
// questa funzione invia un sms
void sendSMS(char remoteNum[], String txtMsg) {
digitalWrite(LedGiallo, LOW);
Serial.print(F("Invio SMS "));
Serial.print(remoteNum);
Serial.println(" " + txtMsg);
digitalWrite(LedVerde, HIGH);
sms.beginSMS(remoteNum);
sms.print(txtMsg);
sms.endSMS();
delay(200);
digitalWrite(LedVerde, LOW);
}
// questa funzione legge i valori del sensore DHT11
void TempUmd() {
int chk;
chk = DHT.read(DHT11_PIN); // READ DATA
switch (chk) {
case DHTLIB_OK:
break;
case DHTLIB_ERROR_CHECKSUM:
//erial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
//erial.print("Time out error,\t");
break;
default:
//erial.print("Unknown error,\t");
break;
}
}
Grazie ancora della tua collaborazione...
