HX711 ADC เชจเซ‡ NRF52832 เชฅเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเซเช‚

1. เชชเชฐเชฟเชšเชฏ

เชเชœเชจเซเชกเชพเชฎเชพเช‚ เชฌเซ‡ เช…เชฐเซเชง-เชฌเซเชฐเชฟเชœ เชšเชพเช‡เชจเซ€เช เชธเซเชŸเซเชฐเซ‡เช‡เชจ เช—เซ‡เชœ เชธเชพเชฅเซ‡ nrf52832 เชฎเชพเช‡เช•เซเชฐเซ‹เช•เชจเซเชŸเซเชฐเซ‹เชฒเชฐ เชฎเชพเชŸเซ‡ เชธเช‚เชšเชพเชฐ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชตเชฟเช•เชธเชพเชตเชตเชพเชจเซเช‚ เช•เชพเชฐเซเชฏ เชนเชคเซเช‚.

เช•เชพเชฐเซเชฏ เชธเชฐเชณ เชจ เชนเชคเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชฎเชจเซ‡ เช•เซ‹เชˆ เชชเชฃ เชฌเซเชฆเซเชงเชฟเช—เชฎเซเชฏ เชฎเชพเชนเชฟเชคเซ€เชจเชพ เช…เชญเชพเชตเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซเชฏเซ‹ เชนเชคเซ‹. เชคเซ‡ เชตเชงเซ เชธเช‚เชญเชต เช›เซ‡ เช•เซ‡ "เชฆเซเชทเซเชŸเชคเชพเชจเซเช‚ เชฎเซ‚เชณ" เชจเซ‹เชฐเซเชกเชฟเช• เชธเซ‡เชฎเชฟเช•เชจเซเชกเช•เซเชŸเชฐเชฅเซ€ เชœ SDK เชฎเชพเช‚ เช›เซ‡ - เชธเชคเชค เชธเช‚เชธเซเช•เชฐเชฃ เช…เชชเชกเซ‡เชŸเซเชธ, เช•เซ‡เชŸเชฒเซ€เช• เชจเชฟเชฐเชฐเซเชฅเช•เชคเชพ เช…เชจเซ‡ เช—เซ‚เช‚เชšเชตเชฃเชญเชฐเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ. เชฎเชพเชฐเซ‡ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชฌเชงเซเช‚ เชฒเช–เชตเซเช‚ เชนเชคเซเช‚.

เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช† เชตเชฟเชทเชฏ เช เชนเช•เซ€เช•เชค เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡ เช•เซ‡ เช† เชšเชฟเชชเชฎเชพเช‚ BLE เชธเซเชŸเซ‡เช• เช›เซ‡ เช…เชจเซ‡ เชŠเชฐเซเชœเชพ เชฌเชšเชค เชฎเซ‹เชก เชฎเชพเชŸเซ‡ "เช—เซเชกเซ€เช" เชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‡เชŸ เช›เซ‡. เชชเชฐเช‚เชคเซ เชนเซเช‚ เชŸเซ‡เช•เชจเชฟเช•เชฒ เชญเชพเช—เชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเชพเชฃเชฎเชพเช‚ เชœเชˆเชถ เชจเชนเซ€เช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช† เชตเชฟเชทเชฏ เชชเชฐ เช˜เชฃเชพ เชฒเซ‡เช–เซ‹ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡.

2. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชตเชฐเซเชฃเชจ

HX711 ADC เชจเซ‡ NRF52832 เชฅเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเซเช‚

เชฒเซ‹เช–เช‚เชก:

  • เชเชกเชซเซเชฐเซ‚เชŸ เชซเซ‡เชงเชฐ nRF52 เชฌเซเชฒเซเชซเซเชฐเซ‚เชŸ LE (เชนเชพเชฅเชฎเชพเช‚ เชถเซเช‚ เชฅเชฏเซเช‚)
  • HX711 ADC
  • เชšเชพเช‡เชจเซ€เช เชธเซเชŸเซเชฐเซ‡เชจ เช—เซ‡เชœ 2 เชชเซ€เชธเซ€. (50x2 เช•เชฟเช—เซเชฐเชพ)
  • เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐ ST-LINK V2

เชธ SoftwareเชซเซเชŸเชตเซ‡เชฐ:

  • IDE VSCODE
  • NRF SDK 16
  • เช“เชชเชจเช“เชธเซ€เชกเซ€
  • เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐ ST-LINK V2

เชฌเชงเซเช‚ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เช›เซ‡, เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชฎเซ‡เช•เชซเชพเช‡เชฒเชจเซ‡ เชŸเซเชตเชฟเช• เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡ (เชคเชฎเชพเชฐเชพ 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);//ะฝะฐัั‚ั€ะฐะตะฒะฐะตะผ ะฝะฐ ะฒั‹ั…ะพะด

เช…เชฎเซ‡ 10 ฮผs เชจเซ€ เช…เชตเชงเชฟ เชธเชพเชฅเซ‡ เช•เช เซ‹เชณ เชชเซ‡เชฆเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ PD_SCL เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เชเซ‡เชถเชจ เชฒเชพเช‡เชจเชจเซ‡ เช†เช‰เชŸเชชเซเชŸเชฎเชพเช‚ เช—เซ‹เช เชตเซ€เช เช›เซ€เช.

   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);//ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€
}
 

เช…เชฎเซ‡ HX711 เชจเซ€ เชคเซˆเชฏเชพเชฐเซ€เชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ DOUT เชกเซ‡เชŸเชพ เชฒเชพเช‡เชจเชจเซ‡ เช—เซ‹เช เชตเซ€เช เช›เซ€เช; เชœเซ‹ เชคเซเชฏเชพเช‚ เชจเซ€เชšเซเช‚ เชธเซเชคเชฐ เชนเซ‹เชฏ, เชคเซ‹ เชเช• เชนเซ‡เชจเซเชกเชฒเชฐ เชŸเซเชฐเชฟเช—เชฐ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช…เชฎเซ‡ เชตเชฟเช•เซเชทเซ‡เชชเชจเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ 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 เชฎเซ‹เชกเซเชฏเซเชฒ เชถเชฐเซ‚ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชธเชฐเช–เชพเชฎเชฃเซ€เชจเซ€ เช˜เชŸเชจเชพ เชฌเชจเซ‡ เชคเซเชฏเชพเชฐเซ‡ 10 ฮผs เชจเชพ เชธเชฎเชฏเช—เชพเชณเชพ เชธเชพเชฅเซ‡ เชชเชฒเซเชธ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเชพ เชŸเชพเชˆเชฎเชฐเชจเซ‡ PD_SCL เช†เช‰เชŸเชชเซเชŸ เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ€เช เช›เซ€เช เช…เชจเซ‡ 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 เช›เซ‡. เช…เชฎเชจเซ‡ เชตเชฟเชทเชฎ เช•เช เซ‹เชณ (เชตเชงเชคเซ€ เชงเชพเชฐ เชธเชพเชฅเซ‡) เชฎเชพเช‚ เชฐเชธ เช›เซ‡ เช…เชจเซ‡ เชชเซ‚เชฐเซ€ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เช›เซ‡ เช•เซ‡ เชคเซ‡เชฎเชจเซ€ เชธเช‚เช–เซเชฏเชพ 24 เชฅเซ€ เชตเชงเซ เชจ เชนเซ‹เชฏ, เช…เชจเซ‡ เชคเซเชฏเชพเช‚ 48 เช˜เชŸเชจเชพเช“ เช›เซ‡. เชฆเชฐเซ‡เช• เชตเชฟเชšเชฟเชคเซเชฐ เช˜เชŸเชจเชพ เชฎเชพเชŸเซ‡, DOUT เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡

เชกเซ‡เชŸเชพเชถเซ€เชŸเชฎเชพเช‚เชฅเซ€ เชคเซ‡ เช…เชจเซเชธเชฐเซ‡ เช›เซ‡ เช•เซ‡ เช•เช เซ‹เชณเชจเซ€ เชธเช‚เช–เซเชฏเชพ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ€ 25 เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช, เชœเซ‡ 128 เชจเชพ เชฒเชพเชญเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ (เช•เซ‹เชกเชฎเชพเช‚ เชฎเซ‡เช‚ 25 เช•เช เซ‹เชณเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹), เช† 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 เชธเซ‡เช•เชจเซเชกเชจเชพ เช…เช‚เชคเชฐเชพเชฒ เชธเชพเชฅเซ‡เชจเซ€ เช˜เชŸเชจเชพเช“เชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซ€เช เช›เซ€เช (เช† เชคเชฎเชพเชฐเซ€ เชฎเซเชจเชธเชซเซ€ เชชเชฐ เช›เซ‡) เช…เชจเซ‡ เชนเซ‡เชจเซเชกเชฒเชฐเชฎเชพเช‚ HX711 เชฒเซ‰เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ DOUT เชฒเชพเช‡เชจ เชชเชฐ เชตเชฟเช•เซเชทเซ‡เชช เช†เชตเซ‡ เช›เซ‡.

เชคเซเชฏเชพเช‚ เชเช• เชตเชงเซ เชฎเซเชฆเซเชฆเซ‹ เช›เซ‡, เชฒเซ‹เช—เซเชธ UART เชฆเซเชตเชพเชฐเชพ เช†เช‰เชŸเชชเซเชŸ เช›เซ‡ (เชฌเซ‰เชก เชฐเซ‡เชŸ 115200, TX - 6 เชชเชฟเชจ, RX - 8 เชชเชฟเชจ) เชคเชฎเชพเชฎ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ sdk_config.h เชฎเชพเช‚ เช›เซ‡

HX711 ADC เชจเซ‡ NRF52832 เชฅเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเซเช‚

เชคเชพเชฐเชฃเซ‹

เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฎเชพเชŸเซ‡ เช†เชช เชธเซŒเชจเซ‹ เช†เชญเชพเชฐ, เชฎเชจเซ‡ เช†เชถเชพ เช›เซ‡ เช•เซ‡ เช† เชฒเซ‡เช– เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡ เช…เชจเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เช‰เช•เซ‡เชฒ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‚เชฒเซเชฏเชตเชพเชจ เชธเชฎเชฏ เช˜เชŸเชพเชกเชถเซ‡. เชนเซเช‚ เช•เชนเซ‡เชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชจเซ‹เชฐเซเชกเชฟเช• เชคเซ‡เชจเชพ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เชœเซ‡ เชคเช•เชจเซ€เช•เซ€ เช…เชญเชฟเช—เชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชŠเชฐเซเชœเชพ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€ เช–เซ‚เชฌ เชœ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡.

PS

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชนเชœเซ€ เชชเชฃ เชตเชฟเช•เชพเชธ เชนเซ‡เช เชณ เช›เซ‡, เชคเซ‡เชฅเซ€ เชœเซ‹ เช† เชตเชฟเชทเชฏ เชฐเชธ เชงเชฐเชพเชตเชคเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เชชเช›เซ€เชจเชพ เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชตเชœเชจ เชธเซ‡เชจเซเชธเชฐเชจเซ‡ เชฎเชพเชชเชพเช‚เช•เชฟเชค เช•เชฐเชตเชพ, เชคเซ‡เชฎเชœ BLE เชธเซเชŸเซ‡เช•เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถ.

เชธเชพเชฎเช—เซเชฐเซ€

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹