เบงเบดเบ—เบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ HX711 ADC เบเบฑเบš NRF52832

1. เบšเบปเบ”เปเบ™เบฐ เบ™เบณ

เปƒเบ™เบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบกเปˆเบ™เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบชเปเบฒเบฅเบฑเบš microcontroller nrf52832 เบ—เบตเปˆเบกเบตเบชเบญเบ‡เป€เบ„เบดเปˆเบ‡เบ‚เบปเบงเบ‚เบญเบ‡เบชเบฒเบเบžเบฑเบ™เบˆเบตเบ™.

เบงเบฝเบเบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบ, เบเป‰เบญเบ™เบงเปˆเบฒเบ‚เป‰เบญเบเบ›เบฐเป€เบŠเบตเบ™เบเบฑเบšเบเบฒเบ™เบ‚เบฒเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบชเบฐเบ•เบดเบ›เบฑเบ™เบเบฒ. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบซเบผเบฒเบเบเบงเปˆเบฒเบงเปˆเบฒ "เบฎเบฒเบเบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเปˆเบงเบฎเป‰เบฒเบ" เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ SDK เบˆเบฒเบ Nordic Semiconductor เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡ - เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบชเบฐเบšเบฑเบšเบ„เบปเบ‡เบ—เบตเปˆ, เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบŠเป‰เปเบฒเบŠเป‰เบญเบ™เปเบฅเบฐเบชเบฑเบšเบชเบปเบ™. เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบ—เบธเบเบขเปˆเบฒเบ‡เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบŠเบดเบšเบ™เบตเป‰เบกเบต stack BLE เปเบฅเบฐเบŠเบธเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "goodies" เบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ›เบฐเบซเบเบฑเบ”เบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™. เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบฅเบปเบ‡เป€เบฅเบดเบเปƒเบ™เบชเปˆเบงเบ™เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบซเบฅเบฒเบเบšเบปเบ”เป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰.

2. เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป‚เบ„เบ‡เบเบฒเบ™

เบงเบดเบ—เบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ HX711 ADC เบเบฑเบš NRF52832

เบ—เบฒเบ”เป€เบซเบผเบฑเบ:

  • Adafruit Feather nRF52 Bluefruit LE (เบกเบตเบซเบเบฑเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบเบฑเบšเบกเบท)
  • ADC HX711
  • เป€เบ„เบทเปˆเบญเบ‡เบงเบฑเบ”เปเบ—เบเบชเบฒเบเบžเบฑเบ™เบˆเบตเบ™ 2 เปœเปˆเบงเบ. (50x2 เบเบดโ€‹เป‚เบฅโ€‹)
  • เป‚เบ›เบฃเปเบเบฃเบกเป€เบกเบต ST-LINK V2

เบŠเบญเบšเปเบง:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • เป‚เบ›เบฃเปเบเบฃเบกเป€เบกเบต ST-LINK V2

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฝเบง, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบ›เบฑเบš Makefile (เบฅเบฐเบšเบธเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เบญเบ‡ SDK เบ‚เบญเบ‡เบ—เปˆเบฒเบ™).

3. เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เป‚เบกเบ”เบนเบ™ GPIOTE เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบญเบธเบ›เบฐเบเบญเบ™เบ•เปเปˆเบžเปˆเบงเบ‡เป‚เบ”เบเบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบœเบนเบเบกเบฑเบ”เบ‚เบญเบ‡เปœเป‰เบฒเบงเบฝเบ เปเบฅเบฐ เป€เบซเบ”เบเบฒเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเป‚เบกเบ”เบนเบ™ PPI เป€เบžเบทเปˆเบญเป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบญเบธเบ›เบฐเบเบญเบ™เบ•เปเปˆเบ•เปเปˆเป„เบ›เบซเบฒเบญเบตเบเบญเบธเบ›เบฐเบเบญเบ™เปœเบถเปˆเบ‡เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ‚เบญเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบต.

ret_code_t err_code;
   err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//ะฝะฐัั‚ั€ะฐะตะฒะฐะตะผ ะฝะฐ ะฒั‹ั…ะพะด
   nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);//ะฑัƒะดะตะผ ะฟะตั€ะตะดะตั€ะณะธะฒะฐั‚ัŒ ะฟะธะฝ ะดะปั ะธะผะฟัƒะปัŒัะฐ
   err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//ะฝะฐัั‚ั€ะฐะตะฒะฐะตะผ ะฝะฐ ะฒั‹ั…ะพะด

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเป€เบชเบฑเป‰เบ™ synchronization PD_SCL เบเบฑเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ pulses เบ—เบตเปˆเบกเบตเป„เบฅเบเบฐเป€เบงเบฅเบฒ 10 ฮผs.

   nrf_drv_gpiote_in_config_t  gpiote_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);// ะฟะตั€ะตั…ะพะด ัƒั€ะพะฒะฝั ั ะฒั‹ัะพะบะพะณะพ ะฝะฐ ะฝะธะทะบะธะน
   nrf_gpio_cfg_input(DOUT, NRF_GPIO_PIN_NOPULL);// ะฝะฐ ะฒั…ะพะด ะฑะตะท ะฟะพะดั‚ัะถะบะธ
   err_code = nrf_drv_gpiote_in_init(DOUT, &gpiote_config, gpiote_evt_handler); 

static void gpiote_evt_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    nrf_drv_gpiote_in_event_disable(DOUT);//ะพั‚ะบะปัŽั‡ะฐะตะผ ะฟั€ะตั€ั‹ะฒะฐะฝะธะต
    nrf_drv_timer_enable(&m_timer0);//ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€
}
 

เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบชเบฑเป‰เบ™เบ‚เปเป‰เบกเบนเบ™ DOUT เป€เบžเบทเปˆเบญเบญเปˆเบฒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡ HX711; เบ–เป‰เบฒเบกเบตเบฅเบฐเบ”เบฑเบšเบ•เปเปˆเบฒ, เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบˆเบฐเบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ›เบดเบ”เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เปเบฅเบฐเป€เบฅเบตเปˆเบกเบˆเบฑเบšเป€เบงเบฅเบฒเป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบเปเบฒเบกเบฐเบˆเบญเบ™เบ‚เบญเบ‡เป‚เบกเบ‡เบขเบนเปˆเบ—เบตเปˆเบœเบปเบ™เบœเบฐเบฅเบดเบ” PD_SCL.

 err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel1);
   APP_ERROR_CHECK(err_code);
   err_code = nrf_drv_ppi_channel_assign(m_ppi_channel1,                                         nrf_drv_timer_event_address_get(&m_timer0, NRF_TIMER_EVENT_COMPARE0),                                           nrf_drv_gpiote_out_task_addr_get(PD_SCK));// ะฟะพะดะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€ ะบ ะฒั‹ั…ะพะดัƒ
   APP_ERROR_CHECK(err_code);
   err_code = nrf_drv_ppi_channel_enable(m_ppi_channel1);// ะฒะบะปัŽั‡ะฐะตะผ ะบะฐะฝะฐะป
   APP_ERROR_CHECK(err_code);
   nrf_drv_gpiote_out_task_enable(PD_SCK); 

// เป€เบ›เบตเบ”เปƒเบŠเป‰ gpiote

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบกเบ”เบนเบ™ PPI เปเบฅเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบกเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ” PD_SCL เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ pulses เบ—เบตเปˆเบกเบตเป„เบฅเบเบฐเป€เบงเบฅเบฒ 10 ฮผsเป€เบกเบทเปˆเบญเป€เบซเบ”เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเป€เบเบตเบ”เบ‚เบทเป‰เบ™, เปเบฅเบฐเบเบฑเบ‡เป€เบ›เบตเบ”เป‚เบกเบ”เบนเบ™ GPIOTE.


nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;// ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ
   timer_cfg.frequency = NRF_TIMER_FREQ_1MHz;// ั‚ะฐะบั‚ะธั€ัƒะตะผ ะฝะฐ ั‡ะฐัั‚ะพั‚ะต 1ะœะณั†
   ret_code_t err_code = nrf_drv_timer_init(&m_timer0, &timer_cfg, timer0_event_handler);
   APP_ERROR_CHECK(err_code);
   nrf_drv_timer_extended_compare(&m_timer0,
                                  NRF_TIMER_CC_CHANNEL0,
                                  nrf_drv_timer_us_to_ticks(&m_timer0,
                                                            10),
                                  NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
                                  true);// ัั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ ะฟะพ ัั€ะฐะฒะฝะตะฝะธัŽ

เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ•เบปเบงเบˆเบฑเบšเป€เบงเบฅเบฒเบชเบนเบ™ เปเบฅเบฐเบ•เบปเบงเบˆเบฑเบšเบ‚เบญเบ‡เบกเบฑเบ™.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// ะฟะตั€ะตะผะตะฝะฝะฐั ัั‡ะธั‚ะฐะฝะฝั‹ั… ะดะฐะฝั‹ั…
        c_counter++;// ัั‡ะตั‚ั‡ะธะบ ะฟะพะปะพะถะธั‚ะตะปัŒะฝั‹ั…  ะธะผะฟัƒะปัŒัะพะฒ
           if(nrf_gpio_pin_read(DOUT))buffer++;//ัั‡ะธั‚ั‹ะฒะฐะตะผ ัะพัั‚ะพัะฝะธะต ะฒั…ะพะดะฐ
   }

เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบชเบธเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบ•เบปเบงเบˆเบฑเบšเป€เบงเบฅเบฒ. เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเปเบฒเบกเบฐเบˆเบญเบ™เปเบกเปˆเบ™ 20 ฮผs. เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™ pulses เบ„เบตเบ (เบ•เบฒเบกเบ‚เบญเบšเบ—เบตเปˆเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™) เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเป€เบเบตเบ™ 24, เปเบฅเบฐเบกเบต 48 เป€เบซเบ”เบเบฒเบ™. เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป€เบซเบ”เบเบฒเบ™เบ„เบตเบ, DOUT เปเบกเปˆเบ™เบญเปˆเบฒเบ™.

เบˆเบฒเบเป€เบญเบเบฐเบชเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเปเบฒเบกเบฐเบˆเบญเบ™เบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 25, เป€เบŠเบดเปˆเบ‡เบเบปเบ‡เบเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบ‚เบญเบ‡ 128 (เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ‚เป‰เบญเบเปƒเบŠเป‰ 25 pulses), เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš 50 เป€เบซเบ”เบเบฒเบ™เบˆเบฑเบšเป€เบงเบฅเบฒ, เป€เบŠเบดเปˆเบ‡เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบเบญเบšเบ‚เปเป‰เบกเบนเบ™.

 ++m_counter;// ัั‡ะตั‚ั‡ะธะบ ัะพะฑั‹ั‚ะธะน
if(m_counter==50){
      nrf_drv_timer_disable(&m_timer0);// ะพั‚ะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€
       m_simple_timer_state = SIMPLE_TIMER_STATE_STOPPED;//
       buffer = buffer ^ 0x800000;
       hx711_stop();//jะพั‚ะบะปัŽั‡ะฐะตะผ hx711
       }
   

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ›เบดเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ‚เปเป‰เบกเบนเบ™ (เบญเบตเบ‡เบ•เบฒเบกเป€เบญเบเบฐเบชเบฒเบ™เบ‚เปเป‰เบกเบนเบ™) เปเบฅเบฐเบ›เปˆเบฝเบ™ HX711 เป€เบ›เบฑเบ™เป‚เบซเบกเบ”เบเบฒเบ™เปƒเบŠเป‰เบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ•เปˆเปเบฒ.


static void repeated_timer_handler(void * p_context)
{
   nrf_drv_gpiote_out_toggle(LED_2);
   if(m_simple_timer_state == SIMPLE_TIMER_STATE_STOPPED){
      	hx711_start();// ะฒะบะปัŽั‡ะฐะตะผ hx711
       nrf_drv_gpiote_out_toggle(LED_1);
       m_simple_timer_state = SIMPLE_TIMER_STATE_STARTED;
   }
  
}
/**@brief Create timers.
*/
static void create_timers()
{
   ret_code_t err_code;
 
   // Create timers
   err_code = app_timer_create(&m_repeated_timer_id,
                               APP_TIMER_MODE_REPEATED,
                               repeated_timer_handler);
   APP_ERROR_CHECK(err_code);
}

เบžเบงเบเป€เบฎเบปเบฒเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเป€เบซเบ”เบเบฒเบ™เบˆเบฒเบเบ•เบปเบงเบˆเบฑเบšเป€เบงเบฅเบฒ RTC เบ—เบตเปˆเบกเบตเป„เบฅเบเบฐเบซเปˆเบฒเบ‡เบ‚เบญเบ‡ 10 s (เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™) เปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบง HX711 เปƒเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เบเปเปˆเปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบขเบนเปˆเปƒเบ™เป€เบชเบฑเป‰เบ™ DOUT.

เบกเบตเบญเบตเบเบˆเบธเบ”เบซเบ™เบถเปˆเบ‡, เบšเบฑเบ™เบ—เบถเบเปเบกเปˆเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบœเปˆเบฒเบ™ UART (baud rate 115200, TX - 6 pins, RX - 8 pins) เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ sdk_config.h

เบงเบดเบ—เบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ HX711 ADC เบเบฑเบš NRF52832

เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบš

เบ‚เปเบ‚เบญเบšเปƒเบˆเบ—เปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปเบฅเบฐเบˆเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบตเบ„เบธเบ™เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบงเบดเบ—เบตเปเบเป‰เป„เบ‚. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™เบ—เบตเปˆ Nordic เปƒเบŠเป‰เปƒเบ™เป€เบงเบ—เบตเบ‚เบญเบ‡เบ•เบปเบ™เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™.

PS

เป‚เบ„เบ‡เบเบฒเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆ, เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบญเบฐเบ—เบดเบšเบฒเบ algorithm เบชเปเบฒเบฅเบฑเบš calibrating sensors เบ™เป‰เปเบฒเบซเบ™เบฑเบ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ stack BLE.

เป€เบ„เบทเปˆเบญเบ‡เปเบ•เปˆเบ‡เบเบฒเบ

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™