Hallo zusammen. Ich habe ein ESP8266 als Steuerung für einen LED Streifen.
Ich habe an einen PIN ein Relais angeschlossen, mit dem ich den Trafo für die 12V LEDs ein und aus schalte.
Zusätzlich wird über einen anderen PIN ein PWM Signal an die LEDs schickt um die LEDs zu dimmen.
2 Schalter an 2 anderen PINs dienen als Hardwareschalter um ein und aus zu schalten, sowie rauf und runter zu dimmen. Das gleiche soll auch über MQTT möglich sein.
Die LEDs sind mit dem Plus Pol direkt am Trafo angeschlossen. Der Minus Pol geht über einen LB8721, welcher durch das PWM Signal gesteuert wird.
An sich funktioniert alles so weit. Relais schaltet aus und ein und es dimmt auch.
Leider ist es aber so, dass der EPS8266 immer wieder mal neu bootet, wenn ein MQTT Signal zum Ausschalten kommt (hauptsächlich eben da). Kann mir das nicht erklären. Eventuell fällt euch was im Code auf, oder es passt irgendwas an der Hardware nicht.
Bin echt schon verzweifelt.
Hier ist der Code:
#include <TimeLib.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>
#include <OneButton.h>
#define SWLICHTUP 4
#define SWLICHTDN 2
#define RELLICHT 5
#define DIMPIN 12
#define MAXDIM 10
#define LOCALIP IPAddress(192, 168, 11, 151)
int vals [] = { 10, 20, 30, 50, 100, 200, 300, 500, 700, 900, 1023 };
const char* ssid = "xxxxxxx";
const char* password = "xxxxxxx";
const char* mqtt_server = "192.168.11.51";
const char* mqtt_username = "xxxxxxx";
const char* mqtt_password = "xxxxxxx";
const int mqtt_port = 1883;
const char* HOSTNAME = "esp151";
const char* GETDIM = "getdim";
const char* SETDIM = "setdim";
const char* SETLICHT = "setlicht";
const char* GETLICHT = "getlicht";
const char* DIMLICHT = "dimlicht";
const char* DIMUP = "up";
const char* DIMDN = "dn";
const char* STATUSON = "ON";
const char* STATUSOFF = "OFF";
const char* STATUSCHANGE = "CHANGE";
const char* GETSTATUS = "getstatus";
const char* SENDSSID = "ssid";
const char* SENDRSSI = "rssi";
const char* SENDUPTIME = "uptime";
WiFiClient espClient;
PubSubClient client_MQTT(espClient);
OneButton swlichtup(SWLICHTUP, true);
OneButton swlichtdn(SWLICHTDN, true);
#define DATA_SIZE 30
char l_str[DATA_SIZE];
char MQTTtopic[DATA_SIZE];
char MQTTpayload[DATA_SIZE];
int i;
int len;
int aktdim;
int brightness = 0;
void sendMQTT () {
strcpy (l_str, HOSTNAME);
strcat (l_str, "/");
strcat (l_str, MQTTtopic);
client_MQTT.publish(l_str, MQTTpayload);
}
void sendrelstatus () {
strcpy (MQTTtopic, GETLICHT);
if (digitalRead (RELLICHT))
strcpy (MQTTpayload, STATUSOFF);
else
strcpy (MQTTpayload, STATUSON);
sendMQTT ();
}
void sendstatus () {
strcpy (MQTTtopic, SENDRSSI);
sprintf (MQTTpayload, "%03i", WiFi.RSSI());
sendMQTT ();
strcpy (MQTTtopic, SENDSSID);
strcpy (MQTTpayload, ssid);
sendMQTT ();
strcpy (MQTTtopic, SENDUPTIME);
sprintf(MQTTpayload, "%04d:%02d:%02d", hour (), minute (), second());
sendMQTT ();
strcpy (MQTTtopic, GETDIM);
sprintf(MQTTpayload, "%d", aktdim);
sendMQTT ();
}
void callback(char* topic, byte* payload, unsigned int length) {
len = strlen (topic);
for (i = 0; i < len; i++) {
MQTTtopic[i] = ((char)topic[i]);
}
MQTTtopic[len] = 0;
for (i = 0; i < length; i++) {
MQTTpayload[i] = ((char)payload[i]);
}
MQTTpayload[length] = 0;
if (strstr (MQTTtopic, "clickup"))
clicklichtup();
if (strstr (MQTTtopic, "clickdn"))
clicklichtdn();
if (strstr (MQTTpayload, GETSTATUS)) {
sendstatus ();
sendrelstatus ();
}
else {
if (strstr (MQTTtopic, SETLICHT)) {
if (strstr (MQTTpayload, STATUSON)) {
if (digitalRead (RELLICHT))
clicklichtup();
}
else if (strstr (MQTTpayload, STATUSOFF))
longPresslichtdn();
else if (strstr (MQTTpayload, STATUSCHANGE)) {
digitalWrite (RELLICHT, !digitalRead (RELLICHT));
sendrelstatus ();
}
}
else {
if (strstr (MQTTtopic, SETDIM)) {
aktdim = atoi(MQTTpayload);
setdim(aktdim);
}
else {
if (strstr (MQTTtopic, DIMLICHT)) {
if (strstr (MQTTpayload, DIMUP))
clicklichtup();
else if (strstr (MQTTpayload, DIMDN))
clicklichtdn();
}
}
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client_MQTT.connected()) {
if (client_MQTT.connect(HOSTNAME, mqtt_username, mqtt_password)) {
strcpy (MQTTtopic, HOSTNAME);
strcat (MQTTtopic, "/");
strcat (MQTTtopic, "#");
client_MQTT.subscribe(MQTTtopic);
sendrelstatus ();
sendstatus ();
} else {
}
}
strcpy (MQTTtopic, HOSTNAME);
strcpy (MQTTpayload, "reconnect");
sendMQTT ();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
WiFi.mode(WIFI_STA);
// WiFi.hostname(HOSTNAME);
WiFi.begin(ssid, password);
WiFi.config(LOCALIP, IPAddress(192, 168, 11, 1), IPAddress(255, 255, 255, 0), IPAddress(8, 8, 8, 8));
while (WiFi.status() != WL_CONNECTED) {
delay(50);
}
}
void setdim(int dim) {
if (dim > MAXDIM)
dim = MAXDIM;
if (dim < 0)
dim = 0;
brightness = vals[dim];
analogWrite(DIMPIN, brightness);
strcpy (MQTTtopic, GETDIM);
sprintf(MQTTpayload, "%d", dim);
sendMQTT ();
strcpy (MQTTtopic, "brightness");
sprintf(MQTTpayload, "%d", brightness);
sendMQTT ();
}
void clicklichtup() {
if (!digitalRead (RELLICHT))
aktdim++;
if (aktdim > MAXDIM)
aktdim = MAXDIM;
if (digitalRead (RELLICHT)) {
digitalWrite (RELLICHT, LOW);
sendrelstatus ();
}
setdim (aktdim);
}
void clicklichtdn() {
aktdim--;
if (aktdim < 0) {
aktdim = 0;
if (!digitalRead (RELLICHT)) {
digitalWrite (RELLICHT, HIGH);
sendrelstatus ();
}
}
setdim (aktdim);
}
void longPresslichtup() {
if (digitalRead (RELLICHT)) {
digitalWrite (RELLICHT, LOW);
sendrelstatus ();
}
aktdim = MAXDIM;
setdim (aktdim);
}
void longPresslichtdn() {
digitalWrite (RELLICHT, HIGH);
sendrelstatus ();
}
void setup() {
Serial.begin(115200);
pinMode(RELLICHT, OUTPUT);
pinMode(DIMPIN, OUTPUT);
digitalWrite (RELLICHT, HIGH);
pinMode(SWLICHTUP, INPUT_PULLUP);
pinMode(SWLICHTDN, INPUT_PULLUP);
swlichtup.attachClick(clicklichtup);
swlichtup.attachLongPressStart(longPresslichtup);
swlichtdn.attachClick(clicklichtdn);
swlichtdn.attachLongPressStart(longPresslichtdn);
setup_wifi();
client_MQTT.setServer(mqtt_server, mqtt_port);
client_MQTT.setCallback(callback);
ArduinoOTA.setPort(8266);
ArduinoOTA.setHostname(HOSTNAME);
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.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();
aktdim = 5;
}
void loop() {
ArduinoOTA.handle();
if (!client_MQTT.connected()) {
reconnect(); /// reconection MQTT
}
swlichtup.tick();
swlichtdn.tick();
client_MQTT.loop();
yield();
}