/* MQTT-Schalter. Schält ein oder aus. 2021-12-22 Wenn über MQTT "ein" empfangen wird, schält das Relais an, wenn "aus" empfangen wird, schält das Relais ab. */ // ////////////////////////////////////////////////// #include #include //MQTT-functionality #include //For serial to EEprom ///// anpassen ///////////////////////////////////////////////////// const char* Whoami = "MQTT-Schalter V.2021-12-22-a"; const short int Ausgang = 12; //Ausgangspin = D6 ///////////////////////////////////////////////////////////////////// const int PIN_LED = 2; // D4 on NodeMCU and WeMos. Controls the onboard LED. WiFiClient espClient; PubSubClient client(espClient); char msg[50];//storage for MQTT-Message String statusflag;//speichert den Befehl (an, aus) long lastMsg = 0; //======== variables for Serial Input ==== String ssid; String pass; String mqtt_broker; String topic; //String actorid; String chipid; char ssidbuffer[25]; char passbuffer[25]; char brokerbuffer[25]; char topicbuffer[25]; //char actoridbuffer[25]; char chipidbuffer[25]; // *************************************************************** void setup() { pinMode(PIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output pinMode(Ausgang, OUTPUT); // Relais-Pin als Ausgang anmelden //Relais ansteuern. statusflag="nop"; pinMode(12, OUTPUT);//=D6=Relaistransistor //PIN aus digitalWrite(12, LOW); Serial.begin(115200); delay(5000); //......... Serial Input Serial.println(); Serial.println("----------------------------"); Serial.println(Whoami); Serial.println("----------------------------"); Serial.println("Press Enter to start Setup"); unsigned long start=millis(); //10s: wait for serial input of Wifi credencials while((start+10000)>millis()) { yield(); if (Serial.available()) { Serial.read(); Serial.read(); setupmenu();//function connectWIFI();//function return; } } connectWIFI(); //MQTT-Broker verbinden client.setServer(brokerbuffer, 1883); client.setCallback(callback); //dient dem Empfang von MQTT-Nachrichten digitalWrite(PIN_LED, HIGH); } //############################### void reconnect() { while (!client.connected()) { Serial.println("Connecting MQTT-Broker..."); //ssid.toCharArray(ssidbuffer,25); //chipid.toCharArray(chipid_buffer,25); //chipid_buffer=string2char(String chipid); if (!client.connect(chipidbuffer)) { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" retrying in 5 seconds"); delay(5000); } } client.subscribe(topicbuffer); Serial.println("MQTT Connected. Waiting for MQTT-Messages..."); Serial.println("----------------------------"); } //############################## void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Received message ["); Serial.print(topic); Serial.print("] "); char msg[length+1]; for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); msg[i] = (char)payload[i]; } Serial.println(" "); msg[length] = '\0'; //wenn "an" empfangen wird Relais anschalten if(strcmp(msg,"an")==0){ //statusflag löschen statusflag="nop"; //Relais an, LED an (0 = an) digitalWrite(Ausgang, HIGH); digitalWrite(PIN_LED, LOW); Serial.print("Relais einschalten \n"); } //wenn "aus" empfangen wird Relais ausschalten if (strcmp(msg, "aus") == 0) { //Relais aus, LED aus (0 = an) digitalWrite(Ausgang, LOW); digitalWrite(PIN_LED, HIGH); Serial.print("Relais ausschalten \n"); } } //############### Main loop void loop() { if (!client.connected()) { reconnect(); } //Client.loop prüft, ob MQTT-Nachrichten eingehen client.loop(); } //##################### Setupmenu void setupmenu() { Serial.println("Enter Setup"); //;;;;; SSID-Eingabe Serial.print("SSID: "); ssid=String(""); while(true) { if (Serial.available()) { char c=Serial.read(); Serial.write(c); if (c==13) { break; } else { ssid=String(ssid+c); } yield(); } } Serial.println(); //;;;;; Passworteingabe Serial.print("PASS: ") ; pass=String(""); while(true) { if (Serial.available()) { char c=Serial.read(); Serial.write(c); if (c==13) { break; } else { pass=String(pass+c); } yield(); } } Serial.println(); //;;;;;;;Broker ip Serial.print("MQTT-Broker-IP: "); mqtt_broker=String(""); while(true) { if (Serial.available()) { char c=Serial.read(); Serial.write(c); if (c==13) { break; } else { mqtt_broker=String(mqtt_broker+c); } yield(); } } Serial.println(); //;;;;;;;;Topic Eingabe Serial.print("Topic: "); topic=String(""); while(true) { if (Serial.available()) { char c=Serial.read(); Serial.write(c); if (c==13) { break; } else { topic=String(topic+c); } yield(); } } Serial.println(); //;;;;;;;; Chipid Serial.print("ChipID: "); chipid=String(""); while(true) { if (Serial.available()) { char c=Serial.read(); Serial.write(c); if (c==13) { break; } else { chipid=String(chipid+c); } yield(); } } Serial.println(); //;;; Schreiben ins EEProm vorbereiten ssid.trim(); pass.trim(); mqtt_broker.trim(); topic.trim(); chipid.trim(); writePROM(); Serial.println("Saved to EEPROM"); } //########################## void connectWIFI() { readPROM(); Serial.println("") ; Serial.print("Connecting ") ; Serial.println(ssid) ; //Serial.println(pass) ; ssid.toCharArray(ssidbuffer,25); pass.toCharArray(passbuffer,25); WiFi.begin(ssidbuffer,passbuffer ); while (WiFi.status()!=WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); }; //########################## void readPROM() { EEPROM.begin(512); EEPROM.get(0,ssidbuffer); ssid=String(ssidbuffer); EEPROM.get(25,passbuffer); pass=String(passbuffer); EEPROM.get(50,brokerbuffer); mqtt_broker=String(brokerbuffer); EEPROM.get(75,topicbuffer); topic=String(topicbuffer); EEPROM.get(125,chipidbuffer); chipid=String(chipidbuffer); Serial.println("### read from EEPROM ###"); Serial.println("SSID: "+ssid); Serial.println("Password: ******"); Serial.println("MQTT-Broker-IP: "+mqtt_broker); Serial.println("Topic: "+topic); Serial.println("Chip-MQTT-unique-ID: "+chipid); Serial.println("###"); EEPROM.commit(); EEPROM.end(); }; //############################# void writePROM() { EEPROM.begin(512); strncpy(ssidbuffer,ssid.c_str(),25); EEPROM.put(0,ssidbuffer); strncpy(passbuffer,pass.c_str(),25); EEPROM.put(25,passbuffer); strncpy(brokerbuffer,mqtt_broker.c_str(),25); EEPROM.put(50,brokerbuffer); strncpy(topicbuffer,topic.c_str(),25); EEPROM.put(75,topicbuffer); strncpy(chipidbuffer,chipid.c_str(),25); EEPROM.put(125,chipidbuffer); EEPROM.commit(); EEPROM.end(); };