Wemos D1 oder ESP8266 Wifi pH Sonde / Messgerät mit MQTT für IoBroker

Auf dieser Seite erfährst du, wo du welche Teile bekommst, wie diese verkabelt werden und wie du die Esp8266 Wifi pHSonde per Wlan und mqtt mit deinem Smarthome verbindest

pH-Sonde

Wir haben seid langem einen Pool und Anfangs bin ich konstant damit beschäftigt gewesen die Werte zu checken und nachzuregeln.

Irgendwann kam der Wunsch auf, die Werte im Smarthome sichbar zu machen.

Die günstigen ESP8266 Chips gibt es auf etlichen Boards günstig zu haben. die am einfachsten zu handhabenden sind der Wemos D1 & der NodeMCU

Beide können bequem per USB geflasht und einfach programiert werden.

Für unsere pH SOnde habe ich mir außerdem dieses kleines Display und natürlich die pH-Sonde bestellt

Jetzt geht es ans zusammenbauen

Lasst Euch nicht vom Schema Irritieren, Es gab das bild des 4502C nicht, daher das schwarze Board. V+ aus 5V am Wemos G auf G und pO auf A0

Mit ein wenig Arduino-Code ist unsere Sonde fast fertig:

Hier findest du den Code
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_INA219.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>
#include <SPI.h>
#define OLED_RESET 4
#define pH_Topic      "Pool/Sensoren/ph"            // MQTT Topic für pH


String sendphValue;
unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
int buf[10],temp;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);


// Connect to the WiFi
const char* ssid = "deine Wlan SSID";
const char* password = "dein WLAN Passwort;
const char* mqtt_server = "ip des MQTT Brokers";

WiFiClient espClient;
PubSubClient client(espClient);

const byte ledPin = 0; // Pin with LED on Adafruit Huzzah

void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i=0;i<length;i++) {
  char receivedChar = (char)payload[i];
  Serial.print(receivedChar);
  if (receivedChar == '0')
  // ESP8266 Huzzah outputs are "reversed"
  digitalWrite(ledPin, HIGH);
  if (receivedChar == '1')
   digitalWrite(ledPin, LOW);
  }
  Serial.println();
}


void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266 Client")) {
  Serial.println("connected");
  // ... and subscribe to topic
  client.subscribe("ledStatus");
} else {
  Serial.print("failed, rc=");
  Serial.print(client.state());
  Serial.println(" try again in 5 seconds");
  // Wait 5 seconds before retrying
  delay(5000);
  }
}
}

void setup()
{
Serial.begin(115200);
WiFi.begin(ssid, password);
// HIER KANNST DU DEN MQTT PORT ÄNDERN, ÄNDERE ABER NUR DEN PORT NICHTS ANDERES!!!

client.setServer(mqtt_server, 1883);
client.setCallback(callback);
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);//Dont proceed
  }
display.display();
delay(2);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print("PH Sensor");
display.display();
delay(3000);
pinMode(ledPin, OUTPUT);


}

void loop()
{

  //String myData = String(analogRead(A0));
    for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  {
    buf[i]=analogRead(A0);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }
  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;  //convert the millivolt into pH value

// Falls dein Wert in einer Kalibrierungslösung abweicht kannst du die -7.51 hier ändern bis es passt

  phValue=phValue-7.51;
  //String myData = String(analogRead(A0))
  Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");

  //=============================oled display======================================
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20,0);
  display.print("PH Wert");

  display.setTextSize(3);
  display.setCursor(30,30);
  display.print(phValue);
  display.display();

  sendphValue=String(phValue,2);
  client.publish(pH_Topic, sendphValue.c_str());

  
if (!client.connected()) {
  reconnect();

}
client.loop();
 delay(9000);
}

Achtet auf die Bibliotheken die eingebunden werden. Diese musst du erst über Sketch Bibl. einbinden Bibl. verwalten installieren!

Eine Anleitung zum flashen findest du hier: https://makesmart.net/esp8266-d1-mini-programmieren/

Trage vor dem flashen noch deine Wlan-Zugangsdaten und deinen Broker ein. Such ggf. im Codenach dem Abschnitt für den MQTT Port. Eingetragen ist der Port 1883. Dies ist allerdings beim iobroker der Port vom Sonoff-Adapter. Ich habe daher den MQTT Broker im iobroker auf 1884 eigestellt.

Ich habe die pH-Sonde für den Wemos und die vom Phileo lt (pH-Minus-Dosiergerät) in den beiden Messzellen untergebracht damit diese nicht permanent im Hauptstrom hängen.. Der Wemos sitzt in der Abzweigdose neben dem Phileo lt