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