diff --git a/platformio.ini b/platformio.ini
index d076722..2a49722 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -25,6 +25,16 @@ src_filter = +<*> - + - +
lib_deps = ${common.lib_deps}
lib_ignore =
Ai Esp32 Rotary Encoder
+
+[env:audio]
+platform = ${common.platform}
+board = ${common.board}
+framework = ${common.framework}
+upload_speed = ${common.upload_speed}
+monitor_baud = ${common.monitor_baud}
+src_filter = +<*> - + - +
+lib_deps = ${common.lib_deps}
+lib_ignore =
[env:analog_esp32]
platform = espressif32
diff --git a/src/examples/audio/config.h b/src/examples/audio/config.h
new file mode 100644
index 0000000..a590ce7
--- /dev/null
+++ b/src/examples/audio/config.h
@@ -0,0 +1,20 @@
+#ifndef __DEVICE_CONFIG__
+#define __DEVICE_CONFIG__
+
+// Scheduler
+#define _TASK_SLEEP_ON_IDLE_RUN
+#define _TASK_STD_FUNCTION
+#define _TASK_PRIORITY
+
+// Chip
+#define SPROCKET_TYPE "SPROCKET"
+#define SERIAL_BAUD_RATE 115200
+#define STARTUP_DELAY 1000
+
+// audio
+#define AUDIO_THRESHOLD 0
+#define AUDIO_POLL_INTERVAL 200
+#define AUDIO_PIN A0
+#define AUDIO_TOPIC "audio/peak"
+
+#endif
\ No newline at end of file
diff --git a/src/examples/audio/main.cpp b/src/examples/audio/main.cpp
new file mode 100644
index 0000000..863ff36
--- /dev/null
+++ b/src/examples/audio/main.cpp
@@ -0,0 +1,22 @@
+#include "config.h"
+#include "Sprocket.h"
+#include "inputs/audio/AudioInputPlugin.h"
+
+Sprocket *sprocket;
+
+void setup()
+{
+ sprocket = new Sprocket({STARTUP_DELAY, SERIAL_BAUD_RATE});
+ sprocket->addPlugin(
+ new AudioInputPlugin({AUDIO_PIN, AUDIO_THRESHOLD, AUDIO_POLL_INTERVAL, AUDIO_TOPIC}));
+ sprocket->subscribe(AUDIO_TOPIC, bind([](String val) {
+ PRINT_MSG(Serial, "AUDIO", val.c_str());
+ }, _1));
+ sprocket->activate();
+}
+
+void loop()
+{
+ sprocket->loop();
+ yield();
+}
\ No newline at end of file
diff --git a/src/inputs/audio/AudioInputPlugin.cpp b/src/inputs/audio/AudioInputPlugin.cpp
new file mode 100644
index 0000000..73d921b
--- /dev/null
+++ b/src/inputs/audio/AudioInputPlugin.cpp
@@ -0,0 +1,41 @@
+#include "AudioInputPlugin.h"
+
+AudioInputPlugin::AudioInputPlugin(GpioConfig cfg){
+ config = cfg;
+}
+void AudioInputPlugin::activate(Scheduler *userScheduler)
+{
+ // add update task
+ inputTask.set(TASK_MILLISECOND * config.updateInterval, TASK_FOREVER, std::bind(&AudioInputPlugin::checkInput, this));
+ userScheduler->addTask(inputTask);
+ inputTask.enable();
+
+ // add dummy subscription
+ subscribe(config.topic, [](String msg){});
+
+ PRINT_MSG(Serial, "PLUGIN", "AudioInputPlugin activated");
+}
+
+void AudioInputPlugin::checkInput()
+{
+ startMillis= millis();
+ peakToPeak = 0;
+ signalMax = 0;
+ signalMin = 1024;
+ // collect data
+ while (millis() - startMillis < sampleWindow) {
+ sample = analogRead(A0);
+ if (sample < 1024) {
+ signalMax = sample > signalMax ? sample : signalMax;
+ signalMin = sample < signalMin ? sample : signalMin;
+
+ }
+ }
+ peakToPeak = signalMax - signalMin;
+
+ int val = mapValueToRange(peakToPeak, 0, 1024, 32, 255);
+ if(val != lastVal){
+ publish(config.topic, String(val));
+ lastVal = val;
+ }
+}
diff --git a/src/inputs/audio/AudioInputPlugin.h b/src/inputs/audio/AudioInputPlugin.h
new file mode 100644
index 0000000..ff3a3f5
--- /dev/null
+++ b/src/inputs/audio/AudioInputPlugin.h
@@ -0,0 +1,39 @@
+#ifndef __AUDIO_INPUT__PLUGIN_H__
+#define __AUDIO_INPUT__PLUGIN_H__
+
+#define _TASK_SLEEP_ON_IDLE_RUN
+#define _TASK_STD_FUNCTION
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace std;
+using namespace std::placeholders;
+
+class AudioInputPlugin : public Plugin
+{
+ private:
+ const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
+ unsigned int sample;
+ unsigned long startMillis = millis();
+ unsigned int peakToPeak = 0;
+ unsigned int signalMax = 0;
+ unsigned int signalMin = 1024;
+ unsigned int lastVal = 0;
+
+ public:
+ Task inputTask;
+ int currentVal = 0;
+ GpioConfig config;
+ AudioInputPlugin(GpioConfig cfg);
+ void activate(Scheduler *userScheduler);
+ void checkInput();
+};
+
+#endif