cherrymax 发表于 2016-1-3 18:21:54

使用arduino uno r3 将pulse sensor传感器测量脉搏 在1602LCD上显示数据


求各路大神帮我解决下问题

小ry 想使用arduino uno r3 将pulsesensor传感器测量脉搏 在1602LCD上显示数据


★ pulsesensor的官方程序 看不懂在哪里获取数据   


★ arduino IDE1.6.7或1.6.6版本


★ 1602 LCD 用4线接arduino 有显示但 出现乱码(估计是程序出错),用8线接arduino板 只亮背光没有显示字符

PS:为了解决LCD占用arduino线口太多的窘况,   特意买了个IIC转接板

程序:

●pulsesensor 传感器






/*Pulse Sensor Amped 1.4    by Joel Murphy and Yury Gitman   http://www.pulsesensor.com

----------------------Notes --------------------------------------------
This code:
1) Blinks an LED to User's Live Heartbeat   PIN 13
2) Fades an LED to User's Live HeartBeat
3) Determines BPM
4) Prints All of the Above to Serial

Read Me:
https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino/blob/master/README.md   
----------------------       --------------------------------------------
*/

//Variables
int pulsePin = 0;               // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;               // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine!
volatile int BPM;                   // int that holds raw Analog in 0. updated every 2mS
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // int that holds the time interval between beats! Must be seeded!
volatile boolean Pulse = false;   // "True" when User's live heartbeat is detected. "False" when not a "live beat".
volatile boolean QS = false;      // becomes true when Arduoino finds a beat.

// Regards Serial OutPut-- Set This Up to your needs
static boolean serialVisual = true;   // Set to 'false' by Default.Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse


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!
interruptSetup();               // sets up to read Pulse Sensor signal every 2mS
   // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE,
   // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
//   analogReference(EXTERNAL);   
}


//Where the Magic Happens
void loop(){

    serialOutput() ;      
   
if (QS == true){   // A Heartbeat Was Found
                     // BPM and IBI have been Determined
                     // Quantified Self "QS" true when arduino finds a heartbeat
      digitalWrite(blinkPin,HIGH);   // Blink LED, we got a beat.
      fadeRate = 255;         // Makes the LED Fade Effect Happen
                              // Set 'fadeRate' Variable to 255 to fade LED with pulse
      serialOutputWhenBeatHappens();   // A Beat Happened, Output that to serial.   
      QS = false;                      // reset the Quantified Self flag for next time   
}
   
ledFadeToBeat();                      // Makes the LED Fade Effect Happen
delay(20);                           //take a break
}





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
}





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

//////////
/////////All Serial Handling Code,
/////////It's Changeable with the 'serialVisual' variable
/////////Set it to 'true' or 'false' when it's declared at start of code.
/////////

void serialOutput(){   // Decide How To Output Serial.
if (serialVisual == true){
   arduinoSerialMonitorVisual('-', Signal);   // goes to function that makes Serial Monitor Visualizer
} else{
      sendDataToSerial('S', Signal);   // goes to sendDataToSerial function
}      
}


//Decides How To OutPut BPM and IBI Data
void serialOutputWhenBeatHappens(){   
if (serialVisual == true){            //Code to Make the Serial Monitor Visualizer Work
    Serial.print("*** Heart-Beat Happened *** ");//ASCII Art Madness
    Serial.print("BPM: ");
    Serial.print(BPM);
    Serial.print("");
} else{
      sendDataToSerial('B',BPM);   // send heart rate with a 'B' prefix
      sendDataToSerial('Q',IBI);   // send time between beats with a 'Q' prefix
}   
}



//Sends Data to Pulse Sensor Processing App, Native Mac App, or Third-party Serial Readers.
void sendDataToSerial(char symbol, int data ){
    Serial.print(symbol);

    Serial.println(data);               
}


//Code to Make the Serial Monitor Visualizer Work
void arduinoSerialMonitorVisual(char symbol, int data ){   
const int sensorMin = 0;      // sensor minimum, discovered through experiment
const int sensorMax = 1024;    // sensor maximum, discovered through experiment

int sensorReading = data;
// map the sensor range to a range of 12 options:
int range = map(sensorReading, sensorMin, sensorMax, 0, 11);

// do something different depending on the
// range value:
switch (range) {
case 0:   
    Serial.println("");   /////ASCII Art Madness
    break;
case 1:   
    Serial.println("---");
    break;
case 2:   
    Serial.println("------");
    break;
case 3:   
    Serial.println("---------");
    break;
case 4:   
    Serial.println("------------");
    break;
case 5:   
    Serial.println("--------------|-");
    break;
case 6:   
    Serial.println("--------------|---");
    break;
case 7:   
    Serial.println("--------------|-------");
    break;
case 8:
    Serial.println("--------------|----------");
    break;
case 9:   
    Serial.println("--------------|----------------");
    break;
case 10:   
    Serial.println("--------------|-------------------");
    break;
case 11:   
    Serial.println("--------------|-----------------------");
    break;

}
}






-----------------------------------------------------------------------------------------------------------------------------------
volatile int rate;                  // 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 = 525;                // 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 = 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 = rate;                  // and drop the oldest IBI value
      runningTotal += rate;            // add up the 9 oldest IBI values
      }

      rate = IBI;                        // add the latest IBI to the rate array
      runningTotal += rate;                // 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




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


1602 LCD:



int LCD1602_RS=12;   
int LCD1602_RW=11;   
int LCD1602_EN=10;   
int DB[] = { 6, 7, 8, 9};
char str1[]="Welcome to";
char str2[]="geek-workshop";
char str3[]="this is the";
char str4[]="4-bit interface";

void LCD_Command_Write(int command)
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);

temp=command & 0xf0;
for (i=DB; i <= 9; i++)
{
   digitalWrite(i,temp & 0x80);
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);

temp=(command & 0x0f)<<4;
for (i=DB; i <= 9; i++)
{
   digitalWrite(i,temp & 0x80);
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}

void LCD_Data_Write(int dat)
{
int i=0,temp;
digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);

temp=dat & 0xf0;
for (i=DB; i <= 9; i++)
{
   digitalWrite(i,temp & 0x80);
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);

temp=(dat & 0x0f)<<4;
for (i=DB; i <= 9; i++)
{
   digitalWrite(i,temp & 0x80);
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}

void LCD_SET_XY( int x, int y )
{
int address;
if (y ==0)    address = 0x80 + x;
else          address = 0xC0 + x;
LCD_Command_Write(address);
}

void LCD_Write_Char( int x,int y,int dat)
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
}

void LCD_Write_String(int X,int Y,char *s)
{
    LCD_SET_XY( X, Y );    //设置地址
    while (*s)             //写字符串
    {
      LCD_Data_Write(*s);   
      s ++;
    }
}

void setup (void)
{
int i = 0;
for (i=6; i <= 12; i++)
   {
   pinMode(i,OUTPUT);
   }
delay(100);
LCD_Command_Write(0x28);//4线 2行 5x7
delay(50);
LCD_Command_Write(0x06);
delay(50);
LCD_Command_Write(0x0c);
delay(50);
LCD_Command_Write(0x80);
delay(50);
LCD_Command_Write(0x01);
delay(50);

}

void loop (void)
{
   LCD_Command_Write(0x01);
   delay(50);
   LCD_Write_String(3,0,str1);//第1行,第4个地址起
   delay(50);
   LCD_Write_String(1,1,str2);//第2行,第2个地址起
   delay(5000);
   LCD_Command_Write(0x01);
   delay(50);
   LCD_Write_String(0,0,str3);
   delay(50);
   LCD_Write_String(0,1,str4);
   delay(5000);

}


wetnt 发表于 2016-3-2 10:39:02

同求! 现在也购买了一块,找解决方案中,,接线方案?

lovezypj 发表于 2016-3-2 12:51:26

你先在控制台看数据对不对,然后再接液晶屏
页: [1]
查看完整版本: 使用arduino uno r3 将pulse sensor传感器测量脉搏 在1602LCD上显示数据