/* Ziele: * - Steuerung der Funksteckdosen über www * - Anzeige von Crypto Marktdaten * - Darstellung der Daten auf Display * - Weiterleiten von 433 Mhz -Daten ins wwww * - auslesen des direkt angeschlossenen dht22 (Temperatur, Luftfeuchtigkeit) * * bei der Verbindung philippwalla.de zum esp einen Code mitsenden, der sich regelmä * ßig erneuert. zb jedes mal wenn der esp seine ip mitteilt * mehrere Wlan-Netzwerke verwenden * * Problem: Der RC-Transmitter sendet auch im deepsleep-Modus und stört so das Signal der physischen Fernbedienung. Erst wenn der Strom ganz aus ist, stoppt der Transmitter. * Daher ggf. nicht ausschalten, sondern nur den Bildschirm ausschalten */ String espconfig = "0|autooff:on|display:on|crypto:on||"; // Standardkonfiguration. wird beim Abruf von philippwalla.de/esp überschrieben int espconfig_T = 0; int espconfig_Tmillis = 0; int i = 0; int i2 = 0; int i2neu = 0; String wlanstatus = "off"; String wlanip = ""; int restarts = 0; int loop_c = 0; int cmcT = -1000*60*60; // 1h in der Vergangenhet, dass CMS beim starten abgerufen wird int wwwipT = -1000*60*60; int Thttp433mhz = 0; int Tdht22 = (-1)*4*60*1000; String autooffshown = "nein"; String cmcdisplaylist = ""; String cmcdisplaylist_temp = ""; int cmcdisplaystartT = 0; String displaystr = ""; String displaylastsent = ""; int displaylastsentT = 0; String dp_T = ""; String dp_row = ""; String dp_column = ""; String dp_clear = ""; String dp_text = ""; char dp_textchar; String cmc_main1 = ""; String cmc_main2 = ""; String cmc_main3 = ""; String cmc_main4 = ""; String cmc_main5 = ""; String cmc_main6 = ""; String cmc_main7 = ""; String cmc_main = ""; String cmc_portfolio = ""; double portfolio_current = 0; double portfolio_24h = 0; double portfolio_24hchange = 0; double portfolio_7d = 0; double portfolio_7dchange = 0; String rf433received = ""; String apipass = "5fGttTu7"; #include #include #include "OLED.h" // SDA and SCL are the GPIO pins of ESP8266 that are connected to respective pins of display. OLED display(4, 5); #include #include #include const char* ssid = ""; //type your ssid const char* password = "";//type your password WiFiServer server(80);//Service Port #include #include #include RCSwitch mySwitch = RCSwitch(); ADC_MODE(ADC_VCC); // Spannung lesen #include "DHT.h" #define DHTPIN 12 // DHT22 is connected to Pin #12, entspricht D6, GPIO12 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); // ######################## // ## ## // ## SETUP ## // ## ## // ######################## void setup() { // put your setup code here, to run once: // Übertragsungsgeschwindigkeit für seriellen Monitor Serial.begin(9600); // RF-Transmitter is connected to Pin #0, entspricht D3, GPIO0 mySwitch.enableTransmit(0); // RF-Receiver is connected to Pin #14, entspricht D5, GPIO14 mySwitch.enableReceive(14); // OLED-Display anschalten display.begin(); // Begrüßung display.print("WILLKOMMEN", 2, 4); delay(300); display.print(".", 4, 6); delay(100); display.print(".", 4, 7); delay(100); display.print(".", 4, 8); delay(100); display.print(".", 4, 9); delay(100); display.print(".", 4, 10); delay(100); display.print(".", 4, 11); delay(100); // Wlan-Verbindung herstellen display.clear(); delay(200); display.print("Wlan verbinden:",0,1); display.print("Die_blaue_Lagun ",1,1); WiFi.begin(ssid, password); i = 0; while (WiFi.status() != WL_CONNECTED and i < 60) { delay(500); i = i+1; if(i2<1) { display.print(".. ",2,1); i2neu = 1; } if(i2>=1) { display.print(". ",2,1); i2neu = 0; } i2 = i2neu; if(i >= 60) { restarts++; // diese Zeilen auskommentieren, dann macht es ohne Wifi weiter if(restarts < 3) { display.print(".restart ",2,1); // display.print(restarts); delay(2000); setup(); } if(restarts >= 3) { display.print(". SHUTDOWN ",2,1); delay(2000); display.off(); ESP.deepSleep(0); } } } if(i >= 60) { display.print("fehlgeschlagen ",2,1); delay(2000); } if(i < 60) { server.begin(); display.print(".verbunden",2,1); wlanstatus = "on"; delay(400); display.print("IP ",3,1); IPAddress ip = WiFi.localIP(); wlanip = ip.toString(); display.print((char*) WiFi.localIP().toString().c_str(),3,4); delay(800); } // pinMode(2, INPUT); } // ######################## // ## ## // ## LOOP ## // ## ## // ######################## void loop() { loop_c++; // put your main code here, to run repeatedly: // Server: prüfen ob sich ein Client verbunden hat WiFiClient client = server.available(); if (client) { // Wait until the client sends some data Serial.println("new client"); int dc = 0; while(!client.available() && dc < 30){ delay(10); dc++; } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); client.println("1"); delay(1); Serial.println("Client disconnected"); Serial.println(""); // Befehle String apipassget = "?" + apipass + "/"; if(request != "" && request.indexOf(apipassget) > 0) { display.clear(); delay(100); display.print("Befehl:",1,1); // Steckdosen an-/ausschalten if(request.indexOf("turnRF") > 0) { display.print("Steckdose",2,1); if(request.indexOf("turnRF1on") > 0) { display.print(" 1 AN",2,10); mySwitch.sendTriState("0FFF0FFFFFF1"); } if(request.indexOf("turnRF2on") > 0) { display.print(" 2 AN",2,10); mySwitch.sendTriState("0FFFF0FFFFF1"); } if(request.indexOf("turnRF3on") > 0) { display.print(" 3 AN",2,10); mySwitch.sendTriState("0FFFFF0FFFF1"); } if(request.indexOf("turnRF1off") > 0) { display.print(" 1 AUS",2,10); mySwitch.sendTriState("0FFF0FFFFFF0"); } if(request.indexOf("turnRF2off") > 0) { display.print(" 2 AUS",2,10); mySwitch.sendTriState("0FFFF0FFFFF0"); } if(request.indexOf("turnRF3off") > 0) { display.print(" 3 AUS",2,10); mySwitch.sendTriState("0FFFFF0FFFF0"); } if(request.indexOf("turnRFalleon") > 0) { display.print("n AN",2,10); mySwitch.sendTriState("0FFF0FFFFFF1"); delay(400); mySwitch.sendTriState("0FFFF0FFFFF1"); delay(400); mySwitch.sendTriState("0FFFFF0FFFF1"); } if(request.indexOf("turnRFalleoff") > 0) { display.print("n AUS",2,10); mySwitch.sendTriState("0FFFFF0FFFF0"); delay(300); mySwitch.sendTriState("0FFFF0FFFFF0"); delay(300); mySwitch.sendTriState("0FFF0FFFFFF0"); } delay(1000); delay(100); display.clear(); } // Display an-/ausschalten if(request.indexOf("cfg_display:on") > 0) { delay(100); display.print("Display: AN",2,1); delay(1000); espconfig.replace("display:off","display:on"); display.on(); } if(request.indexOf("cfg_display:off") > 0) { display.print("Display: AUS",2,1); delay(1000); espconfig.replace("display:on","display:off"); display.off(); } // Einstellungen aktualisieren if(request.indexOf("cfg_autooff:on") > 0) { delay(100); display.print("AutoOff: 10min",2,1); delay(1000); espconfig.replace("autooff:off","autooff:on"); } if(request.indexOf("cfg_autooff:off") > 0) { delay(100); display.print("AutoOff: NIE",2,1); delay(1000); espconfig.replace("autooff:on","autooff:off"); } if(request.indexOf("cfg_crypto:on") > 0) { delay(100); display.print("Kryptos: AN",2,1); delay(1000); espconfig.replace("crypto:off","crypto:on"); } if(request.indexOf("cfg_crypto:off") > 0) { delay(100); display.print("Kryptos: AUS",2,1); delay(1000); espconfig.replace("crypto:on","crypto:off"); cmcdisplaylist = ""; } // ESP8266 ausschalten if(request.indexOf("shutdown") > 0) { display.print("SHUTDOWN",3,1); HTTPClient http; http.begin("XXX"); int httpCode = http.GET(); http.end(); delay(2000); display.off(); ESP.deepSleep(0); } display.clear(); } // ende Befehl ausführen } // ende client Verbindung // 433 Mhz-Signal empfangen if (mySwitch.available() && (millis()-Thttp433mhz) > 3000) { rf433received = mySwitch.getReceivedValue(); display.clear(); delay(100); display.print("433 MHz:",2,1); display.print((char*) rf433received.c_str(),3,1); delay(1000); display.clear(); mySwitch.resetAvailable(); if(rf433received.length() > 3) { HTTPClient http; http.begin("XXX&text3=" + rf433received); int httpCode = http.GET(); http.end(); Thttp433mhz = millis(); } rf433received = ""; } // IP an philippwalla.de/esp senden und Konfiguration ziehen if(((millis()-wwwipT)/1000) > (30*60)) { wwwipT = millis(); delay(800); display.clear(); delay(200); display.print("WWW anmelden:",0,1); delay(300); display.print(".",1,1); delay(100); display.print(".",1,2); delay(100); HTTPClient http; //Declare an object of class HTTPClient http.begin("XXX&text3=" + wlanip + "&text4=" + (millis()/1000/60) + "&text5=" + (ESP.getVcc()/1000.0)); //Specify request destination int httpCode = http.GET(); //Send the request if (httpCode > 0) { //Check the returning code String payload = http.getString(); //Get the request response payload display.print("erfolgreich ",1,3); delay(500); display.clear(); if(payload.indexOf("autooff:") > 0) { espconfig = payload.substring(3); espconfig_T = 0; int stellequer = espconfig.indexOf('|'); espconfig_T = espconfig.substring(0,stellequer).toInt(); espconfig_Tmillis = millis(); // Display an-/ausschalten if(espconfig.indexOf("display:on") > 0) { display.on(); } if(espconfig.indexOf("display:off") > 0) { display.off(); } } } if (httpCode <= 0) { display.print("fehlgeschlagen",1,3); delay(750); display.clear(); } http.end(); } // eigenen Temperatur- & Luftfeuchtigkeitssensor auslesen if((millis()-Tdht22) > (5*60*1000)) { Serial.println("TH jetzt"); int dht22_h = dht.readHumidity()*100; int dht22_t = dht.readTemperature()*100; // Read temperature as Celsius (the default) int dht22_f = dht.readTemperature(true)*100; // Read temperature as Fahrenheit (isFahrenheit = true) // double hif = dht.computeHeatIndex(dht22_f, dht22_h); // double hic = dht.computeHeatIndex(dht22_t, dht22_h, false); String THstring = "ownDHT|T:" + String(dht22_t) + "|H:" + String(dht22_h); HTTPClient http; http.begin("XXX&text3=ownDHT|T:" + String(dht22_t) + "|H:" + String(dht22_h) + "|" + "|T(F):" + String(dht22_f) + "|"); int httpCode = http.GET(); String payload = http.getString(); Serial.println(payload); Serial.println(dht22_t); Serial.println(dht22_h); http.end(); Tdht22 = millis(); if(dht22_t > 100000) { Tdht22 = millis()-(4*60*1000); } } // automatisch nach 10min ausschalten if(espconfig.indexOf("autooff:off") < 1) { if((millis()/1000) > 5*60 && autooffshown == "nein") { autooffshown = "ja"; display.clear(); delay(500); display.print("Auto Off in",1,3); display.print("5:00 Minuten",3,2); delay(1000); display.print("4:59 Minuten",3,2); delay(1000); display.print("4:58 Minuten",3,2); delay(1000); display.print("4:57 Minuten",3,2); delay(1000); display.print("4:56 Minuten",3,2); delay(1000); display.clear(); } if((millis()/1000) > 10*60) { display.clear(); delay(500); display.print("Auto Off in",1,3); display.print("0:05 Minuten",3,2); delay(1000); display.print("0:04 Minuten",3,2); delay(1000); display.print("0:03 Minuten",3,2); delay(1000); display.print("0:02 Minuten",3,2); delay(1000); display.print("0:01 Minuten",3,2); delay(800); HTTPClient http; http.begin("XXX&text3=off"); int httpCode = http.GET(); http.end(); display.off(); ESP.deepSleep(0); } } // Coinmarketcap abrufen if(espconfig.indexOf("crypto:on") > 0 && ((millis()-cmcT)/1000) > (5*60)) { cmcT = millis(); WiFiClientSecure client; CoinMarketCapApi api(client); delay(200); display.print("CMC API abrufen",4,1); delay(300); display.print("Status: 0/7",5,1); CMCTickerResponse response1 = api.GetTickerInfo("bitcoin", "eur"); cmc_main1 = response1.symbol + ": " + round(response1.price_currency) + " EUR (" + response1.percent_change_24h + " %)"; display.print("1",5,9); CMCTickerResponse response2 = api.GetTickerInfo("ethereum", "eur"); cmc_main2 = response2.symbol + ": " + round(response2.price_currency) + " EUR (" + response2.percent_change_24h + " %)"; display.print("2",5,9); CMCTickerResponse response3 = api.GetTickerInfo("ripple", "eur"); cmc_main3 = response3.symbol + ": " + response3.price_currency + " EUR (" + response3.percent_change_24h + " %)"; display.print("3",5,9); CMCTickerResponse response4 = api.GetTickerInfo("bitcoin-cash", "eur"); cmc_main4 = response4.symbol + ": " + round(response4.price_currency) + " EUR (" + response4.percent_change_24h + " %)"; display.print("4",5,9); CMCTickerResponse response5 = api.GetTickerInfo("eos", "eur"); cmc_main5 = response5.symbol + ": " + response5.price_currency + " EUR (" + response5.percent_change_24h + "%)"; display.print("5",5,9); CMCTickerResponse response6 = api.GetTickerInfo("neo", "eur"); cmc_main6 = response6.symbol + ": " + round(response6.price_currency) + " EUR (" + response6.percent_change_24h + " %)"; display.print("6",5,9); CMCTickerResponse response7 = api.GetTickerInfo("iota", "eur"); cmc_main7 = response7.symbol + ": " + response7.price_currency + " EUR (" + response7.percent_change_24h + " %)"; cmc_main7.replace("MIOTA", "IOT"); display.print("7",5,9); delay(700); // Portofolio-Entwicklung anhand obiger Auswahl abschätzen portfolio_current = portfolio_current+(1.69*response1.price_currency); portfolio_24h = portfolio_24h+(1.69*((response1.price_currency/(100+response1.percent_change_24h))*100)); portfolio_7d = portfolio_7d+(1.69*((response1.price_currency/(100+response1.percent_change_7d))*100)); portfolio_current = portfolio_current+(1.69*response2.price_currency); portfolio_24h = portfolio_24h+(1.69*((response2.price_currency/(100+response2.percent_change_24h))*100)); portfolio_7d = portfolio_7d+(1.69*((response2.price_currency/(100+response2.percent_change_7d))*100)); portfolio_current = portfolio_current+(1.69*response5.price_currency); portfolio_24h = portfolio_24h+(1.69*((response5.price_currency/(100+response5.percent_change_24h))*100)); portfolio_7d = portfolio_7d+(1.69*((response5.price_currency/(100+response5.percent_change_7d))*100)); portfolio_current = portfolio_current+(1.69*response6.price_currency); portfolio_24h = portfolio_24h+(1.69*((response6.price_currency/(100+response6.percent_change_24h))*100)); portfolio_7d = portfolio_7d+(1.69*((response6.price_currency/(100+response6.percent_change_7d))*100)); portfolio_current = portfolio_current+(1.69*response7.price_currency); portfolio_24h = portfolio_24h+(1.69*((response7.price_currency/(100+response7.percent_change_24h))*100)); portfolio_7d = portfolio_7d+(1.69*((response7.price_currency/(100+response7.percent_change_7d))*100)); portfolio_24hchange = (portfolio_current-portfolio_24h)/portfolio_24h*100; portfolio_7dchange = (portfolio_current-portfolio_7d)/portfolio_7d*100; // Liste zur Displayanzeige erzeugen cmcdisplaylist = ""; // [begin]time:3000;row:0;column:1;clear:no;text:...;[end] cmcdisplaylist = cmcdisplaylist + "[begin]time:300;row:0;column:1;clear:yes;text:;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1000;row:1;column:3;clear:no;text:PORTFOLIO:;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:3000;row:4;column:2;clear:no;text:" + portfolio_24hchange + " % (24h);[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:3000;row:6;column:2;clear:no;text:" + portfolio_7dchange + " % (7d) ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:300;row:;column:;clear:yes;text:;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:100;row:0;column:4;clear:no;text:MARKET:;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:;column:;clear:no;text:;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:2;column:1;clear:no;text:"+cmc_main1+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:2;column:1;clear:no;text:"+cmc_main1.substring(0,4) + cmc_main1.substring(13,100) + " ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:3;column:1;clear:no;text:"+cmc_main2+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:3;column:1;clear:no;text:"+cmc_main2.substring(0,4) + cmc_main2.substring(12,100) +" ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:5;column:1;clear:no;text:"+cmc_main3+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:5;column:1;clear:no;text:"+cmc_main3.substring(0,4) + cmc_main3.substring(13,100) +" ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:6;column:1;clear:no;text:"+cmc_main4+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:6;column:1;clear:no;text:"+cmc_main4.substring(0,4) + cmc_main4.substring(12,100) +" ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:7;column:1;clear:no;text:"+cmc_main5+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1000;row:7;column:1;clear:no;text:"+cmc_main5.substring(0,4) + cmc_main5.substring(13,100) +" ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:5;column:1;clear:no;text: ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:5;column:1;clear:no;text:"+cmc_main6+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:5;column:1;clear:no;text:"+cmc_main6.substring(0,4) + cmc_main6.substring(11,100) +" ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:500;row:6;column:1;clear:no;text: ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:6;column:1;clear:no;text:"+cmc_main7+";[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1500;row:6;column:1;clear:no;text:"+cmc_main7.substring(0,4) + cmc_main7.substring(13,100) +" ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:300;row:;column:;clear:yes;text:;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:1000;row:3;column:5;clear:yes;text:zZzz;[end]"; } if(cmcdisplaylist.indexOf("zZzzZ") < 1) { cmcdisplaylist = cmcdisplaylist + "[begin]time:3000;row:3;column:5;clear:no;text:zZzz ;[end]"; cmcdisplaylist = cmcdisplaylist + "[begin]time:3000;row:3;column:5;clear:no;text:zZzzZ;[end]"; } if(cmcdisplaylist.indexOf("[end]") > 0) { if(cmcdisplaystartT < 1) { cmcdisplaystartT = millis(); cmcdisplaylist_temp = cmcdisplaylist; } // vorne stehenden Anzeigestring auslesen displaystr = cmcdisplaylist_temp.substring(cmcdisplaylist_temp.indexOf("[begin]"),cmcdisplaylist_temp.indexOf("[end]")+5); // neue Anzeige an das Display senden if(millis()-displaylastsentT > dp_T.toInt() && displaylastsent != displaystr) { displaylastsent = displaystr; displaylastsentT = millis(); dp_T = displaystr.substring(displaystr.indexOf("time:")+5); dp_T = dp_T.substring(0,dp_T.indexOf(";")); dp_row = displaystr.substring(displaystr.indexOf("row:")+4); dp_row = dp_row.substring(0,dp_row.indexOf(";")); dp_column = displaystr.substring(displaystr.indexOf("column:")+7); dp_column = dp_column.substring(0,dp_column.indexOf(";")); dp_clear = displaystr.substring(displaystr.indexOf("clear:")+6); dp_clear = dp_clear.substring(0,dp_clear.indexOf(";")); dp_text = displaystr.substring(displaystr.indexOf("text:")+5); dp_text = dp_text.substring(0,dp_text.indexOf(";")); cmcdisplaylist_temp.replace(displaystr,""); if(dp_clear == "yes") { display.clear(); } Serial.print("clearen? "); Serial.println(dp_clear); dp_text = dp_text.substring(0,15); Serial.println(dp_text); display.print((char*) dp_text.c_str(),dp_row.toInt(),dp_column.toInt()); } if(cmcdisplaylist_temp == "") { cmcdisplaystartT = 0; } } }