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.
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 |
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.
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;
}
#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
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.
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).
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.
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.
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
*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