audio plugin

This commit is contained in:
2018-11-29 14:24:50 +01:00
parent 2cff616fab
commit ca01a947dc
5 changed files with 132 additions and 0 deletions

View File

@@ -26,6 +26,16 @@ 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
board = esp32dev

View 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

View 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();
}

View 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;
}
}

View 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