Guten Tag liebe Raspberry Gemeinde,
ich bin gerade dabei meine Bachelor Arbeit zu schreiben und entwickel dafür einen Wireless Sensor Node (WSN) der über das MQTT-Protokoll mit dem Raspberry kommunizieren soll.
Zur Zeit benutze ich noch das NanoESP zur Kommunikation und einen Temperatur und Luftfeuchtigkeitssensor (DHT11) zum ermitteln von Messwerten. Die Kommunikation zwischen WSN und dem Mosquitto-Broker funktioniert einwandfrei. (Der Broker ist auf dem RPi installiert.) Sobald ich im LXTerminal den Befehl
Quote"mosquitto_sub -d -v -t \#"
(# = Wildcard)
eingebe, werden alle Daten, die vom NanoESP gepublished werden, angezeigt. Es besteht auch die Möglichkeit anstatt der Wildcard (#) spezifische Topics wie "greenhouse1/sensor1/Temp"einzugeben, um beispielsweise nur die Temperatur auszulesen. Der erste Schritt der Entwicklung ist also schon einmal geschafft...
Hier ist der Code für das NanoESP (Prototyp):
#include <NanoESP.h>
#include <NanoESP_MQTT.h>
#include "DHT.h"
#include <SoftwareSerial.h>
/*
* NanoESP MQTT
Change SSID and PASSWORD.
*/
//set your WiFi
#define SSID "Chris"
#define PASSWORD "2548621671438430"
#define LED_WLAN 13
#define DEBUG true
//defines for sensor DHT11
#define DHTPIN A0
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
NanoESP nanoesp = NanoESP();
NanoESP_MQTT mqtt = NanoESP_MQTT(nanoesp);
//globale Value for Humidity & Temperature
unsigned int h, t;
//_________________setup WiFi- and MQTT-Connection_______________________
void setup() {
Serial.begin(19200);
nanoesp.init();
nanoesp.configWifiStation(SSID, PASSWORD);
dht.begin();
if (nanoesp.wifiConnected()) {
Serial.println ("Wifi connected");
digitalWrite(LED_WLAN, HIGH);
}
else {
Serial.println ("Wifi not Connected");
}
//Print IP in Terminal
Serial.println (nanoesp.getIp());
//if (mqtt.MQTT_Connect(0, "broker.mqttdashboard.com", 1883, "NanoESP")) { //alternative broker
if (mqtt.connect(0, "192.168.178.136", 1883, "NanoESP")) {
if (mqtt.publish(0, "a/b", "Hello from NanoESP")) Serial.println ("Published to a/b");
if (mqtt.publish(0, "test", "Hello from NanoESP")) Serial.println ("Published to test");
if (mqtt.subscribe(0, "test")) Serial.println ("Subscribed to test");
if (mqtt.subscribe(0, "a/#")) Serial.println ("Subscribed to a/#");
//if (MQTT_Unsubscribe(0, "test")) debug("Unsubscribed from test");
//if (MQTT_Ping(0)) debug("Ping send ");
//if (MQTT_Disconnect(0)) debug("Disconnect");
}
}
//_______________calculate temperature and humidity_________________
float calculate_sensor_data(){
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
//Read humidity
h = dht.readHumidity();
// Read temperature as Celsius (the default)
t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
}
//_________________Print sensordata in the serial desktop (for tests)_____________
void print_sensor_data(unsigned int humidity,unsigned int temp){
Serial.print ("Humidity: ");
Serial.print (humidity);
Serial.println("%");
Serial.print ("Temperature: ");
Serial.print (temp);
Serial.println("°C");
return;
}
//__________________publish Temperature & Humidity to the mosquitto-broker IP:192.168.178.136___________
void pub_sensor_data_mqtt(unsigned int humidity,unsigned int temp){
String HDY = "Humidity: ";
String pub_string_humidity = HDY + humidity;
String TEMP = "Temperature: ";
String pub_string_temp = TEMP + temp;
mqtt.publish(0, "/greenhouse1/sensor1/humidity", pub_string_humidity); // (ID, Topic, String value)
mqtt.publish(0, "/greenhouse1/sensor1/Temp", pub_string_temp); // (ID, Topic, String value)
return;
}
//__________________Forever______________________
void loop() {
int id, len;
if (nanoesp.recvData(id, len)) {
String topic, value;
if (mqtt.recvMQTT(id, len, topic, value)) {
Serial.println ("New Message:\nTopic=" + topic + " Value=" + value);
}
}
calculate_sensor_data();
//print_sensor_data_desktop(h,t); //testing sensor
pub_sensor_data_mqtt(h,t);
delay(5000);
mqtt.stayConnected(0); //keep the connection to broker alive
}
Display More
Nun möchte ich die Daten allerdings nicht nur auslesen, sondern auch speichern und anschließend in verschiedenen Grafiken darstellen. Dazu möchte ich mein RPi3 auch als Client am Broker anmelden, um anschließend die Daten in einer DB (vorzugsweise SQlite) zu speichern. Ich kenne mich mit Datenbanken nur sehr wenig aus und weiß nicht genau wie ich die Datenbank an den Broker anbinden soll.
Es wäre sehr nett wenn ihr Ideen und Anregungen postet.
Grüße Twinzy