Controllare/Impostare arduino da remoto tramite GSM shield o wifi

Salve a tutti
vorrei avere delle delucidazioni in merito al problema che mi si pone,vi spiego brevemente il sistema e poi vi posto le domande

Sistema:(Automazione di un acquario)
-arduino mega 2560 r3
-TFT LCD 2,8" adafruit
-real time cloc+vari sensori e schede relè
attualmente sto creando un automazione con arduino per automatizzare il più possibile un acquario,
il tutto viene gestito/impostato tramite touch screen ovvero tramite questo io imposto gli orari di accensione-spegnimento di luci, relè eccecc, ovviamente imposto anche le intensità di luce tramite pwm eccecc insomma tutto quello che c'è da impostare per un corretto funzionamento dell'acquario.

Vorrei implementare la mia automazione telegestendola da remoto tramite sms,quindi gsm, oltre a mantenere il touch screen vicino l'impianto.

So che la scheda gsm(almeno quella ufficiale) comunica con arduino tramite i pin RX-TX e la cosa a me va benissimo .
Lo scambio dei dati dovrebbe essere bidirezionale ovvero
1)da cellulare ad arduino invio i dati per impostare orari ed altro
2)da arduino una tantum(ex 1 volta a settimana) dovrebbe mandarmi un messaggio che mi comunica che tutto è ok
oppure se ci sono dei problemi di comunica che qualcosa non va

per la seconda parte non ci sono problemi in quanto basta che fa le letture di tutti i sensori, controlla le batterie eccecc e mi manda i risulati.

Per la prima parte ho dei dubbi in quanto i dovrei andare a modificare dei valori tipo : mlNo3 (quantità di fertilizzante da somministrare), oppure oreOnRELE1( ore di accensione del relè)
che sono dell variabili che io tramite touch imposto
Ex:
mlNo3=2,5; oppure oreOnRELE1=10;

ora le mie domande sono
posso inviare direttamente tramite sms la variabile oreOnRELE1=10;? questa sarà poi usata da arduino con il valore che gli ho assegnato? o sarà solo letta la porta seriale?
dovrà anche essere salvata sulla EEPROM
quindi devo anche inviare il codice per scriverla sulla EEPROM? tipo: EEPROM.write(139, oreOnRELE1);?

altra domanda e problema(Risolto,ho letto che non si può fare) visto che di spazio nella memoria ne ho pochissimo(sono rimasti circa 20k), in quanto la GUI del TFT occupa molto spazio,
posso spostare tutto il programma su una scheda SD? e quindi poi arduino dovrebbe leggere il programma su sd?

spero di essermi spiegato al meglio

p.s. tutto questo lo chiedo per capire se è possibile fare una cosa del genere in quanto la scheda gsm ancora non l'ho e se non è possibile mi risparmierei 80 e passa euro di spesa:)

grazie in anticipo a tutti per le risposte

nessuno mi sa rispondere? dai non credo che nessuno sappia come funziona :stuck_out_tongue:

La scheda Gsm è fatta per inviare e ricevere messaggi, i msg che arduino riceve sono delle strighe, dei char, che possono essere smembrati, interpretati come meglio credi (nei limiti di n caratteri). Quindi si lo puoi fare, ma trovo la tecnologia sms in questo caso come usare ancora un tv in bianco e nero. Non potresti usare una ethernet visto che tutti hanno uno smartphone e le connessioni ormai sono illimitate? e poi costa meno di 80.00 euro

un po' di OT :slight_smile:
Io non vi capisco voi amanti degli acquari, è una passione un hobby come tanti altri non lo metto in dubbio , ma quello che non capisco è perchè volete automatizzarli all'estremo, per tenere in vita 4 pescetti che a volte manco si vedono. Io mi immagino un tipo in vacanza (magari su una spiaggia in Sardegna) che riceve un sms "la temperatura dell'acquario è scesa di 2 gradi" ... presto di corsa carica moglie figli sulla nave e torna a casa per salvare i pescetti (ammettetelo un po' siete maniaci) ahahahahhahaha.
E' un po' come avere la passione del cane e automatizzarlo, gli insegni a fare i bisogni facendolo uscire da solo, a raccogliere i frutti dei suoi bisogni e smaltirli negli appositi contenitori, a lavarsi da solo e a servirsi i pasti da solo. Che passione è se guardo e basta?
E ancora...... gli acquari costano molto, alcuni tipi di pesci costano più dell'acquario, consumo energetico. ecc ecc ...... perchè poi vi fate problemi per poche decine di euro?
Sono curioso, scusa per l' OT, ma sono 3 anni che leggo post sugli acquari e arduino per avere meno ansie in locale e più ansie in controlli remoti :slight_smile:

ciao

intanto grazie per la riposta :slight_smile:

in realtà all'inizio ero indeciso su gsm o wifi poi ho deciso di usare il gsm perchè
-dove ho l'acquario non ho l'adsl (anche se a breve lo metterò)
-non saprei da dove iniziare con una scheda wifi...la eternet l'avevo esclusa a priori
-ho pochi pin a disposizione
-poca memoria a disposizione
-ho letto che ci vuole un ip pubblico e gia qui non saprei come fare
-se poi va via la corrente l'ip cambia e che faccio?(parlo da ignorante in materia quindi peto venia eheh)

però se non chiedo troppo si potrebbe fare un confronto tra gsm e wifi con pro e contro?

per il costo...sullo store ufficiale costa €69+iva(22%)=84,18 :wink:

OT

detto in tutta sincerità se avessi solo 4 pescetti non automatizzerei l'acquario...dei pesci mi frega poco e niente visto che ho solo i pulitori e le caridine, per i pesci basterebbe una semplice mangiatoia automatica al massimo
io ho un plantacquario con piante rare e l'automazione mi serve per mantenere i valori costanti,inserire il fertilizzante quanto non ci sto, gestire le luci, eccecc e invece di usate decine di timer uso arduino ma se non sei un appassionato di acquari capisco questa tua perplessità :slight_smile:
in oltre un acquario non è minimamente paragonabile a un cane...è estremamente più difficile da gestire :stuck_out_tongue:

hai ragione sul dire che gli acquari costano centinaia e centinaia di euro e 80 euro a confronto sono niente ma visto che ho gia speso un patrimonio per l'automazione non voglio spendere altri soldi inutili :stuck_out_tongue: :slight_smile: perchè se il gsm non facesse al coso mio prenderei la wifi e se acquistassi prima il gsm( e poi non va) poi dovrei prendere la wifi e non sono più 84 euro
ma la bellezza di 168... :wink:

posso inviare direttamente tramite sms la variabile oreOnRELE1=10;? questa sarà poi usata da arduino con il valore che gli ho assegnato?

Si, l'SMS lo puoi inviare nella forma che hai previsto.
No, perché Arduino riceverà tale SMS come un banale testo, e pertanto non potrà interagire in modo diretto sul codice.

Tale stringa però potra essere interpretata da Arduino che andrà modifcare di concerto la variabile.
Per esempio, nel SMS il testo "oreOnRELE1=" potrebbe essere sostituito con un banale "R10", in modo da rendere più semplice la decodifica del comando.

ok capito

quindi potrei fare in modo che le letture che fa come banale testo diventino valori delle variabili che a me servono giusto?
potrei fare un controllo che tramite il primo carattere(che sarà una lettera) mi selezione la variabile che voglio e con i successivi caratteri che arrivano mi assegna il valore alla variabile...mi spiego meglio

dico ad arduino che se sulla seriale arriva R il valore successivo va assegnato a OreRele1On se arriva M mlNo3

ovvero invio tramite sms

R10
M3

arduino legge dalla seriale

R----->allora mi prende OreRele1On=10;
M----> mi prende mlNo3=3;

come mi avete detto devo usare delle stringhe, ancora non ho capito bene come funzionano ma le studierò e proverò a buttare giu qualche riga di codice,
usando queste stringhe in base alla posizione di arrivo dei caratteri poi li sommerei per assegnare alla variabile che mi interessa

ovvero fare una cosa di questo tipo
stringThree = stringOne + stringTwo;
OreRele1On =stringThree;

giusto oppure ho scritto una corbelleria? :stuck_out_tongue:

Non ho mai utilzzato la libreria del shield GSM, ma immagino che ci sia una funzione
che restituisca i caratteri del testo del messaggio, qualcosa simile a Serial.read().

definisci un arrays tipo: "char testosms [50];"

e a quel punto ci carichi i vari caratteri in arrivo esempio:"R13"

ora andrai a testare

switch testosms[0] {            // 'R'

  case 'R':
    int valore = 0;
    char car = testosms[1];       // '1' 
    car = car - 48;              // trasforma da ASCII a binario
    valore = car;
    char car = testosms[2] ;      // '3' 
    car = car - 48;              // trasforma da ASCII a binario
    valore = valore * 10 + car;
    OreRele1On = valore;         // setta il tuo software
    break;

  case 'M':
    codice ecc.
    break;
}

Ovviamente è solo uno spunto, l'importante è che tu prenda dimestichezza con la libreria
per capire come affrontare il problema.

grazie lelebum sei stato gentilissimo mi hai dato un ottimo spunto di partenza

si il gsm esegue una cosa simile al Serial.read()

ovvero:

char c;

fa altre cose...

// Read message bytes and print them
while(c=sms.read())
Serial.print(c);

ora mi studio bene bene il tutto e vi faccio sapere:)

ancora grazie :slight_smile:

ragazzi ho provato a buttare giu un pò di codice
secondo voi può andare bene?
ho preso l'esempio del ricevitore sms e ho aggiunto un pò di codice

// SMS receiver

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array dell'ultimo numero di SMS ricevuto
char senderNumber[20];

void setup()
{
// initialize serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

Serial.println("Ricevitore Messaggi SMS");

// Stato di connessione
boolean notConnected = true;

// Inizio connessione GSM
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Non Connesso");
delay(1000);
}
}

Serial.println("Inizializzazione GSM");
Serial.println("In attesa di messaggi");
}

void loop()
{
//queste variabili saranno dichiarate all'inizio...messe qui solo per comodità
char TestoSMS;
int valore = 0;
int valore1 = 0;
int OreRele1On = 0;
int OreOff = 0;

// Se ci sono SMS disponibili()
if (sms.available())
{
int conta=0;
Serial.println("Messagio ricevuto da:");

// Prende il numero
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);

//Legge i bytes del messaggio e li scrivie
while(TestoSMS=sms.read())//legge un carattere alla volta
{

Serial.print(TestoSMS);

if(conta==0)
{
char car = TestoSMS;
car = car - 48; // trasforma il carattere carattere da ASCII a binario
valore = car;
}
else
if(conta==1)
{
char car1 = TestoSMS;
car1 = car1 - 48; // trasforma il secondo carattere da ASCII a binario
valore1 = car1;
}
else
if(conta==3)
{
switch (TestoSMS) { // va ad assegnare il valore alla variabile selezionata
case 'R':
OreRele1On = ((valore*10)+valore1);
conta=0;
break;

case 'M':
OreOff = ((valore*10)+valore1);
conta=0;
break;

}

}

conta++;
}

// Elimina i messaggi dalla memoria del modem.
Serial.println("Fine del Messaggio");
sms.flush();
Serial.println("Messaggio eliminato");

delay(1000);

}

}

invece di usare tante variabili per memorizzare ho inserito un array

si può migliorare lo sketch? se si cosa dovrei usare?

perchè facendo il controllo con le if o switch...case le cose diventano un tantino lunghe

void loop()
{
//queste variabili saranno dichiarate all'inizio...messe qui solo per comodità
char TestoSMS;
int myArray[6]={
0,0,0,0,0,0 };
float OreRele1On = 0;
float OreOff = 0;
char car;

// Se ci sono SMS disponibili()
if (sms.available())
{
int conta = 0;

Serial.println("Messagio ricevuto da:");

// Prende il numero
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);

//Legge i bytes del messaggio e li scrive
while(TestoSMS=sms.read())//legge un carattere alla volta
{

Serial.print(TestoSMS);

car = TestoSMS;
car = car - 48; // trasforma il carattere carattere da ASCII a binario
myArray[conta] = car;

if( conta==7){

switch (TestoSMS) { // va ad assegnare il valore alla variabile selezionata
case 'R':
OreRele1On = (myArray[0]*1000) + (myArray[1]*100) + (myArray[2]*10) + myArray[3] + (myArray[4]*0.1) + (myArray[5]*0.01);
conta=0;
break;

case 'M':
OreOff = (myArray[0]*1000) + (myArray[1]*100) + (myArray[2]*10) + myArray[3] + (myArray[4]*0.1) + (myArray[5]*0.01);
conta=0;
break;

// continua con altri casi (circa 170)

}

}
conta++;

}

// Elimina i messaggi dalla memoria del modem.
Serial.println("Fine del Messaggio");
sms.flush();
Serial.println("Messaggio eliminato");

delay(1000);

}

}