Group Coursework - Planning Process

The following are sample of codes that may lead up to the use in our group project. The idea is to create a health monitoring device that tracks the heart rate along with motion tracking to then use the bpm to output music. There were a few changed made for this project. 


Inputs - AD8232 & MPU92/65

Outputs - RGB & Serial Monitor


 4 minute video uploaded to Youtube (code snippets.. images and video of completed project followed up with how it was made)


MIDI

         

/*

  MIDI note player

 

  This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data.

  If this circuit is connected to a MIDI synth, it will play the notes

  F#-0 (0x1E) to F#-5 (0x5A) in sequence.

 

  The circuit:

  - digital in 1 connected to MIDI jack pin 5

  - MIDI jack pin 2 connected to ground

  - MIDI jack pin 4 connected to +5V through 220 ohm resistor

  - Attach a MIDI cable to the jack, then to a MIDI synth, and play music.

 

  created 13 Jun 2006

  modified 13 Aug 2012

  by Tom Igoe

 

  This example code is in the public domain.

 

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/Midi

*/

 

void setup() {

  // Set MIDI baud rate:

  Serial.begin(31250);

}

 

void loop() {

  // play notes from F#-0 (0x1E) to F#-5 (0x5A):

  for (int note = 0x1E; note < 0x5A; note++) {

    //Note on channel 1 (0x90), some note value (note), middle velocity (0x45):

    noteOn(0x90, note, 0x45);

    delay(100);

    //Note on channel 1 (0x90), some note value (note), silent velocity (0x00):

    noteOn(0x90, note, 0x00);

    delay(100);

  }

}

 

// plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that

// data values are less than 127:

void noteOn(int cmdint pitchint velocity) {

  Serial.write(cmd);

  Serial.write(pitch);

  Serial.write(velocity);

}


 

BLINK


/*

  Blink

 

  Turns an LED on for one second, then off for one second, repeatedly.

 

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO

  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to

  the correct LED pin independent of which board is used.

  If you want to know what pin the on-board LED is connected to on your Arduino

  model, check the Technical Specs of your board at:

  https://www.arduino.cc/en/Main/Products

 

  modified 8 May 2014

  by Scott Fitzgerald

  modified 2 Sep 2016

  by Arturo Guadalupi

  modified 8 Sep 2016

  by Colby Newman

 

  This example code is in the public domain.

 

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/Blink

*/

 

// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin LED_BUILTIN as an output.

  pinMode(LED_BUILTIN, OUTPUT);

}

 

// the loop function runs over and over again forever

void loop() {

  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)

  delay(1000);                      // wait for a second

  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW

  delay(1000);                      // wait for a second

}

 

 

 

AnalogReadSerial


/*

  AnalogReadSerial

 

  Reads an analog input on pin 0, prints the result to the Serial Monitor.

  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).

  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

 

  This example code is in the public domain.

 

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/AnalogReadSerial

*/

 

// the setup routine runs once when you press reset:

void setup() {

  // initialize serial communication at 9600 bits per second:

  Serial.begin(9600);

}

 

// the loop routine runs over and over again forever:

void loop() {

  // read the input on analog pin 0:

  int sensorValue = analogRead(A0);

  // print out the value you read:

  Serial.println(sensorValue);

  delay(1);  // delay in between reads for stability

}


 

Software Serial


#include <ADXL345.h>

 

/*

  Software serial multiple serial test

 

 Receives from the hardware serial, sends to software serial.

 Receives from software serial, sends to hardware serial.

 

 The circuit:

 * RX is digital pin 10 (connect to TX of other device)

 * TX is digital pin 11 (connect to RX of other device)

 

 Note:

 Not all pins on the Mega and Mega 2560 support change interrupts,

 so only the following can be used for RX:

 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 

 Not all pins on the Leonardo and Micro support change interrupts,

 so only the following can be used for RX:

 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 

 created back in the mists of time

 modified 25 May 2012

 by Tom Igoe

 based on Mikal Hart's example

 

 This example code is in the public domain.

 

 */

#include <SoftwareSerial.h>

 

SoftwareSerial mySerial(1011); // RX, TX

 

void setup() {

  // Open serial communications and wait for port to open:

  Serial.begin(57600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

 

  Serial.println("Goodnight moon!");

 

  // set the data rate for the SoftwareSerial port

  mySerial.begin(4800);

  mySerial.println("Hello, world?");

}

 

void loop() { // run over and over

  if (mySerial.available()) {

    Serial.write(mySerial.read());

  }

  if (Serial.available()) {

    mySerial.write(Serial.read());

  }

}


MPU9250


https://components101.com/sensors/MPU9250-9-dof-mems-sensor-module-datasheet-pinout-features-working

https://invensense.tdk.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf



#include <MPU9250_asukiaaa.h>

 

#ifdef _ESP32_HAL_I2C_H_

#define SDA_PIN 21

#define SCL_PIN 22

#endif

 

MPU9250_asukiaaa mySensor;

float aX, aY, aZ, aSqrt, gX, gY, gZ, mDirection, mX, mY, mZ;

 

void setup() {

  Serial.begin(115200);

  while(!Serial);

  Serial.println("started");

 

#ifdef _ESP32_HAL_I2C_H_ // For ESP32

  Wire.begin(SDA_PINSCL_PIN);

  mySensor.setWire(&Wire);

#endif

 

  mySensor.beginAccel();

  mySensor.beginGyro();

  mySensor.beginMag();

 

  // You can set your own offset for mag values

  // mySensor.magXOffset = -50;

  // mySensor.magYOffset = -55;

  // mySensor.magZOffset = -10;

}

 

void loop() {

  uint8_t sensorId;

  int result;

 

  result = mySensor.readId(&sensorId);

  if (result == 0) {

    Serial.println("sensorId: " + String(sensorId));

  } else {

    Serial.println("Cannot read sensorId " + String(result));

  }

 

  result = mySensor.accelUpdate();

  if (result == 0) {

    aX = mySensor.accelX();

    aY = mySensor.accelY();

    aZ = mySensor.accelZ();

    aSqrt = mySensor.accelSqrt();

    Serial.println("accelX: " + String(aX));

    Serial.println("accelY: " + String(aY));

    Serial.println("accelZ: " + String(aZ));

    Serial.println("accelSqrt: " + String(aSqrt));

  } else {

    Serial.println("Cannod read accel values " + String(result));

  }

 

  result = mySensor.gyroUpdate();

  if (result == 0) {

    gX = mySensor.gyroX();

    gY = mySensor.gyroY();

    gZ = mySensor.gyroZ();

    Serial.println("gyroX: " + String(gX));

    Serial.println("gyroY: " + String(gY));

    Serial.println("gyroZ: " + String(gZ));

  } else {

    Serial.println("Cannot read gyro values " + String(result));

  }

 

  result = mySensor.magUpdate();

  if (result != 0) {

    Serial.println("cannot read mag so call begin again");

    mySensor.beginMag();

    result = mySensor.magUpdate();

  }

  if (result == 0) {

    mX = mySensor.magX();

    mY = mySensor.magY();

    mZ = mySensor.magZ();

    mDirection = mySensor.magHorizDirection();

    Serial.println("magX: " + String(mX));

    Serial.println("maxY: " + String(mY));

    Serial.println("magZ: " + String(mZ));

    Serial.println("horizontal direction: " + String(mDirection));

  } else {

    Serial.println("Cannot read mag values " + String(result));

  }

 

  Serial.println("at " + String(millis()) + "ms");

  Serial.println(""); // Add an empty line

  delay(500);

}


AD8232


https://components101.com/modules/ad8232-ecg-module

https://learn.sparkfun.com/tutorials/ad8232-heart-rate-monitor-hookup-guide?_ga=2.22545784.216667294.1711802060-1240253867.1711802060

https://github.com/sparkfun/AD8232_Heart_Rate_Monitor/blob/master/Software/Heart_Rate_Display_Arduino/Heart_Rate_Display_Arduino.ino

https://microcontrollerslab.com/ad8232-ecg-module-pinout-interfacing-with-arduino-applications-features/

 

/******************************************************************************

Heart_Rate_Display.ino

Demo Program for AD8232 Heart Rate sensor.

Casey Kuhns @ SparkFun Electronics

6/27/2014

https://github.com/sparkfun/AD8232_Heart_Rate_Monitor

 

The AD8232 Heart Rate sensor is a low cost EKG/ECG sensor.  This example shows

how to create an ECG with real time display.  The display is using Processing.

This sketch is based heavily on the Graphing Tutorial provided in the Arduino

IDE. http://www.arduino.cc/en/Tutorial/Graph

 

Resources:

This program requires a Processing sketch to view the data in real time.

 

Development environment specifics:

  IDE: Arduino 1.0.5

  Hardware Platform: Arduino Pro 3.3V/8MHz

  AD8232 Heart Monitor Version: 1.0

 

This code is beerware. If you see me (or any other SparkFun employee) at the

local pub, and you've found our code helpful, please buy us a round!

 

Distributed as-is; no warranty is given.

******************************************************************************/

 

void setup() {

  // initialize the serial communication:

  Serial.begin(9600);

  pinMode(10, INPUT); // Setup for leads off detection LO +

  pinMode(11, INPUT); // Setup for leads off detection LO -

 

}

 

void loop() {

  

  if((digitalRead(10) == 1)||(digitalRead(11) == 1)){

    Serial.println('!');

  }

  else{

    // send the value of analog input 0:

      Serial.println(analogRead(A0));

  }

  //Wait for a bit to keep serial data from saturating

  delay(1);

}

 

To calculate and display the BPM of the user : 

 

unsigned long previousMillis = 0; // Variable to store the previous time

int bpm = 0; // Variable to store calculated beats per minute

 

void setup() {

  // initialize the serial communication:

  Serial.begin(9600);

  pinMode(3, INPUT); // Setup for leads off detection LO +

  pinMode(2, INPUT); // Setup for leads off detection LO -

}

 

void loop() {

  if ((digitalRead(3) == 1) || (digitalRead(2) == 1)) {

    Serial.println("Leads off!"); // Indicates leads are off

  } else {

    int sensorValue = analogRead(A0); // Read analog input from the sensor

    unsigned long currentMillis = millis(); // Get the current time

 

    // Calculate time elapsed since last beat

    unsigned long timeElapsed = currentMillis - previousMillis;

 

    // Check if a beat is detected

    if (sensorValue > 400) { // You may need to adjust this threshold based on sensor output

      if (timeElapsed > 200) { // Ignore beats that are too close together

        bpm = 60000 / timeElapsed; // Calculate beats per minute

        previousMillis = currentMillis; // Update previous time

        Serial.print("Heart rate: "); // Label to clarify the BPM value

        Serial.print(bpm); // Print calculated BPM

        Serial.println(" BPM"); // Add units to clarify the value

      }

    }

  }

  delay(100); // Wait for a short time to prevent saturating serial communication

}

 


----------------------------------------------------------------------------------------------

Comments

Popular posts from this blog

Multi-Sensor Health Monitor - Arduino Project

Copywriting using pixels

MIDI Instrument