@@ -153,7 +153,6 @@ void setup() {
153
153
display.setCursor (10 , 0 );
154
154
display.println (" Start" );
155
155
display.display ();
156
- delay (100 );
157
156
digitalWrite (25 , LOW);
158
157
Wire.begin ();
159
158
delay (100 );
@@ -379,6 +378,16 @@ uint8_t readRegister(uint8_t addr)
379
378
return Wire.read ();
380
379
}
381
380
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
+
382
391
static const struct {
383
392
uint8_t reg;
384
393
uint8_t value;
@@ -416,70 +425,235 @@ static const struct {
416
425
{ 0x5Du , 0x81u }
417
426
};
418
427
419
- void Pah8001_Configure ()
428
+ static bool Pah8001_Configure ()
420
429
{
421
430
uint8_t value;
422
- writeRegister (0x06 , 0x82 );
431
+
432
+ writeRegister (0x06u , 0x82u );
423
433
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
+
428
439
for (size_t i = 0 ; i < sizeof (config) / sizeof (config[0 ]); i++)
429
440
{
430
441
writeRegister (config[i].reg , config[i].value );
431
442
}
443
+
432
444
value = readRegister (0x00 );
445
+
446
+ return true ;
433
447
}
434
448
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
+ }
435
578
436
- void Pah8001_ReadRawData (uint8_t buffer[9 ])
579
+ uint8_t Pah8001_ReadRawData (uint8_t buffer[9 ])
437
580
{
438
- uint8_t tmp[ 4 ] ;
581
+ static uint8_t ppg_frame_count = 0 , touch_cnt = 0 ;
439
582
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 ;
441
598
442
- buffer[0 ] = readRegister (0x68 ) & 0xF ;
443
599
444
600
if (buffer[0 ] != 0 ) // 0 means no data, 1~15 mean have data
445
601
{
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
+
446
608
Wire.beginTransmission (0x6b );
447
609
Wire.write (0x64 );
448
610
Wire.endTransmission ();
449
611
Wire.requestFrom (0x6b , 4 );
450
612
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 ;
455
617
456
618
Wire.beginTransmission (0x6b );
457
619
Wire.write (0x1a );
458
620
Wire.endTransmission ();
459
621
Wire.requestFrom (0x6b , 4 );
460
622
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 ;
464
626
465
- writeRegister (0x7F , 0x00 );
466
- buffer[8 ] = readRegister (0x59 ) & 0x80 ;
627
+ writeRegister (0x7Fu , 0x00u );
628
+ value = readRegister (0x59u );
629
+ buffer[8 ] = value & 0x80u ;
467
630
}
468
631
else
469
632
{
470
- writeRegister (0x7F , 0x00 );
633
+ writeRegister (0x7Fu , 0x00u );
634
+ return 0x22 ;
471
635
}
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 ;
472
645
}
473
646
474
- void Pah8001_PowerOff (void )
647
+ bool Pah8001_PowerOff (void )
475
648
{
476
- writeRegister (0x7F , 0x00 );
477
- writeRegister (0x06 , 0x0A );
649
+ writeRegister (0x7Fu , 0x00u );
650
+ writeRegister (0x06u , 0x0Au );
651
+ return true ;
478
652
}
479
653
480
- void Pah8001_PowerOn (void )
654
+ bool Pah8001_PowerOn (void )
481
655
{
482
- writeRegister (0x7F , 0x00 );
483
- writeRegister (0x06 , 0x02 );
484
- writeRegister (0x05 , 0x99 );
656
+ writeRegister (0x7Fu , 0x00u );
657
+ writeRegister (0x06u , 0x02u );
658
+ writeRegister (0x05u , 0x99u );
485
659
}
0 commit comments