Soll das Atmen durch die Maske erleichtern

Arduino nano RP 2040 und ein PC-Lüfter

Beatmungsgeraet mit Maske

Es funktioniert nicht weil der Ventilator viel zu wenig Druck erzeugt.

Die Idee war einen "Aduino RP 2040" (hat Mikrofon) zu benutzen um an der Lautstärke zu ekennen ob ein- oder ausgeatmet wird. Das hat einigermaßen funktioniert. Der Ventilator sollte beim Einatmen das Luftholen unterstützen.

Arduino Code

*
  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;




}

Gibts auch als Gist: