1 | #include <ESP8266WiFi.h>
|
2 | #include <PubSubClient.h>
|
3 | const char* ssid = "SSID";
|
4 | const char* password = "PASSWORD";
|
5 | const char* mqtt_server = "192.168.178.31";
|
6 | const char* deviceID = "WEMOSD1mini";
|
7 |
|
8 | WiFiClient wifiClient; //create an instance of the WiFi client
|
9 | PubSubClient MQTTclient(wifiClient); //create an instance of the MQTT client, based on the WiFi client
|
10 |
|
11 | long lastMsgTime = 0; //The time (from millis()) at which last message was published
|
12 | char msg[64]; //A buffer to hold messages to be sent/have been received
|
13 | char topic[32]; //The topic in which to publish a message
|
14 | int pulseCount = 0; //Counter for number of heartbeat pulses sent
|
15 |
|
16 | void setup() {
|
17 | //PIN für LED & Anschalten dieser, um boot Vorgang anzuzeigen
|
18 | pinMode(D3, OUTPUT);
|
19 | digitalWrite(D3, HIGH);
|
20 |
|
21 | wifiSetup(); //WIFI-Connection
|
22 | mqttSetup(); //MQTT-Connection
|
23 |
|
24 | //LED kurze Blinken & ausschalten (zum Anzeigen, dass Boot-Vorgang abgeschlossen ist
|
25 | for (int i = 0; i < 4; i++){
|
26 | digitalWrite(D3, HIGH);
|
27 | delay(250);
|
28 | digitalWrite(D3, LOW);
|
29 | delay(250);
|
30 | }
|
31 | }
|
32 |
|
33 | void loop() {
|
34 | mqttLoop();
|
35 | LED();
|
36 | }
|
37 |
|
38 | void mqttCallback(char* topic, byte* payload, unsigned int length) { //Callback function each time a message is published in any of the topics to which this client is subscribed
|
39 | ...
|
40 | }
|
41 |
|
42 | void mqttLoop() {
|
43 | if (MQTTclient.connected()) {
|
44 | MQTTclient.loop(); //call the main loop to check for and publish messages
|
45 | }
|
46 | }
|
47 |
|
48 | void mqttReconnect() {
|
49 | if (!MQTTclient.connected()) {
|
50 | Serial.print("\nAttempting to connect to MQTT broker at (30sek) ");
|
51 | Serial.print(mqtt_server);
|
52 |
|
53 | MQTTclient.connect(deviceID);
|
54 | unsigned long currentF = millis();
|
55 | unsigned long previousF = currentF;
|
56 |
|
57 | //der Versuch, sich neu zu verbinden soll maximal 45 Sekunden dauern, da er im Zweifel nicht 5h in dieser Schleife hängen soll. (Ich habe vor, mithilfe einer Variable im EEPROM-Speicher, bei jedem 5. Reboot hintereinander, ersteinmal eine Pause von z.B. 15min zu lassen. Denn wenn nach 5 Versuchen keine Verbindung gelingt, liegt das Problem eher am Router
|
58 | while (!MQTTclient.connected() && currentF - previousF <= 45000) {
|
59 | delay(100);
|
60 | Serial.print("-");
|
61 | MQTTclient.connect(deviceID);
|
62 | currentF = millis();
|
63 | }
|
64 | if (!MQTTclient.connected()) {
|
65 | //Serial.print(MQTTclient.state()); //Debug Info
|
66 | Serial.write("\nMQTT-Reconnect fehlgeschlagen. Automatischer Neustart in 3 sek!\n");
|
67 | delay(3000);
|
68 | ESP.restart();
|
69 | }
|
70 | else {
|
71 | Serial.println("\nConnected to MQTT broker\n"); //Debug info
|
72 |
|
73 | //hier stehen alle subscriptions
|
74 | }
|
75 | }
|
76 | }
|
77 |
|
78 | void WiFiReconnect() {
|
79 | if (WiFi.status() != WL_CONNECTED) {
|
80 | Serial.print("\nVersuch, eine WLan Verbindung aufzustellen bei (30sek): ");
|
81 | Serial.print(ssid);
|
82 |
|
83 | WiFi.begin(ssid, password);
|
84 | unsigned long currentH = millis();
|
85 | unsigned long previousH = currentH;
|
86 |
|
87 | //der Versuch, sich neu zu verbinden soll maximal 45 Sekunden dauern, da er im Zweifel nicht 5h in dieser Schleife hängen soll
|
88 | while (WiFi.status() != WL_CONNECTED && currentH - previousH <= 45000) {
|
89 | delay(500);
|
90 | Serial.print(".");
|
91 | currentH = millis();
|
92 | }
|
93 | if (!MQTTclient.connected()) {
|
94 | //Serial.print(MQTTclient.state()); //Debug Info
|
95 | Serial.write("\nWLan-Reconnect fehlgeschlagen. Automatischer Neustart in 10 sek!\n");
|
96 | delay(10000);
|
97 | ESP.restart();
|
98 | }
|
99 | else {
|
100 | Serial.println("\nConnected to WiFi\n"); //Debug info
|
101 | Serial.println("MQTT Verbindung wird hergestellt...");
|
102 | mqttReconnect();
|
103 | }
|
104 | }
|
105 | }
|
106 |
|
107 | void mqttSetup() {
|
108 | MQTTclient.setServer(mqtt_server, 1883);
|
109 | MQTTclient.setCallback(mqttCallback);
|
110 |
|
111 | Serial.print("Attempting to connect to MQTT broker at (20sek) ");
|
112 | Serial.println(mqtt_server);
|
113 |
|
114 | MQTTclient.connect(deviceID);
|
115 | unsigned long currentG = millis();
|
116 | unsigned long previousG = currentG;
|
117 |
|
118 | //der Versuch, sich neu zu verbinden soll maximal 20 Sekunden dauern, da er im Zweifel nicht 5h in dieser Schleife hängen soll
|
119 | while (!MQTTclient.connected() && currentG - previousG <= 20000) {
|
120 | delay(100);
|
121 | Serial.print("-");
|
122 | MQTTclient.connect(deviceID);
|
123 | currentG = millis();
|
124 | }
|
125 | if (!MQTTclient.connected()) {
|
126 | //Serial.print(MQTTclient.state()); //Debug Info
|
127 | Serial.write("\nMQTT-Verbindung fehlgeschlagen. Automatischer Neustart in 3sek!\n");
|
128 | delay(3000);
|
129 | ESP.restart();
|
130 | }
|
131 | else {
|
132 | Serial.println("\nConnected to MQTT broker"); //Debug info
|
133 |
|
134 | //hier stehen alle subscriptions
|
135 | }
|
136 | }
|
137 |
|
138 | void wifiSetup() {
|
139 | if (!Serial) {
|
140 | Serial.begin(9600); //Start the Serial connection
|
141 | Serial.println("\nESP gestartet");
|
142 | }
|
143 |
|
144 | Serial.print("Ausgewähltes Wlan-Netzwerk: "); //Connect to the specified WiFi network
|
145 | Serial.println(ssid);
|
146 | WiFi.begin(ssid, password);
|
147 | unsigned long currentH = millis();
|
148 | unsigned long previousH = currentH;
|
149 |
|
150 | Serial.print("Verbidung wird hergestellt (15sek) ..."); //progress while we wait to connect
|
151 | while (WiFi.status() != WL_CONNECTED && currentH - previousH <= 15000) { //wenn keine Verbindung und weniger als 15 Sekunden vorbei: h < 15000
|
152 | delay(500);
|
153 | Serial.print(".");
|
154 | currentH = millis();
|
155 | }
|
156 | if (WiFi.status() != WL_CONNECTED) {
|
157 | Serial.write("\n Wlan Verbindung fehlgeschlagen. Auto Restart\n");
|
158 | ESP.restart();
|
159 | }
|
160 | else {
|
161 | delay(1500); //give the WiFi a couple of seconds to initialize
|
162 | Serial.println();
|
163 |
|
164 | Serial.print("Verbunden! IP-Adresse: ");
|
165 | Serial.println(WiFi.localIP());
|
166 | }
|
167 | }
|
168 |
|
169 | void LED() {
|
170 | if (WiFi.status() != WL_CONNECTED) {
|
171 | digitalWrite(D3, HIGH);
|
172 | Serial.print("\nWlan Verbindung verloren");
|
173 | WiFiReconnect();
|
174 | }
|
175 | else if (!MQTTclient.connected()) {
|
176 | digitalWrite(D3, HIGH);
|
177 | Serial.print("\nMQTT Verbindung Verloren");
|
178 | mqttReconnect();
|
179 | }
|
180 | else {
|
181 | digitalWrite(D3, LOW);
|
182 | }
|
183 | }
|