#include "esp_timer.h" #include "WiFi.h" #include "esp_now.h" #include Preferences preferences; typedef struct struct_message{ int id; int einspeise_leistung; int mittelwert_oben_links; int mittelwert_unten_links; int mittelwert_oben_rechts; int mittelwert_unten_rechts; } struct_message; struct_message myData; int32_t server_werte[5] = {0,0,0,0,0}; int64_t zeit_speicher[300]; int32_t index_1 = 0; bool m = 0; int32_t druck_zeiger = 0; int64_t aus_zeit = 0; byte inhalts_liste[288]; int32_t inhalts_index = 0; byte sende_schritt = 0; int64_t sende_start_zeit = 0; int64_t sende_ziel_zeit = 0; int32_t bit_zahl = 0; byte n[36]; const byte ir_led = 21; const byte rote_led = 27; const byte gruene_led = 32; const byte blaue_led = 33; const byte pieper = 13; byte rot = 0; byte gruen = 0; byte blau = 0; byte speicher = 0; unsigned long sekunde = 0; bool automatik_ein = 0; bool klimaanlage_eingeschaltet = 0; byte sendungen = 0; unsigned int summe_helligkeit = 0; const int dunkel_grenzwert = 5; unsigned long licht_zeit = 0; unsigned long zeit_limit = 120000; byte heizbetrieb = 0; byte kuehlbetrieb = 0; byte soll_temperatur = 0; float ist_temp_float = 0.0; byte ist_temperatur = 0; unsigned long auf_regel_zeit = 0; unsigned long ab_regel_zeit = 0; byte aenderung = 0; unsigned long aktuelle_zeit = 0; byte local_sec = 0; bool aus_signal = 0; bool weisses_licht = 0; bool piep = 0; //void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len){ void OnDataRecv(const esp_now_recv_info_t * recv_info, const uint8_t *incomingData, int len){ memcpy(&myData, incomingData, sizeof(myData)); Serial.println(" "); Serial.println(myData.id); Serial.println(myData.einspeise_leistung); Serial.println(myData.mittelwert_oben_links); Serial.println(myData.mittelwert_unten_links); Serial.println(myData.mittelwert_oben_rechts); Serial.println(myData.mittelwert_unten_rechts); Serial.println(aktuelle_zeit); if(myData.id == 1234){ if(myData.einspeise_leistung >= 0 && myData.einspeise_leistung <= 10000)server_werte[0] = myData.einspeise_leistung; if(myData.mittelwert_oben_links >= 0 && myData.mittelwert_oben_links <= 1200)server_werte[1] = myData.mittelwert_oben_links; if(myData.mittelwert_unten_links >= 0 && myData.mittelwert_unten_links <= 1200)server_werte[2] = myData.mittelwert_unten_links; if(myData.mittelwert_oben_rechts >= 0 && myData.mittelwert_oben_rechts <= 1200)server_werte[3] = myData.mittelwert_oben_rechts; if(myData.mittelwert_unten_rechts >= 0 && myData.mittelwert_unten_rechts <= 1200)server_werte[4] = myData.mittelwert_unten_rechts; licht_zeit = aktuelle_zeit; if(summe_helligkeit > dunkel_grenzwert)weisses_licht = 1; } } void setup() { Serial.begin(115200); pinMode(36, INPUT); preferences.begin("az", false); preferences.getBytes("Inhalt", &inhalts_liste, 288); preferences.end(); if(inhalts_liste[45] == 1 && inhalts_liste[189] == 1){automatik_ein = 1;} else {automatik_ein = 0;} //soll_temperatur + 26 = Wirklichkeit bitWrite(soll_temperatur, 0, inhalts_liste[56]); bitWrite(soll_temperatur, 1, inhalts_liste[57]); bitWrite(soll_temperatur, 2, inhalts_liste[58]); bitWrite(soll_temperatur, 3, inhalts_liste[59]); Serial.print("soll_temperatur: "); Serial.println(soll_temperatur); /* ledcSetup(0, 38000, 8); ledcSetup(1, 12000, 8); ledcSetup(2, 12000, 8); ledcSetup(3, 12000, 8); ledcAttachPin(ir_led, 0); ledcAttachPin(rote_led, 1); ledcAttachPin(gruene_led, 2); ledcAttachPin(blaue_led, 3); */ ledcAttach(ir_led, 38000, 8); ledcAttach(rote_led, 12000, 8); ledcAttach(gruene_led, 12000, 8); ledcAttach(blaue_led, 12000, 8); ledcWrite(ir_led, 0); ledcWrite(rote_led, 0); ledcWrite(gruene_led, 0); ledcWrite(blaue_led, 0); pinMode(pieper, OUTPUT); digitalWrite(pieper, LOW); WiFi.mode(WIFI_STA); if(esp_now_init() != ESP_OK){ Serial.println("Fehler"); return; } esp_now_register_recv_cb(OnDataRecv); digitalWrite(pieper, HIGH); delay(600); digitalWrite(pieper, LOW); } void loop() { //Sekunden Taktgeber aktuelle_zeit = millis(); if((aktuelle_zeit - sekunde) >= 1000){ sekunde = aktuelle_zeit; if(piep == 1){ digitalWrite(pieper, HIGH); piep = 0; } else{ digitalWrite(pieper, LOW); } if(weisses_licht == 1){ ledcWrite(rote_led, 200); ledcWrite(gruene_led, 200); ledcWrite(blaue_led, 200); weisses_licht = 0; } else{ ledcWrite(rote_led, rot); ledcWrite(gruene_led, gruen); ledcWrite(blaue_led, blau); } local_sec++; if(local_sec >= 60)local_sec = 0; //Summe der vier Helligkeiten berechnen summe_helligkeit = server_werte[1] + server_werte[2] + server_werte[3] + server_werte[4]; //Empfang prüfen if((aktuelle_zeit - licht_zeit) > zeit_limit)rot = 140; else rot = 0; //blaues Licht if(automatik_ein == 1 && summe_helligkeit > dunkel_grenzwert)blau = 140; else blau = 0; //gruenes Licht if(server_werte[0] > 50 && summe_helligkeit > dunkel_grenzwert)gruen = 140; else gruen = 0; //Frage ob Heizbetrieb ausgewählt wurde if(inhalts_liste[51] == 1 && inhalts_liste[52] == 0 && inhalts_liste[53] == 0){ heizbetrieb = 1; //Serial.println("Heizbetrieb ein"); } else heizbetrieb = 0; //Frage ob Kühlbetrieb ausgewählt wurde if(inhalts_liste[51] == 1 && inhalts_liste[52] == 1 && inhalts_liste[53] == 0){ kuehlbetrieb = 1; //Serial.println("kühlbetrieb ein"); } else kuehlbetrieb = 0; //Automatik ein if(automatik_ein == 1 && ((heizbetrieb == 1 && server_werte[0] > 1000) || (kuehlbetrieb == 1 && server_werte[0] > 800)) && klimaanlage_eingeschaltet == 0 && (aktuelle_zeit - licht_zeit) < zeit_limit){ inhalts_liste[45] = 1; inhalts_liste[189] = 1; auf_regel_zeit = aktuelle_zeit; ab_regel_zeit = aktuelle_zeit; if(heizbetrieb == 1)ist_temp_float = 0; if(kuehlbetrieb == 1)ist_temp_float = 8; klimaanlage_eingeschaltet = 1; aenderung = 1; Serial.println("klinaanlage wurde eingeschaltet"); } //Leistungsregelung if(klimaanlage_eingeschaltet == 1){ if(heizbetrieb == 1 && kuehlbetrieb == 0){ if((aktuelle_zeit - auf_regel_zeit) > 120000){ if(server_werte[0] > 300 && soll_temperatur > ist_temp_float){ if(server_werte[0] > 1000)ist_temp_float = ist_temp_float + 4; else if(server_werte[0] > 750 && server_werte[0] <= 1000)ist_temp_float = ist_temp_float + 3; else if(server_werte[0] > 500 && server_werte[0] <= 750)ist_temp_float = ist_temp_float + 2; else ist_temp_float = ist_temp_float + 1; aenderung = 1; Serial.println("ist_temperatur wurde erhöht"); } auf_regel_zeit = aktuelle_zeit; } if((aktuelle_zeit - ab_regel_zeit) > 60000){ if(server_werte[0] < 150){ if(summe_helligkeit < 3200)ist_temp_float = ist_temp_float - 2.0; else ist_temp_float = ist_temp_float - 1.0; if(ist_temp_float < 0.0){aus_signal = 1; Serial.println("Klimaanlage wird ausgeschaltet");} else{aenderung = 1; Serial.println("ist_temperatur wurde erniedrigt");} } ab_regel_zeit = aktuelle_zeit; } if(soll_temperatur < ist_temp_float){ ist_temp_float = soll_temperatur; aenderung = 1; Serial.println("ist_temperatur wurde auf soll_temperatur erniedrigt"); } } if(heizbetrieb == 0 && kuehlbetrieb == 1){ if((aktuelle_zeit - auf_regel_zeit) > 120000){ if(server_werte[0] > 300 && soll_temperatur < ist_temp_float){ if(server_werte[0] > 1000)ist_temp_float = ist_temp_float - 4; else if(server_werte[0] > 750 && server_werte[0] <= 1000)ist_temp_float = ist_temp_float - 3; else if(server_werte[0] > 500 && server_werte[0] <= 750)ist_temp_float = ist_temp_float - 2; else ist_temp_float = ist_temp_float - 1; aenderung = 1; Serial.println("ist_temperatur wurde erniedrigt"); } auf_regel_zeit = aktuelle_zeit; } if((aktuelle_zeit - ab_regel_zeit) > 60000){ if(server_werte[0] < 150){ if(summe_helligkeit < 3200)ist_temp_float = ist_temp_float + 2.0; else ist_temp_float = ist_temp_float + 1.0; if(ist_temp_float > 15.0){aus_signal = 1; Serial.println("Klimaanlage wird ausgeschaltet");} else{aenderung = 1; Serial.println("ist_temperatur wurde erhöht");} } ab_regel_zeit = aktuelle_zeit; } if(soll_temperatur > ist_temp_float){ ist_temp_float = soll_temperatur; aenderung = 1; Serial.println("ist_temperatur wurde auf soll_temperatur erhöht"); } } if(aenderung == 1){ if(ist_temp_float > 15.0)ist_temp_float = 15.0; if(ist_temp_float < 0.0)ist_temp_float = 0.0; ist_temperatur = ist_temp_float; inhalts_liste[56] = bitRead(ist_temperatur, 0); inhalts_liste[57] = bitRead(ist_temperatur, 1); inhalts_liste[58] = bitRead(ist_temperatur, 2); inhalts_liste[59] = bitRead(ist_temperatur, 3); sendungen = 1; aenderung = 0; Serial.print("solltemperatur: "); Serial.println(soll_temperatur); Serial.print("isttemperatur: "); Serial.print(ist_temp_float); Serial.print(" "); Serial.println(ist_temperatur); Serial.print("einspeise_leistung: "); Serial.println(server_werte[0]); Serial.print("helligkeit: "); Serial.println(summe_helligkeit); } } //Automatik aus if((automatik_ein == 0 || aus_signal == 1 || (aktuelle_zeit - licht_zeit) > zeit_limit) && klimaanlage_eingeschaltet == 1){ aus_signal = 0; inhalts_liste[45] = 0; inhalts_liste[189] = 0; sendungen = 3; klimaanlage_eingeschaltet = 0; Serial.println("Klimaanlage wurde ausgeschaltet"); } } //Empfang if(digitalRead(36) == LOW && m == 0 && sende_schritt == 0){ zeit_speicher[index_1] = esp_timer_get_time(); m = 1; } if(digitalRead(36) == HIGH && m == 1 && sende_schritt == 0){ index_1++; m = 0; aus_zeit = esp_timer_get_time(); } if(digitalRead(36) == HIGH && esp_timer_get_time() > (aus_zeit + 30000)){ index_1 = 0; m = 0; } //Auswertung des Empfangs if(index_1 >= 292){ int bit_zaehler = 0; int byte_zaehler = 0; bool bit_wert = 0; inhalts_index = 0; while(druck_zeiger < 293){ if(druck_zeiger > 0){ unsigned long diff = zeit_speicher[druck_zeiger] - zeit_speicher[druck_zeiger - 1]; if(diff > 9000){ //Serial.println("Pause"); bit_zaehler++; } if(diff > 600 && diff < 1100){ //Serial.print(0); bit_zaehler++; bit_wert = 0; if(inhalts_index < 288){ inhalts_liste[inhalts_index] = 0; inhalts_index++; } } if(diff > 1100 && diff < 2000){ //Serial.print(1); bit_zaehler++; bit_wert = 1; if(inhalts_index < 288){ inhalts_liste[inhalts_index] = 1; inhalts_index++; } } if(diff > 2000 && diff < 9000){ //Serial.println("Start: "); bit_zaehler = -1; } } druck_zeiger++; if(bit_zaehler > 7){ bit_zaehler = 0; byte_zaehler++; } //if(bit_zaehler == 7)Serial.print(" "); if(bit_zaehler >= 0 && byte_zaehler < 36){ bitWrite(n[byte_zaehler], bit_zaehler, bit_wert); } } druck_zeiger = 0; index_1 = 0; /* for(byte i=0; i<18; i++){ Serial.print(i);Serial.print(": "); Serial.print(n[i], BIN); Serial.print(": "); Serial.println(n[i]); } */ long summe = 0; for(byte i=0; i<17; i++){summe = summe + n[i];} long chsum = summe % 256; //Serial.print("chsum: "); Serial.print(chsum); Serial.print(" "); Serial.println(chsum, BIN); if(chsum == n[17]){ //Serial.println("Die Prüfsumme ist korrekt."); piep = 1; if(inhalts_liste[45] == 1 && inhalts_liste[189] == 1){automatik_ein = 1;} else {automatik_ein = 0;} //soll_temperatur + 26 = Wirklichkeit soll_temperatur = 0; bitWrite(soll_temperatur, 0, inhalts_liste[56]); bitWrite(soll_temperatur, 1, inhalts_liste[57]); bitWrite(soll_temperatur, 2, inhalts_liste[58]); bitWrite(soll_temperatur, 3, inhalts_liste[59]); Serial.print("soll_temperatur: "); Serial.println(soll_temperatur); preferences.begin("az", false); preferences.putBytes("Inhalt", &inhalts_liste, 288); preferences.end(); } else{for(int32_t i=0; i<288; i++){inhalts_liste[i] = 0;}} } //senden if(local_sec == 50 && sende_schritt == 0 && sendungen > 0){ sendungen--; sende_schritt = 11; } if(sende_schritt == 11){ if(inhalts_liste[0] == 1 && inhalts_liste[144] == 1){ sende_schritt = 1; } else sende_schritt = 0; } //senden nur mit gefüllter Liste if(sende_schritt == 1){ //Umwandlung der inhalts_liste in bytes int32_t inhalts_bit_zaehler = 0; int32_t inhalts_byte_zaehler = 0; byte sende_bytes[36]; for(int32_t i=0; i<288; i++){ if(inhalts_bit_zaehler > 7){inhalts_bit_zaehler = 0; inhalts_byte_zaehler++;} bitWrite(sende_bytes[inhalts_byte_zaehler], inhalts_bit_zaehler, inhalts_liste[i]); inhalts_bit_zaehler++; } //Berechnung der Prüsumme int64_t inhalts_summe = 0; for(byte i=0; i<17; i++){ inhalts_summe = inhalts_summe + sende_bytes[i]; } byte inhalts_chsum = inhalts_summe % 256; //Serial.print("inhalts_chsum: "); Serial.print(inhalts_chsum); Serial.print(" "); Serial.println(inhalts_chsum, BIN); //inhalts_chsum in die Inhalts_liste einfügen for(int32_t i=0; i<8; i++){ int32_t y1 = 136 + i; int32_t y2 = 280 + i; inhalts_liste[y1] = bitRead(inhalts_chsum, i); inhalts_liste[y2] = bitRead(inhalts_chsum, i); } //for(int32_t i=0; i<288; i++){Serial.print("bit-Nr.: "); Serial.print(i); Serial.print(" : "); Serial.println(inhalts_liste[i]);} sende_start_zeit = esp_timer_get_time(); sende_ziel_zeit = sende_start_zeit + 50000; bit_zahl = 0; sende_schritt = 2; } //Startsignal if(sende_schritt == 2){ if(esp_timer_get_time() > sende_ziel_zeit){ ledcWrite(ir_led, 127); sende_ziel_zeit = sende_ziel_zeit + 3400; sende_schritt = 3; } } if(sende_schritt == 3){ if(esp_timer_get_time() > sende_ziel_zeit){ ledcWrite(ir_led, 0); sende_ziel_zeit = sende_ziel_zeit + 1750; sende_schritt = 4; } } //bit-Signale if(sende_schritt == 4){ if(esp_timer_get_time() > sende_ziel_zeit){ ledcWrite(ir_led, 127); sende_ziel_zeit = sende_ziel_zeit + 450; sende_schritt = 5; } } if(sende_schritt == 5){ if(esp_timer_get_time() > sende_ziel_zeit){ ledcWrite(ir_led, 0); if(inhalts_liste[bit_zahl] == 1)sende_ziel_zeit = sende_ziel_zeit + 1300; if(inhalts_liste[bit_zahl] == 0)sende_ziel_zeit = sende_ziel_zeit + 420; if(bit_zahl >= 0 && bit_zahl <= 142)sende_schritt = 4; if(bit_zahl >= 144 && bit_zahl <= 286)sende_schritt = 4; if(bit_zahl == 143 || bit_zahl == 287)sende_schritt = 6; bit_zahl++; } } //Pause if(sende_schritt == 6){ if(esp_timer_get_time() > sende_ziel_zeit){ ledcWrite(ir_led, 127); sende_ziel_zeit = sende_ziel_zeit + 440; sende_schritt = 7; } } if(sende_schritt == 7){ if(esp_timer_get_time() > sende_ziel_zeit){ ledcWrite(ir_led, 0); sende_ziel_zeit = sende_ziel_zeit + 17100; if(bit_zahl == 144)sende_schritt = 2; else{ sende_schritt = 0; //Serial.println("sendung erledigt"); //delay(1000); //piep = 1; } } } }