Arduino: controllo a distanza della temperatura

Arduino è un invenzione tutta italiana che ha avuto successo nel mondo intero e che ha permesso a tutti, con un minimo di conoscenze, la possibilità di creare dei sistemi artigianali tecnologici multifunzionali. Con l’introduzione di Arduino si sono fatti sempre più strada concetti come “domotica” e “Internet of Things”.

Oggigiorno ognuno può assemblarsi da solo dei sistemi di controllo, dal semplice controllo delle luci di casa comandati da un telefonino al sistema di gestione dell’irrigazione del giardino oppure la produzione in piena autonomia di un sistema di video sorveglianza casalingo che invia un messaggio quando in casa viene rilevato del movimento.

I sensori che si possono usare con Arduino sono numerosi: sensori di temperatura, di umidità, rilevatori di fumo, di movimento, di prossimità, ecc.

Nel caso in questione avevo la necessità di conoscere la temperatura di una piccola sala server e di poterne monitorare l’andamento senza dover continuamente entrare ed uscire. Ci sono molti sistemi ups che permettono di controllare la temperatura dell’ambiente, tuttavia avere un pannello che permette un controllo immediato della situazione è molto più comodo. Pertanto ho pensato di costruire un prototipo per il controllo della temperatura e trasmissione del dato via onde radio.

L’obiettivo del nostro progetto dunque sarà quello di trasmettere dei dati di temperatura e di trasmetterli ad un dispositivo ricevente posto in un altro ambiente.

Schema della trasmittente

Arduino: controllo a distanza della temperatura

Schema del ricevente

Arduino: controllo a distanza della temperatura

Funzionamento

La trasmittente legge il valore della temperatura fornitagli dal sensore LM35

Arduino: controllo a distanza della temperatura

e, tramite un altro sensore che è un trasmittente radio a 433 Mhz,

Arduino: controllo a distanza della temperatura

trasmette di continuo la lettura della temperatura.
In un altro ambiente andremo a posizionare il componente ricevente. Le componenti dello schema del ricevente sono:

  • 1 LCD display 16×2
  • 3 LED (1 rosso, 1 giallo, 1 verde)
  • 1 Potenziometro (da collegare al pin luminosità del display)
  • 1 Buzzer ( per emettere un suono al superamento della soglia)
  • 1 Ricevitore radio 433Mhz
  • 4 Resistenze da 330 Ohm per stare sicuri
  • 2 Arduino nano (io ho usato 1 arduino nano e 1 arduino UNO r3)

Il risultato finale è il seguente:

Arduino: controllo a distanza della temperatura

 

Arduino: controllo a distanza della temperatura

Ecco il codice del ricevente:

// include the library code:
#include <LiquidCrystal.h>
#include <VirtualWire.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int redled = 6;
int yellowled = 7;
int greenled = 8;
int buzz = 10;
int radiopin = 9;
int count;
int received;

void setup() {

pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(greenled, OUTPUT);

Serial.begin(9600); // Debugging only
Serial.println("setup"); // Prints "Setup to the serial monitor"

// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Gradi:");

tone(buzz, 1000, 500);
initialize_leds();

initialize_receiver();
}

void initialize_leds(){

digitalWrite(redled,HIGH);
digitalWrite(yellowled,HIGH);
digitalWrite(greenled,HIGH);
delay(2500);

digitalWrite(redled,LOW);
digitalWrite(yellowled,LOW);
digitalWrite(greenled,LOW);

}

void initialize_receiver() {
vw_set_rx_pin(radiopin);
vw_setup(2000);
vw_rx_start();
}

int receive_integer() {
uint8_t Buffer_Size = 2;
unsigned int Data;
uint8_t RxBuffer[Buffer_Size];


if (vw_get_message(RxBuffer, &Buffer_Size)) // Non-blocking
{
Data = RxBuffer[0] << 8 | RxBuffer[1];
return Data;
}
return -1;
}

void loop() {

lcd.setCursor(0, 1);
received = receive_integer();
if(received != -1) Serial.println(received);

if(received != -1) lcd.print(received);

if(received<=25 && received>0) {
digitalWrite(greenled,HIGH);
digitalWrite(redled,LOW);
digitalWrite(yellowled,LOW);
}

if(received==26 && received>0) {
digitalWrite(greenled,LOW);
digitalWrite(redled,HIGH);
digitalWrite(yellowled,HIGH);
}

if(received>=27 && received>0) {
digitalWrite(greenled,LOW);
digitalWrite(redled,HIGH);
digitalWrite(yellowled,LOW);
tone(buzz, 1000, 500);
}
}

Infine il codice del trasmettitore:

#include <VirtualWire.h>

const int TX_DIO_Pin = 7;

int pinled = 13;

int reading;
int LM35Feed = A0;
float tCelsius;
float tFahrenheit;
float tKelvin;
float millivolts;


void setup() {
pinMode(pinled, OUTPUT);
initialize_transmitter();
Serial.begin(9600);

}

/* Main program */
void loop() {
int counter;
reading = analogRead(LM35Feed);
millivolts= (reading/1024.0) * 5000;
tCelsius = millivolts/10; //LM 35 Equation
tFahrenheit= ( tCelsius * (9/5) ) + 32;
tKelvin = tCelsius+273.15;

Serial.print("Celsius °C :");
Serial.print(tCelsius);
Serial.println("");
Serial.print("Fahrenheit °F :");
Serial.print(tFahrenheit);
Serial.println("");
Serial.print("Kelvin °K :");
Serial.print(tKelvin);
Serial.println("\n");

for(counter=0; counter<100; counter++) {
digitalWrite(pinled, HIGH);
transmit_integer(tCelsius);
digitalWrite(pinled, LOW);
reading = analogRead(LM35Feed);
millivolts= (reading/1024.0) * 5000;
tCelsius = millivolts/10; //LM 35 Equation
tFahrenheit= ( tCelsius * (9/5) ) + 32;
tKelvin = tCelsius+273.15;

Serial.print("Celsius °C :");
Serial.print(tCelsius);
Serial.println("");
Serial.print("Fahrenheit °F :");
Serial.print(tFahrenheit);
Serial.println("");
Serial.print("Kelvin °K :");
Serial.print(tKelvin);
Serial.println("\n");

delay(1200);
}
}

void initialize_transmitter() {

vw_set_tx_pin(TX_DIO_Pin);
vw_set_ptt_inverted(true);
vw_setup(2000);
}

void transmit_integer(unsigned int Data) {

byte TxBuffer[2];
TxBuffer[0] = Data >> 8;
TxBuffer[1] = Data;
vw_send((byte *)TxBuffer, 2);
vw_wait_tx();
}

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *