dataclient-dht22
|
DATACLIENT-DHT22: invia i dati recuperati dal dht22 al raspberry via MQTT. Continua...
#include <ArduinoJson.h>
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
Definizioni | |
#define | dim(x) (sizeof(dim_helper(x))) |
#define | dhtConnected true |
true = DHT22 utilizzabile/connesso Continua... | |
#define | serialDebug false |
true = visualizza messaggi di debug attraverso comunicazione seriale Continua... | |
#define | DHTPIN 4 |
pin dato del DHT22 Continua... | |
#define | DHTTYPE DHT22 |
tipo di sensore DHT (DHT22) Continua... | |
Funzioni | |
template<typename T , int N> | |
char(& | dim_helper (T(&)[N]))[N] |
DHT | dht (DHTPIN, DHTTYPE) |
creazione oggetto dht Continua... | |
PubSubClient | client (espClient) |
usa client WiFi per MQTT Continua... | |
void | WiFiconn () |
void | macAddrToString (byte *mac, char *macAddr) |
void | MQTTconn () |
void | present () |
void | callback (char *topic, byte *payload, unsigned int length) |
void | reportData (float t_humidity, float t_temp, int t_rssi) |
void | setup () |
void | loop () |
Variabili | |
const int | nodeType = 0 |
tipo di nodo Continua... | |
const char | mqttServer [15] = "raspberry" |
IP/dominio mqtt server. Continua... | |
const int | mqttPort = 1883 |
porta mqtt Continua... | |
const char * | mqttUser = "test" |
utente mqtt Continua... | |
const char * | mqttPassword = "test" |
password mqtt Continua... | |
char | prMainTopic [14] = "presentation/" |
topic principale presentazione Continua... | |
char | optMainTopic [9] = "options/" |
topic principale opzioni Continua... | |
char | dataMainTopic [6] = "data/" |
topic principale dati Continua... | |
float | humidity = 12.34 |
umidita' (default 12.34 come test) Continua... | |
float | temperature = 12.34 |
temperatura Celsius (default 12.34 come test) Continua... | |
int | timeSinceLastRead = 0 |
variabile tempo dall'ultima lettura DHT Continua... | |
int | timeToWait = 2000 |
variabile tempo da aspettare per interrogare DHT (minimo 2000 [ms]) Continua... | |
const char * | WIFI_SSID = "nameofnetwork" |
SSID access point. Continua... | |
const char * | WIFI_PASS = "longerthan8charspassword" |
Passphrase access point. Continua... | |
char | ipAddr [16] |
contiene IP address Continua... | |
char | macAddr [18] = {0} |
contiene MAC address Continua... | |
WiFiClient | espClient |
crea un client WiFI Continua... | |
DATACLIENT-DHT22: invia i dati recuperati dal dht22 al raspberry via MQTT.
Lo sketch verifica nel setup() se il valore delle variabili e' accettabile:
poi memorizza in <macAddr> l'indirizzo mac del dispositivo.
Per farlo si usa la funzione macAddrToString()
Formato: @codeAB:AB:AB:AB:AB:AB
Nella funzione loop() viene gestita la connessione all'access point di raspberry attraverso la funzione WiFiconn() e la connessione al broker MQTT con la funzione MQTTconn().
WiFiconn() memorizza l'indirizzo IP nella stringa <ipAddr>
MQTTconn() annuncia la presenza del sensore al sistema usando la funzione present()
Dopo essersi connessi all'AP e al broker MQTT vengono rilevate temperatura e umidita' dal DHT22 e viene misurato l'RSSI. Temperatura, umidita' e RSSI vengono mandati al broker MQTT dalla funzione reportData()
#define dim | ( | x | ) | (sizeof(dim_helper(x))) |
#define dhtConnected true |
true = DHT22 utilizzabile/connesso
#define serialDebug false |
true = visualizza messaggi di debug attraverso comunicazione seriale
#define DHTPIN 4 |
pin dato del DHT22
#define DHTTYPE DHT22 |
tipo di sensore DHT (DHT22)
char(& dim_helper | ( | T(&) | [N] | ) | )[N] |
creazione oggetto dht
PubSubClient client | ( | espClient | ) |
usa client WiFi per MQTT
void WiFiconn | ( | ) |
Questa funzione si occupa di connettersi al WiFi.
Disattiva e riattiva il WiFi per evitare un tentativo di connessione mentre e' gia' connesso, e utilizza ssid e password per tentare una connessione alla rete. Dopo la connessione viene memorizzato l'indirizzo IP in <ipAddr>.
Se in 15 secondi non ci riesce smette di tentare di connettersi all'access point.
void macAddrToString | ( | byte * | mac, |
char * | macAddr | ||
) |
Converte indirizzo MAC in una stringa.
Scorre l'array di byte: per ogni byte prende i due valori esadecimali e ottiene la loro "versione stringa". Ogni byte e' concatenato da ":"
L'ultimo ":" viene sostituito da "\0"
mac | Puntatore a un array di byte con indirizzo MAC |
macAddr | Puntatore a una stringa |
void MQTTconn | ( | ) |
Connette il nodemcu al broker MQTT su raspberry.
Imposta nome/IP del server e la relativa porta, imposta la funzione da richiamare quando si ricevono messaggi sui topic sottoscritti e si tenta la connessione con username e password.
L'id di connessione e' l'indirizzo MAC del dispositivo.
Se la connessione ha successo viene inviato un messaggio di presentazione attraverso la funzione present()
void present | ( | ) |
Presenta il dispositivo al sistema via messaggio MQTT.
Manda sul topic presentation/<mac> il proprio indirizzo MAC, IP, tipo di nodo e timeToWait. Se il dispositivo e' riuscito a inviare il dato il client si iscrive al topic per ottenere configurazioni dal raspberry, altrimenti si disconnette dal broker per cercare di ri-presentarsi alla prossima connessione
void callback | ( | char * | topic, |
byte * | payload, | ||
unsigned int | length | ||
) |
Funzione di callback sui topic sottoscritti.
Compone il topic opzioni. Se il topic del messaggio ricevuto corrisponde al topic delle opzioni, controlla se il valore ricevuto e' valido. Se e' valido (numero intero) usalo.
topic | Stringa con topic |
payload | Messaggio ricevuto |
length | Lunghezza messaggio |
void reportData | ( | float | t_humidity, |
float | t_temp, | ||
int | t_rssi | ||
) |
Invia i dati al broker MQTT.
Compone il topic per i dati, crea un oggetto JSON con i dati passati alla funzione, lo converte in stringa e lo invia al broker MQTT su raspberry pi.
t_humidity | Float umidita' |
t_temp | Float temperatura |
t_rssi | Intero RSSI |
void setup | ( | ) |
Salva indirizzo MAC e si connette all' access point e al broker MQTT.
La funzione converte l'indirizzo MAC da byte array in stringa e lo salva nella variabile <macAddr>, si assicura che timeToWait vale almeno 2000 [ms]
Per rilevare i dati dal DHT22 servono almeno 2 secondi tra le letture
void loop | ( | ) |
Mantiene connesso il dispositivo a WiFi e broker MQTT, rileva dati e li invia al broker.
La funzione controlla se il dispositivo e' connesso al WiFi: se non e' piu' connesso si ricollega richiamando la funzione WiFiconn()
Poi controlla se e' connesso al broker MQTT: se non e' piu' connesso si ricollega richiamando la funzione MQTTconn()
Ogni <timeToWait> viene salvato il valore di RSSI, vengono eseguite le rilevazioni dal sensore DHT22 e poi invia i dati al broker MQTT con la funzione reportData()
const int nodeType = 0 |
tipo di nodo
const char mqttServer[15] = "raspberry" |
IP/dominio mqtt server.
const int mqttPort = 1883 |
porta mqtt
const char* mqttUser = "test" |
utente mqtt
const char* mqttPassword = "test" |
password mqtt
char prMainTopic[14] = "presentation/" |
topic principale presentazione
char optMainTopic[9] = "options/" |
topic principale opzioni
char dataMainTopic[6] = "data/" |
topic principale dati
float humidity = 12.34 |
umidita' (default 12.34 come test)
float temperature = 12.34 |
temperatura Celsius (default 12.34 come test)
int timeSinceLastRead = 0 |
variabile tempo dall'ultima lettura DHT
int timeToWait = 2000 |
variabile tempo da aspettare per interrogare DHT (minimo 2000 [ms])
const char* WIFI_SSID = "nameofnetwork" |
SSID access point.
const char* WIFI_PASS = "longerthan8charspassword" |
Passphrase access point.
char ipAddr[16] |
contiene IP address
char macAddr[18] = {0} |
contiene MAC address
WiFiClient espClient |
crea un client WiFI