Skip to content

Commit d3540bf

Browse files
authored
Add files via upload
1 parent 44d228f commit d3540bf

File tree

1 file changed

+202
-28
lines changed

1 file changed

+202
-28
lines changed

libraries/D6Examples/examples/HeartRateTest/HeartRateTest.ino

+202-28
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ void setup() {
153153
display.setCursor(10, 0);
154154
display.println("Start");
155155
display.display();
156-
delay(100);
157156
digitalWrite(25, LOW);
158157
Wire.begin();
159158
delay(100);
@@ -379,6 +378,16 @@ uint8_t readRegister(uint8_t addr)
379378
return Wire.read();
380379
}
381380

381+
static bool ppg_current_change = false;
382+
383+
#define PAH8001_LED_STEP_DELTA 2
384+
#define PAH8001_LED_EXPOSURE_MAX 496
385+
#define PAH8001_LED_EXPOSURE_MIN 32
386+
#define PAH8001_LED_EXPOSURE_BIG 420
387+
#define PAH8001_LED_EXPOSURE_SML 64
388+
#define PAH8001_LED_STEP_MAX 31
389+
#define PAH8001_LED_STEP_MIN 1
390+
382391
static const struct {
383392
uint8_t reg;
384393
uint8_t value;
@@ -416,70 +425,235 @@ static const struct {
416425
{ 0x5Du, 0x81u }
417426
};
418427

419-
void Pah8001_Configure()
428+
static bool Pah8001_Configure()
420429
{
421430
uint8_t value;
422-
writeRegister(0x06, 0x82);
431+
432+
writeRegister(0x06u, 0x82u);
423433
delay(10);
424-
writeRegister(0x09,0x5A);
425-
writeRegister(0x05,0x99);
426-
value = readRegister (0x17);
427-
writeRegister(0x17, value | 0x80 );
434+
writeRegister(0x09u, 0x5Au );
435+
writeRegister(0x05u, 0x99u );
436+
value = readRegister (0x17u);
437+
writeRegister(0x17u, value | 0x80 );
438+
428439
for (size_t i = 0; i < sizeof(config) / sizeof(config[0]); i++)
429440
{
430441
writeRegister(config[i].reg, config[i].value);
431442
}
443+
432444
value = readRegister(0x00);
445+
446+
return true;
433447
}
434448

449+
static bool Pah8001_UpdateLed(bool touch)
450+
{
451+
static bool ppg_sleep = true;
452+
static uint8_t ppg_states = 0;
453+
static uint8_t ppg_led_mode = 0;
454+
static uint8_t ppg_led_step = 10;
455+
456+
if (!touch)
457+
{
458+
writeRegister(0x7Fu, 0x00u);
459+
writeRegister(0x05u, 0xB8u);
460+
writeRegister(0x7Fu, 0x01u);
461+
writeRegister(0x42u, 0xA0u);
462+
writeRegister(0x38u, 0xE5u);
463+
464+
ppg_led_step = 10;
465+
ppg_sleep = true;
466+
ppg_current_change = false;
467+
}
468+
else
469+
{
470+
uint8_t value;
471+
uint16_t exposureTime;
472+
writeRegister(0x7Fu, 0x00u);
473+
writeRegister(0x05u, 0x98u);
474+
writeRegister(0x7Fu, 0x01u);
475+
writeRegister(0x42u, 0xA4u);
476+
writeRegister(0x7Fu, 0x00u);
477+
478+
// Read exposure time
479+
value = readRegister(0x33);
480+
exposureTime = (value & 0x3u) << 8;
481+
value = readRegister(0x32);
482+
exposureTime |= value;
483+
484+
writeRegister(0x7Fu, 0x01u);
485+
if (ppg_sleep)
486+
{
487+
writeRegister(0x38u, (0xE0u | 10));
488+
ppg_sleep = false;
489+
}
490+
491+
if (ppg_states++ > 3)
492+
{
493+
ppg_states = 0;
494+
if (ppg_led_mode == 0)
495+
{
496+
if (exposureTime >= PAH8001_LED_EXPOSURE_MAX
497+
|| exposureTime <= PAH8001_LED_EXPOSURE_MIN)
498+
{
499+
ppg_led_step = readRegister(0x38u);
500+
ppg_led_step &= 0x1Fu;
501+
502+
if (exposureTime >= PAH8001_LED_EXPOSURE_MAX &&
503+
ppg_led_step < PAH8001_LED_STEP_MAX)
504+
{
505+
ppg_led_mode = 1;
506+
if (ppg_led_step += PAH8001_LED_STEP_DELTA > PAH8001_LED_STEP_MAX) {
507+
ppg_led_step = PAH8001_LED_STEP_MAX;
508+
}
509+
writeRegister(0x38u, ppg_led_step | 0xE0u);
510+
ppg_current_change = true;
511+
}
512+
else if (exposureTime <= PAH8001_LED_EXPOSURE_MIN &&
513+
ppg_led_step > PAH8001_LED_STEP_MIN)
514+
{
515+
ppg_led_mode = 2;
516+
if (ppg_led_step <= PAH8001_LED_STEP_MIN + PAH8001_LED_STEP_DELTA) {
517+
ppg_led_step = PAH8001_LED_STEP_MIN;
518+
}
519+
else ppg_led_step -= PAH8001_LED_STEP_DELTA;
520+
521+
writeRegister(0x38u, ppg_led_step | 0xE0u);
522+
ppg_current_change = true;
523+
}
524+
else
525+
{
526+
ppg_led_mode = 0;
527+
ppg_current_change = false;
528+
}
529+
}
530+
else ppg_current_change = false;
531+
}
532+
else if (ppg_led_mode == 1)
533+
{
534+
if (exposureTime > PAH8001_LED_EXPOSURE_BIG)
535+
{
536+
if (ppg_led_step += PAH8001_LED_STEP_DELTA > PAH8001_LED_STEP_MAX)
537+
{
538+
ppg_led_mode = 0;
539+
ppg_led_step = PAH8001_LED_STEP_MAX;
540+
}
541+
writeRegister(0x38u, ppg_led_step | 0xE0u);
542+
ppg_current_change = true;
543+
}
544+
else
545+
{
546+
ppg_led_mode = 0;
547+
ppg_current_change = false;
548+
}
549+
}
550+
else
551+
{
552+
if (exposureTime < PAH8001_LED_EXPOSURE_SML)
553+
{
554+
ppg_led_mode = 2;
555+
if (ppg_led_step <= PAH8001_LED_STEP_MIN + PAH8001_LED_STEP_DELTA)
556+
{
557+
ppg_led_mode = 0;
558+
ppg_led_step = PAH8001_LED_STEP_MIN;
559+
}
560+
else ppg_led_step -= PAH8001_LED_STEP_DELTA;
561+
562+
writeRegister(0x38u, ppg_led_step | 0xE0u);
563+
ppg_current_change = true;
564+
}
565+
else
566+
{
567+
ppg_led_mode = 0;
568+
ppg_current_change = false;
569+
}
570+
}
571+
}
572+
else {
573+
ppg_current_change = false;
574+
}
575+
}
576+
return true;
577+
}
435578

436-
void Pah8001_ReadRawData(uint8_t buffer[9])
579+
uint8_t Pah8001_ReadRawData(uint8_t buffer[9])
437580
{
438-
uint8_t tmp[4];
581+
static uint8_t ppg_frame_count = 0, touch_cnt = 0;
439582
uint8_t value;
440-
writeRegister(0x7F, 0x01);
583+
writeRegister(0x7Fu, 0x00u);
584+
value = readRegister(0x59u);
585+
if (value == 0x80)
586+
touch_cnt = 0;
587+
if (touch_cnt++ < 250)
588+
if (!Pah8001_UpdateLed(1)) return 0x13;
589+
else
590+
{
591+
if (!Pah8001_UpdateLed(0)) return 0x13;
592+
touch_cnt = 252;
593+
}
594+
writeRegister(0x7Fu, 0x01u);
595+
596+
value = readRegister(0x68u);
597+
buffer[0] = value & 0xFu;
441598

442-
buffer[0] = readRegister(0x68) & 0xF;
443599

444600
if (buffer[0] != 0) //0 means no data, 1~15 mean have data
445601
{
602+
uint8_t tmp[4];
603+
/* 0x7f is change bank register,
604+
0x64~0x67 is HR_DATA
605+
0x1a~0x1C is HR_DATA_Algo
606+
*/
607+
446608
Wire.beginTransmission(0x6b);
447609
Wire.write(0x64);
448610
Wire.endTransmission();
449611
Wire.requestFrom(0x6b, 4);
450612

451-
buffer[1] = Wire.read() & 0xFF;
452-
buffer[2] = Wire.read() & 0xFF;
453-
buffer[3] = Wire.read() & 0xFF;
454-
buffer[4] = Wire.read() & 0xFF;
613+
buffer[1] = Wire.read() & 0xFFu;
614+
buffer[2] = Wire.read() & 0xFFu;
615+
buffer[3] = Wire.read() & 0xFFu;
616+
buffer[4] = Wire.read() & 0xFFu;
455617

456618
Wire.beginTransmission(0x6b);
457619
Wire.write(0x1a);
458620
Wire.endTransmission();
459621
Wire.requestFrom(0x6b, 4);
460622

461-
buffer[5] = Wire.read() & 0xFF;
462-
buffer[6] = Wire.read() & 0xFF;
463-
buffer[7] = Wire.read() & 0xFF;
623+
buffer[5] = Wire.read() & 0xFFu;
624+
buffer[6] = Wire.read() & 0xFFu;
625+
buffer[7] = Wire.read() & 0xFFu;
464626

465-
writeRegister(0x7F, 0x00);
466-
buffer[8] = readRegister(0x59) & 0x80;
627+
writeRegister(0x7Fu, 0x00u);
628+
value = readRegister(0x59u);
629+
buffer[8] = value & 0x80u;
467630
}
468631
else
469632
{
470-
writeRegister(0x7F, 0x00);
633+
writeRegister(0x7Fu, 0x00u);
634+
return 0x22;
471635
}
636+
return 0;
637+
}
638+
639+
640+
bool Pah8001_HRValid(void)
641+
{
642+
uint8_t value;
643+
value = readRegister(0x59u);
644+
return value & 0x80u == 0x80u;
472645
}
473646

474-
void Pah8001_PowerOff(void)
647+
bool Pah8001_PowerOff(void)
475648
{
476-
writeRegister(0x7F, 0x00);
477-
writeRegister(0x06, 0x0A);
649+
writeRegister(0x7Fu, 0x00u);
650+
writeRegister(0x06u, 0x0Au);
651+
return true;
478652
}
479653

480-
void Pah8001_PowerOn(void)
654+
bool Pah8001_PowerOn(void)
481655
{
482-
writeRegister(0x7F, 0x00);
483-
writeRegister(0x06, 0x02);
484-
writeRegister(0x05, 0x99);
656+
writeRegister(0x7Fu, 0x00u);
657+
writeRegister(0x06u, 0x02u);
658+
writeRegister(0x05u, 0x99u);
485659
}

0 commit comments

Comments
 (0)