Sonntag, 19. April 2020

Datalogger mit Display im RAW-Elektrik-Design, Visualisierung und Push-Nachrichten

Erfahre, wie du dir deine eigene kleine Indoor-Wetterstation oder dein eigenes Thermometer mit WLAN und Übertragung der Daten zu einer Datenbank sowie Auswertung auf einer grafischen Oberfläche baust. Du kannst dir über Grafana Benachrichtigungen via E-Mail oder Telegram automatisiert zuschicken, wenn sich die Werte außerhalb des Soll-Bereichs befinden.

Grafana-Dashboard mit den Messwerten des Mikrocontrollers gefüttert.




Datenlogger im RAW-Elektrik-Design mit Display zur direkten Visualisierung der erfassten Daten.
Unten links: Wlan-Connection mit Qualitätsanzeige
Unten in der Mitte: Zeit bis zur nächsten Übertragung zur Datenbank und Anzeige, ob es beim letzten Übertragungsversuch funktioniert hat.
Unten rechts: die Einheit des Messwertes.
Mitte: Messwertgröße.
Oben: Name des Messwertes.
Oben links: Quickinfo-Messwertname




Links (oben): Temperaturanzeige in °C, Verbindungsqualität zum Wlan-Router 100%, Nächste Datenübertragung zur Datenbank in 270 Sekunden.
Rechts (unten): Direkt nach dem starten des Mikrocontroller: Verbindung zum Router erfolgreich.









Verwendete Hardware

Wemos D1 Mini Mikrocontroller mit I²C Schnittstelle zu ansteuern des Displays, auslesen des BMP280 und BH1750 sowie zur Übertragung der Daten zum Server bzw. in die phpMyAdmin-Datenbank. Leider momentan bei AZ-Delivery nicht verfügbar...
ESP8266 ESP-12 D1 Mini-Modul NodeMcu Lua WiFi Development Board Micro USB 3.3V Basierend auf ESP-8266EX 11 Digital-Pin

1,3" Zoll großes OLED Display mit I²C-Schnittstelle zur Visualisierung der aufgenommen Daten direkt am Mikrocontroller. ACHTUNG: Das Glas des Displays ist verdammt dünn. Also vorsichtig damit umgehen. Am besten gleich mehrere im Bundle kaufen. Sonst ist der Ärger groß, wenn man einmal angefangen hat daran zu werkeln und man unbedingt weiter machen möchte... Ich weiß, wovon ich rede.
128 x 64 Pixel 1,3 Zoll OLED I2C Display für Arduino und Raspberry Pi oder generell I²C fähige Mikrocontroller


Der BMP280 ist multifunktional. - Mit diesem Bauteil lässt sich die Temperatur, die Luftfeuchtigkeit und auch der Luftdruck messen! Um an die Messwerte zu gelangen, wird der Sensor per I²C an den Mikrocontroller angeschlossen und ausgelesen.
GY-BME280 Barometrischer Sensor für Temperatur, Luftfeuchtigkeit und Luftdruck für I²C


Mit dem BH1750 lässt sich die Helligkeit bzw. die Beleuchtungsstärke in Lux messen. Auch dieser Sensor wird über die I²C-Schnittstelle betrieben.
GY-302 BH1750 Licht Sensor Helligkeitsensor für Arduino und Raspberry Pi oder generll I²C fähige Geräte 

Um die aufgenommen Messwerte zu visualisieren, verwende ich ein Raspberry Pi 4 B mit Grafana. Klar, entsprechende Software hierzu lässt sich auch auf dem heimischen Windows-PC betreiben, ist aber recht unpraktikabel, da dieser dazu immer eingeschaltet sein müsste. Hinzu kommen große Unterschiede beim Stromverbrauch. Vor allem bei Langzeitbetrachtung lohnt sich das Pi!

Ich habe auf dem Pi den Grafana-Server laufen, um die Daten zu visualisieren. Eine Datenbank betreibe ich hier nicht. Die Möglichkeit dazu besteht jedoch!
Raspberry Pi 4 Model B 4 GB Ultimatives Kit mit 32GB Class10 Micro SD-Karte, 5,1V 3,0A USB-C EIN/Aus-Schaltnetzteil, 3 Premium Kupfer Kühlkörper, Micro HDMI-Kabel, Premium Schwarzes Gehäuse


Hinweis: Klick auf die Bilder, um direkt zum Produkt zu komme. Den Lieferanten AZ-Delivery kann ich sehr empfehlen. Kostet zwar ein paar Euro mehr, als die Teile in China zu bestellen, allerdings sind sie sehr rasch da und es werden immer PDF-Dateien zu den jeweiligen Bauteilen oder Breakout-Boards mitgeliefert!

Vorbereitung der Programmierumgebung

Lade dir Arduino herunter und installiere es:

Arduino starten!

Erste Einstellungen vornehmen, um eine Verbindung zum Mikrocontroller aufbauen zu können:
1. Werkzeuge -> Board -> Boardverwalter...
2. Im Suchfeld ESP eingeben
3. esp8266 installieren
Installiere die ESP-Boards



4. Werkzeuge -> Board -> "LOLIN(Wemos) D1 R2 & mini" auswählen
5. Unter "Werkzeuge -> Port" den entsprechenden Port deines Mikrocontrollers auswählen.
Solltest du nicht wissen, welcher es ist: Gib in der Windows-Suche "Gerätemanager" und öffne ihn.
Unter der Kategorie "Anschlüsse (COM & LPT)" sollte, nachdem du deinen Mikrocontroller mit dem PC verbunden hast  "USB CH340 (COMxxx)" auftauchen. (xxx = Nummer des COM-Ports).

Finde deinen COM-Port


5. Mit einem einfachen Sketch die Verbindung und Funktion des Mikrocontrollers testen.
Du findest den Code direkt in Arduino unter "Datei -> Beispiele -> 01.Basics-> Blink"


Beispielcode aus Arduino "Blink"

6. Um den Code auf dein Board zu laden, einfach den kleinen Pfeil oben links, der nach rechts zeigt drücken. Dein Programm wird kompiliert, gleichzeitig auf Syntaxfehler geprüft und auf den Mikrocontroller geladen und gleich ausgeführt.

Librarys installieren

Damit die Sensoren, das Display, und die Übertragung per WLAN einwandfrei funktionieren, werden Librarys benötigt. Diese enthalten vorgefertigten Programmcode und ersparen dir somit eine Menge Arbeit, alles einzeln zu Programmieren und die Datenblätter zu studieren. Allerdings lernst du dabei recht wenig und du weißt auch nicht, was in den enthaltenen Funktionen passiert und ob die Werte die dir diese Funktionen liefern, auch deiner gewünschten Genauigkeit entsprechen.
Des weiteren hast du selten Einfluss auf Sonderfunktionen deiner I²C Devices. Ein markantes Beispiel hierfür ist der deepsleep oder generell sleep mode, der oft unterstützt wird (geringer Stromverbrauch. Interessant für Batteriebetrieben Projekte).
Es erforder aber ein erhebliches Maß mehr an Kenntnis über die Materie, ohne Librarys zu arbeiten. 
Es erfordert eine Menge Zeit und Ausdauer, dies alles zu lernen. 
Da du deine kleine Wetterstation aber schnell bauen möchtest, zeige ich dir den kurzen Weg über die Librarys.



Weitere Librarys zu Arduino hinzufügen:
 "Sketch -> Bibliothek einbinden -> Bibliotheken verwalten..."
Im Suchfeld "BMP280" eingeben und die "Adafruit BMP280 Library" installieren

Auf diesem Wege werden auch die weiteren Librarys installiert:
Einmal alle aufgelistet:

Adafruit BMP Library
BH1750
U8G2
MySQL Connector Arduino
ESP8266WiFi (bereits installiert, Boardverwalter...)

Die ESP8266WiFi Library sollte schon über den Boardverwalter mit installiert worden sein.


Bauanleitung

Wenn denn dann endlich alle Teile da sind, kann es mit dem Aufbau losgehen.
Bevor nun aber gleich alle Teile zusammengelötet werden, empfiehlt es sich, das ganze erstmal auf einem Breadboard aufzubauen und auszuprobieren. Denn so können Verbindungen ganz einfach gesetzt und wieder entfernt werden.
Breadboard Kit - 3 x 65Stk. Jumper Wire Kabel M2M und 3 x Mini Breadboard 400 Pins für Arduino, Raspberry Pi


Nur, bevor du da einfach wild lossteckst, musst du wissen, was du da tust!
Denn die Bauteile sind recht empfindlich, was falsche Spannungen am falschen Pin angeht und dann recht schnell hinüber...
Also hier der Plan zur Verschaltung der Komponenten:



Wenn du auf Nummer sicher gehen möchtest, dass die Kommunikation mit jedem einzelnen Teilnehmer erst einmal funktioniert, schließe sie nacheinander an.
Das solltest du auch alleine aus dem Grund schon machen, um die I²C Adressen der Teilnehmer herauszufinden.

Also: Einen Teilnehmer am Mikrocontroller anschließen und eine I²C-Scann Programmierung drüber laufen lassen. Die findest du hier:
https://playground.arduino.cc/Main/I2cScanner/

Einfach den gesamten Quellcode in Arduino kopieren und auf den Controller laden.

Über die Serielle-Console erfährst du nun die Adressen deiner Geräte:
I²C Scanner im Einsatz
Bei mir wurden die Adressen:
0x23
0x3C
0x76
gefunden.
Da ich momentan drei I²C-Teilnehmer gleichzeitig am BUS betrieben habe, kann ich die Adressen so nicht den einzelnen Teilnehmern zuordnen.


Schön! - Jetzt weißt du, wie du an die Adressen ran kommst. - Allerdings brauchst du, dank der Librarys im Normalfall keine der Adresse separat eintragen. - Es sei denn, du hast zum Beispiel den Anschluss ADDR am BH1750 auf +5V statt auf GND gelegt. Dann erhält der Teilnehmer eine andere Adresse. Wie genau sich diese Adresse zusammensetzt, erfährst du aus den Datenblättern der Bauteile.


Bevor du nun beginnst, alles zusammen zu löten, solltest du noch jeden Teilnehmer einzeln testen:
Also: Einen Teilnehmer an den I²C-BUS und die Programmierung auf den Mikrocontroller laden.
Im Normalfall befinden sich innerhalb jeder Library Beispielcodes die dir schon liefern was du benötigst. Die Messwerte! - Diese werden auf der Seriellen-Console in leserlicher Form ausgegeben.

Alles getestet, alles läuft!


Um nun alles für auf ewig zusammenzufügen, brauchst du einen Lötkolben.
Im Freundes- und Bekanntenkreis ist dieser hier sehr beliebt:

SainSmart ToolPAC PRO32 Mini Smart Lötkolben Werkzeug Set


Lötkolben mit Lötzinn und Halterunge, Erdungsband, Netzteil, Akkuanschluss
Auch bei RC-Fans sehr beliebt, da der Lötkolben direkt über Li-Po-Akkus betrieben werden kann.


Es geht aber auch Günstiger. Ich habe das ganze mit einer einfachen Löt-Station, die ich schon seit meiner Ausbildung habe, gelötet.

Lötstation für Langzeitbetrieb gut geeignet

Beim löten unbedingt darauf achten, dass die Temperatur nicht zu hoch eingestellt ist und der Lötkolben nicht länger als nötig an die Platine gehalten wird. Ansonsten kann es zum Tot der Bauteile führen oder es lösen sich die Kupferkränze um die Lötlöcher. - Echt ätzend!

Datenbank vorbereiten

Da ich schon seit geraumer Zeit einen Account bei All-Inkl besitze, hat es sich einfach Angeboten, den Datenwust hierher abzuwälzen. Nachdem du dir dort einen Account angelegt hast, oder deine eigene phpMyAdmin Datenbank angelegt hast, musst du noch Einstellungen vornehmen, damit deine Daten vom Mikrocontroller auch entgegengenommen werden können.

1. In der Technischen Verwaltung von All-Inkl anmelden kas.all-inkl.com.
2. Neue Datenbank anlegen:

3. Passwort vergeben und den Zugriff von überall erlauben!
Im Kommentarfeld kann ein Name für die Datenbank vergeben werden.
Dient lediglich der Ordnung innerhalb der Platform (KAS).
4. phpMyAdmin: Gehe hierzu wieder in die Datenbankübersicht wie in Punkt 2 beschrieben und klicke auf die zwei kleinen Computer rechts in der Zeile der gerade angelegten Datenbank.

5. Tabelle anlegen: Klicke links im Menü auf "Neu"
Dann wird oben in der Leiste eine Name für die Tabelle eingefügt.
Dieser ist später wichtig, da sie dem Mikrocontroller mitgeteilt werden müssen.
Am besten hier den Namen "miniwetterstation" vergeben, so musst du nachher den Programmcode nicht anpassen.
Dann eine Spalte hinzufügen.
Die Namen der einzelnen Spalten (momentan Zeilen...) so vergeben, wie es im Beispielbild zu sehen ist. Selbiger Grund wie beim Tabellennamen. Auch den Typ anpassen. Und in der Zeile "Zeit" den "Index" "Primary" setzten.

Zum Schluss unten rechts auf speichern klicken.
Deine Tabelle ist fertig angelegt.

Programmierung

Du kannst dir nun die Arbeit machen und alles selbst zusammenfügen, oder du nimmst einfach meinen fertigen Quellcode:
Dei Funktion des Quellcodes kurz erklärt:

  • Beim Starten des Mikrocontroller wird versucht, eine Wlan-Verbindung zum eingestellten Netzwerk herzustellen.  Schlägt dies innerhalb von 30 fehl, wird abgebrochen und wechselt in den Normalbetrieb und zeigt unten links im Eck auch keine Verbindung an. Auch die Übermittlungsintervallzeit unten in der Mitte wird nicht angezeigt.
  • Wird ein Verbindung aufgebaut, startet er eben mit diesen Anzeigen.
  • Alle 7 Sekunden wechselt das Bild. Temperatur -> Luftfeuchte -> Luftdruck -> Lichtstärke.
  • Einmal pro Minute werden Messwerte vom BMP280 entnommen. Öfter sollte dies nicht passieren, da dies zur Eigenerwärmung des Sensors beiträgt und die Messwerte verfälscht.
  • Jede Sekunde werden Messwerte des BH1750 entnommen. 
  • Alle 5 Minuten werden die Daten zum Server übertragen.


Hier musst du noch ein paar Werte anpassen:

Deine WLAN-Zugangsdaten
const char* SSID = "WLANNAME";          //DEINWLANNAME
char pass[] = "WLANPASSWORT";           //DIENWLANPASSWORT


Deine Heimnetzadresse
IPAddress ip(192, 168, 178, 66);      //Gegebenenfalls die IP-Adresse anpassen
IPAddress gateway(192, 168, 178, 1);


Deine Loggindaten für die Datenbank
IPAddress server_addr(0, 0 , 0 , 0);                         // MySQL server IP (findest du in der Datenbank)
char user[] = "DATENBANKBENUTZENAME";                   // MySQL user
char password[] = "DATENBANKPASSWORT";                  // MySQL password


Hier kannst du noch ein paar Werte anpassen:

const int32_t databanksendtime_in_millis = 300000;  //EINSTELLUNG, WIE OFT ZUM SERVER ÜBERTRAGEN WERDEN SOLL
#define anzeige_in_sek 7                            //EINSTELLUNG, WIE OFT DAS BILD DURCHWECHSELN SOLL






Nun der gesamte Quellcode:


 #include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

//LUX SENSOR
#include <Wire.h>
#include <BH1750.h>
BH1750 lightMeter;

//SENSOR BMP240
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C

//DISPLAY
#include <U8g2lib.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

const int32_t databanksendtime_in_millis = 300000;  //EINSTELLUNG, WIE OFT ZUM SERVER ÜBERTRAGEN WERDEN SOLL
#define anzeige_in_sek 7                            //EINSTELLUNG, WIE OFT DAS BILD DURCHWECHSELN SOLL

//Varibablen
float temp, hum, pressure, lx;
uint32_t prev_millis, prev_millis2, prev_millis3, prev_millis4;
uint8_t connected_to_database;
uint8_t connect_to_database_try;
uint8_t anzeige;
uint8_t wifi_conn_try, wifi_is_conn;
int32_t sendezeit;
uint8_t once1 = 1;


//WIFI SETUP
const char* SSID = "WLANNAME";          //DEINWLANNAME
char pass[] = "WLANPASSWORT";           //DIENWLANPASSWORT
byte mac[6];

WiFiServer server(80);
IPAddress ip(192, 168, 178, 66);      //Gegebenenfalls die IP-Adresse anpassen
IPAddress gateway(192, 168, 178, 1);
IPAddress subnet(255, 255, 255, 0);

WiFiClient client;
MySQL_Connection conn((Client *)&client);


char INSERT_SQL[] = "INSERT INTO DATENBANKBENUTZENAME.miniwetterstation(temp, hum, pressure, lx) VALUES (%f, %f, %f, %f)";
char query[128];

IPAddress server_addr(0, 0 , 0 , 0);                                            // MySQL server IP
char user[] = "DATENBANKBENUTZENAME";                   // MySQL user
char password[] = "DATENBANKPASSWORT";                  // MySQL password



//Funktion für die Qualitätsanzeige
int getQuality() {
  if (WiFi.status() != WL_CONNECTED)
    return -1;
  int dBm = WiFi.RSSI();
  if (dBm <= -100)
    return 0;
  if (dBm >= -50)
    return 100;
  return 2 * (dBm + 100);
}

void setup() {
  Serial.begin(9600);
  //LUX SENSOR
  Wire.begin();
  lightMeter.begin();
  //SENSOR
  bme.begin(0x76); //BME SENSOR 0x76
  //DISPLAY
  u8g2.begin();
  u8g2.enableUTF8Print();    // enable UTF8 support for the Arduino print() function

  //MYSQL
  Serial.println("Initialising connection");
  Serial.print(F("Setting static ip to : "));
  Serial.println(ip);
  Serial.println("");
  Serial.println("");
  Serial.print("Connecting to ");
  Serial.println(SSID);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(SSID, pass);

  while (wifi_conn_try != 100 && wifi_is_conn == 0) {

    if (WiFi.status() != WL_CONNECTED) {
      delay(300);
      Serial.print(".");
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_open_iconic_www_6x_t);
      u8g2.drawGlyph(0, 60, 72);
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(30, 10);
      u8g2.print("Connecting to WIFI");
      u8g2.setCursor(40, 20);
      u8g2.print("DEINWLANNAME");
      u8g2.setCursor(45, 30);
      u8g2.print("192.168.178.66");
      u8g2.setFont(u8g2_font_10x20_tf);
      if (wifi_conn_try % 2 == 0) {
        u8g2.setCursor(50, 50);
        u8g2.print(".  .  .");
      }
      u8g2.sendBuffer();
    }
    else {
      wifi_is_conn = 1;
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_open_iconic_www_6x_t);
      u8g2.drawGlyph(0, 60, 72);
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(30, 10);
      u8g2.print("Connecting to WIFI");
      u8g2.setCursor(40, 20);
      u8g2.print("DEINWLANNAME");
      u8g2.setCursor(45, 30);
      u8g2.print("192.168.178.66");
      u8g2.setCursor(53, 50);
      u8g2.print("Connected! :)");
      u8g2.sendBuffer();
      delay(5000);
    }
    wifi_conn_try++;
  }

  if (wifi_is_conn == 0) {
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_open_iconic_www_6x_t);
    u8g2.drawGlyph(0, 60, 72);
    u8g2.setFont(u8g2_font_5x7_tf );
    u8g2.setCursor(30, 10);
    u8g2.print("Connecting to WIFI");
    u8g2.setCursor(50, 20);
    u8g2.print("DEINWLANNAME");
    u8g2.setCursor(45, 30);
    u8g2.print("192.168.178.66");
    u8g2.setCursor(53, 50);
    u8g2.print("No Connection! :(");
    u8g2.sendBuffer();

  }
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);
  Serial.println("");
  Serial.print(F("Assigned IP: "));
  Serial.print(WiFi.localIP());
  Serial.println("");


  prev_millis = millis();
  prev_millis2 = millis();
  prev_millis3 = millis();
  prev_millis4 = millis();
  sendezeit = 10;
}

void loop() {


    if (millis() >= prev_millis4 + 60000 || once1 == 1) {
      //SENSORS
      temp = bme.readTemperature()-1;
      hum = bme.readHumidity();
      pressure = bme.readPressure() / 100.0F;
      once1=0;
      prev_millis4 = millis();
    }



  if (millis() >= prev_millis2 + 1000) {
    lx = lightMeter.readLightLevel();
    sendezeit = (prev_millis + databanksendtime_in_millis - millis()) / 1000;
    prev_millis2 = millis();
    //DISLPAY
    if (millis() << prev_millis3 + (anzeige_in_sek + 0) * 1000) {
      anzeige = 1;

      if (millis() >= prev_millis3 + (anzeige_in_sek + 0) * 1000) {
        anzeige = 2;

        if (millis() >= prev_millis3 + (anzeige_in_sek + anzeige_in_sek ) * 1000) {
          anzeige = 3;

          if (millis() >= prev_millis3 + (anzeige_in_sek + 2 * anzeige_in_sek ) * 1000) {
            anzeige = 4;

            if (millis() >= prev_millis3 + (anzeige_in_sek + 3 * anzeige_in_sek ) * 1000) {
              prev_millis3 = millis();
            }
          }
        }
      }
    }

    u8g2.setFontDirection(0);
    u8g2.clearBuffer();
    if (anzeige == 1) {
      //Temperatur auf Display
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(52, 10);
      u8g2.print("Temperatur");
      u8g2.setFont(u8g2_font_open_iconic_weather_4x_t);
      u8g2.drawGlyph(0, 36, 69);
      u8g2.setFont(u8g2_font_crox5tb_tf);
      u8g2.setCursor(45, 40);
      u8g2.print(temp);
      u8g2.setFont(u8g2_font_10x20_tf);
      u8g2.setCursor(104, 60);
      u8g2.print("°C");
    }
    if (anzeige == 2) {
      //Luftfeuchtigkeit
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(40, 10);
      u8g2.print("Lustfeuchtigkeit");
      u8g2.setFont(u8g2_font_open_iconic_thing_4x_t);
      u8g2.drawGlyph(0, 36, 72);
      u8g2.setFont(u8g2_font_crox5tb_tf);
      u8g2.setCursor(45, 40);
      u8g2.print(hum);
      u8g2.setFont(u8g2_font_10x20_tf);
      u8g2.setCursor(112, 60);
      u8g2.print("%");
    }
    if (anzeige == 3) {
      //Luftdruck
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(55, 10);
      u8g2.print("Lustdruck");
      u8g2.setFont(u8g2_font_open_iconic_gui_4x_t);
      u8g2.drawGlyph(0, 36, 73);
      u8g2.setFont(u8g2_font_crox4tb_tf);
      u8g2.setCursor(45, 40);
      u8g2.print(pressure);
      u8g2.setFont(u8g2_font_10x20_tf);
      u8g2.setCursor(97, 60);
      u8g2.print("hPa");
    }
    if (anzeige == 4) {
      //LUX
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(50, 10);
      u8g2.print("Beleuchtung");
      u8g2.setFont(u8g2_font_open_iconic_embedded_4x_t);
      u8g2.drawGlyph(0, 36, 77);
      u8g2.setFont(u8g2_font_crox5tb_tf);
      u8g2.setCursor(45, 40);
      u8g2.print(lx);
      u8g2.setFont(u8g2_font_10x20_tf);
      u8g2.setCursor(97, 60);
      u8g2.print("lux");
    }
    //Nächster Datenbankeintrag
    if (wifi_is_conn == 1) {
      u8g2.setFont(u8g2_font_5x7_tf );
      u8g2.setCursor(69, 63);
      if (sendezeit <= 0 ) {
        u8g2.print("now");
      }
      else {
        u8g2.print(sendezeit);
      }
    }
    u8g2.setFont(u8g2_font_open_iconic_gui_1x_t);
    u8g2.drawGlyph(60, 65, 65);
    if (connected_to_database == 1) {
      u8g2.setFont(u8g2_font_open_iconic_check_1x_t);
      u8g2.drawGlyph(50, 64, 64);
    }
    //WIFI-QUALLITY
    u8g2.setFont(u8g2_font_open_iconic_www_2x_t);
    u8g2.drawGlyph(1, 58, 81);
    u8g2.setFont(u8g2_font_5x7_tf );
    u8g2.setCursor(5, 63);
    u8g2.print(getQuality());
    u8g2.sendBuffer();
  }
  if (wifi_is_conn == 1 && sendezeit <= 0 ) {
    //MYSQL INSERT
    connected_to_database = 0;
    connect_to_database_try = 0;
    prev_millis = millis();
    Serial.println("Connecting to database");
    //Verbinde zur Datenbank
    while (connect_to_database_try != 10 && connected_to_database == 0) {
      if (conn.connect(server_addr, 3306, user, password) == true) {
        connected_to_database = 1;
      }
      else {
        connected_to_database = 0;
      }
      delay(300);
      Serial.print ( "." );
      connect_to_database_try++;
    }

    if (connected_to_database == true) {
      Serial.println("");
      Serial.println(F("Connected to SQL Server!"));

      sprintf(query, INSERT_SQL, temp, hum, pressure, lx);  //Insert into Database
      Serial.println(F("Recorded data."));
      Serial.println(query);
      MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
      cur_mem->execute(query);
      delete cur_mem;
      conn.close();
    }
    else {
      Serial.println(F("No Connection to Database"));
    }
  }

}


Hier findest du eine Unterstützung zur Einrichtung des Raspberry Pi's

Hier die Anleitung zur Installation von Grafana

Und hier findest du die Anleitung für Grafana Telegram-Push-Nachrichten






Viel Spaß beim Nachbauen    (。◕‿◕。)



Ich hoffe, ich konnte weiterhelfen und habe alles verständlich rüber gebracht.

Wenn es dir gefallen hat, bei Anregungen und Kritik, lass gerne einen Kommentar da! - Auch bei Fragen.

Falls du es nachgebaut hast, kannst du auch gerne Inhalte zu deinem Nachbau in den Kommentaren verlinken.












Keine Kommentare:

Kommentar veröffentlichen