Raccolta pareri per progetto arduino

Ciao a tutti, sono una new entry del mondo Arduino :) Non ho mai preso in mano questa board ma l'idea/necessità di un progettino mi hanno fatto venire la voglia di buttarmici. Quello che vorrei realizzare sarebbe questo: -Controllo del riscaldamento via sms,implementato nella maniera più semplice possibile: all'arrivo di un sms arduino chiude un relè che fa andare la caldaia n ore. La cosa sarebbe da applicare a 2 ambienti diversi, riscaldati da caldaie differenti oppure un'unica caldaia con valvole di zona per decidere l'ambiente da scaldare.Ma alla fine a me interessa che arduino apra/chiuda due rele indipendenti in base al testo ricevuto via sms.

-Gestione apertura porte RFID L'idea è quella di montare un lettore rfid 125KHz(ID-20) vicino ad ogni porta.Al passaggio di un tag UNIQUE davanti al lettore arduino controlla che l'ID del tag sia in "whitelist" e se lo è faccia scattare l'elettroserratura della porta

E qui iniziano le domande/dubbi/perplessità, soprattutto sul lato Hadware: -E' possibile/consigliato realizzare il tutto con un singolo arduino o è meglio suddividere i progetti? -Quale board utilizzare(UNO,Leonardo,ecc..)?

La cosa che mi mette più in difficoltà e' la parte SMS del riscaldamento. -Quale shield mi conviene comprare per gestire la SIM, e quale mi fornisce le migliori librerie per la gestione di SMS?

Premetto che partirei già con un discreto bagaglio C/C++, quindi non dovrei avere esagerate difficoltà ad addentrarmi nella programmazione

Mi scuso per le domande da neofita e ringrazio per la vostra disponibilità! :)

Forse sarebbe meglio che tu acquistassi un Arduino che già dispone delle varie opzioni necessarie.

Ti consiglio TiDiGino di Futura elettronica.

E' un MEGA con qualcosa in meno, ma anche con qualcosa in più: 2 relè, 2 ingressi optoisolati, un sensore temperatura DS18B20, un modulo GSM SIM900, memoria seriale EEPROM 32KB.

L'ho usato a lungo e funziona bene.

Il TiDiGino costa 140€ e secondo me offre anche troppo. Che vantaggi avrebbe rispetto ad un Arduino UNO+GSM/GPRS & GPS Shield+SIM900?

Con TiDiGino riuscirei a controllare riscaldamento+porte?

Sicuramente il riscaldamento (è stato pensato per questo).

Per RFID ovviamente ci vuole un aggiunta di hardware, ma comunque ti consiglio una soluzione con il MEGA o TiDiGino per via della maggiore area RAM a disposizione.

Quindi con TiDiGino+lettore rfid riuscirei a fare tutto? TiDiGino può essere programmato e fungere anche come un normale arduino?Ha gli stessi pin? Nel senso:se un giorno mi stufassi del termostato SMS e volessi usarlo per pilotare dei relè esterni(non quello onboard) posso farlo tranquillamente?

Come ho detto qualche limitazione c'è.

Per esempio, non disponi di tutti gli I/O digitali del MEGA (dal 22 in poi), perciò con TiDiGino non puoi pilotare molti relè.

Ma se sono sufficienti quelli che puoi collegare dal pin 2 al 13 ed eventualmente dal pin A0 ad A5 (cioè gli stessi della UNO) va benone.

Alla fine dovrei controllare 2 relè delle caldaia(quindi userei i relè onboard) più 2 elettroserrature, quindi come pin dovrei essere a posto. Della documentazione/codice sulla parte GSM dove la posso trovare?

P.S.:se usassi TiDiGino per riscaldamento + serrature dovrei fare in loop un polling dei lettori RFID e della parte GSM per verificare in continuazione la presenza di TAG/SMS:è realizzabile?

Futura ha predisposto un sito dove trovare tutte le informazioni.

code.google.com/p/tidigino/downloads/list?can=2&q=&sort=-uploaded&colspec=Filename%20Summary%20Uploaded%20ReleaseDate%20Size%20DownloadCount

Riguardo all'RFID, anche se perfettamente realizzabile con TiDiGino, io lo eviterei usando un ricevitore indipendente, ma è questione di gusti.

Grazie per la tua disponibilità e il tempo che mi stai dedicando! :) Vorrei chiederti un altro paio di cose: -Nel caso avessi bisogno di più ingressi/uscite per futuri ampliamenti potrei espandermi con un multiplexer? -Sarebbe il caso di integrare anche una scheda RTC per la gestione dell'orologio?

Grazie

Certo che puoi usare un expander.

Per la scheda RTC, io l'ho evitata usando l'RTC a bordo del SIM900

Rieccomi qui, ho comprato il TiDiGino e ho iniziato a sviluppare. All'inizio mi sono basato su uno dei tanti sketch presenti su google code, ma visto che nessuno si adattava perfettamente al mio scopo ho deciso di scrivermi il mio basandomi selle librerie GSM distribuite da Futura(sulle quali si basano tutti gli sketch) Tutto OK, sono già riuscito a scrivermi il mio programmino che ricevuto un sms stampa a video mittente e testo ed esegue un comando a seconda del testo. Continuo ad espandere il codice e salta fuori un problema: alla stampa su seriale dell'SMS non stampa il numero del mittente(l'array che lo contiene è vuoto) e se il corpo del messaggio supera una certa lunghezza(circa 20 caratteri) concatena alla fine di questo la stringa "AT+CMGR=n"(dove n rappresenta un numero).

Ho subito pensato ad un mio errore di programmazione, così ho cominciato a fare il rollback delle modifiche, ma senza ottenere nessun risultato. Come prova finale ho ricaricato uno degli sketch di Google Code e...il problema si presenta anche li!

Al problema dei caratteri extra stampati dopo il testo del messaggio ho forse trovato il problema: La funzione GetSMS di GSM.cpp contiene le seguenti righe di codice: Serial1.print("AT+CMGR="); Serial1.print((int)position); Serial1.print("\r");

Peccato che la serial1 non venga mai inizializzata(o meglio, esiste una funzione che lo fa ma non viene mai chiamata) e soprattutto perchè lo fa solo con SMS oltre un certa lunghezza??? Riguardo al problema del numero che non viene stampato sinceramente non ne ho idea...

La cosa che mi lascia più sorpreso però è che neppure il codice che originariamente funzionava ora non funziona più! Qualcuno che ha lavorato con questa board riesce a darmi qualche suggerimento? Grazie 1000!

EDIT:Mi correggo, la Serial1 da quel che ho capito è il canale di comunicazione con il modulo GSM, la domanda è comunque come mai stampa sul serial monitor, o meglio concatena la stringa al testo del messaggio( non sono due stampe separate, il testo viene proprio copiato nell'array)

Dovresti postare il codice per darti un parere.

Indica anche che versione hai caricato delle librerie: potrebbe essere un errore delle stesse.

OK, ho fatto un cleanup dell’ambiente e librerie e rimesso su tutto.
Resoconto:
-Sketch Sviluppo 1.25(Google Code) funziona
-Mio sketch non funziona (sempre solito problema)

Le librerie GSM sono le 1.01(quelle integrate in Sviluppo 1.25)

Una volta inizializzato il modulo l’sms lo leggo così:

void ControllaSMS()
{
	char posizione;
	char numero[13];
	char testo[160];

	posizione = gsm.IsSMSPresent(SMS_UNREAD);

	if(posizione)
	{
		//lampeggio per 5 volte il LD4 (pin 25)
		for(int i = 0; i < 5; ++i) {
			digitalWrite(DEBUG_LED2, HIGH);
			delay(100);
			digitalWrite(DEBUG_LED2, LOW);
			delay(100);
		}

		//prendo l'SMS
		gsm.GetSMS(posizione, numero, testo, 160);
		//e lo stampo sulla seriale (se il DEBUG_FLAG è attivato)
		Serial.print("Mittente: ");
		Serial.println(numero);
		Serial.print("Testo: ");
		Serial.println(testo);


		//cancello l'sms dalla SIM
		gsm.DeleteSMS(posizione);
	}
	return;
}

Mi sembra tutto corretto, ad eccezione di un return finale di troppo (ma non dovrebbe creare problemi) e la lunghezza del vettore numero che porterei a 16.

Prova e fammi sapere.

Appena arrivo a casa provo le modifiche.Intanto io uso questo codice per inizializzare il modulo, è corretto?

int SetupIniziale()
{
    //Connessione seriale attiva solo se DEBUG_FLAG è attivato
    #ifdef DEBUG_FLAG
    Serial.begin(6900);                  /*Apro connessione seriale a 9600 baud*/
    Serial.println("Inizializzazione HW");
    #endif

    int ret_val = 0;                     /* Variabile di errore: 0 default (no error)       */

    //Resetto il modulo GSM per sicurezza
    digitalWrite(GSM_RESET, 1);
    delay(100);
    digitalWrite(GSM_RESET, 0);

    //Configuro il modulo e inizializzo tutto quello che serve
    gsm.TurnOn(115200);              /* Lanciamo la funzione di avvio del modulo GSM    */
    gsm.InitParam(PARAM_SET_1);      /* Lanciamo dei parametri per la configurazione    */

    //Controllo che ci sia la connessione GSM
    ControllaRete();

    //Ritorno un eventuale errore oppure 0 (zero) se tutto è andato a buon fine
    return ret_val;
}

P.S.:Nel codice originale dopo la gsm.TurnOn() lancia una gsm.Echo(0), cosa che io non faccio perchè mi da dei problemi...

UPDATE:A volte neanche con lo sketch Sviluppo 1.25 stampa il mittente, va a caso...

Se non mi fornisci il listato completo, mi è difficile capire se hai commesso qualche errore.

Comunque: il ret_val restituisce sempre 0 rimuovi il reset del modulo, perché è inutile (lo fa già il TurnOn, che esegue anche il begin della Serial1) Echo(0) credo sia necessario perché disabilita l'echo, forse è per questo che hai l'accodamento di comandi AT nella stringa numero

Abbiamo individuato e isolato il problema( o almeno quello del numero, ma penso che quello del testo sia simile): Il bug è nella GSM.cpp, funzione GetSMS, che non fa il parsing corretto del response(che estrae numero e testo). Domani a mente lucida posto il problema e il codice nel dettaglio, cercando anche di trovare una soluzione...

UPDATE: il problema sembra essere nelle modalità di ricezione degli SMS da parte del modulo SIM900...ho modificato la GSM.cpp, precisamente dove manda il comando AT+CNMI...

ORIGINALE

SendATCmdWaitResp("AT+CNMI=2,0", 1000, 50, "OK", 2);

MODIFICATO

SendATCmdWaitResp("AT+CNMI=0,0", 1000, 50, "OK", 2);

e ho forzato il SIM900 a inviare tutti gli header aggiuntivi:

Serial1.println("AT+CSDH=1");

la domanda è: perchè a volte gli header li mandava e a volte no? e perchè a volte mi inviava dei codici risultato non richiesti (+CMT)?

Sinceramente sto cominciando un pochino a stufarmi...perchè non è possibile che uno spenda 150€ di hardware e le librerie fornite siano, oltre che scritte male, non funzionanti...

Sfondi una porta aperta: ho perso vari giorni per comprendere il motivo per cui avessero previsto due tipi di parametri di configurazione (0, 1).

Poi ho capito, leggendo la libreria, che uno è il propedeutico del secondo per motivi legati alla fase di start up.

Dimenticavo di dirti che la libreria in questione (una volta molto più lunga) è stata ridotta e suddivisa in moduli per motivi di memoria RAM.

Fai attenzione a non superare certi limiti oltre i quali hai a che fare con la gestione delle stringhe che usano la memoria HEAP (stai usando, vero, la funzione F() per la memorizzazione delle costanti stringa?)

Divisa in moduli? La mia è un unico file GSM.cpp...sto usando quella fornita da FuturaShop...

Non ho costanti stringa (solo array di caratteri) per cui finora non ho utilizzato la F()...dici che il problema potrebbe essere legato alla gestione delle stringhe?