const int peprepeats = 2; // pep repeats per session
const int peplength = 4000; // pep length in milliseconds
const int pepminpress = 18; // Mbar
const int pepmaxpress = 21; // Mbar
const int peprest = 30; //rest time between reps in seconds
const int acarepeats = 2; // acapella repeats per session
const int acalength = 4000; // acapella length in milliseconds
const int acaminpress = 10; // Mbar
const int acamaxpress = 13; // Mbar
const int acarest = 30; //rest time between reps in seconds
const int pover = 0; //parental setting, 0=off / 1=on
const int cab = 85; // Calibration value
const int greenled = 3;
const int redled = 6;
const int blueled = 9;
const int button1 = 4;
const int button2 = 7;
const int button3 = 8;
int buttonstate1=0;
int buttonstate2=0;
int buttonstate3=0;
int phrepeats=0;
int phlength=0;
int phminpress=0;
int phmaxpress=0;
int phrest=0;
int pres3 = 0;
int pepcount = 0;
int Rep = 0;
int menu = 0;
#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
BME280 mySensor;
void setup() {
mySensor.settings.commInterface = I2C_MODE;
mySensor.settings.I2CAddress = 0x76;
mySensor.settings.runMode = 3;
mySensor.settings.tStandby = 0;
mySensor.settings.filter = 0;
mySensor.settings.tempOverSample = 1;
mySensor.settings.pressOverSample = 1;
mySensor.settings.humidOverSample = 1;
Serial.begin(57600);
Serial.print("Program Started\n");
Serial.print("Starting BME280... result of .begin(): 0x");
Serial.println(mySensor.begin(), HEX);
delay(10);
Serial.print("Displaying ID, reset and ctrl regs\n");
Serial.print("ID(0xD0): 0x");
Serial.println(mySensor.readRegister(BME280_CHIP_ID_REG), HEX);
Serial.print("Reset register(0xE0): 0x");
Serial.println(mySensor.readRegister(BME280_RST_REG), HEX);
Serial.print("ctrl_meas(0xF4): 0x");
Serial.println(mySensor.readRegister(BME280_CTRL_MEAS_REG), HEX);
Serial.print("ctrl_hum(0xF2): 0x");
Serial.println(mySensor.readRegister(BME280_CTRL_HUMIDITY_REG), HEX);
Serial.print("\n\n");
Serial.print("Displaying all regs\n");
uint8_t memCounter = 0x80;
uint8_t tempReadData;
for(int rowi = 8; rowi < 16; rowi++ ){
Serial.print("0x");
Serial.print(rowi, HEX);
Serial.print("0:");
for(int coli = 0; coli < 16; coli++ ){
tempReadData = mySensor.readRegister(memCounter);
Serial.print((tempReadData >> 4) & 0x0F, HEX);
Serial.print(tempReadData & 0x0F, HEX);
Serial.print(" ");
memCounter++;}
Serial.print("\n");}
Serial.print("\n\n");
Serial.print("Displaying concatenated calibration words\n");
Serial.print("dig_T1, uint16: ");
Serial.println(mySensor.calibration.dig_T1);
Serial.print("dig_T2, int16: ");
Serial.println(mySensor.calibration.dig_T2);
Serial.print("dig_T3, int16: ");
Serial.println(mySensor.calibration.dig_T3);
Serial.print("dig_P1, uint16: ");
Serial.println(mySensor.calibration.dig_P1);
Serial.print("dig_P2, int16: ");
Serial.println(mySensor.calibration.dig_P2);
Serial.print("dig_P3, int16: ");
Serial.println(mySensor.calibration.dig_P3);
Serial.print("dig_P4, int16: ");
Serial.println(mySensor.calibration.dig_P4);
Serial.print("dig_P5, int16: ");
Serial.println(mySensor.calibration.dig_P5);
Serial.print("dig_P6, int16: ");
Serial.println(mySensor.calibration.dig_P6);
Serial.print("dig_P7, int16: ");
Serial.println(mySensor.calibration.dig_P7);
Serial.print("dig_P8, int16: ");
Serial.println(mySensor.calibration.dig_P8);
Serial.print("dig_P9, int16: ");
Serial.println(mySensor.calibration.dig_P9);
Serial.print("dig_H1, uint8: ");
Serial.println(mySensor.calibration.dig_H1);
Serial.print("dig_H2, int16: ");
Serial.println(mySensor.calibration.dig_H2);
Serial.print("dig_H3, uint8: ");
Serial.println(mySensor.calibration.dig_H3);
Serial.print("dig_H4, int16: ");
Serial.println(mySensor.calibration.dig_H4);
Serial.print("dig_H5, int16: ");
Serial.println(mySensor.calibration.dig_H5);
Serial.print("dig_H6, uint8: ");
Serial.println(mySensor.calibration.dig_H6);
pinMode(greenled, OUTPUT);
pinMode(redled, OUTPUT);
pinMode(blueled, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop() {
start:
if (menu==0){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(12,6);
display.println("Kule Go");
display.setTextSize(1);
display.setCursor(80,20);
display.println("Rv 2");
display.display();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.stopscroll();
display.clearDisplay();
display.setCursor(0,25);
display.println(" PEP or Acapella");
display.display();
menu = 1;}
digitalWrite(redled, LOW);
digitalWrite(blueled,LOW);
digitalWrite(greenled,LOW);
digitalWrite(button1,LOW);
digitalWrite(button3,LOW);
delay(50);
buttonstate1=digitalRead(button1);
buttonstate3=digitalRead(button3);
if(buttonstate1==HIGH){
//PEP select
phrepeats=peprepeats;
phlength=peplength;
phminpress=pepminpress;
phmaxpress=pepmaxpress;
phrest=peprest;
goto physio;}
if(buttonstate3==HIGH){
//Aca Select
phrepeats=acarepeats;
phlength=acalength;
phminpress=acaminpress;
phmaxpress=acamaxpress;
phrest=acarest;
goto physio;}
goto start;
physio:
for (int Rep = 1; Rep < (phrepeats +1 ); Rep++){
int pres1 = ((uint32_t)mySensor.readFloatPressure()/cab); //Reference pressure
int phcount = 0;
while(phcount < phlength){
int pres2 = ((uint32_t)mySensor.readFloatPressure()/cab); //input pressure
int pres3 = (pres2 - pres1);
if (pres3<0){pres3=0;}
if (pres3>=phminpress && pres3 <= phmaxpress){
digitalWrite(redled, LOW);
digitalWrite(greenled, LOW);
analogWrite(blueled, 2+20);
delay(50);
phcount = phcount +85;
}
if (pres3 > phmaxpress) {
analogWrite(redled, 5+pres3*2);
digitalWrite(greenled, LOW);
digitalWrite(blueled,LOW);
delay(50);
phcount = phcount +85;
}
if (pres3 < phminpress) {
analogWrite(greenled, 1+pres3/4);
digitalWrite(redled, LOW);
digitalWrite(blueled,LOW);}
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.print("Rep = ");
display.print(Rep);
display.print(" of ");
display.print(phrepeats);
display.print(" READY");
display.setCursor(0,8);
display.print("Target = ");
display.print(phminpress);
display.print(" Mb = ");
display.print(pres3);
display.setCursor(0,16);
display.print("Pep Time = ");
display.print(phcount/10);
display.print(" of ");
display.print(phlength/10);
display.setCursor(0,24);
display.print("Pressure = ");
if (pres3<phminpress){display.print("Low");}
if (pres3>=phminpress && pres3 <= phmaxpress){display.print("Good");}
if (pres3>phmaxpress){display.print("HIGH");}
display.display();
}
digitalWrite(redled, LOW);
digitalWrite(blueled,LOW);
digitalWrite(greenled,LOW);
tone(A0,1050,1000);
if ((Rep)<(phrepeats)) {
for (int t = phrest; t > 0; t--){
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.print("Rep ");
display.print(Rep);
display.print(" of ");
display.print(phrepeats);
display.print(" Complete");
display.setTextSize(2);
display.setCursor(20,16);
display.print("Rest ");
display.print(t);
display.display();
for (int g=4; g <= 35; g++){
analogWrite(9, g);
analogWrite(6, g);
delay(20);}
for (int g=35; g >= 4; g--){
analogWrite(9, g);
analogWrite(6, g);
delay(20);}
}}}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(15,0);
display.print("Physio");
display.setCursor(25,16);
display.print("Complete");
display.display();
delay(1000);
tone(A0,650,800);
delay(800);
tone(A0,850,800);
delay(800);
tone(A0,1050,800);
darthdad:
for (int g=4; g <= 35; g++){
analogWrite(9, g);
analogWrite(6, g);
delay(20);}
for (int g=35; g >= 4; g--){
analogWrite(9, g);
analogWrite(6, g);
delay(20);}
for (int g=4; g <= 35; g++){
analogWrite(3, g);
analogWrite(6, g);
delay(20);}
for (int g=35; g >= 4; g--){
analogWrite(3, g);
analogWrite(6, g);
delay(20);}
for (int g=4; g <= 35; g++){
analogWrite(3, g);
analogWrite(9, g);
delay(20);}
for (int g=35; g >= 4; g--){
analogWrite(3, g);
analogWrite(9, g);
delay(20);}
menu = 0;
if(pover == 1){goto darthdad;}}