{"id":7575,"date":"2024-11-21T15:54:17","date_gmt":"2024-11-21T06:54:17","guid":{"rendered":"https:\/\/akibabara.com\/blog\/?p=7575"},"modified":"2024-11-21T16:28:11","modified_gmt":"2024-11-21T07:28:11","slug":"xiao-ble-nrf52840%e3%81%ae%e9%80%81%e4%bf%a1%e5%87%ba%e5%8a%9b%e3%82%84%e3%82%a2%e3%83%89%e3%83%90%e3%82%bf%e3%82%a4%e3%82%ba%e9%80%81%e4%bf%a1%e9%96%93%e9%9a%94%e3%81%a8%e3%80%81%e9%9b%bb%e6%b3%a2","status":"publish","type":"post","link":"https:\/\/akibabara.com\/blog\/7575.html","title":{"rendered":"XIAO BLE nRF52840\u306e\u9001\u4fe1\u51fa\u529b\u3084\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u9001\u4fe1\u9593\u9694\u3068\u3001\u96fb\u6ce2\u304c\u5c4a\u304f\u8ddd\u96e2\u306e\u95a2\u4fc2\u3092\u5b9f\u9a13\u3057\u3066\u307f\u305f"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712-1024x768.webp\" alt=\"\" class=\"wp-image-7576\" style=\"aspect-ratio:16\/9;object-fit:cover\" srcset=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712-1024x768.webp 1024w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712-300x225.webp 300w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712-768x576.webp 768w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712-1536x1152.webp 1536w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712.webp 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/akibabara.com\/blog\/7539.html\" target=\"_blank\" rel=\"noreferrer noopener\">\u524d\u56de<\/a>\u306f<a href=\"https:\/\/jp.seeedstudio.com\/Seeed-XIAO-BLE-nRF52840-p-5201.html\" target=\"_blank\" rel=\"noreferrer noopener\">XIAO BLE nRF52840<\/a>\u3068\u3044\u3046\u30de\u30a4\u30b3\u30f3\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u6d88\u8cbb\u96fb\u529b\u3092\u8abf\u3079\u3066\u307f\u307e\u3057\u305f\u304c\u3001\u4eca\u56de\u306f\u5b9f\u969b\u306b\u3069\u306e\u304f\u3089\u3044\u307e\u3067\u96fb\u6ce2\u304c\u5c4a\u304f\u306e\u304b\u5b9f\u9a13\u3092\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u6bd4\u8f03\u3059\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306f\u4ee5\u4e0b\u306e3\u70b9\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30fb\u9001\u4fe1\u3059\u308b\u96fb\u6ce2\u306e\u51fa\u529b\u5f37\u5ea6<br>\u30fb\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306e\u9001\u4fe1\u983b\u5ea6<br>\u30fb\u9001\u4fe1\u6a5f\u304b\u3089\u53d7\u4fe1\u6a5f\u307e\u3067\u306e\u8ddd\u96e2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u3092\u5909\u66f4\u3057\u306a\u304c\u3089\u6700\u9069\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u898b\u3064\u3051\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002\u306a\u304a\u3001\u4eca\u56de\u306e\u5b9f\u9a13\u306f\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306b\u30bb\u30f3\u30b5\u30fc\u306e\u30c7\u30fc\u30bf\u3092\u4e57\u305b\u3066\u9001\u4fe1\u3059\u308bIoT\u30c7\u30d0\u30a4\u30b9\u3092\u60f3\u5b9a\u3057\u305f\u5b9f\u9a13\u3067\u3059\u3002\u30da\u30a2\u30ea\u30f3\u30b0\u3092\u884c\u3063\u3066\u901a\u4fe1\u3059\u308b\u5834\u5408\u306f\u307e\u305f\u5909\u308f\u3063\u3066\u304f\u308b\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6e2c\u5b9a\u6761\u4ef6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9001\u4fe1\u5074<br>\u30fbXIAO BLE nRF52840\u3092\u4f7f\u7528<br>\u30fb\u96fb\u6e90\u306f\u30b3\u30a4\u30f3\u96fb\u6c60CR2032\u3092BAT+\/-\u306b\u63a5\u7d9a<br>\u30fb9\u79d2\u9593\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u3092\u9001\u4fe1\u30011\u79d2\u9593\u4f11\u6b62\u3001\u3053\u306e1\u30bb\u30c3\u30c8\u306710\u79d2<br>\u30fb\u3053\u308c\u309210\u56de\u7e70\u308a\u8fd4\u3059<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53d7\u4fe1\u5074<br>\u30fbM5Stack Core2\u3092\u4f7f\u7528<br>\u30fb5\u79d2\u9593\u30b9\u30ad\u30e3\u30f3\u3057\u3066\u53d7\u4fe1\u3057\u305f\u30c7\u30fc\u30bf\u3092\u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\u3057\u3001\u3059\u3050\u306b\u7e70\u308a\u8fd4\u3059<br>\u30fb\u540c\u3058\u30c7\u30fc\u30bf\u3092\u518d\u3073\u53d7\u4fe1\u3057\u305f\u5834\u5408\u306f\u7121\u8996\u3059\u308b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3064\u307e\u308a\u3001\u53d6\u5f97\u3057\u305f\u30c7\u30fc\u30bf\u6570\u306f10\u500b\u306b\u306a\u308c\u3070\u5168\u3066\u306e\u30c7\u30fc\u30bf\u304c\u6b63\u5e38\u306b\u53d7\u4fe1\u3067\u304d\u305f\u3053\u3068\u3092\u610f\u5473\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6e2c\u5b9a\u30d1\u30bf\u30fc\u30f3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">(1) \u9001\u4fe1\u3059\u308b\u96fb\u6ce2\u306e\u51fa\u529b\u5f37\u5ea6<br>Bluefruit.setTxPower() \u3067\u4e0e\u3048\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u3001-40, 0, 4, 8 \u306e4\u30d1\u30bf\u30fc\u30f3\u3067\u8a66\u3057\u307e\u3057\u305f\u3002-40dB\u304c\u6700\u5c0f\u3067\u3001+8dB\u304c\u6700\u5927\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(2) \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306e\u9001\u4fe1\u983b\u5ea6<br>Bluefruit.Advertising.setInterval() \u3067\u4e0e\u3048\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u300132, 64, 128, 256, 384, 512, 1024, 2048, 4096 \u306e9\u30d1\u30bf\u30fc\u30f3\u3067\u8a66\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u6570\u5b57\u306fBLE\u306e\u57fa\u6e96\u306e\u5468\u671f 0.625ms \u306e\u500d\u6570\u3068\u3059\u308b\u5024\u3067\u300132\u306a\u308920ms\u9593\u9694\u3001512\u306a\u3089320ms\u9593\u9694\u3067\u9001\u4fe1\u3055\u308c\u307e\u3059\u3002<br>setInterval()\u306b\u306f2\u3064\u5f15\u6570\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u4eca\u56de\u306f\u540c\u3058\u5024\u306b\u3057\u3066\u3044\u307e\u3059\u3002Bluefruit.Advertising.setFastTimeout(1) \u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u5e38\u306b\u540c\u3058\u9593\u9694\u3067\u51fa\u3059\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(3) \u9001\u4fe1\u6a5f\u304b\u3089\u53d7\u4fe1\u6a5f\u307e\u3067\u306e\u8ddd\u96e2<br>\u4ee5\u4e0b\u306e3\u30d1\u30bf\u30fc\u30f3\u3067\u5b9f\u9a13\u3057\u307e\u3057\u305f\u3002\u7279\u306b\u6700\u5f8c\u306e\u7b87\u6240\u306fWiFi\u3067\u3082\u96fb\u6ce2\u72b6\u6cc1\u304c\u826f\u304f\u306a\u3044\u5834\u6240\u3067\u3059\u3002<br>\u30fb\u7d0450cm\u306e\u81f3\u8fd1\u8ddd\u96e2<br>\u30fb\u7d044m\u3001\u5eca\u4e0b\u3092\u306f\u3055\u3093\u3067\u96a3\u306e\u90e8\u5c4b<br>\u30fb\u7d0415m\u3001\u5eca\u4e0b\u3092\u306f\u3055\u3093\u3067\u96a3\u306e\u96a3\u306e\u90e8\u5c4b<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d7\u30ed\u30b0\u30e9\u30e0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u9001\u4fe1\u5074\uff08XIAO BLE nRF52840\uff09<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-cpp\" data-lang=\"C++\"><code>\/*\n  ble2wifi_client.ino\n  Seeed XIAO BLE nRF52840\u3067\u30d0\u30c3\u30c6\u30ea\u30fc\u96fb\u5727\u7b49\u306e\u30c7\u30fc\u30bf\u3092\u3001BLE\u306e\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30c7\u30fc\u30bf\u306b\u306e\u305b\u3066\u9001\u4fe1\u3059\u308b\n  \n  Copyright (c) 2024 Kaz  (https:\/\/akibabara.com\/blog\/)\n  Released under the MIT license.\n  see https:\/\/opensource.org\/licenses\/MIT\n*\/\n\n#define DEBUG 1\n#include &lt;Arduino.h&gt;\n#if DEBUG == 1\n#include &lt;Adafruit_TinyUSB.h&gt;   \/\/ for Serial\n#endif\n\n\/\/ \u8a2d\u5b9a\nconst uint16_t DEVICE_ID = 1;     \/\/ \u5b50\u6a5fID (advData.id)\nconst uint8_t DEVICE_TYPE = 10;   \/\/ \u5b50\u6a5f\u7a2e\u5225 (advData.type)\n\n\/\/ BLE\u95a2\u9023\n#include &quot;bluefruit.h&quot;\n\n\/\/ \u5916\u90e8QSPI Flash Memory\uff08\u7701\u96fb\u529b\u5316\u306e\u305f\u3081\u306b\u4f7f\u7528\uff09\n#include &lt;Adafruit_SPIFlash.h&gt;\nAdafruit_FlashTransport_QSPI flashTransport;\nAdafruit_SPIFlash flash(&flashTransport);\n\n\/\/ \u9001\u4fe1\u3059\u308b\u30c7\u30fc\u30bf\u306e\u69cb\u9020\u4f53\uff08nRF52840\u3067\u306f2\u30d0\u30a4\u30c8\u672a\u6e80\u306f\u30d1\u30c7\u30a3\u30f3\u30b0\u3055\u308c\u308b\u306e\u3067\u9806\u756a\u306b\u6ce8\u610f\uff09\ntypedef struct {\n  uint8_t maker[4]; \/\/ maker_id \u5b50\u6a5f(nRF52840)\u306e\u8b58\u5225\u7528\n  uint16_t id;    \/\/ \u5b50\u6a5fID\n  uint8_t type;   \/\/ \u5b50\u6a5f\u7a2e\u5225\n  uint8_t ttl;    \/\/ TTL (time to live)\n  uint16_t seq;   \/\/ \u30b7\u30fc\u30b1\u30f3\u30b9\u756a\u53f7   -- \u3053\u3053\u307e\u3067\u5171\u901a\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n  int16_t volt;   \/\/ \u96fb\u5727\u30c7\u30fc\u30bf\n  int16_t temp;   \/\/ \u6e29\u5ea6\u30c7\u30fc\u30bf\n} AdvData;\n AdvData advData = {\n  .maker = { 0xFF, 0xFF, 0x12, 0x35 },\n  .id = DEVICE_ID,\n  .type = DEVICE_TYPE,\n  .ttl = 0,\n  .seq = 1,\n };\n\n\/\/ \u30c7\u30d0\u30c3\u30b0\u306b\u4fbf\u5229\u306a\u30de\u30af\u30ed\u5b9a\u7fa9 --------\n#define sp(x) Serial.println(x)\n#define spn(x) Serial.print(x)\n#define spp(k,v) Serial.println(String(k)+&quot;=&quot;+String(v))\n#define spf(fmt, ...) Serial.printf(fmt, __VA_ARGS__)\n#define array_length(x) (sizeof(x) \/ sizeof(x[0]))\n\n\/\/ \u6e2c\u5b9a\u3057\u3066\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\nvoid measure() {\n  \/\/ \u30d0\u30c3\u30c6\u30ea\u30fc\u96fb\u5727\u306e\u6e2c\u5b9a\n  int vbat_raw = analogRead(PIN_VBAT);\n  int vbat_mv = vbat_raw * 2400 \/ 1023; \/\/ VREF = 2.4V, 10bit A\/D\n  vbat_mv = vbat_mv * 1510 \/ 510;       \/\/ 1M + 510k \/ 510k\n  advData.volt = (int16_t)vbat_mv;\n  if (DEBUG) sp(advData.volt);\n\n  \/\/ CPU\u306e\u6e29\u5ea6\u6e2c\u5b9a\n  advData.temp = (int16_t)(readCPUTemperature() * 100.0);\n\n  \/\/ \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u4e2d\u306a\u3089\u4e00\u65e6\u4e2d\u65ad\uff08\u305f\u3076\u3093\u3057\u306a\u304f\u3066\u3044\u3044\uff09\n  if (Bluefruit.Advertising.isRunning()) {\n    Bluefruit.Advertising.stop();\n  }\n\n  \/\/ \u30c7\u30fc\u30bf\u3092\u9001\u4fe1\n  if (advData.seq &gt; 9999) advData.seq = 0;\n  Bluefruit.Advertising.clearData();\n  Bluefruit.Advertising.addData(BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA, &advData, sizeof(advData));\n  Bluefruit.Advertising.start(9);   \/\/ \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u3092\u958b\u59cb\u3001\u5f15\u6570\u306f\u7d42\u4e86\u3059\u308b\u6642\u9593(s)\n  advData.seq++;\n}\n\n\/\/ \u521d\u671f\u5316\nvoid setup() {\n  if (DEBUG) {\n    Serial.begin(115200);\n    pinMode(LED_RED, OUTPUT);\n    pinMode(LED_GREEN, OUTPUT);\n    pinMode(LED_BLUE, OUTPUT);\n    digitalWrite(LED_RED, HIGH);\n    digitalWrite(LED_GREEN, HIGH);\n    digitalWrite(LED_BLUE, HIGH);\n  }\n\n  \/\/ \u30aa\u30f3\u30dc\u30fc\u30c9QSPI Flash Memory\u3092Deep Power-down\u30e2\u30fc\u30c9\u306b\u3057\u3066\u7701\u96fb\u529b\u5316\u3059\u308b\n  flashTransport.begin();\n  flashTransport.runCommand(0xB9);\n  delayMicroseconds(5);\n  flashTransport.end();\n\n  \/\/ \u30d0\u30c3\u30c6\u30ea\u30fc\u96fb\u5727\u6e2c\u5b9a\u306e\u6e96\u5099\n  analogReference(AR_INTERNAL_2_4); \/\/ VREF = 2.4V\n  analogReadResolution(10);         \/\/ 10bit A\/D\n  pinMode(VBAT_ENABLE, OUTPUT);\n  digitalWrite(VBAT_ENABLE, LOW);   \/\/ VBAT_ENABLE\u3092LOW\u306b\u3059\u308b\u3068\u6e2c\u5b9a\u3067\u304d\u308b\n\n  if (DEBUG) {\n    digitalWrite(LED_RED, LOW);\n    delay(500);\n    digitalWrite(LED_RED, HIGH);\n  }\n\n  \/\/ BLE\u306e\u8a2d\u5b9a\n  Bluefruit.begin();\n  Bluefruit.autoConnLed(false);\n  Bluefruit.setTxPower(0);  \/\/ \u9001\u4fe1\u5f37\u5ea6\u3000\u6700\u5c0f -40, \u6700\u5927 +8 dBm\n  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);\n  Bluefruit.Advertising.setType(BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED);\n  \/\/Bluefruit.Advertising.addData(BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA, &advData, sizeof(advData));\n  Bluefruit.Advertising.setFastTimeout(1);  \/\/ \u9ad8\u901f\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306e\u7d42\u4e86\u6642\u9593 0=\u7d99\u7d9a\uff080\u306b\u3059\u308b\u3068\u306a\u305c\u304bstart()\u304c\u52b9\u304b\u306a\u3044\uff09\n\n  \/\/ WDT\u306e\u8a2d\u5b9a\n  NRF_WDT-&gt;CONFIG         = 0x01;     \/\/ Configure WDT to run when CPU is asleep\n  NRF_WDT-&gt;CRV            = 1+32768*120;    \/\/ CRV = timeout * 32768 + 1\n  NRF_WDT-&gt;RREN           = 0x01;     \/\/ Enable the RR[0] reload register\n  NRF_WDT-&gt;TASKS_START    = 1;        \/\/ Start WDT       \n}\n\n\/\/ \u30e1\u30a4\u30f3\nvoid loop() {\n  int16_t txpowers[4] = { -40, 0, 4, 8 };\n  uint16_t intervals[9] = { 32, 64, 128, 256, 384, 512, 1024, 2048, 4096 };\n  for (int tx=0; tx&lt;4; tx++) {\n    for (int iv=0; iv&lt;9; iv++) {\n      advData.id = tx * 100 + iv;\n      advData.seq = 1;\n      Bluefruit.setTxPower(txpowers[tx]);\n      Bluefruit.Advertising.setInterval(intervals[iv], intervals[iv]);\n      for (int i=0; i&lt;10; i++) {\n        loop_sub();\n      }\n    }\n  }\n  digitalWrite(LED_GREEN, HIGH);\n  digitalWrite(LED_BLUE, HIGH);\n  while (1) {\n    digitalWrite(LED_RED, LOW);\n    delay(500);\n    digitalWrite(LED_RED, HIGH);\n    delay(500);\n    NRF_WDT-&gt;RR[0] = WDT_RR_RR_Reload;\n  }\n}\nvoid loop_sub() {\n  if (DEBUG) {\n    digitalWrite(LED_GREEN, HIGH);\n    digitalWrite(LED_BLUE, LOW);\n  }\n\n  measure();  \/\/ \u6e2c\u5b9a\u3057\u3066\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\n\n  delay(500);\n  if (DEBUG) {\n    digitalWrite(LED_BLUE, HIGH);\n    digitalWrite(LED_GREEN, LOW);\n  }\n  delay(9500);\n\n  \/\/ WDT Update\n  NRF_WDT-&gt;RR[0] = WDT_RR_RR_Reload;\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u53d7\u4fe1\u5074\uff08M5Stack Core2\uff09<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-cpp\" data-lang=\"C++\"><code>\/*\n  ble2wifi_server.ino\n  Seeed XIAO BLE nRF52840\u304b\u3089\u53d7\u4fe1\u3057\u305fBLE\u306e\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30c7\u30fc\u30bf\u3092\u3001WiFi\u3067Web\u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\u3059\u308b\n\n  Copyright (c) 2024 Kaz  (https:\/\/akibabara.com\/blog\/)\n  Released under the MIT license.\n  see https:\/\/opensource.org\/licenses\/MIT\n*\/\n\n#include &lt;M5Unified.h&gt;\n\/\/#include &lt;Arduino.h&gt;\n\n\/\/ \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\n#define WIFI_SSID &quot;xxxx&quot;\n#define WIFI_PASS &quot;xxxx&quot;\nconst String WEB_API_URL = &quot;http:\/\/xxxx\/bletest.php&quot;;  \/\/ \u9001\u4fe1\u5148URL\n\n\/\/ \u8a2d\u5b9a\nconst size_t RCV_CNT_MAX = 10;  \/\/ \u540c\u6642\u306b\u53d7\u4fe1\u3059\u308b\u30c7\u30d0\u30a4\u30b9\u306e\u6700\u5927\u6570\nconst int BLE_SCAN_TIME = 5;    \/\/ BLE\u306e\u30b9\u30ad\u30e3\u30f3\u3092\u884c\u3046\u6642\u9593(s)\nconst char XIAO[4] = { 0xFF, 0xFF, 0x12, 0x35 };   \/\/ XIAO nRF52840\u8b58\u5225\u5024(FFFF\u306f\u56fa\u5b9a)\n\n\/\/ BLE\u95a2\u9023\n#include &lt;BLEDevice.h&gt;\nBLEScan* pBLEScan;\n\n\/\/ Wi-Fi\u95a2\u9023\n#include &lt;WiFi.h&gt;\n#include &lt;HTTPClient.h&gt;\n\n\/\/ \u30b7\u30fc\u30b1\u30f3\u30b9\u756a\u53f7\u306e\u8a18\u61b6\n#include &lt;map&gt;\nstd::map&lt;uint16_t, uint16_t&gt; seqHist;\n\n\/\/ \u30c7\u30d0\u30c3\u30b0\u306b\u4fbf\u5229\u306a\u30de\u30af\u30ed\u5b9a\u7fa9 --------\n#define sp(x) Serial.println(x)\n#define spn(x) Serial.print(x)\n#define spp(k,v) Serial.println(String(k)+&quot;=&quot;+String(v))\n#define spf(fmt, ...) Serial.printf(fmt, __VA_ARGS__)\n\n\/\/ \u305d\u306e\u4ed6\u5b9a\u7fa9\nstruct RcvData {\n  uint16_t id;  \/\/ \u5b50\u6a5fID\n  uint8_t type; \/\/ \u5b50\u6a5f\u7a2e\u5225\n  uint8_t ttl;  \/\/ TTL (time to live)\n  uint16_t seq; \/\/ \u30b7\u30fc\u30b1\u30f3\u30b9\u756a\u53f7\n  float volt;   \/\/ \u30d0\u30c3\u30c6\u30ea\u30fc\u96fb\u5727\n  float temp;   \/\/ SoC\u6e29\u5ea6\n  int16_t rssi; \/\/ \u96fb\u6ce2\u5f37\u5ea6 RSSI -50\u975e\u5e38\u306b\u5f37\u3044\u3000-80\u5f31\u3044\n};\n\n\/\/ Wi-Fi\u63a5\u7d9a\u3059\u308b\nbool wifiConnect() {\n  bool stat = false;\n  if (WiFi.status() != WL_CONNECTED) {\n    Serial.println(&quot;Wifi connecting.&quot;);\n    for (int j=0; j&lt;10; j++) {\n      WiFi.disconnect();\n      WiFi.mode(WIFI_STA);\n      WiFi.begin(WIFI_SSID, WIFI_PASS);  \/\/  Wi-Fi AP\u306b\u63a5\u7d9a\n      for (int i=0; i&lt;10; i++) {\n        if (WiFi.status() == WL_CONNECTED) break;\n        Serial.print(&quot;.&quot;);\n        delay(500);\n      }\n      if (WiFi.status() == WL_CONNECTED) {\n        Serial.println(&quot;connected!&quot;);\n        Serial.println(WiFi.localIP());\n        stat = true;\n        break;\n      } else {\n        Serial.println(&quot;failed&quot;);\n        WiFi.disconnect();\n      }\n    }\n  }\n  return stat;\n}\n\n\/\/ \u521d\u671f\u5316\nvoid setup() {\n  auto cfg = M5.config();\n  M5.begin(cfg); \n\tSerial.begin(115200);\n  delay(1000);\n  sp(&quot;System Start!&quot;);\n\n  \/\/ \u30c7\u30a3\u30b9\u30d7\u30ec\u30a4\u306e\u8a2d\u5b9a\n  M5.Lcd.init();\n  M5.Lcd.setColorDepth(16);\n  M5.Lcd.fillScreen(TFT_BLUE);\n  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);\n  M5.Lcd.setTextSize(2);\n  M5.Lcd.setClipRect(2,2, M5.Lcd.width()-4, M5.Lcd.height()-4);  \/\/\u63cf\u753b\u7bc4\u56f2\n\n  \/\/ Wi-Fi\u63a5\u7d9a\n  wifiConnect();\n\n  \/\/ BLE\u306e\u8a2d\u5b9a\n  sp(&quot;init BLE device...&quot;);\n  BLEDevice::init(&quot;&quot;);\n  pBLEScan = BLEDevice::getScan();\n  pBLEScan-&gt;setActiveScan(false);   \/\/ \u30d1\u30c3\u30b7\u30d6\u30b9\u30ad\u30e3\u30f3\u306b\u3059\u308b\n}\n\n\/\/ \u30e1\u30a4\u30f3\nvoid loop() {\n  RcvData rcvdatas[RCV_CNT_MAX];\n  int rcvcnt = 0;\n\n  \/\/ BLE\u306e\u30b9\u30ad\u30e3\u30f3\u3092\u884c\u3046\n  sp(&quot;\\nscanning...&quot;);\n  BLEScanResults foundDevices = pBLEScan-&gt;start(BLE_SCAN_TIME);\n  int hit = foundDevices.getCount();\n  spf(&quot;found&quot;, hit);\n\n  \/\/ \u53d7\u4fe1\u3057\u305f\u4e00\u89a7\u304b\u3089\u5bfe\u8c61\u30c7\u30d0\u30a4\u30b9\u3092\u62bd\u51fa\u3059\u308b\n  for (int i=0; i&lt;hit; i++) {\n    BLEAdvertisedDevice dev = foundDevices.getDevice(i);\n    std::string data = dev.getManufacturerData();\n\n    \/\/ debug\n    if (data[0] == XIAO[0] && data[1] == XIAO[1]) {\n      String tmpinfo = &quot;&quot;;\n      spf(&quot;Scanned: Device_%03d (%02d): &quot;, i, data.length());\n      for (int j=0; j&lt;data.length(); j++) spf(&quot;%02X &quot;,data[j]);\n      sp(&quot;&quot;);\n    }\n\n    \/\/ XIAO nRF52840\u304b\u3089\u306e\u30c7\u30fc\u30bf\u3060\u3063\u305f\u3089\u5024\u3092\u683c\u7d0d\u3059\u308b\n    if (data.length() &lt; 14) continue;\n    if (data[0] == XIAO[0] && data[1] == XIAO[1] && data[2] == XIAO[2] && data[3] == XIAO[3]) {\n      rcvdatas[rcvcnt].id = data[5] &lt;&lt; 8 | data[4];\n      rcvdatas[rcvcnt].type = data[6];\n      rcvdatas[rcvcnt].ttl = data[7];\n      rcvdatas[rcvcnt].seq = data[9] &lt;&lt; 8 | data[8];\n      if (seqHist[rcvdatas[rcvcnt].id] == rcvdatas[rcvcnt].seq) continue;  \/\/ \u540c\u3058\u30c7\u30fc\u30bf\u306f\u7121\u8996\n      seqHist[rcvdatas[rcvcnt].id] = rcvdatas[rcvcnt].seq;\n      if (rcvdatas[rcvcnt].type == 10) {  \/\/ \u7a2e\u522510: \u5b9f\u9a13\u7528 volt(i2) temp(i2)\n        rcvdatas[rcvcnt].volt = (float)(data[11] &lt;&lt; 8 | data[10]) \/ 1000.00;\n        rcvdatas[rcvcnt].temp = (float)(data[13] &lt;&lt; 8 | data[12]) \/ 100.00;\n        rcvdatas[rcvcnt].rssi = (uint16_t)dev.getRSSI();  \/\/ \u96fb\u6ce2\u5f37\u5ea6\n        rcvcnt ++;\n      }\n      if (rcvcnt &gt;= RCV_CNT_MAX) break;\n    }\n  }\n\n  \/\/ \u30c7\u30a3\u30b9\u30d7\u30ec\u30a4\u306b\u8868\u793a\n  if (rcvcnt &gt; 0) {\n    M5.Lcd.fillScreen(TFT_BLACK);\n    M5.Lcd.setCursor(2, 4);\n    for (int i=0; i&lt;rcvcnt; i++) {\n      M5.Lcd.printf(&quot;%02X %.2fV %.1fC %d %d\\n&quot;, rcvdatas[i].id, rcvdatas[i].volt, rcvdatas[i].temp, rcvdatas[i].rssi, rcvdatas[i].seq);\n    }\n  } else {\n    M5.Lcd.println(&quot;no data found&quot;);\n  }\n\n  \/\/ \u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\u3059\u308b\n  if (rcvcnt &gt; 0) {\n    postServer(rcvdatas, rcvcnt);\n  }\n\n  delay(10);\n}\n\n\/\/ Web\u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\nvoid postServer(struct RcvData* td, int cnt) {\n  HTTPClient http;\n  sp(&quot;Send to Web Server&quot;);\n\n  \/\/ POST\u30c7\u30fc\u30bf\u4f5c\u6210\n  String jsonData = &quot;{\\&quot;data\\&quot;:[&quot;;\n  char buff[64];\n  for (int i=0; i&lt;cnt; i++) {\n    sprintf(buff, &quot;{\\&quot;id\\&quot;:%d,&quot;, td[i].id);\n    jsonData += buff;\n    sprintf(buff, &quot;\\&quot;volt\\&quot;:%.2f,&quot;, td[i].volt);\n    jsonData += buff;\n    sprintf(buff, &quot;\\&quot;temp\\&quot;:%.1f,&quot;, td[i].temp);\n    jsonData += buff;\n    sprintf(buff, &quot;\\&quot;rssi\\&quot;:%d,&quot;, td[i].rssi);\n    jsonData += buff;\n    sprintf(buff, &quot;\\&quot;seq\\&quot;:%d}&quot;, td[i].seq);\n    jsonData += buff;\n    if (i &lt; cnt-1) jsonData += &quot;,&quot;;\n  }\n  jsonData += &quot;],\\&quot;count\\&quot;:&quot;+String(cnt)+&quot;}&quot;;\n  sp(jsonData);\n\n  \/\/ \u9001\u4fe1\n  http.begin(WEB_API_URL); \/\/HTTP\n  http.addHeader(&quot;Content-Type&quot;, &quot;application\/x-www-form-urlencoded&quot;);\n  http.addHeader(&quot;Content-Length&quot;, String(jsonData.length()));\n  http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS);\n  int httpCode = http.POST(jsonData);\n  sp(&quot;[HTTP] POST... code: %d\\n&quot;+String(httpCode));\n\n  \/\/ \u9001\u4fe1\u5f8c\u306e\u51e6\u7406\n  if (httpCode == HTTP_CODE_OK) {\n    String payload = http.getString();\n    sp(payload);\n  } else {\n    sp(&quot;[HTTP] POST... failed, error: %s\\n&quot;+String(httpCode));\n  }\n  http.end();\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Web\u30b5\u30fc\u30d0\u30fc\u5074\uff08Linux\uff09<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\/\/\n\/\/ M5Stack\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3092CSV\u306b\u683c\u7d0d\u3059\u308b\n\/\/\n\n\/\/ \u8a2d\u5b9a\n$SAVE_DIR = &quot;\/path\/to\/savedir&quot;;\t\/\/ \u4fdd\u5b58\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff08\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u5909\u66f4\u3092\u5fd8\u308c\u305a\u306b\uff09\n$PREFIX = &quot;xiao&quot;;\t\/\/ \u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\n\n\/\/ \u5f15\u6570\u3092\u53d6\u308a\u8fbc\u307f\n$text = file_get_contents(&quot;php:\/\/input&quot;);\n$json = json_decode($text, true);\nif (!is_numeric($json[&#39;count&#39;] ?? null) || !is_array($json[&#39;data&#39;] ?? null)) {\n\theader(&quot;HTTP\/1.1 400 Bad Request&quot;);\n\texit;\n}\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\n$update = 0;\nif (count($json[&#39;data&#39;]) &gt; 0) {\n\tforeach ($json[&#39;data&#39;] as $dd) {\n\t\tif (!is_numeric($dd[&#39;id&#39;] ?? null)) continue;\n\t\t$seq_path = sprintf(&quot;%s\/%s_%d.seq&quot;, $SAVE_DIR, $PREFIX, $dd[&#39;id&#39;]);\n\t\t$csv_path = sprintf(&quot;%s\/%s_%d.csv&quot;, $SAVE_DIR, $PREFIX, $dd[&#39;id&#39;]);\n\t\t$allcsv_path = sprintf(&quot;%s\/%s_all.csv&quot;, $SAVE_DIR, $PREFIX);\n\t\t$last_seq = (file_exists($seq_path)) ? file_get_contents($seq_path) : -1;\n\t\tif ($dd[&#39;seq&#39;] != $last_seq) {\n\t\t\t$csv = [\n\t\t\t\tdate(&quot;Y-m-d H:i:s&quot;),\n\t\t\t\t$dd[&#39;id&#39;],\n\t\t\t\t$dd[&#39;volt&#39;],\n\t\t\t\t$dd[&#39;temp&#39;],\n\t\t\t\t$dd[&#39;rssi&#39;],\n\t\t\t\t$dd[&#39;seq&#39;],\n\t\t\t];\n\t\t\t$str = join(&quot;,&quot;,$csv).&quot;\\n&quot;;\n\t\t\terror_log($str, 3, $csv_path);\n\t\t\terror_log($str, 3, $allcsv_path);\n\t\t\tfile_put_contents($seq_path, $dd[&#39;seq&#39;]);\n\t\t\t$update ++;\n\t\t}\n\t}\n}\n\n\/\/ \u7d42\u4e86\n$json = [ &#39;update&#39;=&gt; $update ];\nheader(&quot;Content-Type: application\/json; charset=utf-8&quot;);\necho json_encode($json);\nexit;\n\n?&gt;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u6e2c\u5b9a\u7d50\u679c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u305d\u308c\u305e\u308c\u306e\u8ddd\u96e2\u5225\u306e\u6e2c\u5b9a\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002\u7e26\u8ef8\u306f\u53d7\u4fe1\u306b\u6210\u529f\u3057\u305f\u56de\u6570\u3067\u300110\u306f100%\u6210\u529f\u3067\u3059\u3002\u6a2a\u8ef8\u306e\u300cAI nn\u300d\u306fBluefruit.Advertising.setInterval()\u306b\u4e0e\u3048\u305f\u6570\u5b57\u3067\u3001\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306e\u983b\u5ea6\u3067\u3059\u3002\uff080.625*nn\u79d2\uff09<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a03b93fc0031&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a03b93fc0031\" class=\"wp-block-image size-large is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"615\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_50-1024x615.webp\" alt=\"\" class=\"wp-image-7584\" style=\"width:540px\" srcset=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_50-1024x615.webp 1024w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_50-300x180.webp 300w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_50-768x462.webp 768w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_50-1536x923.webp 1536w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_50.webp 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u3059\u3050\u6a2a\u306b\u7f6e\u3044\u305f\u3088\u3046\u306a\u72b6\u614b\u3067\u3057\u305f\u304c\u3001\u51fa\u529b\u304c-40dB\u306e\u3068\u304d\u306f\u3061\u3087\u3063\u3068\u53b3\u3057\u3044\u3088\u3046\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a03b93fc059d&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a03b93fc059d\" class=\"wp-block-image size-large is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"617\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_400-1024x617.webp\" alt=\"\" class=\"wp-image-7585\" style=\"width:540px\" srcset=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_400-1024x617.webp 1024w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_400-300x181.webp 300w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_400-768x463.webp 768w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_400-1536x926.webp 1536w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_400.webp 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5225\u306e\u90e8\u5c4b\u306b\u7f6e\u3044\u305f\u5834\u5408\u3001\u51fa\u529b-40dB\u306f\u5168\u6ec5\u3067\u3057\u305f\u304c\u3001\u305d\u308c\u4ee5\u5916\u306f\u3051\u3063\u3053\u3046\u3044\u3051\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a03b93fc0ac1&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a03b93fc0ac1\" class=\"wp-block-image size-large is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"618\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_1500-1024x618.webp\" alt=\"\" class=\"wp-image-7586\" style=\"width:540px\" srcset=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_1500-1024x618.webp 1024w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_1500-300x181.webp 300w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_1500-768x463.webp 768w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_1500-1536x926.webp 1536w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_1500.webp 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u8907\u6570\u306e\u90e8\u5c4b\u3092\u307e\u305f\u3044\u3060\u53b3\u3057\u3044\u6761\u4ef6\u3067\u306f\u3001\u9001\u4fe1\u51fa\u529b\u306b\u3088\u3063\u3066\u5927\u304d\u306a\u5dee\u304c\u3042\u308a\u307e\u3057\u305f\u3002\u51fa\u529b+4dB\u306a\u3089\u3070\u3001\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306e\u983b\u5ea6\u3092\u4e0b\u3052\u3066\u3082\u6b63\u5e38\u306b\u53d7\u4fe1\u3067\u304d\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6d88\u8cbb\u96fb\u6d41\u306e\u8abf\u67fb<\/h2>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a03b93fc0ff7&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a03b93fc0ff7\" class=\"wp-block-image size-large is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"821\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentscan-1024x821.webp\" alt=\"\" class=\"wp-image-7581\" style=\"width:360px\" srcset=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentscan-1024x821.webp 1024w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentscan-300x241.webp 300w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentscan-768x616.webp 768w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentscan.webp 1496w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u7d9a\u3044\u3066\u9001\u4fe1\u51fa\u529b vs \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u9001\u4fe1\u9593\u9694\u306e\u6d88\u8cbb\u96fb\u6d41\u3092\u6e2c\u5b9a\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u6e2c\u5b9a\u306f\u5148\u307b\u3069\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u30d9\u30fc\u30b9\u306b\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u4f59\u8a08\u306a\u6d88\u8cbb\u96fb\u6d41\u3092\u7701\u304f\u305f\u3081\u306bLED\u306e\u70b9\u706f\u3092\u3084\u3081\u3066\u3044\u307e\u3059\u3002\u96fb\u6e90\u306fPPK2\u304b\u30893000mV\u3092\u4e0e\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-576970a631de953460788d215dce1c12 wp-block-paragraph\">\u203b\u753b\u50cf\u306bMA\u3068\u66f8\u3044\u3066\u3042\u308a\u307e\u3059\u304c\u9593\u9055\u3044\u3067\u3059\u3002\u6b63\u3057\u304f\u306f\u03bcA\u3067\u3059\u3002<sub>\uff08Excel\u306e\u30b0\u30e9\u30d5\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304c\u52dd\u624b\u306b\u5185\u5bb9\u3092\u66f8\u304d\u63db\u3048\u3066\u3057\u307e\u3046\uff57<\/sub>\uff09<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a03b93fc15bf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a03b93fc15bf\" class=\"wp-block-image size-large is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"560\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentav-2-1024x560.webp\" alt=\"\" class=\"wp-image-7587\" style=\"width:640px\" srcset=\"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentav-2-1024x560.webp 1024w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentav-2-300x164.webp 300w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentav-2-768x420.webp 768w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentav-2-1536x840.webp 1536w, https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_currentav-2.webp 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u3055\u3059\u304c\u306b\u9ad8\u51fa\u529b\u3092\u9ad8\u983b\u5ea6\u3067\u884c\u3046\u3068\u7d50\u69cb\u98df\u3044\u307e\u3059\u306d\u3002\u3068\u3044\u3063\u3066\u3082\u6700\u9ad8\u3067\u30821.3mA\u304f\u3089\u3044\u3067\u3059\u304b\u3089\u3001\u6ec5\u8336\u82e6\u8336\u7701\u96fb\u529b\u306a\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4eca\u307e\u3067\u306e\u5b9f\u9a13\u7d50\u679c\u304b\u3089\u3001\u8ddd\u96e2\u306b\u5bfe\u3057\u3066\u306f\u983b\u5ea6\u3088\u308a\u3082\u51fa\u529b\u3092\u4e0a\u3052\u308b\u65b9\u304c\u52b9\u679c\u7684\u306a\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3057\u305f\u306e\u3067\u3001\u51fa\u529b\u306f4dB\u304b8dB\u304f\u3089\u3044\u306b\u4e0a\u3052\u3066\u3001\u983b\u5ea6\u3092256\uff08160mS\uff09\u3042\u305f\u308a\u306b\u3059\u308b\u306e\u304c\u3001\u5b9f\u7528\u7684\u3067\u7701\u96fb\u529b\u3067\u3044\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-cpp\" data-lang=\"C++\"><code>Bluefruit.setTxPower(4);\nBluefruit.Advertising.setInterval(256, 256);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u306a\u3089\u5e73\u5747 146uA \u304f\u3089\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9f\u969b\u306f\u90e8\u5c4b\u306e\u69cb\u9020\u3060\u3063\u305f\u308a\u53d7\u4fe1\u5074\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306a\u3069\u3001\u74b0\u5883\u306b\u3088\u3063\u3066\u5909\u308f\u3063\u3066\u304f\u308b\u3068\u601d\u3044\u307e\u3059\u306e\u3067\u3001\u3061\u3087\u3046\u3069\u826f\u3044\u3068\u3053\u308d\u3092\u63a2\u3057\u3066\u307f\u308b\u3068\u3044\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u56de\u306fXIAO BLE nRF52840\u3068\u3044\u3046\u30de\u30a4\u30b3\u30f3\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u6d88\u8cbb\u96fb\u529b\u3092\u8abf\u3079\u3066\u307f\u307e\u3057\u305f\u304c\u2026<\/p>\n","protected":false},"author":1,"featured_media":7576,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[130,141,142],"class_list":{"0":"post-7575","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-other-topic","8":"tag-arduino","9":"tag-nrf52840","10":"tag-xiao","11":"three-column","12":"ar-three-column","13":"au-three-column"},"jetpack_featured_media_url":"https:\/\/akibabara.com\/blog\/wp-content\/uploads\/2024\/11\/xn_IMG_8712.webp","jetpack_shortlink":"https:\/\/wp.me\/pavCgQ-1Yb","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/posts\/7575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/comments?post=7575"}],"version-history":[{"count":12,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/posts\/7575\/revisions"}],"predecessor-version":[{"id":7596,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/posts\/7575\/revisions\/7596"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/media\/7576"}],"wp:attachment":[{"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/media?parent=7575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/categories?post=7575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/akibabara.com\/blog\/wp-json\/wp\/v2\/tags?post=7575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}