@tt-tom
Hat schon.
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>
#include <AccelStepper.h>
#include <Adafruit_NeoPixel.h>
#ifndef STASSID
#define STASSID "msg2"
#define STAPSK "1629969423743097"
#endif
#define MotorStatus D2 // Steppermotor aktivieren/deaktivieren
#define LEDpin D7 // Umgesteuerter GPIO für die NEO-Led
#define NUMPIXELS 1 // Anzal der LEDs
const char* ssid = STASSID;
const char* password = STAPSK;
char* mqtt_client_id = "Essig_Innen";
const char* mqtt_server = "192.168.49.38";
const int mqtt_port = 1886;
const char* mqtt_user = "mqttuser";
const char* mqtt_password = "Beowolf503588";
const byte Pegelschalter = D6; // Pegelschalter für Essigvorrat
const byte RelaisVentil = D5; // Relais für Wasserzufuhrventil
// const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür
const unsigned int Essigdosis = 20000;
int lebenszeichen_zaehler = 0; // Zähler um Lebenzeichen an MQTT Broker zusenden
int lebenszeichen_interval = 10; // interval für MQTT Broker in sek
int messung_interval = 10; // interval für Pegelmessung in sek
long led_takt = 500; // Zeittakt (ms) für die LED ##takt##
long led_zeit; // Letzter Durchlauf (ms) für die LED ##takt##
long lebenszeichen_takt = lebenszeichen_interval * 1000; // Zeittakt (ms) ##takt##
long lebenszeichen_zeit; // Letzter Durchlauf (ms) ##takt##
long lebenszeichen_ein_aus = 0; // ##takt##
long messung_takt = messung_interval *1000; // Zeittakt (ms)
long messung_zeit; //Letzter Durchlauf (ms)
WiFiClient espClient;
PubSubClient mqttClient(espClient);
AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(2, LEDpin, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(LEDpin, OUTPUT); // NEO-LED
pinMode(Pegelschalter, INPUT_PULLUP); // Pegelschalter für Essigtank
pinMode(RelaisVentil, OUTPUT); // Relais für Wasserzufuhrventil
pinMode(MotorStatus, OUTPUT); // Enable Motor 1
pinMode(LED_BUILTIN, OUTPUT); // Board-LED nutzen
stepper.setMaxSpeed(1000);
stepper.setAcceleration(1500);
digitalWrite(MotorStatus, HIGH); //Motor deaktiviert
Serial.begin(9600);
// while(!Serial){
// ; // wartet bis die serielle Schnittstelle eine Verbindung hergestellt hat. Wird für natives USB benötigt
// }
// Per WLAN mit dem Netzwerk verbinden
Serial.print("Verbinden mit ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
///////////////////////////////////////////
// Anfang Update über Wlan
///////////////////////////////////////////
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
///////////////////////////////////////////
// Ende Update über Wlan
///////////////////////////////////////////
// Die IP vom Webserver auf dem seriellen Monitor ausgeben
Serial.println("");
Serial.println("WLAN verbunden.");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
// MQTT Brocker
// Mit ioBroker Mqtt verbinden
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.setCallback(callback);
// NEO_Pixel Start
pixels.begin(); // This initializes the NeoPixel library.
lebenszeichen_zeit = millis(); // ##takt##
led_zeit = millis(); // ##takt##
messung_zeit = millis();
Serial.println("Programmanfang");
}
//ende Setup
//////////////////////////////////////////////////////////////////////////////////
void loop() {
ArduinoOTA.handle();
ArduinoOTA.setHostname("Essig_Innen");
Pegelstand_lesen();
Essigdosierer_deaktivieren();
lebenszeichen();
stepper.run();
// MQTT Broker
mqttClient.loop();
if (!mqttClient.connected()) {
reconnectToMQTT();
}
}
//ende loop
/////////////////////////////////////////////////////////////////////////////////
void Pegelstand_lesen() {
long current_time = millis();
if (messung_zeit <= current_time) {
if (digitalRead(Pegelschalter)) {
mqttClient.publish("HH_Frischwasser/Innen/Essigpegel", "1");
} else {
mqttClient.publish("HH_Frischwasser/Innen/Essigpegel", "0");
}
while (messung_zeit <= current_time)
messung_zeit += messung_takt;
}
}
// MQTT Funktion
// *************
void reconnectToMQTT() {
if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) {
Serial.println("Per MQTT mit ioBroker verbunden");
mqttClient.publish("HH_Frischwasser/Innen/alive", "0");
mqttClient.subscribe("HH_Frischwasser/Innen/Frischwasserventil");
mqttClient.subscribe("HH_Frischwasser/Innen/Essigdosierer");
} else {
Serial.print("mqtt-Verbindung fehlgeschlagen ");
Serial.print(mqttClient.state());
Serial.println(" versuchen es in 5 Sekunden erneut");
// Wait 5 seconds before retrying
delay(5000);
}
}
// MQTT Callback
void callback(char* topic, byte* payload, unsigned int length)
{
payload[length] = '\0';
String strTopic = String(topic);
String strPayload = String((char * ) payload);
Serial.print("Nachricht angekommen [");
Serial.print(strTopic);
Serial.print("----");
Serial.print(strPayload);
Serial.print("] ");
Serial.println();
if (strTopic == "HH_Frischwasser/Innen/Frischwasserventil")
{
// Pumpe Start
if (strPayload == "false") {
Serial.println("Frischwasserventil geöffnet über IoBroker");
digitalWrite(RelaisVentil, HIGH);
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); //LED Farbe blau
pixels.show();
}
// Pumpe Stop
if (strPayload == "true") {
Serial.println("Frischwasserventil geschlossen über IoBroker");
digitalWrite(RelaisVentil, LOW);
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //LED Farbe grün
pixels.show();
}
}
if (strTopic == "HH_Frischwasser/Innen/Essigdosierer")
{
// Essigdosierer Start
if (strPayload == "true") {
Serial.println("Start Essigdosierer über IoBroker");
digitalWrite(MotorStatus, LOW); //Motor aktiviert
stepper.move(Essigdosis);
pixels.setPixelColor(1, pixels.Color(255, 127, 0)); //LED Farbe gelb
pixels.show();
}
}
}
void Essigdosierer_deaktivieren() {
// Essigdosierer Stopp
if (stepper.currentPosition() == Essigdosis) {
Serial.println(stepper.currentPosition());
mqttClient.publish("HH_Frischwasser/Innen/Essigdosierer", "false");
Serial.println("Essigdosierer gestoppt");
pixels.setPixelColor(1, pixels.Color(0, 255, 0)); //LED Farbe grün
pixels.show();
stopp();
}
}
void stopp() {
stepper.setCurrentPosition(0);
stepper.stop();
digitalWrite(MotorStatus, HIGH); //Motor deaktiviert
}
void lebenszeichen() {
// ##takt## -->
long current_time = millis();
// LED auf dem Board blinken lassen
if (led_zeit <= current_time) {
if (digitalRead(LED_BUILTIN) == HIGH)
digitalWrite(LED_BUILTIN, LOW);
else
digitalWrite(LED_BUILTIN, HIGH);
while (led_zeit <= current_time)
led_zeit += led_takt;
}
if (lebenszeichen_zeit <= current_time) {
if (lebenszeichen_ein_aus == 0) {
mqttClient.publish("HH_Frischwasser/Innen/alive", "1");
lebenszeichen_ein_aus = 1;
} else {
mqttClient.publish("HH_Frischwasser/Innen/alive", "0");
lebenszeichen_ein_aus = 0;
}
while (lebenszeichen_zeit <= current_time)
lebenszeichen_zeit += lebenszeichen_takt;
}
// ##takt## <--
}