Skip to content

Instantly share code, notes, and snippets.

@dewomser
Created January 13, 2022 10:29
Show Gist options
  • Save dewomser/15556b41ea5932ddc540bb37b7264cc2 to your computer and use it in GitHub Desktop.
Save dewomser/15556b41ea5932ddc540bb37b7264cc2 to your computer and use it in GitHub Desktop.
Beim Ausatmen wird die LED rot sonst blau.
/*
This example reads audio data from the on-board PDM microphones, and prints
out the samples to the Serial console. The Serial Plotter built into the
Arduino IDE can be used to plot the audio data (Tools -> Serial Plotter)
Circuit:
- Arduino Nano 33 BLE board, or
- Arduino Nano RP2040 Connect, or
- Arduino Portenta H7 board plus Portenta Vision Shield
This example code is in the public domain.
*/
#include <WiFiNINA.h>
#include <PDM.h>
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 16000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(LEDB, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(LEDB, HIGH);
Serial.begin(9600);
//while (!Serial);
// Configure the data receive callback
PDM.onReceive(onPDMdata);
// Optionally set the gain
// Defaults to 20 on the BLE Sense and 24 on the Portenta Vision Shield
// PDM.setGain(30);
// Initialize PDM with:
// - one channel (mono mode)
// - a 16 kHz sample rate for the Arduino Nano 33 BLE Sense
// - a 32 kHz or 64 kHz sample rate for the Arduino Portenta Vision Shield
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop() {
// Wait for samples to be read
if (samplesRead) {
// Print samples to the serial monitor or plotter
for (int i = 0; i < samplesRead; i++) {
if(channels == 2) {
Serial.print("L:");
Serial.print(sampleBuffer[i]);
Serial.print(" R:");
i++;
}
Serial.println(sampleBuffer[i]);
//digitalWrite(LED_BUILTIN, HIGH);
//digitalWrite(LEDB, HIGH);
if (sampleBuffer[i] > 350 || sampleBuffer[i] < -350) {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(LEDB,LOW);
delay(250);
}
else {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(LEDB, HIGH);
}
}
// Clear the read count
samplesRead = 0;
}
}
/**
* Callback function to process the data from the PDM microphone.
* NOTE: This callback is executed as part of an ISR.
* Therefore using `Serial` to print messages inside this function isn't supported.
* */
void onPDMdata() {
// Query the number of available bytes
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
@dewomser
Copy link
Author

  1. commit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment