MQTT – enc28j60 e Arduino (22)

luca 02/11/2016 0

Da appassionato di fumetti, non potevo non pubblicare un crossover tra il mio “storico” tutorial sull’uso del controller enc28j60 con Arduino e il nuovo tutorial sul protocollo MQTT.

Ecco quindi che, dopo aver introdotto il protocollo MQTT e spiegato l’uso di mosquitto, oggi vediamo come inviare dati ad un broker MQTT tramite il controller ethernet enc28j60.

Librerie

Utilizzeremo la libreria PubSubClient di Nick O’Leary per “parlare” con il nostro broker MQTT (mosquitto). La libreria può essere installata direttamente dal Library Manager di Arduino (menu Sketch – Include Library – Manage Libraries…):

mqtt-arduino01

La libreria scelta si basa sulla API Ethernet Client di Arduino, normalmente disponibile se si utilizza il chip ethernet “ufficiale” (W5100). Già in passato vi ho però parlato della libreria UIPEthernet che rende compatibili sketch e librerie scritte per tale chip anche per il chip enc28j60. Installiamo quindi anche questa libreria all’interno dell’IDE di Arduino e siamo pronti per scrivere il nostro sketch…

Infine per questo tutorial ho pensato di collegare un sensore di temperatura (e umidità) ad Arduino; il sensore scelto è il DHT11. Per leggere i valori dal sensore, utilizzeremo la libreria DHT sensor library di Adafruit, anch’essa installabile tramite il Library Manager.

mqtt-arduino03

Sketch

Ho pubblicato lo sketch completo nel mio repository Github.

Vediamo le parti principali. Dopo aver incluso le librerie, definiamo alcune costanti, tra le quali il topic al quale invieremo i dati, l’identificativo del nostro client MQTT, l’intervallo di invio dati e la configurazione del sensore:

#define CLIENT_ID       "ArduinoMQTT"
#define TOPIC           "temperature"
#define PUBLISH_DELAY   5000
#define DHTPIN          3
#define DHTTYPE         DHT11

configuriamo quindi il MAC address dell’interfaccia di rete di Arduino e l’indirizzo IP del broker MQTT (= l’indirizzo del computer sul quale è in esecuzione mosquitto):

uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
IPAddress mqttServer(192,168,1,4);

la configurazione del client MQTT avviene indicando l’Ethernet client da utilizzare e il server (e la relativa porta) a cui connettersi:

mqttClient.setClient(ethClient);
mqttClient.setServer(mqttServer, 1883);
Serial.println(F("MQTT client configured"));

all’interno del loop() controlliamo se è trascorso l’intervallo di tempo tra una misurazione e la successiva, in caso affermativo leggiamo il nuovo valore di temperatura e inviamolo al broker:

if(millis() - previousMillis > PUBLISH_DELAY) {
  sendData();
  previousMillis = millis();
}

molto importante chiamare frequentemente il comando loop() dell’oggetto MQTT Client, in modo che questo possa processare i vari pacchetti in ingresso:

mqttClient.loop();
ogni tot secondi, lo sketch legge la temperatura, la visualizza e la invia al broker. Il valore di temperatura restituito dalla libreria è di tipo float, è quindi necessario convertirlo in stringa (usando il comando dtostrf):
float t = dht.readTemperature();
Serial.print("Temperature: ");
Serial.println(t);
 
if(mqttClient.connect(CLIENT_ID)) {
  mqttClient.publish(TOPIC, dtostrf(t, 6, 2, msgBuffer));
}

Test

Per provare lo sketch, dobbiamo per prima cosa eseguire mosquitto sul nostro PC. Apriamo inoltre un secondo prompt dei comandi e lanciamo mosquitto_sub per sottoscrivere il topic temperature:

mosquitto_sub.exe -t temperature

Se ora eseguiamo lo sketch, dovremmo vedere i valori di temperatura inviati al broker e da questi al sottoscrittore:

mqtt-arduino02

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi