mercoledì 7 marzo 2018

Telecontrollo GSM con Arduino Uno -Descrizione Generale, Termistore NTC, Modulo SIM 900 e Scheda Relè

Descrizione Generale e Termistore NTC


Vi sarà sicuramente capitata la necessità di dover attivare o disattivare degli apparati a distanza tramite un semplice SMS; per esempio aprire un cancello, attivare una caldaia o il motore di una pompa; oppure impostare il sistema in modo che automaticamente controlli una stufa o una pompa e che, se richiesto, fornisca lo stato in cui si trovano questi apparati.

In questo articolo, e negli altri a cui potete accedere dai link all'inizio e alla fine di questa pagina, descriverò come realizzare un sistema che consente di controllare due relè sia direttamente (modo manuale) sia in automatico.

Se impostato in modo manuale basterà inviare, tramite SMS, gli opportuni comandi di attivazione o disattivazione per ottenere l'accensione o lo spegnimento degli apparati collegati ai due relè.

Se impostato in modo automatico il sistema provvederà in modo autonomo ad accendere l'apparato collegato al relè in base ad alcuni parametri che avremo precedentemente provveduto a settare; si noti che il modo automatico o manuale è riferito al singolo relè, cioè potremo avere il relè uno in automatico e il relè due in manuale e viceversa o entrambi i relè in manuale o entrambi in automatico.
Tutte le impostazioni relative ai parametri per il modo automatico avvengono sempre per SMS o collegando il sistema ad un PC tramite la porta USB.

Descrizione del modo Automatico
Il sistema, consente di associare i due relè a due ingressi analogici di Arduino:
- al primo (A0) collegheremo una sonda di temperatura (termistore) NTC 3435;
- al secondo (A1) potremo collegare un qualsiasi apparato che fornisca una uscita da 0 a 5 volt;
in questo modo sarà possibile impostare il sistema in modo che controlli automaticamente una stufa e/o un altro apparato.
Al primo ingresso analogico (A0) sono associati due parametri:
- il valore di temperatura da raggiungere T;
- il valore di temperatura di riattivazione dT.
Se impostato in automatico e la temperatura rilevata dalla sonda NTC 3435 è inferiore alla temperatura da raggiungere T allora il sistema attiverà il relè associato alla stufa che si accenderà.
Quando la temperatura dell'ambiente arriva a T (quella desiderata) il sistema disattiverà il relè associato alla stufa che si spegnerà. A questo punto se la temperatura dovesse scendere, rispetto a quella desiderata, di un valore dT, il sistema riattiverà la stufa.
Per esempio si può impostare una temperatura desiderata T di 20°C e una temperatura dT di 1°C;
in questo caso il sistema spegne la stufa (relè) quando la temperatura letta dalla sonda NTC3435 è di 20°C e la riaccende quando la temperatura è di 20-1 cioè 19°C.

Un ragionamento simile si applica al secondo ingresso analogico (A1) ma in questo caso abbiamo un intervallo di valori VAmin e VAmax compresi tra 0 e 1023.
Quando l'apparato collegato all'ingresso analogico A1 fornisce un valore pari a VAmax, il sistema disattiverà il relè associato all'apparato che si spegnerà; quando il valore fornito dall'apparato collegato all'ingresso analogico A1 scenderà sotto VAmin, l'apparato sarà riacceso.
Per esempio si può impostare VAmax ad un valore di 512 (circa 2,5 volt forniti dall'apparato) e VAmin ad un valore di 450.
Quando l'apparato fornisce un valore che convertito da Arduino Uno è di 512 il relè associato all'apparato sarà spento; quando il valore fornito dall'apparato e convertito da Arduino Uno scende sotto 450, il relè associato all'apparato sarà riattivato.

Il sistema può essere controllato tramite SMS o tramite un PC, collegato ad Arduino UNO tramite la porta USB, sul quale è attivo un programma terminale come Putty o l'IDE di sviluppo Arduino.


La Sonda di Temperatura (termistore) NTC 3435
Proseguo la descrizione del sistema di telecontrollo con Arduino, parlando della sonda di temperatura NTC 3435; si tratta di un termistore, cioè di una resistenza il cui valore varia al variare della temperatura.
I termistori possono essere:
- PTC: se la resistenza elettrica aumenta all'aumentare della temperatura;
- NTC: se la resistenza elettrica diminuisce all'aumentare della temperatura.

Questo tipo di termistore presenta i seguenti punti di forza:
- È il sensore più economico disponibile sul mercato;
- Può essere facilmente impermeabilizzato;
- Funziona a qualsiasi tensione (di solito a 3 o a 5V);
- Rispetto alle termocoppie non richiede amplificatori per funzionare ma può essere collegata direttamente al microprocessore;
- È molto precise, infatti ha un’accuratezza di ±0,25°C;
- È molto robusto e affidabile

Schema di collegamento con Arduino
All'atto dell'acquisto, verificate i parametri del termistore che si possono desumere dal datasheet fornito dal produttore; nel mio caso il componente è un NTC 3435 - 10 kohm a 25°C 1% con temperature da -30°C a +110°C.
Il valore 3435 indica il FATTORE BETA della sonda e rappresenta il rapporto dei valori della resistenza a 25 e 85 gradi centigradi e nel caso della mia sonda è appunto di 3435 con una precisione dell'1%.
La sonda presenta in oltre un valore di 10 Kohm a 25°C.

Come determinare la temperatura a partire dalla resistenza della sonda?

Poichè la funzione che descrive come varia la resistenza della sonda al variare della temperatura, non è lineare, per determinare la temperatura dato un certo valore della resistenza, ci avvaliamo di una equazione che fa uso del fattore Beta menzionato in precedenza

Determinazione della temperatura col Metodo del fattore Beta 

nella quale i valori di temperatura sono espressi in gradi Kelvin (temperatura assoluta)
R è la resistenza letta;
T è la temperatura che vogliamo determinare;
R0 e T0 sono rispettivamente 10000 e 298,15 (valore della resistenza alla temperatura di 25°C che espressa in °Kelvin è di 298,15);

B  è il fattore Beta cioè 3435.

Ricordiamo che la temperatura può essere espressa usando varie unità di misura; quella che usiamo noi in Italia è il grado centigrado ottenuto dividendo in cento parti uguali l'intervallo di temperatura a cui fonde e quella a cui bolle l'acqua distillata alla pressione di una atmosfera e misurata lungo la scala di un termometro a mercurio.
Un'altra unità di misura della temperatura è quella che si riferisce alla temperatura assoluta misurata in gradi Kelvin che pone il suo zero alla temperatura di -273,15° C. Per convertire un valore di temperatura da grado centigrado a grado Kelvin è necessario usare la relazione:   °K = °C + 273,15
Tornando al nostro progetto e seguendo lo schema di collegamento descritto in figura, riporto la funzione dello sketch (che pubblicherò sull'ultimo post di questa serie) che legge il valore analogico di tensione dall'ingresso analogico A0 e lo converte nella temperatura in °C. Si noti che nello sketch è definito il parametro NTC_R1 che indica il valore in ohm della resistenza in serie al termistore; per assicurare una maggiore accuratezza nella determinazione della temperatura è bene acquistare una resistenza che abbia una precisione dell'1% e leggerne il valore con un multimetro in modo da impostarne il valore nello sketch; per esempio se il valore letto dal nostro multimetro è di 9996 ohm allora NTC_R1 sarà posto a 9996 invece che ha 10000.
Sono definiti inoltre i valori: NTC_R0 NTC_T0 NTC_BETA che vanno modificati adattandoli a quelli della sonda da voi acquistata.
Un'altra considerazione legata alla precisione della lettura della temperatura va rivolta alla scelta dell'alimentazione che deve essere stabile e quanto più prossima ai 5 volt. Consiglio un alimentatore stabilizzato in grado di erogare una corrente di almeno 3A (a causa della presenza del modem GSM).
Lo sketch legge 5 valori analogici e ne fa la media che converte poi in temperatura con la formula del fattore Beta.

#define NTC_IN A0        //Pin analogico a cui è connesso il termistore
#define NTC_R0 10000     //Valore in Ohm dell'NTC alla Temp T0=25°C
#define NTC_T0 25        //Temperatura nominale T0 in °C
#define NUMAMOSTRAS 5    //Numero di campioni
#define NTC_BETA 3435    //Coefficente Beta del NTC
#define NTC_R1 10000     //Valore della resistenza in serie al NTC
int NUMAMOSTRAS = 5;
int amostra[5];

float getNTCTemperature(){
  float media;
  float temperatura;

  media = 0;
  for (i=0; i< NUMAMOSTRAS; i++) {
    amostra[i] = analogRead(NTC_IN);
    media += amostra[i];
    delay(10);
  }
  media /= NUMAMOSTRAS;
  // Convert the thermal stress value to resistance
  media = 1023 / media - 1;
  media = NTC_R1 / media;

  //Calculate temperature using the Beta Factor of Steinhart-Hart equation
  temperatura = media / NTC_R0;              // (R/Ro)
  temperatura = log(temperatura);            // ln(R/Ro)
  temperatura /= NTC_BETA;                   // 1/B * ln(R/Ro)
  temperatura += 1.0 / (NTC_T0 + 273.15);    // + (1/To)
  temperatura = 1.0 / temperatura;           // Invert the value
  temperatura -= 273.15;                     // Convert it to Celsius
  return temperatura;
}

Scheda Relè due canali e Modulo GSM SIM900


Sono quasi alla fine della descrizione del sistema di telecontrollo con Arduino, e in questa terza parte parlerò della scheda con due relè; questo può sembrare un argomento banale, ma è meglio parlarne in modo da chiarire alcuni aspetti relativi a questo dispositivo.

Si tratta di un modulo con due relè con bobina da 5V e che possono commutare un carico di massimo 10A; in commercio si trovano moduli con uno, due, quattro o anche più relè con bobine a 5V ma anche a 12V.

Per il nostro progetto noi dobbiamo procurarci un modulo con due relè a 5V.
Basta collegare l'alimentazione (+5Vcc e GND) e i Pin di comando a due IO digitali di arduino; facciamo però attenzione ad un paio di dettagli.

Schema relativo ad un Relè della scheda


Nella figura vediamo lo schema relativo ad un solo relè e notiamo subito che il relè è attivato basso cioè esso commuta quando sul Pin di comando è presente uno 0 logico cioè GND.

Se è presente un 1 logico cioè 5V o 3,3V il relè non commuta.

Si notino inoltre i due terminali Vcc e JD-Vcc.

Il terminale JD-Vcc è quello su cui si devono obbligatoriamente mettere 5Vcc necessari per attivare il relè.

Il terminale Vcc è stato posto DISTINTO da JD-Vcc in quanto la scheda uC (che può essere Arduino o Raspberry PI) che comanda il relè può avere dei pin GPIO a 5Vcc o a 3,3Vcc.

Se i pin GPIO sono a 5Vcc, cioè una tensione uguale a quella necessaria per attivare il relè, allora i due terminali Vcc e JD-Vcc si possono ponticellare (infatti il prodotto viene consegnato con un ponticello già inserito).

Supponiamo di trovarci nella condizione in cui il relè è a 5V e il Pin di comando è a 3,3V: allora quando devo attivare il relè imponendo tramite il uC sul pin uno 0 logico, non ho alcun problema in quanto il relè si attiva;

ma se voglio disattivare il relè imponendo tramite il uC sul Pin di comando un 1 logico (cioè 3,3Vcc) essendoci su Vcc 5V avrei comunque una ddp di 5-3,3 che potrebbe attivare il relè.

Quindi su Vcc devo mettere la tensione di alimentazione (o del GPIO del uC): se questa è 5V allora basta ponticellare con JD-Vcc che è anche a 5Vcc; se l'alimentazione dei GPIO è a 3,3Vcc devo togliere il ponticello ed alimentare Vcc a 3,3Vcc e JD-Vcc a 5V.


Il modulo GSM SIM900
Si tratta di un dispositivo che, come un comune smartphone, consente di effettuare o ricevere chiamate vocali, SMS o connettersi con un sito (server) e scambiare dati sfruttando la rete GPRS.

Ma tutto questo viene fatto scambiando informazioni col modulo tramite un collegamento seriale, cioè tramite una coppia di cavi che collegano Arduino col modulo GSM e sfruttando la ben nota libreria SoftwareSerial.h; i comandi da impartire al modulo GSM iniziano tutti con "AT".

Per esempio, dopo aver alimentato il modulo GSM e Arduino con una tensione di 5V e aver collegato i pin 12 e 13 di Arduino rispettivamente ai pin RX e TX del modulo GSM, aver acceso il modem, il seguente sketch:


#include <SoftwareSerial.h>

SoftwareSerial SerialGSM(13, 12); // RX, TX
//Questo significa che:
//IO13 di Arduino servirà a ricevere RX e deve essere collegato al pin TX del modulo GSM
//IO12 di Arduino servirà a trasmettere TX e deve essere collegato al pin RX del modulo GSM

int8_t answer;
char response[100];

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout) {
  uint8_t x = 0,  answer = 0;
  //char response[100];
  unsigned long previous;

  memset(response, '\0', 100);    // Initialize the string
  delay(100);
  while ( SerialGSM.available() > 0) SerialGSM.read();   // Clean the input buffer
  SerialGSM.println(ATcommand);    // Send the AT command
  x = 0;
  previous = millis();

  // this loop waits for the answer

 do {
    if (SerialGSM.available() != 0) {
      // if there are data in the UART input buffer, reads it and checks for the asnwer
      response[x] = SerialGSM.read();
      //Serial.print(response[x]);
      x++;
      // check if the desired answer  is in the response of the module
      if (strstr(response, expected_answer) != NULL) {
        answer = 1;
      }
    }
  }
  // Waits for the asnwer with time out
  while ((answer == 0) && ((millis() - previous) < timeout));
  return answer;

}

void setup() {
  Serial.begin(19200);
  SerialGSM.begin(19200);
}

void loop() {
  answer = sendATcommand("AT", "OK", 2000);
  if (answer == 1) {
    Serial.println("OK il modem risponde");
  } else {
    Serial.println("Qualcosa non va, controlla collegamenti e accendi il modem");
  }
  delay(5000);
}

non fa altro che inviare al modem il comando "AT" al quale il modem risponde semplicemente con "OK".
In un prossimo post parlerò dei comandi del modulo GSM costruendo un sistema che invia i dati prelevati da una sonda ad un server che provvederà a memorizzarli in un database.

Ma tornando al sistema di telecontrollo, per comunicare col nostro modem useremo una libreria che ho scaricato più di un anno fa da qui e che provvede ad impartire al modem i comandi AT per le varie operazioni.

Per esempio se in un nostro sketch includiamo le seguenti linee:

#include "SIM900.h"
#include <SoftwareSerial.h>

#include "sms.h"
SMSGSM sms;
...

possiamo inviare un SMS semplicemente con:

if (sms.SendSMS("393xxxxxxxx", "Arduino SMS"))
      Serial.println("\nSMS sent OK");

La libreria necessita di qualche adattamento che io ho già fatto al fine di usarla senza problemi nel nostro progetto; quindi da questo link potete scaricare sia la libreria già adattata che lo sketch del nostro sistema di telecontrollo.

Nella cartella compressa che avrete scaricato troverete una cartella chiamata SIM900 che deve essere messa nella cartella libraries nel percorso di installazione di Arduino; troverete inoltre la cartella ArduinoGSM contenente lo sketch per il sistema di telecontrollo GSM.

Nel caso vogliate adattare la libreria ad altri vostri progetti, fate attenzione al file GSM.cpp, ne quale ci sono le seguenti definizioni:

#define _GSM_TXPIN_ 12   //Da collegare al pin TX del GSM
#define _GSM_RXPIN_ 13   //Da collegare al pin RX del GSM

Significa che vogliamo collegare il pin 12 di Arduino (inteso come RX) al pin TX del modulo GSM; il pin 13 di Arduino (inteso come TX) al pin RX del modulo GSM.

Attenzione inoltre al file GSM.h nel quale ci sono le seguenti definizioni:
// pins definition
#define GSM_ON              8
#define GSM_RESET           9

In cui si definiscono i pin di Arduino a cui sono collegati i pin PWR ed RST del modulo GSM (che noi non useremo un questo progetto).

Inoltre è definita la linea

//#define DEBUG_ON

Che se commentata disabilita le chiamate alle Serial.print e non stampa i messaggi di log per un eventuale debug dell'applicazione che vogliamo sviluppare.

Terminata la descrizione della libreria, parlerò dello sketch e dei comandi che è possibile impartire al sistema di telecontrollo, sia per mezzo della porta seriale del PC collegato ad Arduino sia per mezzo di SMS ma nel prossimo post.

Per ora, se collegate tutto secondo lo schema (molto colorato) che ho mostrato in figura, accendete Arduino e modulo GSM e una volta accertati che quest'ultimo è connesso alla vostra rete GSM (il led del modulo dovrebbe lampeggiare lentamente) inviate un SMS o tramite il monitor seriale dell'IDE di Arduino, scrivendo:

*start1/

oppure

*start2/

per attivare il relè uno e/o due.

Se invece inviate:

*ferma1/

oppure         

*ferma2/

disattiverete il relè uno e/o due.

Alla prossima per un elenco completo dei comandi.



Aiutaci a continuare a sviluppare idee e soluzioni che potrebbero esserti utili

Fai una donazione




Le informazioni pubblicate in queste pagine web sono state elaborate a puro scopo divulgativo ed informativo, al di fuori di ogni rapporto professionale con il navigatore, non devono essere considerate consulenza. Le immagini utilizzate sono state prelevate su Internet e appartengono ai relativi proprietari, possono essere soggette a Copyright che ne limita la distribuzione. Ogni riferimento a prodotti commerciali ha il solo scopo informativo, e gli eventuali marchi registrati citati appartengono ai relativi proprietari. L'autore non garantisce l'assenza di errori e il funzionamento degli esempi, e declina ogni responsabilità derivante dall'uso di questo documento e dei suoi contenuti.

Nessun commento:

Posta un commento

Lasciate le vostre impressioni su questo articolo

Tutorial Arduino - Controllo Giri RPM Motore a Spazzole con Controllo PID ed LCD KeyPad Shield

Qualche tempo fa ho dovuto buttare un vecchio robot da cucina Bimby ed ho pensato di recuperare il suo motore. Volendolo impiegare n...