Die Platine:
Temperatur und Zeit wird nun per mqtt aktualisiert. Erst gabs ein kleinen Fehler, er bekam nicht die richtige Zeit. Lösung des Problems war, ich musste den DNS Server angeben. Sonst fand er nicht den Zeitserver.
Hier nochmal der komplette und aktuelle Code, der zumindest momentan tut was er soll:
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "PCF8574.h"
#include <PubSubClient.h>
#include <time.h>
#include <OneWire.h>
#include <DallasTemperature.h>
WiFiClient espClient;
PubSubClient client(espClient);
const char* ssid = "SSID";
const char* password = "WiFi Password";
IPAddress ip(192,168,178,202); // 192.168.178.xxx = freie IP Adresse, ggf. müsst ihr auch die anderen Zahlen anpassen; schaut am besten in euren Router
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);
IPAddress dns(8, 8, 8, 8);
char tmp[50];
char time_value[20];
PCF8574 m1(0x38);
const char* otaHostname = "OTA User"; // OTA Hostname
const char* otaPassword = "OTA Passwort"; // OTA Zugangscode
char* clientId = "KellerlichtLast";
const char* mqtt_server = "192.168.178.43";
const int mqtt_port = 1883;
char* msg1 = "";
char* msg2;
char* msg3;
char* msg4;
float temperature;
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
const unsigned long interval = 2000;
unsigned long lastmillis = 0;
void setup()
{
Serial.begin(9600);
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet, dns);
ArduinoOTA.setHostname(otaHostname);
ArduinoOTA.setPassword(otaPassword);
ArduinoOTA.begin();
connectToMQTT();
m1.begin();
m1.pinMode(P0, OUTPUT);
m1.pinMode(P4, INPUT);
m1.pinMode(P5, INPUT);
m1.pinMode(P6, INPUT);
m1.pinMode(P7, INPUT);
//pinMode(D8, INPUT);
//pinMode(D1, OUTPUT);
m1.digitalWrite(P0, LOW);
DS18B20.begin();
delay(1000);
}
void loop()
{
ArduinoOTA.handle();
if (millis() - lastmillis >= interval)
{
if (WiFi.status() != WL_CONNECTED)
{
m1.digitalWrite(P0, HIGH);
m1.digitalWrite(P2, LOW);
}
else
{
m1.digitalWrite(P0, LOW);
m1.digitalWrite(P2, HIGH);
lastmillis = millis();
//Serial.println(digitalRead(D8));
//digitalWrite(D1, digitalRead(D8));
connectToMQTT();
if (m1.digitalRead(P4))
{
msg1 = "ON";
}
else
{
msg1 = "OFF";
}
client.publish("ESP_Kellerlicht/Keller", msg1);
if (m1.digitalRead(P5))
{
msg2 = "ON";
}
else
{
msg2 = "OFF";
}
client.publish("ESP_Kellerlicht/Schleifplatz", msg2);
if (m1.digitalRead(P6))
{
msg3 = "ON";
}
else
{
msg3 = "OFF";
}
client.publish("ESP_Kellerlicht/NC1", msg3);
if (m1.digitalRead(P7))
{
msg4 = "ON";
}
else
{
msg4 = "OFF";
}
client.publish("ESP_Kellerlicht/NC2", msg4);
DS18B20.requestTemperatures();
temperature = DS18B20.getTempCByIndex(0);
Serial.println(String(temperature) + " °C");
client.publish("ESP_Kellerlicht/Temp", String(temperature).c_str());
Zeitholen();
client.publish("ESP_Kellerlicht/time", time_value);
Serial.println(msg1);
Serial.println(msg2);
Serial.println(msg3);
Serial.println(msg4);
}
}
}
void connectToMQTT()
{
client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
if (client.connect(clientId))
{
Serial.println("connected");
m1.digitalWrite(P1, LOW);
m1.digitalWrite(P0, HIGH);
}
else {
m1.digitalWrite(P1, HIGH);
m1.digitalWrite(P0, LOW);
}
}
void Zeitholen() {
configTime(2 * 3600, 0, "0.de.pool.ntp.org", "ptbtime1.ptb.de");
delay(1000);
time_t now = time(nullptr);
String time = String(ctime(&now));
time.trim();
time.substring(0,19).toCharArray(time_value, 20);
}
Mit Sicherheit kann man den Code noch optimieren. Das muss man sich dann bei nächster gelegenheit mal angucken.
Der wichtigere Spaß wird es, beim ESP07 die externe Antenne ans laufen zu bekommen. Aktuell läuft noch die interne. Lust habe ich wenig, ist ja in der Regel immer so ein gefriemel mit dem umlöten.
Michael
Kannst Du mal für mich was austesten?
Vor dem setup bitte mal folgende Zeile einsetzen:
char zustand[][4]={"OFF", "ON"};
Und dann mal ersetzen:
if (m1.digitalRead(P5))
{
msg2 = "ON";
}
else
{
msg2 = "OFF";
}
durch:
msg2=zustand[m1.digitalRead(P5)];
Mal sehen, ob das compiliert - und dann ob das tut.
Mach ich sofort. Meldung kommt gleich.
Ergebnis vom Test:
Es tut das "gleiche" wie mein Code. Also keine Probleme beim Kompilieren oder Programmieren. Und wenn ich testweise die Anschlüße "schließe" und "öffne" tuen alle 4 was sie sollen.
Wenn ich das richtig verstehe, erspart mir dein Experiment die ganzen abfragen und ich kann einfach bei msg1 - msg4 den Array Zustand abfragen und bum, weniger Code?
Kann ich später oder morgen bei allen mal testen, der Hund muss raus. Ob ich danach nochmal groß online komme weiß ich nicht. Vielleicht aber auch erst die Tage wieder.
Die Frau möchte auch mal bisschen was von mir am Wochenende haben
Und so kann ich mich etwas um das gefriemel beim löten drücken.
Ist aber ja nur aufgeschoben nicht aufgehoben. Ich verstehe die Chinesen da nur nicht, wieso die nicht gleich die in "umgelötet" verkaufen wenn diese als Set mit Antenne verkauft werden. Aber das ist ein anderes Thema.
Genau das und es wird kürzer.
void loop()
{
ArduinoOTA.handle();
if (millis() - lastmillis >= interval)
{
if (WiFi.status() != WL_CONNECTED)
{
m1.digitalWrite(P0, HIGH);
}
else
{
m1.digitalWrite(P0, LOW);
lastmillis = millis();
//Serial.println(digitalRead(D8));
//digitalWrite(D1, digitalRead(D8));
connectToMQTT();
msg1 = zustand[m1.digitalRead(P4));
msg2 = zustand[m1.digitalRead(P5)];
msg3 = zustand[m1.digitalRead(P6)];
msg4 = zustand[m1.digitalRead(P7)];
if (msg1 != msg1old)
{
client.publish("ESP_Kellerlicht/Keller", msg1);
msg1old = msg1;
}
client.publish("ESP_Kellerlicht/Schleifplatz", msg2);
client.publish("ESP_Kellerlicht/NC1", msg3);
client.publish("ESP_Kellerlicht/NC2", msg4);
Serial.println(msg1);
Serial.println(msg2);
Serial.println(msg3);
Serial.println(msg4);
}
m1.digitalWrite(P2, !m1.digitalRead(P0));
}
}
Und jetzt noch die msg als Array gemacht und das wird nen Dreizeiler....
For Schleife würde sich da anbieten, wenn ich mich nicht vertue. Würde ich die Tage aber erst selber mal testen und bei Fragen mich melden. Komme leider erst die Tage dazu.
Man möchte ja auch eins Lerneffekt haben mit Erfolgserlebnis.
Vor allem nach dem nächsten kleinen Rückschlag. Geplantes Gehäuse passt nicht muss eine Nummer größer nehmen. Hab die Kabel in der Klemme der Versorgungsspannung (230V) vergessen
Beweisfotos:
Aber man lernt ja dazu, zumindest ist das der Plan. Den ohne 230V Kabel passt alles perfekt wie geplant
Es gibt doch Printfassungen, die von oben gesteckt werden. Die passen auch in das Raster. Gibt es z.B. auch bei Conrad. Ich schau mal ob ich was finde.
Hier bei Reichelt.Stecker
Ja, auch.
Man kann das auch ohne Schleife machen.
loop() ist eine Schleife
Du musst unbedingt dafür sorgen, das ArduinoOTA.handle() nicht in ein TimeOut läuft. Jede zusätzliche Schleife kann Dir da böse mitspielen.
Okay das wäre auch eine Möglichkeit. Muss dann zwar noch welche bestellen. Den von den aktuell verbauten Klemmen hab ich noch einige da. Aber gucke ich mal. Könnte ggf einfacher werden als extra Gehäuse zu kaufen
Stimmt auch wieder und einfach einen Zähler hoch zählen bzw. Ab dem maximal Wert diesen wieder auf 0 setzen.
Der Abgang ist aber auch nach vorne.
Suche mal nach WAGO ecom.
Die Federklemmleisten gibt es von oben einsteckbar.
Wobei ich evtl. auch ne andere Variante nehmen würde, die mir mehr Abstand bringt...
Die habe ich bestellt mit Gegenstücke, wenn ich es richtig sehe, kann das klappen. Aber wegen den Steckklemmen gucke ich auch mal.
Neee, den (inkl. Stiftleiste) kannst z. B um 180 Grad drehen.
Hm. wird eng, sehr eng. Und wenn Du deine Platine so dimensioniert hast, das die bis an das Gehäuse reicht, wird das eher nichts.
Ich setze mal die Aderendhülse als Maß an, was Du noch brauchst, damit das passt. Eher mehr.
Meine wäre dann das:
WAGO 2092-3152
Rastermaß 7,5.
Ok, das sind aber andere, als von mir verlinkten.
Da ist der Schraubenteil etwas dicker.
Ob das nutzt? Der Abstand nach hinten wird vom Wandler bestimmt. Und der ist bei den benötigten 8mm im Weg.
Datenblatt
Ich gucke mal wenn meine bestellten Klemmen da sind. Und naja wie gesagt, es ist schon eher Lerneffekt. Wird mir vielleicht nicht noch ein mal passieren
Aber ich guck mal, wie es wird. Sobald die Sachen da sind kann ich es ja mal probieren und werd mal Foto machen.
Der Schraubteil dürfte aber zur Platine gehen, wenn ich das richtig gesehen habe. Aber wie gesagt mal Testen.
Testen sollte man es schon. Ich kann es von hier nicht sehen und nicht entscheiden.
War nur ein Tipp.
Ist sicher einfacher als ein neues Gehäuse.