| 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
 1.8.16
 1.8.16