diff --git a/OpenMQTTGateway.ino b/OpenMQTTGateway.ino index aa12659..e4de2b5 100644 --- a/OpenMQTTGateway.ino +++ b/OpenMQTTGateway.ino @@ -109,6 +109,9 @@ #ifdef ZsensorGPIOInput #include "config_GPIOInput.h" #endif +#ifdef ZsensorGPIOKeyCode + #include "config_GPIOKeyCode.h" +#endif // array to store previous received RFs, IRs codes and their timestamps #if defined(ESP8266) || defined(ESP32) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) #define MQTT_MAX_PACKET_SIZE 1024 @@ -381,7 +384,9 @@ void setup() #ifdef ZsensorGPIOInput setupGPIOInput(); #endif - + #ifdef ZsensorGPIOKeyCode + setupGPIOKeyCode(); + #endif trc(F("MQTT_MAX_PACKET_SIZE")); trc(MQTT_MAX_PACKET_SIZE); trc(F("Setup OpenMQTTGateway end")); @@ -630,6 +635,9 @@ void loop() #ifdef ZsensorGPIOInput MeasureGPIOInput(); #endif + #ifdef ZsensorGPIOKeyCode + MeasureGPIOKeyCode(); + #endif #ifdef ZsensorADC MeasureADC(); //Addon to measure the analog value of analog pin #endif @@ -770,6 +778,9 @@ void stateMeasures(){ #ifdef ZsensorGPIOInput modules = modules + ZsensorGPIOInput; #endif + #ifdef ZsensorGPIOKeyCode + modules = modules + ZsensorGPIOKeyCode; + #endif SYSdata["modules"] = modules; trc(modules); char JSONmessageBuffer[100]; diff --git a/ZsensorGPIOKeyCode.ino b/ZsensorGPIOKeyCode.ino new file mode 100644 index 0000000..43aa13e --- /dev/null +++ b/ZsensorGPIOKeyCode.ino @@ -0,0 +1,85 @@ +/* + OpenMQTTGateway Addon - ESP8266 or Arduino program for home automation + Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker + Send and receiving command by MQTT + + GPIO KeyCode derived from GPIO Input + + This reads up to 4 gpio with latch signal (gpio line) and combines the bits as KeyKode - can be connected + to EV1527 receiver. + + Copyright: (c)Grzegorz Rajtar + + This file is part of OpenMQTTGateway. + + OpenMQTTGateway is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + OpenMQTTGateway is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifdef ZsensorGPIOKeyCode + +unsigned long lastDebounceTime = 0; +int InputState = 0x0f; // Set to 3 so that it reads on startup +int lastInputState = 0x0f; +int lastLatchState = 0; + + +void setupGPIOKeyCode() { + pinMode(GPIOKeyCode_LATCH_PIN, INPUT_PULLUP); // + pinMode(GPIOKeyCode_D0_PIN, INPUT_PULLUP); // + pinMode(GPIOKeyCode_D1_PIN, INPUT_PULLUP); // + pinMode(GPIOKeyCode_D2_PIN, INPUT_PULLUP); // + //pinMode(GPIOKeyCode_D3_PIN, INPUT_PULLUP); // +} + +void MeasureGPIOKeyCode(){ + + int latch = digitalRead(GPIOKeyCode_LATCH_PIN); + + // check to see if you just pressed the button + // (i.e. the input went from LOW to HIGH), and you've waited long enough + // since the last press to ignore any noise: + + { + // whatever the reading is at, it's been there for longer than the debounce + // delay, so take it as the actual current state: + #if defined(ESP8266) || defined(ESP32) + yield(); + #endif + // if the Input state has changed: + if (latch > 0 && lastLatchState != latch) { + + int reading = digitalRead(GPIOKeyCode_D0_PIN) + | (digitalRead(GPIOKeyCode_D1_PIN) << 1) + | (digitalRead(GPIOKeyCode_D2_PIN) << 2); + //| digitalRead(GPIOKeyCode_D3_PIN) << 3; + + char hex[3]; + + InputState = reading; + sprintf(hex, "%02x", InputState); + hex[2] = 0; + Serial.printf("GPIOKeyCode %s\n", hex); + client.publish(subjectGPIOKeyCodetoMQTT,hex); + lastLatchState = latch; + } + + if (latch != lastLatchState) { + lastLatchState = latch; + Serial.printf("GPIOKeyCode latch %d\n", latch); + if (latch == 0) + client.publish(subjectGPIOKeyCodeStatetoMQTT, "done"); + } + + // save the reading. Next time through the loop, it'll be the lastInputState: + lastInputState = InputState; + } +} +#endif diff --git a/config_GPIOKeyCode.h b/config_GPIOKeyCode.h new file mode 100644 index 0000000..20b333f --- /dev/null +++ b/config_GPIOKeyCode.h @@ -0,0 +1,54 @@ +/* + OpenMQTTGateway - ESP8266 or Arduino program for home automation + + Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker + Send and receiving command by MQTT + + This files enables to set your parameter for the GPIOKeyCode multi input + + Copyright: (c)Grzegorz Rajtar + + This file is part of OpenMQTTGateway. + + OpenMQTTGateway is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenMQTTGateway is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/*----------------------------USER PARAMETERS-----------------------------*/ +/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/ +#define subjectGPIOKeyCodetoMQTT Base_Topic Gateway_Name "/keycode" +#define subjectGPIOKeyCodeStatetoMQTT subjectGPIOKeyCodetoMQTT "/status" +#define GPIOKeyCodeDebounceDelay 60 //debounce time, increase if there are issues + +/*-------------------PIN DEFINITIONS----------------------*/ +#if defined(ESP8266) || defined(ESP32) + +#ifndef GPIOKeyCode_LATCH_PIN + #define GPIOKeyCode_LATCH_PIN 12 //D6 +#endif +#ifndef GPIOKeyCode_D0_PIN + #define GPIOKeyCode_D0_PIN 14 //D5 +#endif +#ifndef GPIOKeyCode_D1_PIN + #define GPIOKeyCode_D1_PIN 5 //D1 +#endif +#ifndef GPIOKeyCode_D2_PIN + #define GPIOKeyCode_D2_PIN 13 //D7 +#endif +#ifndef GPIOKeyCode_D3_PIN + #define GPIOKeyCode_D3_PIN XX //?? +#endif +#else +// must define !!! +#endif +