Moin,
ich werkle gerade mit gefährlichem Halbwissen an einer Mqtt Verbindung mit einem esp8266. Leider bin ich auf ein Problem gestoßen, aus dem ich nicht schlau werde: Trotz der vermeintlich richtigen Verwendung von "client.loop()", bekomme ich nur einmal eine sub-Verbindung, aber das war es dann auch schon. Das Ziel ist eine dauerhafte Verbindung.
P.s. Ich weiß das der code grausig ausschaut, allerdings ist das bisher auch nur ein Konzept und noch kein fertiger Code.
tip#ifndef STASSID
#define STASSID "**************" // set your SSID
#define STAPSK "*******" // set your wifi password
#endif
/* Configuration of NTP */
#define MY_NTP_SERVER "at.pool.ntp.org"
#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03"
/* Necessary Includes */
#include <ESP8266WiFi.h> // we need wifi to get internet access
#include <time.h> // time() ctime()
#include <Servo.h>
#include <PubSubClient.h>
/* Globals */
time_t now; // this is the epoch
tm tm; // the structure tm holds time information in a more convient way
Servo servoMotor4;
Servo servoMotor3;
Servo servoMotor2;
Servo servoMotor1;
WiFiClient espClient;
PubSubClient client(espClient);
int exittry = 0;
const char* broker = "************"; //IP address of broker
const int port = ****;
const char* mqttUser = "************";
const char* mqttPassword = "********";
byte inPin = D5; //D5
byte up = D6; //D6
byte down = D7; //D7
int val = 0;
int val1 = 0;
int val2 = 0;
int hold = 0;
int hold1 = 0;
int hold2 = 0;
int exe = 0;
int ver = 0;
int trytry = 0;
int trytry1 = 0;
int trytry2 = 0;
int imanage = 0;
int itry = 0;
int ttry = 0;
bool wopen = false;
bool breakend = false;
bool we = false;
String inco;
String cache;
void showTime() {
time(&now); // read the current time
localtime_r(&now, &tm); // update the structure tm with the current time
Serial.print("year:");
Serial.print(tm.tm_year + 1900); // years since 1900
Serial.print("\tmonth:");
Serial.print(tm.tm_mon + 1); // January = 0 (!)
Serial.print("\tday:");
Serial.print(tm.tm_mday); // day of month
Serial.print("\thour:");
Serial.print(tm.tm_hour); // hours since midnight 0-23
Serial.print("\tmin:");
Serial.print(tm.tm_min); // minutes after the hour 0-59
Serial.print("\tsec:");
Serial.print(tm.tm_sec); // seconds after the minute 0-61*
Serial.print("\twday");
Serial.print(tm.tm_wday); // days since Sunday 0-6
if (tm.tm_isdst == 1) // Daylight Saving Time flag
Serial.print("\tDST");
else
Serial.print("\tstandard");
Serial.println();
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message received in topic: ");
Serial.print(topic);
Serial.print(" length is:");
Serial.println(length);
Serial.print("Data Received From Broker:");
for (int i = 0; i < length; i++) {
inco = inco + (char)payload[i];
}
Serial.println(inco);
payload = 0;
itry = 0;
if(inco != cache && itry == 0){
cache = inco;
itry = 1;
ttry = 0;
for(int i = 0; i <= 100; i++){
imanage = i;
String istring = String(i);
if(istring == inco){
break;
}
}
if(imanage == 0 && ttry == 0){
ttry = 1;
digitalWrite(D8, HIGH);
servoMotor4.write(40);
delay(1000);
servoMotor4.write(0);
delay(500); //close
servoMotor2.write(40);
delay(1000);
servoMotor2.write(0);
delay(15000);
wopen = false;
Serial.println("Close");
servoMotor3.write(0);
delay(1000); //reset
servoMotor3.write(40);
digitalWrite(D8, LOW);
}
if(imanage == 100 && ttry == 0){
ttry = 1;
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
digitalWrite(D8, LOW);
}
if(imanage >= 0 && imanage <= 100 && ttry == 0){
ttry = 1;
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
servoMotor4.write(40);
delay(1000);
servoMotor4.write(0);
delay(500); //close
servoMotor2.write(40);
delay(1000);
servoMotor2.write(0);
delay(8000 / 100 * imanage);
wopen = false;
Serial.println("Close");
servoMotor3.write(0);
delay(1000); //reset
servoMotor3.write(40);
digitalWrite(D8, LOW);
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
}
inco = "";
}
void setup() {
pinMode(D8, OUTPUT);
digitalWrite(D8, HIGH);
Serial.begin(115200);
Serial.println("\nNTP TZ DST - bare minimum");
configTime(MY_TZ, MY_NTP_SERVER); // --> Here is the IMPORTANT ONE LINER needed in your sketch!
// start network
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);
while (WiFi.status() != WL_CONNECTED && exittry <= 60) {
delay(200);
Serial.print ( "." );
exittry ++;
}
if(WiFi.status() == WL_CONNECTED){
Serial.println("\nWiFi connected");
// by default, the NTP will be started after 60 secs
}else{
Serial.println("Connection failed!");
}
client.setServer(broker, port);
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32Client", mqttUser, mqttPassword )){
Serial.println("connected to MQTT broker");
}else{
Serial.print("failed with state ");
Serial.print(client.state());
delay(500);
}
}
Serial.println("ESP8266 AS SUBSCRIBER");
Serial.println("Subscribing topic /Finn/Zimmer/Rolladen/lvl:");
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
servoMotor4.attach(D3);
servoMotor3.attach(D2);
servoMotor2.attach(D1);
servoMotor1.attach(D0);
servoMotor1.write(40);
servoMotor2.write(0);
servoMotor3.write(40);
servoMotor4.write(0);
delay(500);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
pinMode(inPin, INPUT); // declare pushbutton as input
digitalWrite(D8, LOW);
showTime;
}
void loop() {
client.loop();
if(WiFi.status() == WL_CONNECTED){
showTime();
}
if(tm.tm_wday == 0 || tm.tm_wday == 6){
we = true;
}else{
we = false;
}
val = digitalRead(inPin); // read input value
// val1 = digitalRead(up);
// val2 = digitalRead(down);
while(val == HIGH){ // check if the input is LOW (button released)
if(hold >= 1 && trytry == 0){
digitalWrite(D8, HIGH);
trytry = 1;
hold = 0;
breakend = false;
}
Serial.println("pushed master");
hold ++;
Serial.println(hold);
delay(1100);
val = digitalRead(inPin); // read input value
}
while(val1 == HIGH){ // check if the input is LOW (button released)
if(hold1 >= 1 && trytry1 == 0){
digitalWrite(D8, HIGH);
trytry1 = 1;
hold1 = 0;
breakend = false;
}
Serial.println("pushed up");
hold1 ++;
Serial.println(hold1);
delay(1100);
val1 = digitalRead(up); // read input value
if(hold1 > 1){
if(exe == 0){
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
wopen = true;
Serial.println("Open");
exe = 1;
}
if(val1 == LOW){
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
digitalWrite(D8, LOW);
hold1 = 0;
exe = 0;
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
}
}
if(hold1 == 1){
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
digitalWrite(D8, LOW);
hold1 = 0;
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
while(val2 == HIGH){ // check if the input is LOW (button released)
if(hold2 >= 1 && trytry2 == 0){
digitalWrite(D8, HIGH);
trytry2 = 1;
hold2 = 0;
breakend = false;
}
Serial.println("pushed down");
hold2 ++;
Serial.println(hold2);
delay(1100);
val2 = digitalRead(down); // read input value
if(hold2 > 1){
if(exe == 0){
digitalWrite(D8, HIGH);
servoMotor4.write(40);
delay(500);
servoMotor4.write(0);
delay(500); //close
servoMotor2.write(40);
delay(500);
servoMotor2.write(0);
wopen = false;
Serial.println("Close");
exe = 1;
}
if(val2 == LOW){
servoMotor3.write(0);
delay(1000); //reset
servoMotor3.write(40);
digitalWrite(D8, LOW);
hold2 = 0;
exe = 0;
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
}
}
if(hold2 == 1){
digitalWrite(D8, HIGH);
servoMotor4.write(40);
delay(1000);
servoMotor4.write(0);
delay(500); //close
servoMotor2.write(40);
delay(1000);
servoMotor2.write(0);
delay(15000);
wopen = false;
Serial.println("Close");
servoMotor3.write(0);
delay(1000); //reset
servoMotor3.write(40);
digitalWrite(D8, LOW);
hold2 = 0;
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
trytry = 0;
trytry1 = 0;
trytry2 = 0;
digitalWrite(D8, LOW);
if(hold == 1 && wopen == true){
hold = 15;
}
if(hold == 1 && wopen == false){
breakend = true;
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
digitalWrite(D8, LOW);
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
if(hold != ver && breakend == false){
ver = hold;
if(hold != 1){
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
delay (1000);
servoMotor4.write(40);
delay(1000);
servoMotor4.write(0);
delay(500); //close
servoMotor2.write(40);
delay(1000);
servoMotor2.write(0);
delay(hold * 1000 - 1000);
wopen = false;
Serial.println("Close");
servoMotor3.write(0);
delay(1000); //reset
servoMotor3.write(40);
digitalWrite(D8, LOW);
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
}
if(tm.tm_hour == 22 && tm.tm_min == 0 && tm.tm_sec == 0){
digitalWrite(D8, HIGH);
servoMotor4.write(40);
delay(1000);
servoMotor4.write(0);
delay(500); //close
servoMotor2.write(40);
delay(1000);
servoMotor2.write(0);
delay(15000);
wopen = false;
Serial.println("Close");
servoMotor3.write(0);
delay(1000); //reset
servoMotor3.write(40);
digitalWrite(D8, LOW);
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
if(tm.tm_hour == 6 && tm.tm_min == 30 && tm.tm_sec == 0 && we == false){
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
digitalWrite(D8, LOW);
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
if(we = true && tm.tm_hour == 10 && tm.tm_min == 0 && tm.tm_sec == 0){
digitalWrite(D8, HIGH);
servoMotor3.write(0);
delay(1000);
servoMotor3.write(40);
delay(500); //open
servoMotor1.write(0);
delay(1000);
servoMotor1.write(40);
delay(15000);
wopen = true;
Serial.println("Open");
servoMotor4.write(40);
delay(1000); //reset
servoMotor4.write(0);
digitalWrite(D8, LOW);
client.setServer(broker, port);
client.subscribe("/Finn/Zimmer/Rolladen/lvl");
client.setCallback(callback);
}
if(tm.tm_hour == 12 && tm.tm_min == 0 && tm.tm_sec == 0){
digitalWrite(D8, HIGH);
delay(500);
digitalWrite(D8, LOW);
ESP.reset();
}
}