// Codice per il monitoraggio da remoto della temperatura e umidità
// introduzione alla rete mesh 4 nodi con painlessMesh library
//
#include "Adafruit_Sensor.h"
#include <DHT.h>
#include "painlessMesh.h"
//--------------------------------------------------------------------------------------
//Constants
#define DHTPIN 4 // pin DATI sul GPIO
#define DHTTYPE DHT11 // Sensore DHT11 (AM2302)
//#define DHTTYPE DHT22 // DHT 11 (AM2302)
DHT dht(DHTPIN, DHTTYPE); // Inizializza il sensore
int LEDPIN = 22; //GPIO pin usato dal LED
float temp;
float humidity;
//--------------------------------------------------------------------------------------
#define MESH_PREFIX "whateverYouLike" //Mesh net name
#define MESH_PASSWORD "somethingSneaky" //Mesh net password
#define MESH_PORT 5555 //Mesh TCP server port
Scheduler userScheduler; // scheduler controlla i task per non usare i "delay"
painlessMesh mesh; //crea un oggetto mesh per gestire la rete mesh
void sendMessage() ; // prototype for full C compatibility
int clientRef;
//Crea un task per chiamare il sendMessage() ogni secondo senza bloccare il i vari jobs.
Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );
//Invia un messaggio a TUTTI i nodi (broadcasting)
void sendMessage() {
String msg = "Connesso dal Client ";
msg += String(clientRef);
//String msg = "Connesso dal Client 1";
//String msg = "Connesso dal Client 2";
//String msg = "Connesso dal Client 3";
//String msg = "Connesso dal Client 4";
msg += " (NodeId: ";
msg += mesh.getNodeId();
msg += " ) - Temp : ";
if ( digitalRead(LEDPIN) == HIGH ) digitalWrite(LEDPIN, LOW);
else digitalWrite(LEDPIN, HIGH);
temp = dht.readTemperature();
humidity = dht.readHumidity();
msg += String(temp);
msg += ", Humidity";
msg += String(humidity);
mesh.sendBroadcast( msg );
taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}
// Le seguenti funzioni devono essere definite per funzionare con la libreria painlessMesh
//
// receivedCallback viene richiamata quando un nuovo messaggio viene ricevuto
void receivedCallback( uint32_t from, String &msg ) {
Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
//Serial.printf("HEREMEAS: Temperature %f, Humidity %f\n", temp, humidity);
}
// newConnectionCallback viene richiamata ad ogni nuovo nodo che si connette alla rete
void newConnectionCallback(uint32_t nodeId) {
Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}
//changedConnectionCallback viene richiamata quando un a connessione cambia, come ad esempio
//quando un nuovo nodo entra o esce dalla rete, etc.
void changedConnectionCallback() {
Serial.printf("Changed connections\n");
}
//nodeTimeAdjustedCallback quando viene modificato il tempo di riferimento della rete (sincronizzazione)
void nodeTimeAdjustedCallback(int32_t offset) {
Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}
//--------------------------------------------------------------------------------------
void setup() {
Serial.begin(115200); // Inizializzazione del monitor seriale (solo per il debugging!)
pinMode(LEDPIN, OUTPUT);
dht.begin();
//--------------------------------------------------------------------------------------
clientRef = random(1,1000000);
//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
mesh.setDebugMsgTypes( ERROR | STARTUP ); // prima di inizializzare bisogna scegliere il livello di debug della rete
mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT ); //inizializzazione
mesh.onReceive(&receivedCallback); // assegnazione della funzione onReceive
mesh.onNewConnection(&newConnectionCallback);// assegnazione della funzione onNewConnection
mesh.onChangedConnections(&changedConnectionCallback);// assegnazione della funzione onChangedConnections
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);// assegnazione della funzione onNodeTimeAdjusted
userScheduler.addTask( taskSendMessage ); //assegnazione e
taskSendMessage.enable(); // abilitazione dell'invio dei messaggi
//--------------------------------------------------------------------------------------
delay(2000);
}
void loop() {
if ( digitalRead(LEDPIN) == HIGH ) digitalWrite(LEDPIN, LOW);
else digitalWrite(LEDPIN, HIGH);
temp = dht.readTemperature();
humidity = dht.readHumidity();
/*
Serial.print("Temp : ");
Serial.print(temp);
Serial.println(" C ");
Serial.print("Humidity : ");
Serial.print(humidity);
Serial.println(" % ");
*/
//delay(200);
//delay(1000);
mesh.update();
}
Loading
ssd1306
ssd1306