mirror of
https://gitlab.com/wirelos/sprocket-plugin-gpio.git
synced 2025-12-14 13:26:48 +01:00
audio plugin
This commit is contained in:
@@ -25,6 +25,16 @@ src_filter = +<*> -<examples/> +<examples/analog/> -<inputs/> +<inputs/analog>
|
|||||||
lib_deps = ${common.lib_deps}
|
lib_deps = ${common.lib_deps}
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
Ai Esp32 Rotary Encoder
|
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 = +<*> -<examples/> +<examples/audio/> -<inputs/> +<inputs/audio>
|
||||||
|
lib_deps = ${common.lib_deps}
|
||||||
|
lib_ignore =
|
||||||
|
|
||||||
[env:analog_esp32]
|
[env:analog_esp32]
|
||||||
platform = espressif32
|
platform = espressif32
|
||||||
|
|||||||
20
src/examples/audio/config.h
Normal file
20
src/examples/audio/config.h
Normal file
@@ -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
|
||||||
22
src/examples/audio/main.cpp
Normal file
22
src/examples/audio/main.cpp
Normal file
@@ -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();
|
||||||
|
}
|
||||||
41
src/inputs/audio/AudioInputPlugin.cpp
Normal file
41
src/inputs/audio/AudioInputPlugin.cpp
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
39
src/inputs/audio/AudioInputPlugin.h
Normal file
39
src/inputs/audio/AudioInputPlugin.h
Normal file
@@ -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 <functional>
|
||||||
|
#include <vector>
|
||||||
|
#include <FS.h>
|
||||||
|
#include <TaskSchedulerDeclarations.h>
|
||||||
|
#include <Plugin.h>
|
||||||
|
#include <utils/print.h>
|
||||||
|
#include <utils/misc.h>
|
||||||
|
#include <GpioConfig.h>
|
||||||
|
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user