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_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 = +<*> -<examples/> +<examples/audio/> -<inputs/> +<inputs/audio>
|
||||
lib_deps = ${common.lib_deps}
|
||||
lib_ignore =
|
||||
|
||||
[env:analog_esp32]
|
||||
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