วันอังคารที่ 27 กรกฎาคม พ.ศ. 2564

Algorithms of Sleeping Positions with Heart Rhythms Measurement :

 // Algorithms of Sleeping Positions with Heart Rhythms Measurement :

// Neramitr Chirakanphaisarn, Mit9bkk@gmail.com

// initial the up counter

#include <Wire.h>

#include <SD.h> 

#include <LiquidCrystal.h>      // used library of SLCD module with 20 digits x 4 lines

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //assigned the SLCD functions of 16 digits x 2 lines

#define IN_PIN0  0         // set Digital Pin0 for control file.close of SD card

#define IN_PIN9  9         // set Digital Pin9 for show SEX type of MALE / FEMALE into EXCEL OR CSV file

#define IN_PIN10  10       // set Digital Pin10 for closed file for head label in EXCEL or CSV file

const int chipSelect = 53;

//-------------open declare speed of motion------------------

#define IN_PIN    19      //set Switch input to Digital pin19  ADKR3 mega2560

#define DEBOUNCE  10      // Delay 10 mSec , That no port number !!

#define BUZZER  7      // Digital Pin7 is Buzzer beep using Alert! when 60 seconds

#define ANALOG_PIN  5      // Sweep the PATIENT AGE to Analog input A5 of ADK R3 mega2560

int analogValue = 5;     // Sweep the PATIENT AGE to Analog input A5 of ADK R3 mega2560


#define ANALOG_PIN4  4      // Sweep the PATIENT ID or No. to Analog input A4 of ADK R3 mega2560

int analogValue4 = 4 ;     // Sweep the PATIENT ID or No. to Analog input A4 of ADK R3 mega2560


int state_sw = HIGH;

int reading;

int previous = HIGH;


unsigned long atime= 0;

unsigned long rtc= 0;

unsigned char counter=0;

unsigned long temp[200];    // temp is very importance for count 0 to 200 , not 60 Seconds

unsigned long sub=0;

bool data_effect=true;

const int max_heartpluse_duty=20000;    //you can change 20000 meams 20 seconds. 

//---------closed declare of debounce switch-------------------

// Closed the initial the up counter

//  VARIABLES of Pulse sensor

int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0

int blinkPin = 13;                // pin to blink led at each beat

int fadePin = 6;         // default is pin5 ,pin to do fancy classy fading blink at each beat

int fadeRate = 0;                 // used to fade LED on with PWM on fadePin


// these variables are volatile because they are used during the interrupt service routine!

volatile int BPM;                   // used to hold the pulse rate

volatile int Signal;                // holds the incoming raw data

volatile int IBI = 600;             // holds the time between beats, must be seeded! 

volatile boolean Pulse = false;     // true when pulse wave is high, false when it's low

volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

// Closed the  VARIABLES of Pulse sensor

void setup(){

  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!

  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!

  Serial.begin(115200);             // we agree to talk fast!

  Serial.println("neramitr chirakarnphaisarn");

  //--------- setup of debounce switch-------------------  

  pinMode(IN_PIN, INPUT);     // set pinMode digitalPin 19  name's IN_PIN is INPUT of ADK R3

//---------closed setup of debounce switch------------------- 

    lcd.begin(16, 4);

       lcd.setCursor(0, 0); 

     lcd.print("Id:");

       lcd.setCursor(9, 0); 

       lcd.print("Neramitr.TU");

     lcd.setCursor(0, 1); 

     lcd.print("Age:");

       lcd.setCursor(7, 1); 

       lcd.print("Sx:");

         lcd.setCursor(14, 1); 

         lcd.print("Amp:");

           lcd.setCursor(4, 2); 

           lcd.print("Measure=   /   sec.");

       

             lcd.setCursor(4, 3); 

             lcd.print("Pulse rate=    bpm. ");    

      

// Show Id after calibration  

  analogValue4 = analogRead(ANALOG_PIN4);

  int id = analogValue4/20;        // adjust Patients Id , values 0 to 50 persons (1000/20= 50 persons)

   if(id <= 50)                // Fix LCD shows 0 to 50 persons only

    {

        lcd.setCursor(3, 0);

        lcd.print(id); 

    }


// Show Sex after calibration

pinMode (IN_PIN9, INPUT);         //set pinMode digitalPin 9     

 int sex = digitalRead(IN_PIN9);    // default (IN_PIN9) 

   if(sex == LOW )                  // Assigned move right stoke is HIGH 

   {

     lcd.setCursor(10, 1);        // show position (column,row)

     lcd.print("MA");    

   }

   else

    {

     lcd.setCursor(10, 1);        // show position (column,row)

     lcd.print("FE");           

    }   

// End of show sex after calibration


// Show Age after calibration   

analogValue = analogRead(ANALOG_PIN);

  int age = analogValue/10;

  if(age <= 99) 

   {

    lcd.setCursor(4, 1);                  // show position (column,row)

    lcd.print(age);

   }

    

// Setup BUZZER loud for Alert when 60 Seconds OK!

pinMode(BUZZER, OUTPUT);      // sets the digital pin as output

// Closed Set up Buzzer OK!

 interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS

}


void loop()

{


// Adjust the PATIENT ID , Identification by we setting ID value 0-50 Persons  

// Press "Big Circle YELLOW" Switch is LOW , But NO Press "BIG CIRCLE GREEN" Switch is HIGH


   pinMode (IN_PIN10, INPUT);             // Control the CLOSE or IGNORE file

   int closed1 = digitalRead(IN_PIN10);    

   if(closed1 == LOW )        // Press BIG YELLOW swith      

         {

            {

            analogValue4 = analogRead(ANALOG_PIN4);

            int id = analogValue4/20;                // adjust 0 to 50 persons (1000/20= 50 persons)

      

            if(id <= 50)                             // Fix LCD shows 0 to 50 persons only      

                {

                 lcd.setCursor(3, 0);                  // show position (column,row)

                 lcd.print("  ");                     

                     lcd.setCursor(3, 0);                  // show position (column,row)

                     lcd.print(id);   

                } 

            }            

         }

        

        else     // NO Press hold BIG GREEN swith 

         {

          // At here is closed = LOW then NOT save RIGHT to EXCEL                        

         }

// Closed the Adjust the PATIENT ID by we setting AGE value 0-10 persons  

// Set Set SEX type MALE / FEMALE for EXCEL or CSV file

   pinMode (IN_PIN10, INPUT);             // Control the CLOSE or IGNORE file

   //int closed1 = digitalRead(IN_PIN10);    

   if(closed1 == LOW )        // Press BIG YELLOW swith    

     {

       pinMode (IN_PIN9, INPUT);  // set pinMode digitalPin 9  name's IN_PIN6 is INPUT of ADK R3 for RIGHT_LEG or LEFT_LEG   

       int sex = digitalRead(IN_PIN9);    // default (IN_PIN9) get input HIGH or LOW for select RIGHT_LEG or LEFT_LEG to shows EXCEL, CSV file

         if(sex == LOW )                  // Assigned move right stoke is HIGH , Assigned move left stoke is LOW 

           {    

             {

              lcd.setCursor(10, 1);        // show position (column,row)

              lcd.print("MA");    

             }

           }

         else 

            {

             lcd.setCursor(10, 1);        // show position (column,row)

             lcd.print("FE");

            }

     }

// End of Set SEX type MALE / FEMALE for EXCEL or CSV file


// Adjust the PATIENT AGE by we setting AGE value 0-80 years  

   pinMode (IN_PIN10, INPUT);             // Control the CLOSE or IGNORE file

   int closed = digitalRead(IN_PIN10);    

   if(closed == LOW )        // NO press BIG GREEN swith      

         {

            {

            analogValue = analogRead(ANALOG_PIN);

            int age = analogValue/10;                // adjust age 0 to 100 years (1000/10= 100 persons) 

      

            if(age <= 99)                           // Fix LCD shows 0 to 99 persons only

                {

                 lcd.setCursor(4, 1);                  // show position (column,row)

                 lcd.print("  ");   

                   lcd.setCursor(4, 1);                  // show position (column,row)

                   lcd.print(age);    

                } 

            }            

         }

        

        else  // Press hold BIG GREEN swith 

         {

           // At here is closed = LOW then NOT save RIGHT to EXCEL                        

         }

// Closed the Adjust the PATIENT AGE by we setting AGE value 30-80 years


//----------- Start of Section of speed of motion Up counter -------------------------

    reading=digitalRead(IN_PIN);    //read from Digital pin0 or PD2, INT2 , PACE NUMBER  

  if (reading == LOW && previous == HIGH)   //check the button switch 

  {

    delay(DEBOUNCE);                    // delay 10 mSec

    if(digitalRead(IN_PIN) == HIGH)

      state_sw = !state_sw;

   

    interruptCounter();

  }

  previous = reading;

// ---------------End of Section of speed of motion ---------------------------


// Start of the SLCD shows the value of PACE in SECOND , Angle = ?


  lcd.setCursor(12, 2);        // shown Hearth Beat per cycle

  lcd.print(counter);


  lcd.setCursor(16, 2);        // shown realtime clock 0-60 Sec.

  lcd.print(rtc);            


// Adjust the Pulse Swing (minimum to maximum situation) by we set the maximum is 90 peak

     int pulseSwingValue = analogRead(pulsePin);

     int signal = pulseSwingValue/13;           // adjust beat from Pulse sensor directly, for proper 

     if(signal <= 90)                       // Fix LCD shows 0 to 90 persons only

       {

                

         lcd.setCursor(18, 1);         // Pulse signal has minimum to maximum peak

         lcd.print(signal); 

         delay(50); 

       //Serial.print (pulseSwing);  

       }         

// Closed Adjust the Pulse swing (minimum to maximum situation)

   sendDataToProcessing('S', Signal);     // send Processing the raw Pulse Sensor data

  if (QS == true){                       // Quantified Self flag is true when arduino finds a heartbeat

        fadeRate = 255;                  // Set 'fadeRate' Variable to 255 to fade LED with pulse

        sendDataToProcessing('B',BPM);   // send heart rate with a 'B' prefix

        sendDataToProcessing('Q',IBI);   // send time between beats with a 'Q' prefix

        QS = false;                      // reset the Quantified Self flag for next time    

     }

  

  ledFadeToBeat();

  

  //delay(1);                             //  take a break , default is 20

  

}


void ledFadeToBeat(){

    fadeRate -= 15;                         //  set LED fade value

    fadeRate = constrain(fadeRate,0,255);   //  keep LED fade value from going into negative numbers!

    analogWrite(fadePin,fadeRate);          //  fade LED

  }


void sendDataToProcessing(char symbol, int data ){

    Serial.print(symbol);                // symbol prefix tells Processing what type of data is coming

    Serial.println(data);                // the data to send culminating in a carriage return

  }


// the funtions are up counter only 

void interruptCounter()

{

  //check no move the goniometer then the monitor shows 0 second

  if(counter <= 0)

  {    

  }

  else

    atime = millis();

  rtc= atime/1000;

  temp[counter]=millis();


   

  switch (counter)

  {

    case(0):

    sub=temp[counter]-temp[60];

    break;

  default:

    sub=temp[counter]-temp[counter-1];

    break;

  }

  if(sub > max_heartpluse_duty)//set 20 seconds as max pluse duty

  {

    data_effect=0;//sign bit

    counter=0;

   // Serial.println("End of measuring,please reset for begin." );

    array_init();

  }


  if (rtc >= 60 and rtc <= 62)

  {            

    lcd.setCursor (16,3);   // show Pulse rate per minute

    lcd.print (counter); 

     //lcd.setCursor (12,1);

     //lcd.print (" bpm");

       digitalWrite(BUZZER,HIGH);

       delay(100);

       digitalWrite(BUZZER,LOW);

  }


  else if(rtc != 60 && data_effect)        // default is rtc!=60

    counter++   ;            //counter++;


  else 

  {

    counter = counter ;      //counter=0;

    data_effect=1;


  }

}

void array_init()

{

  for(unsigned char i=0; i!=60; ++i)

  {

    temp[i]=0;

  }

  

  temp[60]=millis();

  }






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

Interrupt:

volatile int rate[10];                    // array to hold last ten IBI values

volatile unsigned long sampleCounter = 0;          // used to determine pulse timing

volatile unsigned long lastBeatTime = 0;           // used to find IBI

volatile int P =512;                      // used to find peak in pulse wave, seeded

volatile int T = 512;                     // used to find trough in pulse wave, seeded

volatile int thresh = 512;                // used to find instant moment of heart beat, seeded

volatile int amp = 100;                   // used to hold amplitude of pulse waveform, seeded

volatile boolean firstBeat = true;        // used to seed rate array so we startup with reasonable BPM

volatile boolean secondBeat = false;      // used to seed rate array so we startup with reasonable BPM



void interruptSetup(){     

  // Initializes Timer2 to throw an interrupt every 2mS.

  TCCR2A = 0x02;     // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE

  TCCR2B = 0x06;     // DON'T FORCE COMPARE, 256 PRESCALER 

  OCR2A = 0X7C;      // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE

  TIMSK2 = 0x02;     // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A

  sei();             // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED      



// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. 

// Timer 2 makes sure that we take a reading every 2 miliseconds

ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124

  cli();                                      // disable interrupts while we do this

  Signal = analogRead(pulsePin);              // read the Pulse Sensor 

  sampleCounter += 2;                         // keep track of the time in mS with this variable

  int N = sampleCounter - lastBeatTime;       // monitor the time since the last beat to avoid noise


    //  find the peak and trough of the pulse wave

  if(Signal < thresh && N > (IBI/5)*3){       // avoid dichrotic noise by waiting 3/5 of last IBI

    if (Signal < T){                        // T is the trough

      T = Signal;                         // keep track of lowest point in pulse wave 

    }

  }


  if(Signal > thresh && Signal > P){          // thresh condition helps avoid noise

    P = Signal;                             // P is the peak

  }                                        // keep track of highest point in pulse wave


  //  NOW IT'S TIME TO LOOK FOR THE HEART BEAT

  // signal surges up in value every time there is a pulse

  if (N > 250){                                   // avoid high frequency noise

    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){        

      Pulse = true;                               // set the Pulse flag when we think there is a pulse

      digitalWrite(blinkPin,HIGH);                // turn on pin 13 LED

      IBI = sampleCounter - lastBeatTime;         // measure time between beats in mS

      lastBeatTime = sampleCounter;               // keep track of time for next pulse


      if(secondBeat){                        // if this is the second beat, if secondBeat == TRUE

        secondBeat = false;                  // clear secondBeat flag

        for(int i=0; i<=9; i++){             // seed the running total to get a realisitic BPM at startup

          rate[i] = IBI;                      

        }

      }


      if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE

        firstBeat = false;                   // clear firstBeat flag

        secondBeat = true;                   // set the second beat flag

        sei();                               // enable interrupts again

        return;                              // IBI value is unreliable so discard it

      }   



      // keep a running total of the last 10 IBI values

      word runningTotal = 0;                  // clear the runningTotal variable    


      for(int i=0; i<=8; i++){                // shift data in the rate array

        rate[i] = rate[i+1];                  // and drop the oldest IBI value 

        runningTotal += rate[i];              // add up the 9 oldest IBI values

      }


      rate[9] = IBI;                          // add the latest IBI to the rate array

      runningTotal += rate[9];                // add the latest IBI to runningTotal

      runningTotal /= 10;                     // average the last 10 IBI values 

      BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!

      QS = true;                              // set Quantified Self flag 

      // QS FLAG IS NOT CLEARED INSIDE THIS ISR

    }                       

  }


  if (Signal < thresh && Pulse == true){   // when the values are going down, the beat is over

    digitalWrite(blinkPin,LOW);            // turn off pin 13 LED

    Pulse = false;                         // reset the Pulse flag so we can do it again

    amp = P - T;                           // get amplitude of the pulse wave

    thresh = amp/2 + T;                    // set thresh at 50% of the amplitude

    P = thresh;                            // reset these for next time

    T = thresh;

  }


  if (N > 2500){                           // if 2.5 seconds go by without a beat

    thresh = 512;                          // set thresh default

    P = 512;                               // set P default

    T = 512;                               // set T default

    lastBeatTime = sampleCounter;          // bring the lastBeatTime up to date        

    firstBeat = true;                      // set these to avoid noise

    secondBeat = false;                    // when we get the heartbeat back

  }


  sei();                                   // enable interrupts when youre done!

}// end isr




Program coding of muscle stimulation and hot compress

/* Program coding of muscle stimulation and hot compress , Neramitr Chirakanphaisarn, mit9bkk@gmail.com */

// This program that shows charactor LCD size 20x4 (lcd12864)(20characters,4rows)

// The wiring diagram please see picture of Muscle Stimulation and Hot compress. This code is completed by wiring diagram sure! 

// Mr.Neramitr Chirakanphaisarn, mit9bkk@gmail.com

#include <SoftwareSerial.h>

#include <SD.h>              // used SD CARD module for reading and writing the log data

#include <LiquidCrystal.h>      // used library of SLCD module with 16 digits x 2 lines

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);      // assigned the SLCD functions of 20 digits x 4 lines


#define ANALOG_PIN4  4      // Sweep the Subject ID or No. to Analog input A4 of ADK R3 mega2560

int analogValue4 = 4 ;     // Sweep the Subject ID or No. to Analog input A4 of ADK R3 mega2560

#define ANALOG_PIN  5      // Sweep the Subject AGE to Analog input A5 of ADK R3 mega2560

int analogValue = 5;     // Sweep the Subject AGE to Analog input A5 of ADK R3 mega2560

#define ANALOG_PIN3  3      // Sweep the Stimulate time to Analog input A3 of ADK R3 mega2560

int analogValue3 = 3;     // Sweep the Stimulate time to Analog input A3 of ADK R3 mega2560

#define ANALOG_PIN0  0      // Sweep the Stimulate Level to Analog input A0 of ADK R3 mega2560

int analogValue0 = 0;     // Sweep the Stimulate Level to Analog input A0 of ADK R3 mega2560

#define ANALOG_PIN1  1      // Sweep the Frequency to Analog input A1 of ADK R3 mega2560

int analogValue1 = 1;     // Sweep the Frequency to Analog input A1 of ADK R3 mega2560

#define ANALOG_PIN2  2      // Sweep the T-PAD Temperature to Analog input A2 of ADK R3 mega2560

int analogValue2 = 2;     // Sweep the T-PAD Temperature to Analog input A2 of ADK R3 mega2560


#define IN_PIN0  0         // set Digital Pin0 (D0) for control file.close of SD card

#define IN_PIN6  6         // set Digital Pin6 (D6) to show KNEE or ABDOMINAL

#define ANALOG_PIN7  7     // Sweep angle (degree)of ADK R3 mega2560

int analogValue7 = 7 ;     // Decare the Sweep angle (degree)of ADK R3 mega2560

#define IN_PIN9  9         // set Digital Pin9 (D9) for show SEX type of MALE / FEMALE

#define IN_PIN10  10       // set Digital Pin10 (D10) for closed file for head label in EXCEL or CSV file


#define IN_PIN    19      //set Switch input to Digital pin19  ADKR3 mega2560

#define DEBOUNCE  10      // Delay 10 mSec , That no port number !!

#define OUT_PIN   8          //Output , Digital Pin8 (D8) or  ADK R3 mega2560

#define IN_SWEEP  7      // Sweep the ANGLE to Analog input A7 of ADK R3 mega2560

#define ANALOG_PIN6 6

#define BUZZER  7      // Digital Pin7 (D7) is Buzzer beep using Alert! when 60 seconds

#define ENDU_COUNT 8    // Digital Pin1 (D1) is Endurance Counter for Round Per Minute (RPM)

                          //We will use D8 for OUT_PIN and ENDU_COUNT are SURELY (Mitr)

const int chipSelect = 53;



int infrared;

int distance;

int state_sw = HIGH;

int reading;

int previous = HIGH;


unsigned long atime= 0;

unsigned long rtc= 0;

unsigned char counter=0;

unsigned long temp[200];      // default is temp[61];

unsigned long sub=0;

bool data_effect=true;

const int max_heartpluse_duty=20000;  

//---------closed declare of debounce switch-------------------




void setup()

  Serial.begin(9600);

  lcd.begin(20, 4);

 

  delay(100);


  while (!Serial) 

     {

       ; // wait for serial port to connect. 

     }


// Starting of datalogger section of setup mode ------------------------------

  pinMode(IN_PIN0,INPUT);   // set pinMode is INPUT value for file.close of SD card


  Serial.print("Initializing SD card...");

                    // make sure that the default chip select pin is set to

                    // output, even if you don't use it:

  pinMode(53, OUTPUT);

                    // see if the card is present and can be initialized:

  if (!SD.begin(chipSelect)) {

    Serial.println("Card failed, or not present");

                    // don't do anything more:

    return;

  }

  Serial.println("card initialized.");

  

// End of datalogger section of setup mode ------------------------------

 



 

  //---------open setup of debounce switch------------------- 

  pinMode(IN_PIN, INPUT);            // set pinMode digitalPin 19  name's IN_PIN is INPUT of ADK R3

  pinMode(OUT_PIN, OUTPUT);          // set pinMode digitalPin 8 name's OUT_PIN is OUTPUT of ADK R3

  digitalWrite(OUT_PIN, state_sw);   // set digitalWrite of digitalPin 3

  pinMode(IN_SWEEP,INPUT);            // set pinMode  analogPin 7 (A7) 

  //---------closed setup of debounce switch------------------- 


   lcd.setCursor(0,3);                  // show position (column,row)

   lcd.print("                   ");


 // Select the Muscle Stimulation and Hot compress

 pinMode (IN_PIN6, INPUT);  // set pinMode digitalPin 6   

 int test = digitalRead(IN_PIN6);    // default (IN_PIN6) get input HIGH or LOW to select 

   if(test == LOW )                  // Setting LOW 

   {                                    

    Serial.println("NERAMITR  TSE-TU2021");

    Serial.println("Id\tYear\tSex\tEndur\tTime\tStrng\tAngle");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.println("NERAMITR  TSE-TU2021");    //Show header of file

                  dataFile.print("ID");    

                  dataFile.print(",");  

                  dataFile.print("Age");    

                  dataFile.print(","); 

                  dataFile.print("Sex");    

                  dataFile.print(","); 

                  dataFile.print("Level");    

                  dataFile.print(",");

                  dataFile.print("Freq");    

                  dataFile.print(",");

                  dataFile.print("Temp");    

                  dataFile.print(",");

                  dataFile.println("Time");                   

              

                   int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA 

                   if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                   {

                   dataFile.close();

                   dataFile.println("NERAMITR  TSE-TU2021");    //Endurance rpm 

                   dataFile.print("ID");    

                   dataFile.print(",");  

                   dataFile.print("Age");    

                   dataFile.print(","); 

                   dataFile.print("Sex");    

                   dataFile.print(","); 

                   dataFile.print("Level");    

                   dataFile.print(",");

                   dataFile.print("Freq");    

                   dataFile.print(",");

                   dataFile.print("Temp");    

                   dataFile.print(",");

                   dataFile.println("Time");    

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD     

   } 

}





void loop()

{

 

 // Setting the Stimulate Muscle & Hot compress 2021 Published paper 

 

 pinMode (IN_PIN6, INPUT);  // set pinMode digitalPin 6  name's IN_PIN6 is INPUT of ADK R3    

 int test = digitalRead(IN_PIN6);    // default (IN_PIN6) get input HIGH or LOW to select 

   if(test == LOW )                  // Setting LOW 

   {                                    

    lcd.setCursor(0,0);

    lcd.print("NERAMITR  TSE-TU2021");

      lcd.setCursor(0,1);                  // show position (column,row)

                              // show ID  YR  LV  FREQ  TMP on LCD first

      lcd.print("Id Yr Sx Lv Fre Tmp"); 


            lcd.setCursor(15,3);                  // show unit of stimulate time (column,row)

            lcd.print("min"); 

  

   //delay(100);

   

   

 // Set Patients ID , We applied A4 ANALOG PIN4 and adjust age with Volume 10K ohms 

     analogValue4 = analogRead(ANALOG_PIN4);

     int id = analogValue4/10;        // adjust Patients Id , values 0 to 100 persons (1000/10= 100 persons)

  

     if(id <= 99)  {              // Fix LCD shows 0 to 50 persons only

        lcd.setCursor(0,2);                  // show position (column,row)

        lcd.print("  "); 

            lcd.setCursor(0, 2);                  // show position (column,row)

            lcd.print(id);  

            Serial.print(id);

            Serial.print("\t");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print(id);    

                  dataFile.print(",");


                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA 

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print(id);    

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD             

     }

  // Close the Set Patients ID , We applied A4 ANALOG PIN4

 

 

  // Set Patients AGE , We applied A5 ANALOG PIN5 and adjust age with Volume 10K ohm 

      analogValue = analogRead(ANALOG_PIN);

      int age = analogValue/10;

     

      if(age <= 99)   {

         lcd.setCursor(3, 2);                  // show position (column,row)

         lcd.print("  ");

             lcd.setCursor(3, 2);                  // show position (column,row)

             lcd.print(age); 

             Serial.print(age);

             Serial.print("\t");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print(age);    //Endurance rpm shows into SD Card

                  dataFile.print(",");

              //delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA or YELLOW SWITCH

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print(age);    

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD              

       }

  // Close, We applied A5 ANALOG PIN5

    

  

  //Set Set SEX type MALE / FEMALE for EXCEL or CSV file

    pinMode (IN_PIN9, INPUT);  // set pinMode digitalPin 9     

    int sex = digitalRead(IN_PIN9);    // default (IN_PIN9) get CSV file


    if(sex == LOW ) {                

      lcd.setCursor(6, 2);       

      lcd.print("MA");

      Serial.print("MA");

      Serial.print("\t"); 

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print("MA");    

                  dataFile.print(",");

              //delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print("MA");   

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD       

      }

      else {

             lcd.setCursor(6, 2);        // show position (column,row)

             lcd.print("FE");

             Serial.print("FE");

             Serial.print("\t");           

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print("FE");   

                  dataFile.print(",");

             // delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA 

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print("FE");    //Endurance rpm shows into SD Card

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD 

         }

         

  //End of Set SEX type MALE / FEMALE 



// Set Stimulation time or timer , We applied A3 ANALOG PIN3 and adjust Stimulate Level with Volume 10K ohms 

     analogValue3 = analogRead(ANALOG_PIN3);

     int timer = analogValue3/100;        // adjust Stimulation Level , values 0 to 10 (1000/100= 10 minutes)

  

     if(timer <= 10)  {              // Fix LCD shows 0 to 10 minutes  only

        lcd.setCursor(13,3);                

        lcd.print("  "); 

            lcd.setCursor(13, 3);                 

            lcd.print(timer); 

             int rtc = millis()/1150 ;

              if(timer == 1 && rtc == 60)

               {

                pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                digitalWrite(BUZZER,HIGH);

                delay(50);

                digitalWrite(BUZZER,LOW);

                digitalWrite(BUZZER,HIGH);

                delay(50);

                digitalWrite(BUZZER,LOW);           

               }

                if(timer == 2 && rtc == 120)

                 {

                pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                digitalWrite(BUZZER,HIGH);

                delay(50);

                digitalWrite(BUZZER,LOW);

                digitalWrite(BUZZER,HIGH);

                delay(50);

                digitalWrite(BUZZER,LOW);

                 }

                  if(timer == 3 && rtc == 180)

                   {

                    pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                    digitalWrite(BUZZER,HIGH);

                    delay(50);

                    digitalWrite(BUZZER,LOW);

                    digitalWrite(BUZZER,HIGH);

                    delay(50);

                    digitalWrite(BUZZER,LOW);

                   }

                    if(timer == 4 && rtc == 240)

                     {

                      pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                      digitalWrite(BUZZER,HIGH);

                      delay(50);

                      digitalWrite(BUZZER,LOW);

                      digitalWrite(BUZZER,HIGH);

                      delay(50);

                      digitalWrite(BUZZER,LOW);

                     }

                      if(timer == 5 && rtc == 300)

                       {

                        pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                        digitalWrite(BUZZER,HIGH);

                        delay(50);

                        digitalWrite(BUZZER,LOW);

                        digitalWrite(BUZZER,HIGH);

                        delay(50);

                        digitalWrite(BUZZER,LOW);

                       }

                        if(timer == 6 && rtc == 360)

                         {

                         pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                         digitalWrite(BUZZER,HIGH);

                         delay(50);

                         digitalWrite(BUZZER,LOW);

                         digitalWrite(BUZZER,HIGH);

                         delay(50);

                         digitalWrite(BUZZER,LOW);

                         }

                          if(timer == 7 && rtc == 420)

                           {

                            pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                            digitalWrite(BUZZER,HIGH);

                            delay(50);

                            digitalWrite(BUZZER,LOW);

                            digitalWrite(BUZZER,HIGH);

                            delay(50);

                            digitalWrite(BUZZER,LOW);

                           }

                            if(timer == 8 && rtc == 480)

                             {

                              pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                              digitalWrite(BUZZER,HIGH);

                              delay(50);

                              digitalWrite(BUZZER,LOW);

                              digitalWrite(BUZZER,HIGH);

                              delay(50);

                              digitalWrite(BUZZER,LOW);

                             }

                              if(timer == 9 && rtc == 540)

                               {

                                pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                                digitalWrite(BUZZER,HIGH);

                                delay(50);

                                digitalWrite(BUZZER,LOW);

                                digitalWrite(BUZZER,HIGH);

                                delay(50);

                                digitalWrite(BUZZER,LOW);

                               }

                                if(timer == 10 && rtc == 600)

                                 {

                                  pinMode(BUZZER, OUTPUT);      // sets the digital pin 7 as output

                                  digitalWrite(BUZZER,HIGH);

                                  delay(50);

                                  digitalWrite(BUZZER,LOW);

                                  digitalWrite(BUZZER,HIGH);

                                  delay(50);

                                  digitalWrite(BUZZER,LOW);

                                 }




             

            Serial.print(timer);

            Serial.print("\t");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print(timer);    

                  dataFile.print(",");

              //delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA or YELLOW SWITCH

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print(timer);   d

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD             

     }

  // Close the Stimulation time or timer , We applied A3 ANALOG PIN3 and adjust Stimulate Level with Volume 10K ohms




 // Set Stimulation Level or Vp , We applied A0 ANALOG PIN0 and adjust Stimulate Level with Volume 10K ohms 

     analogValue0 = analogRead(ANALOG_PIN0);

     int level = analogValue0/50;        // adjust Stimulation Level , values 0 to 10 (1000/50= 20 level)

  

     if(level <= 20)  {              // Fix LCD shows 0 to 20  only

        lcd.setCursor(9,2);                  // show position (column,row)

        lcd.print("  "); 

            lcd.setCursor(9, 2);                  // show position (column,row)

            lcd.print(level);  

            Serial.print(level);

            Serial.print("\t");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print(level);  

                  dataFile.print(",");

              //delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA or YELLOW SWITCH

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print(level);    //Endurance rpm shows into SD Card

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD             

     }

  // Close the Stimulation Level or Vp , We applied A0 ANALOG PIN0 and adjust Stimulate Level with Volume 10K ohms



 // Set Frequency or Fre , We applied A1 ANALOG PIN1 and adjust Frequency with Volume 10K ohms 

     analogValue1 = analogRead(ANALOG_PIN1);

     int fre = analogValue1/10;        // adjust Frequency, values 0 to 100  (1000/10= 100 )

  

     if(fre <= 100)  {              // Fix LCD shows 0 to 50  only

        lcd.setCursor(12,2);                  // show position (column,row)

        lcd.print("   "); 

            lcd.setCursor(12, 2);                  // show position (column,row)

            lcd.print(fre);  

            Serial.print(fre);

            Serial.print("\t");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print(fre);  

                  dataFile.print(",");

              //delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA or YELLOW SWITCH

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print(fre);    //Endurance rpm shows into SD Card

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD             

     }

  // Close the Frequency or Fre , We applied A1 ANALOG PIN1 and adjust Frequency with Volume 10K ohms





// Set T-PAD Temperature , We applied A2 ANALOG PIN2 and adjust Frequency with Volume 10K ohms 

     analogValue2 = analogRead(ANALOG_PIN2);

     int tmp = (analogValue2/12.5)+30;        // adjust T-PAD Temperature, values 30 to 80  (1000/12.5= 80 )

  

     if(tmp <= 80)  {              // Fix LCD shows 0 to 90  only

        lcd.setCursor(17,2);                  // show position (column,row)

        lcd.print("  "); 

            lcd.setCursor(17, 2);                  // show position (column,row)

            lcd.print(tmp);  

            Serial.println(tmp);

           // Serial.print("\t");

            // Start DATA LOGGER in LOOP for saving in CSV to SD CARD

              File dataFile = SD.open("k_muscle.csv", FILE_WRITE);  //limit "name" size = 8 characters

              if (dataFile >= 0)  // dataFile=1 has write , dataFile=0 has not file , limited 207 lines 

                {        

                  dataFile.print(tmp);    //Endurance rpm shows into SD Card

                  dataFile.print(",");

              //delay(50);              // Reduces speed rate 50 mSec

                  int reading = digitalRead(IN_PIN0);    // get input HIGH or LOW , it is mode of control RECORD DATA or YELLOW SWITCH

                  if(reading == LOW )                  // Press RED SW to small is LOW (0 volt) , Release to tall is HIGH (5 volts)

                  {

                    dataFile.close();

                      dataFile.print(tmp);    

                      dataFile.print(",");

                  }  

                  else {

                        Serial.println ("status_swith is HIGH you should a Press to LOW");

                        }

                }

                    else {

                            Serial.println("error opening k_muscle.csv");

                         } 

            // Closed the DATA LOGGER in LOOP for saving in CSV to SD CARD             

     }

  // Close the Hot compress / T-PAD Temperature , We applied A2 ANALOG PIN2 and adjust Frequency with Volume 10K ohms 



   }


  lcd.setCursor(0,3);                  // show unit of stimulate time (column,row)

  lcd.print("Time("); 

    lcd.setCursor(8,3);                  // show unit of stimulate time (column,row)

  lcd.print(")="); 

    int rtc = millis()/1150 ;

    lcd.setCursor(5, 3);

      lcd.print(rtc);          // print the number of seconds since reset:

        lcd.setCursor(12,3);        

        lcd.print(":"); 

  if(rtc == 60 )

    {

    lcd.setCursor(10, 3);

    lcd.print("1");

    }

     if(rtc == 120 )

      {

      lcd.setCursor(10, 3);

      lcd.print("2"); 

      }

       if(rtc == 180)

        {

         lcd.setCursor(10, 3);

         lcd.print("3"); 

        }

         if(rtc == 240)

          {

           lcd.setCursor(10, 3);

           lcd.print("4"); 

          }

           if(rtc == 300)

            {

             lcd.setCursor(10, 3);

             lcd.print("5"); 

            }

             if(rtc == 360)

              {

               lcd.setCursor(10, 3);

               lcd.print("6"); 

              }

               if(rtc == 840)

                {

                 lcd.setCursor(10, 3);

                 lcd.print("7"); 

                }

                 if(rtc == 480)

                  {

                   lcd.setCursor(10, 3);

                   lcd.print("8"); 

                  }

                   if(rtc == 540)

                    {

                     lcd.setCursor(10, 3);

                     lcd.print("9"); 

                    }

                    if(rtc == 600)

                     {

                      lcd.setCursor(10, 3);

                      lcd.print("10"); 

                     }

  else

  {

  } 

}

Engineering of Robotics Industry & Computer (ERIC) , 2008-2022

นาย เนรมิธ   จิรกาญจน์ไพศาล,  Add Line : Click here คลิ๊กตรงนี้   NERAMITR CHIRAKANPHAISARN, Curriculum vitae Research evidence areas :  -G...