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
+