/* // Multi-OLED // Wemos D1 mini mit mehreren OLEDs // Ankoppelung an ioBroker via MQTT // Made by joergeli 17.01.2022 */ #include #include #include #include #include #include // fuer Flashen ueber WLAN ( OTA = Over The Air) //########################################################################################### // Netzwerk-Parameter festlegen //_________________________________________________________________________________________ // Set your own !!!! network variables in this section !!! const char* OTA_host = "Multi-OLED"; //### Name for OTA-Flashing (OTA = Over the Air) const char* ssid = "xxxxxxxxxxx"; //### your WLAN SSID //### the name of your WiFi-network / <= 31 Signs const char* pwd = "xxxxxxxx"; //### your WLAN Password //### the password of your WiFi-network / >= 8 or <= 63 signs or NULL IPAddress ip(xxx, xxx, xxx, xxx); //### local ip-address of NodeMCU IPAddress gateway(xxx, xxx, xxx, xxx);//### router IPAddress subnet(255, 255, 255, 0); //### subnet-mask IPAddress dns(xxx, xxx, xxx, xxx); //### dns-server = mostly the same adress as router //########################################################################################### // MQTT-Broker und Topic festlegen const char *mqtt_broker = "192.168.192.29"; //### IP-Adresse des ioBroker-Servers const int mqtt_port = 1891; //### normal ist port=1183, da der bei mir bereits belegt ist, nutze ich einen anderen const char *topic = "javascript/0/SolarParser/*"; //### Alle Topics unter javascript/0/SolarParser/ //########################################################################################### WiFiClient espClient; PubSubClient client(espClient); //_________________________________________________________________________________________ bool connectWIFI(){ U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); TCA9548A(2); // tell the TCA9548A which I2C bus number we want use u8g2.begin(); u8g2.clearBuffer(); // clear the internal memory u8g2.setContrast(5); // contrast from 0-255 u8g2.setFont(u8g2_font_logisoso16_tf); // choose a suitable font u8g2.setCursor(0, 15); u8g2.print("Verbinde WLAN"); u8g2.sendBuffer(); u8g2.setFont(u8g2_font_6x13B_tf); // choose a suitable font u8g2.setCursor(0, 46); WiFi.config(ip, gateway, subnet, dns); delay(200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, pwd); Serial.print("Connecting to "); Serial.println(ssid); int count_x = 0; while (WiFi.status() != WL_CONNECTED) { Serial.print("."); if(count_x >= 20){ count_x =0; u8g2.setCursor(count_x, 60); } u8g2.print("."); u8g2.sendBuffer(); count_x += 1; delay(500); } // WLAN ist verbunden long rssi = WiFi.RSSI(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_logisoso16_tf); u8g2.setCursor(0, 15); u8g2.print("Verbunden"); u8g2.setCursor(0, 55); u8g2.print(rssi); u8g2.print(" dBm"); u8g2.sendBuffer(); Serial.println(); Serial.println(); Serial.print("WiFi connected ---> "); Serial.print("IP: "); Serial.print(WiFi.localIP()); Serial.print(" "); Serial.print("RSSI:"); Serial.print(rssi); Serial.println(" dBm"); delay(3000); return true; } // end of connectWIFI //_____________________________________________________________________________ void TCA9548A(uint8_t bus) // Multiplexer-Bus { Wire.beginTransmission(0x70); // TCA9548A address is 0x70 Wire.write(1 << bus); // send byte to select bus Wire.endTransmission(); } U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); //_____________________________________________________________________________ void startOTAhandling() { ArduinoOTA.onStart([]() { Serial.println("Start updating"); }); 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"); }); String Hostname = OTA_host; // OTA Name ArduinoOTA.setHostname(Hostname.c_str()); ArduinoOTA.begin(); Serial.println("OTAhandling gestartet ..."); } //_____________________________________________________________________________ void setup() { int disp_nr; u8g2.begin(); for (disp_nr=0; disp_nr<=8; disp_nr++){ // Displays loeschen TCA9548A(disp_nr); // tell the TCA9548A which I2C bus number we want use u8g2.clearBuffer(); // clear the internal memory u8g2.sendBuffer(); } Wire.begin(); Serial.begin(115200); Serial.println(); Serial.println(); connectWIFI(); startOTAhandling(); ArduinoOTA.setHostname(OTA_host); // fuer Flashen ueber WLAN ArduinoOTA.begin(); // fuer Flashen ueber WLAN //connecting to a mqtt broker client.setServer(mqtt_broker, mqtt_port); client.setCallback(callback); while (!client.connected()) { String client_id = "Solar-OLED"; Serial.printf("Client %s connects to MQTT-broker\n", client_id.c_str()); if (client.connect(client_id.c_str())) { Serial.println("MQTT-broker connected"); Serial.println("_______________________________________________________________"); Serial.println(); Serial.println(); } else { Serial.print("Connect failed with state "); Serial.print(client.state()); delay(2000); } } // subscribe topic client.subscribe(topic); u8g2.enableUTF8Print(); //(fuer Sonderzeichen) } //_____________________________________________________________________________ void oled_ausgabe(int disp_nr, String message, String sensor) { Serial.print("Display"); Serial.print(disp_nr); Serial.print(":"); Serial.print(" Message: "); Serial.print(message); Serial.print(" Sensor: "); Serial.println(sensor); TCA9548A(disp_nr); // tell the TCA9548A which I2C bus number we want use u8g2.begin(); u8g2.clearBuffer(); // clear the internal memory u8g2.setContrast(5); // contrast from 0-255 u8g2.setFont(u8g2_font_logisoso20_tf); // choose a suitable font u8g2.setCursor(0, 48); // Hier: "Normalposition" Curser x=0, Cursor y=48 if(disp_nr ==0){ u8g2.setCursor(10, 50);} //Speicher unten weiter rechts/oben anzeigen if(disp_nr ==1){ u8g2.setCursor(10, 59);} //Speicher oben weiter rechts/oben anzeigen if(disp_nr ==2){ u8g2.setCursor(10, 59);} //Kollektor-Temp weiter rechts/oben anzeigen if(disp_nr ==3){ u8g2.setCursor(20, 53);} //Drehzahl weiter rechts/oben anzeigen if(disp_nr ==4){ u8g2.setCursor(10, 53);} //Solar-Vorlauf weiter rechts anzeigen if(disp_nr ==5){ u8g2.setCursor(10, 50);} //Solar-Ruecklauf weiter rechts/oben anzeigen if(disp_nr ==6){ u8g2.setCursor(15, 62);} //Speicherladung weiter rechts/oben anzeigen u8g2.print(message); u8g2.sendBuffer(); // transfer internal memory to the display Serial.println("________________________________________________________"); Serial.println(); } //_____________________________________________________________________________ void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Topic: "); Serial.println(topic); delay(1); // ######################################################################## // ##### Display0 - Speicher unten ##### if (strcmp(topic,"javascript/0/SolarParser/Daten4")==0){ int disp_nr = 0; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); /* Serial.print("Message:"); for (int i = 0; i < length; i++) { Serial.print((char) payload[i]); } */ String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " °C"; //message String sensor = "Speicher unten"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## // ##### Display1 - Speicher oben ##### if (strcmp(topic,"javascript/0/SolarParser/Daten5")==0){ int disp_nr = 1; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " °C"; //message String sensor = "Speicher oben"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## // ##### Display2 - Kollektor-Temp ##### if (strcmp(topic,"javascript/0/SolarParser/Daten3")==0){ int disp_nr = 2; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " °C"; //message String sensor = "Kollektor-Temp"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## // ##### Display3 - Drehzahl Solarpumpe ##### if (strcmp(topic,"javascript/0/SolarParser/Daten13")==0){ int disp_nr = 3; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " %"; //message String sensor = "Solarpumpe-Drehzahl"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## // ##### Display4 - Vorlauf ##### if (strcmp(topic,"javascript/0/SolarParser/Daten9")==0){ int disp_nr = 4; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " °C"; //message String sensor = "Solar-Vorlauf"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## // ##### Display5 - Ruecklauf ##### if (strcmp(topic,"javascript/0/SolarParser/Daten10")==0){ int disp_nr = 5; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " °C"; //message String sensor = "Solar-Ruecklauf"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## // ##### Display6 - SpeicherLadung ##### if (strcmp(topic,"javascript/0/SolarParser/Daten41")==0){ int disp_nr = 6; //Diplay Nr., bzw. TCA9548A I2C bus number payload[length] = '\0'; Serial.println("________________________________________________________"); Serial.print("Message arrived in topic: "); Serial.println(topic); String msg; String strTopic; strTopic = String((char*)topic); msg = String((char*)payload); // Anzeigen auf OLED String message = msg + " °C"; //message String sensor = "Speicherladung"; //sensor oled_ausgabe(disp_nr, message, sensor); } // ######################################################################## } // End of void callback //_____________________________________________________________________________ void loop(){ client.loop(); ArduinoOTA.handle(); //for OTA-Flashing // Reboot if WiFi connection was lost if (WiFi.status() != WL_CONNECTED) { ESP.restart(); } } // End of loop