Display für die Weichwasseranlage

Zum Projekt der Weichwasseranlage wollte ich (um den Verbrauch einschätzen zu können) ein kleines Display haben auf dem ich den aktuellen Status sehen kann.

Ich verwende folgende Komponenten:

NodeMCU ESP8266 * Affiliatelink

0,96 Zoll OLED Display I2C SSD1306 * Affiliatelink

Jumper-Kabel * Affiliatelink

Ergebnis

Das Python-Script habe ich dann folgendermaßen erweitert:

datei = open('/link/zur/datei/weichwasser.txt','w')
for x in root:
  if x.tag == "D_Y_10_1":
    third = x.text.strip()
  if x.tag == "D_Y_5":
    first = x.text.strip()
  if x.tag == "D_A_2_1":
    second = x.text.strip()
datei.write(first + "#" + second + "-" + third)

Die so (jede Minute) erstellte Datei wird abgefragt und dann auf dem Display angezeigt. Im „Normalbetrieb“ wird die restliche Austauscherkapazität angezeigt, beim Start der Regeneration werden die Schritte mit der (sofern vorhanden) verbleibenden Zeit angezeigt.

Programmierung Arduino

Ich musste folgende Biblotheken hinzufügen:

  • ESP8266HTTPClient
  • ESP8266WiFi
  • Adafruit_SSD1306

Der Code:

// Includes
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <Adafruit_SSD1306.h>

// Defines
// Bildschirmgröße
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Webserverabfrage:
String serverName = "http://server/file.txt";

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Set timer to 60 seconds (60000)
unsigned long timerDelay = 60000;

// WLAN-Anbindung
char ssid[] = "WLAN-Name";   // your network SSID (name)
char pass[] = "WLAN-Schluessel";   // your network password
WiFiClient  client;

void setup() {
  // initialize with the I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  display.setTextSize(2);
  display.println("Boot");
  display.println("completed");

  Serial.begin(9600);  // Initialize serial

  WiFi.mode(WIFI_STA);
}

void loop() {
  // Connect or reconnect to WiFi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);

    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setCursor(0, 10);
    display.setTextSize(2);
    display.println("Connecting");
    display.println(ssid);

    while (WiFi.status() != WL_CONNECTED) {
      WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(5000);
    }
    Serial.println("\nConnected.");

    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setCursor(0, 10);
    display.setTextSize(2);
    display.println(ssid);
    display.println("connected");
  }

  //Send an HTTP POST request every Intervall
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if (WiFi.status() == WL_CONNECTED) {
      HTTPClient http;

      String serverPath = serverName;

      // Your Domain name with URL path or IP address with path
      http.begin(client, serverPath.c_str());

      // Send HTTP GET request
      int httpResponseCode = http.GET();

      if (httpResponseCode > 0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        String payload = http.getString();
        Serial.println(payload);

        // Payload-Beispiele:
        // 0#0.0-76 keine Regeneration
        // 1#1.2-24 Soletank füllen
        // 2#1.1-24 Besalzen
        // 3#1.1-24 Verdrängen
        // 4#1.1-24 Rückspülen
        // 5#1.1-24 Erstfiltrat
        //payload = "5#3.5-12";

        int bindestrich = payload.indexOf("-");
        int stufe = 0;
        int austauscher = 0;
        String zeit = "";

        stufe = payload.substring(0, 1).toInt();
        austauscher = payload.substring(bindestrich + 1, bindestrich + 3).toInt();
        zeit = payload.substring(2, bindestrich);

        Serial.println("Stufe: " + String(stufe));
        Serial.println("Austauscher: " + String(austauscher));
        Serial.println("Zeit: " + zeit);

        if (stufe == 0) {
          // Clear the buffer.
          display.clearDisplay();

          // Changing Font Size
          display.setTextColor(WHITE);
          display.setCursor(0, 10);
          display.setTextSize(7);
          display.setCursor(0, 10);
          display.println(String(austauscher) + "%");
        }
        else {
          // Austauscher regeneriert, Status anzeigen
          display.clearDisplay();

          display.setTextColor(WHITE);
          display.setCursor(0, 10);
          display.setTextSize(2);
          display.setCursor(0, 10);
          display.println("Stufe: " + String(stufe) + "/5");

          switch (stufe) {
            case 1:
              display.println("Soletank++");
              break;
            case 2:
              display.println("Besalzen");
              break;
            case 3:
              display.println("Verdrangen");
              break;
            case 4:
              display.println("Ruckspulen");
              break;
            case 5:
              display.println("Erstfiltr.");
              break;
            default:
              display.println("???");
              break;
          }
          display.println("fur " + zeit + "min");
        }

        display.display();
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);

        display.clearDisplay();
        display.setTextColor(WHITE);
        display.setCursor(0, 10);
        display.setTextSize(2);
        display.println("Error");
        display.println(httpResponseCode);

      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");

      display.clearDisplay();
      display.setTextColor(WHITE);
      display.setCursor(0, 10);
      display.setTextSize(2);
      display.println(ssid);
      display.println("disconnected");

    }
    lastTime = millis();
  }
}

Zugeben muss ich folgendes: Teile des Codes sind von verschiedensten Quellen (hauptsächlich die Arduino-Funktionsreferenz). Außerdem ist sehr viel zu viel in dem Code, da muss man sicher noch einiges rausschmeißen um Code, etc zu sparen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert