Arduino – Trasmissione senza fili a 433 Mhz : Sensore di temperatura wireless

 

Questa serie di articoli riguarda l’impiego di moduli radio low cost funzionanti a 433 Mhz e usati in tutte quelle situazioni dov’è richiesta la trasmissione e la ricezione dati a breve distanza, come ad esempio radiocomandi, sensori wireless o la comunicazione senza fili fra due schede Arduino. I modelli utilizzati per gli esempi proposti sono l’ XD-FST per il trasmettitore e l’ XD-RF-5V per il ricevitore, le cui caratteristiche sono riportate  brevemente qui in basso.

 

 

SiglaXD-FST
Tensione di funzionamentoda 3.5V a 12V
ModulazioneAM ( modulazione d'ampiezza )
Max velocità trasm.4 KB/S
Potenza trasmissione10 mW
CoperturaFino a 200 metri ( in base alla tensione di alimentazione )
Frequenza portante433 Mhz

 

 

Sigla XD-RF-5V
Tensione di funzionamento5 V
Frequenza 433.92 Mhz
Assorbimento a riposo 4 mA
Sensibilità-105 dB

 

Il tipo di modulazione usata da questi moduli è di tipo AM ( modulazione in ampiezza, chiamata anche ASK = Amplitude-shift keying ), cioè il trasmettitore genera un segnale a frequenza fissa di 433 Mhz ( chiamato portante ) la cui ampiezza varia a seconda dello stato logico di un altro segnale ( chiamato modulante ) presente sul pin DATA. Nell’esempio in figura si vede come la portante irradiata dall’antenna, pur conservando la stessa frequenza, avrà la sua massima ampiezza in presenza di un livello logico alto e un valore molto inferiore o nullo in presenza di un livello logico basso.

 

 

Modulazione ASK 433 mhz Arduino

 

 

Cosa molto importante da considerare è che al fine di ottenere una buona ricezione è necessario che entrambi i moduli siano dotati della propria antenna formata semplicemente da uno spezzone di filo di rame della lunghezza di 17 cm circa. Questo valore corrisponde ad un quarto della lunghezza fisica dell’onda portante irradiata dal trasmettitore e si ottiene secondo la seguente relazione :

 

Lunghezza =   ( 300  / Frequenza  ) / 4   

da cui ricaviamo

( 300 / 433 ) / 4 = 0.1732 metri   ossia 17.32 cm

 

Il motivo per cui si adotta questo metodo lo si può dedurre dalla figura riportata in basso, nella quale viene raffigurato il percorso effettuato da un’onda su uno spezzone di filo usato come antenna. Vediamo, infatti,  che se questo spezzone fosse lungo esattamente quanto la lunghezza di un’onda a 433 Mhz ( cioè circa 69 cm ) per metà esso sarebbe percorso dalla semi onda positiva e per l’altra metà dalla semi onda negativa. Considerando la prima metà del filo, quindi metà lunghezza, vediamo che la semi onda positiva raggiunge il suo massimo valore in corrente nel punto K, cioè ad una lunghezza che equivale ad 1/4 di onda ossia a circa 17 cm. Per la quanto riguarda la semi onda negativa, in sua presenza il valore della corrente del segnale è praticamente nullo e quindi non viene considerata.

 

 

Lunghezza antenna 433 Mhz

 

Inoltre, anche se in tabella leggiamo che la portata ( molto ottimisticamente…) arriva a 200 mt, va sottolineato che tale valore si riferisce a quando ci si trova in linea d’aria mentre in ambienti chiusi questa si ridurrà sensibilmente per effetto della presenza di muri, porte e ostacoli di vario genere. Infine, si sarà notato che mentre per alimentare il trasmettitore possiamo usare indifferentemente un qualsiasi valore di tensione compreso fra 3.5 e 12 V ( maggiore è questo valore maggiore sarà la portata ), per quel che riguarda invece il ricevitore esso rimane fisso a 5V.

 

 

Sensore di temperatura wireless

Vediamo ora il primo esempio applicativo di questi moduli e che riguarda la realizzazione di un sensore di temperatura wireless attraverso l’utilizzo di due schede Arduino UNO. La prima viene usata come trasmettitore che ad intervalli di tempo regolari invia il valore della temperatura misurata da una resistenza NTC, la seconda come ricevitore che stamperà sul monitor seriale dell’ IDE di Arduino il valore ricevuto.  La sua realizzazione è molto semplice come è possibile osservare dallo schema riportato qui in basso.

 

 

Arduino sensore wireless

 

Sulla prima scheda bisogna soltanto collegare al pin A5 il partitore formato dalla resistenza da 10K e dal sensore NTC da 22K. Questo valore può essere cambiato ricordandoci di andare ad impostare la variabile corrispondente nello sketch. Il pin 12 invece andrà collegato al terminale DATA del modulo trasmettitore.  Nella seconda scheda invece bisognerà soltanto collegare il pin DATA del modulo ricevente al pin 11. A questo punto bisognerà aprire il monitor seriale dell’IDE di Arduino e vedere i valori ricevuti.

Gli sketch

Gli sketch per questo esempio sono molto semplici e fanno uso della libreria RH_ASK.h scaricabile a fondo pagina. Nel programma del trasmettitore vengono impostate le variabili necessarie a ricavare il valore della temperatura tenendo conto del valore usato per la resistenza NTC  ( 22k ) e della resistenza collegata in serie ( 10k ). Il tutto poi viene elaborato dalla funzione valore_Termistore() che provvede ad inviarne il risultato attraverso il modulo TX ogni 300 mS. Anche se non espressamente specificato, per impostazione predefinita il pin usato dalla libreria per la trasmissione dati è il numero 12.

 

Programma Trasmettitore

/*
  Programma per la trasmissione della temperatura misurata
  dal sensore NTC attraverso il modulo trasmittente a 433 Mhz
*/

#include <RH_ASK.h>
#include <SPI.h>

byte pinNTC = A5;                         // pin entrata del sensore NTC
#define resistenza_In_Serie 10000         // resistenza posta in serie al sensore NTC ( in Ohm )
#define resistenza_Nominale_NTC 22000     // valore nominale del sensore NTC ( in Ohm )
#define temp_Nominale_NTC 25              // valore della temperatura nominale ( in gradi centigradi )
#define coeff_Thermistore 3950            // costante materiale del termistore ( è un valore comune )
float temperatura;
char strTemp[6];


RH_ASK askTx;  // Crea un oggetto ASK che permette la trasmissione di dati via radio

// Funzione che permette di ricavare il valore della temperatura
// misurato dal sensore NTC e di trasmetterlo via radio.

void valore_Termistore()

{
  float valore_ADC;
  float Resistenza;
  float steinhart;
  valore_ADC = analogRead(pinNTC);
  Resistenza = (1023 / valore_ADC) - 1;
  Resistenza = resistenza_In_Serie / Resistenza;
  steinhart = Resistenza / resistenza_Nominale_NTC;
  steinhart = log(steinhart);
  steinhart /= coeff_Thermistore;
  steinhart += 1.0 / (temp_Nominale_NTC  + 273.15);
  steinhart = 1.0 / steinhart;
  steinhart -= 273.15;
  temperatura = steinhart;   // valore della temperatura in gradi centigradi

  // il valore della variabile temperatura viene momorizzato in 
  // un array tipo char e trasmesso
  //
  dtostrf(temperatura, 6, 2, strTemp); 
  delay(10);
  askTx.send((uint8_t *)strTemp, strlen(strTemp));
  askTx.waitPacketSent();
  Serial.println(strTemp);

}

void setup()
{
  Serial.begin(9600);
  pinMode(pinNTC, INPUT); // pin del sensore NTC impostato come INPUT
  askTx.init();   // inizializza l'oggetto ASK

}

void loop()
{

  valore_Termistore();
  delay(300);
}

 

Nel programma lato ricevitore invece, attraverso il metodo  ask.recv(buf_rx, &lungh_buf_rx ) eseguito nel ciclo di loop(), viene controllato se il dato in arrivo corrisponde al tipo che ci si aspetta di ricevere e in caso affermativo stampa il risultato sul monitor seriale. Anche qui per impostazione predefinita la libreria usa il pin 11 per la ricezione dati.

 

Programma Ricevitore

/*
 *  Programma lato ricevitore
 *  x sensore temp. wireless a 433 Mhz
 * 
 */

 
#include <RH_ASK.h> 
#include <SPI.h> 
RH_ASK ask; // Crea un oggetto ask per la ricezione dati
 
void setup()
{
    
    ask.init();           // Inizializza l'oggetto ask
    Serial.begin(9600); 
}
 
void loop()
{
    
   // Array in cui viene memorizzato il dato ricevuto
    uint8_t buf_rx[6];
    uint8_t lungh_buf_rx = sizeof(buf_rx);
    
    // Verifica se il dato ricevuto è della lunghezza richiesta ( 6 nel mio caso )
    
    if (ask.recv(buf_rx, &lungh_buf_rx ))
    {
      
      Serial.print("Temperatura esterna: ");
      Serial.println((char*)buf_rx);         // stampa il dato sulla seriale
     
    }
}

 

 

Nel video si osserva la ricezione dei dati trasmessi dal trasmettitore e stampati sul modulo seriale

 

 

Qui in basso è possibile scaricare i file dell’esempio proposto

sketch RX e TX

RadioHead-1.86

Schema Arduino tx_rx_433Mhz.png