
{"id":7007,"date":"2018-04-09T17:12:21","date_gmt":"2018-04-09T08:12:21","guid":{"rendered":"https:\/\/okiraku-camera.tokyo\/blog\/?page_id=7007"},"modified":"2018-04-17T12:51:42","modified_gmt":"2018-04-17T03:51:42","slug":"bme280-%e6%b8%ac%e5%ae%9a%e3%82%b9%e3%82%b1%e3%83%83%e3%83%811","status":"publish","type":"page","link":"https:\/\/okiraku-camera.tokyo\/blog\/?page_id=7007","title":{"rendered":"bme280 \u6e2c\u5b9a\u30b9\u30b1\u30c3\u30c11"},"content":{"rendered":"<p>ESP-WROOM-02\u3068BME280\u3092\u4f7f\u3063\u305f\u6e29\u5ea6\u6e2c\u5b9a\u306b\u95a2\u4fc2\u3059\u308b\u57fa\u672c\u7684\u306a\u30bd\u30fc\u30b9\u985e\u3092\u307e\u3068\u3081\u305f\u3002\u6982\u8981\u3084\u56de\u8def\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/okiraku-camera.tokyo\/blog\/?p=6958\">\u3053\u3061\u3089\u3092\u53c2\u7167<\/a>\u306e\u3053\u3068\u3002<\/p>\n<h1>\u76ee\u6b21<\/h1>\n<ol>\n<li><a href=\"#1\">\u6539\u826f\u524d\u30e1\u30a4\u30f3\u30b9\u30b1\u30c3\u30c1(ESP_BME280-1.ino)<\/a><\/li>\n<li><a href=\"#2\">\u30bb\u30f3\u30b5\u30fc\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9(hdc1000_bmc280.h)<\/a><\/li>\n<li><a href=\"#3\">\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u30b9\u30af\u30ea\u30d7\u30c8(create_table.sql)<\/a><\/li>\n<li><a href=\"#4\">\u30b5\u30fc\u30d0\u30fc\u5074\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9(envdata_db.php)<\/a><\/li>\n<li><a href=\"#5\">\u30b5\u30fc\u30d0\u30fc\u5074\u30c7\u30fc\u30bf\u683c\u7d0d\u30b9\u30af\u30ea\u30d7\u30c8(store_data.php)<\/a><\/li>\n<\/ol>\n<h2 id=\"1\">ESP_BME280-1.ino<\/h2>\n<p>\u6d88\u8cbb\u96fb\u6d41\u3092\u8003\u616e\u3057\u3066\u3044\u306a\u3044\u5f53\u521d\u306e\u30b9\u30b1\u30c3\u30c1\u3002ESP8266 Arduino Core 2.4.0 \u3092\u4f7f\u3063\u3066\u30d3\u30eb\u30c9\u3002<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;ESP8266WiFi.h&gt;\r\n#include \"hdc1000_bme280.h\"\r\nextern \"C\" {\r\n  #include \"user_interface.h\"\r\n}\r\n#define START_MSG \"\\n\" + String(__FILE__) + \" start.\"\r\n#if 1\r\n#define SERIAL_INIT(a)  Serial.begin(a)\r\n#define SERIAL_OUT(a) Serial.println(a)\r\n#else\r\n#define SERIAL_INIT(a)\r\n#define SERIAL_OUT(a)\r\n#endif\r\n#define LED1 15\r\n#define MEASURE_INTERVAL_SECONDS  180\r\n\r\nbme280 bmp280(0x76);\r\n\r\n\/\/ wifi\r\nconst char* ssid = \"ssid\";\r\nconst char* password = \"password\";\r\nconst char* remote_host = \"host_ipaddress\";\r\n\r\nvoid die(int msec, const char* cp) {\r\n  if (cp)\r\n    SERIAL_OUT(cp);\r\n  for(;;) {\r\n    digitalWrite(LED1, 1);\r\n    delay(msec);\r\n    digitalWrite(LED1, 0);\r\n    delay(msec);\r\n  }\r\n}\r\n\r\nvoid deep_sleep(int seconds) {\r\n  SERIAL_OUT(\"deep_sleep()\");\r\n  ESP.deepSleep(seconds * 1000 * 1000, WAKE_RF_DEFAULT);\r\n  delay(10);\r\n}\r\nbool ap_connect() {\r\n  SERIAL_OUT(\"\\nstart ap_connect()\");\r\n  WiFi.mode(WIFI_STA);\r\n  wifi_station_set_auto_connect(false);\r\n  WiFi.begin(ssid, password); \r\n  delay(200);\r\n  int n;\r\n  int count = 0;\r\n  int retry = 0;\r\n  while ((n = WiFi.status()) != WL_CONNECTED) {\r\n    SERIAL_OUT(String(n) + \" \");\r\n    delay(500);\r\n    if (n == WL_NO_SSID_AVAIL || n == WL_CONNECT_FAILED) {\r\n      WiFi.reconnect();\r\n      count = 0;\r\n      retry++;\r\n    }\r\n    if (count++ &gt; 30 || retry &gt; 10) {\r\n      SERIAL_OUT(\"\");\r\n      return false;\r\n    }\r\n  }\r\n  SERIAL_OUT(\"\\nap_connect() done.\");\r\n  return true;\r\n}\r\n\r\nvoid ap_disconnect() {\r\n  if (WiFi.status() != WL_CONNECTED)\r\n    return;  \r\n  WiFi.disconnect();\r\n  int n;\r\n  while ((n = WiFi.status()) != WL_IDLE_STATUS) {\r\n    SERIAL_OUT(String(n) + \" \");\r\n    delay(50);\r\n  }        \r\n  SERIAL_OUT(\"ap_disconnect() done.\");\r\n}\r\n\r\nbool wifi_send_data(float temp, float humi, float bpress, float vbat) {\r\n  SERIAL_OUT(\"start wifi_send_data()\");\r\n  WiFiClient client;\r\n  if (!client.connect(remote_host, 80))\r\n    return false;\r\n  String request = \"\/store_data.php?point_id=\" + WiFi.macAddress() + \"&amp;T=\" + String(temp) + \"&amp;H=\" + String(humi) + \r\n      \"&amp;P=\" + String(bpress) + \"&amp;V=\" + String(vbat);\r\n  String req_line = \"GET \" + request + \" HTTP\/1.1\\r\\nHost: \" + String(remote_host) + \"\\r\\nConnection: close\\r\\n\\r\\n\";\r\n  client.print(req_line);\r\n  int count = 0;\r\n  while(!client.available()) {  \/\/ waif for response.\r\n    delay(50);\r\n    count++;            \r\n      if (count &gt;= 200) {  \/\/ limit = 10secs.\r\n        return false;\r\n      }\r\n  }\r\n  while(client.available()){\r\n    String line = client.readStringUntil('\\n');\r\n    SERIAL_OUT(line);\r\n    delay(1);\r\n  }\r\n  return true;  \r\n}\r\n\r\nvoid setup() {\r\n  delay(10);\r\n  SERIAL_INIT(115200);\r\n  SERIAL_OUT(START_MSG);\r\n  \r\n  pinMode(LED1, OUTPUT);\r\n  digitalWrite(LED1, 1);\r\n  if (!bmp280.init())\r\n    die(500, \"FATAL: BMP280 init failed.\");\r\n  if (!ap_connect()) {\r\n      deep_sleep(30);  \/\/ reset myself after a  while.\r\n      return;\r\n  }\r\n  float vbat = 570.0 * system_adc_read() \/ 1024.0;  \/\/ 100\u500d\u3057\u305f\u96fb\u5727\u3002470K + 100K\u3067\u306e\u5206\u5727\u6642 570 \/ 100 = 5.7\r\n  bmp280.measure();\r\n  SERIAL_OUT(\"\\nPa = \" + String(bmp280.press) + \", Temp = \" + String(bmp280.temp) + \", Humi = \" + String(bmp280.humi) + \", Vbat = \" + String(vbat));\r\n  wifi_send_data(bmp280.temp, bmp280.humi, bmp280.press, vbat);\r\n  ap_disconnect();\r\n  deep_sleep(MEASURE_INTERVAL_SECONDS);\r\n}\r\n\r\nvoid loop() {\r\n  delay(100);\r\n}<\/pre>\n<h2>\u89e3\u8aac<\/h2>\n<p>\u3053\u306e\u30b9\u30b1\u30c3\u30c1\u306f\u3001\u4e0b\u306b\u8f09\u305b\u305f\u30bb\u30f3\u30b5\u30fc\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u7528\u306ehdc1000_bme280.h \u3068\u540c\u3058\u30d5\u30a9\u30eb\u30c0\u306b\u5165\u308c\u3066\u304a\u304f\u3002\u305d\u3046\u3059\u308b\u3053\u3068\u3067\u3001Arduino IDE\u3092\u958b\u3044\u305f\u3068\u304d\u306b\u5404\u30d5\u30a1\u30a4\u30eb\u3092\u30bf\u30d6\u3067\u9078\u629e\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n<h3>\u5b9a\u7fa9\u3001\u5b9a\u6570\u95a2\u4fc2<\/h3>\n<p>\u30b9\u30b1\u30c3\u30c1\u3092\u4f5c\u308b\u3068\u304d\u306f\u30b7\u30ea\u30a2\u30eb\u30e2\u30cb\u30bf\u306b\u3044\u308d\u3044\u308d\u306a\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3055\u305b\u308b\u304c\u3001\u5b9f\u7a3c\u50cd\u6642\u306b\u306f\u4e0d\u8981\u306b\u306a\u306e\u3067<em>Serial<\/em> \u3092\u4f7f\u3046\u90e8\u5206\u306f#if \uff5e #endif\u30d6\u30ed\u30c3\u30af\u306b\u56f2\u3093\u3060\u3002<\/p>\n<p><span class=\"lang:default decode:true crayon-inline\">#define MEASURE_INTERVAL_SECONDS 180<\/span>\u00a0\u306f\u3001\u6e2c\u5b9a\u9593\u9694\u306e\u79d2\u6570\u3092\u5b9a\u7fa9\u3057\u3066\u304a\u308a\u30011000000\u500d\u3057\u3066<em>\u00a0ESP.deepSleep();<\/em> \u306b\u6e21\u3059\u3002<\/p>\n<p><span class=\"lang:default decode:true crayon-inline \">bme280 bmp280(0x76);<\/span>\u00a0 \u306b\u3088\u3063\u3066<em>bme280<\/em>\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\u3057\u3066\u304a\u308a\u3001\u5f15\u6570\u306e0x76\u3067i2c\u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u3066\u3044\u308b\u3002\u3053\u306e\u30a2\u30c9\u30ec\u30b9\u306b\u63a5\u7d9a\u3055\u308c\u3066\u3044\u308b\u30bb\u30f3\u30b5\u30fc\u304cBME280\u306a\u306e\u304bBMP280\u306a\u306e\u304b\u306e\u8b58\u5225\u306f<em>bme280<\/em>\u30af\u30e9\u30b9\u5185\u3067\u884c\u3063\u3066\u3044\u308b\u3002\u3053\u306e\u30b9\u30b1\u30c3\u30c1\u306f\u3001\u4ee5\u524dBMP280\u7528\u306b\u4f5c\u3063\u305f\u3082\u306e\u3092\u6d41\u7528\u3057\u305f\u306e\u3067\u5909\u6570\u540d\u304c<em>bmp280<\/em>\u306b\u306a\u3063\u3066\u3044\u308b\u3002<\/p>\n<p><em>ssid, password, remote_host<\/em>\u306f\u3001\u63a5\u7d9a\u5148\u306eWiFi\u30a2\u30af\u30bb\u30b9\u30dd\u30a4\u30f3\u30c8\u306b\u63a5\u7d9a\u3059\u308b\u305f\u3081\u306e\u60c5\u5831\u3068\u3001\u30c7\u30fc\u30bf\u9001\u4fe1\u5148\u306e\u30ea\u30e2\u30fc\u30c8\u30db\u30b9\u30c8\u306e\u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u3066\u3044\u308b\u3002<\/p>\n<h3>void deep_sleep(int seconds)<\/h3>\n<p>\u30c7\u30a3\u30fc\u30d7\u30b9\u30ea\u30fc\u30d7\u3059\u308b\u79d2\u6570\u3092\u6307\u5b9a\u3059\u308b\u3002\u3053\u306e\u95a2\u6570\u5185\u3067\u306f\u3001 <span class=\"lang:default decode:true crayon-inline\">ESP.deepSleep(seconds * 1000 * 1000, WAKE_RF_DEFAULT);<\/span>\u00a0\u00a0\u3092\u547c\u3076\u3053\u3068\u3067\u3001\u30b9\u30ea\u30fc\u30d7\u6642\u9593\u3092\u03bc\u79d2\u5358\u4f4d\u306b\u3057\u3066\u6e21\u3057\u3066\u3044\u308b\u3002\u3053\u306e\u95a2\u6570\u304c\u547c\u3073\u51fa\u3059\u00a0<em>EspClass::deepSleep()<\/em>\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u30b9\u30ea\u30fc\u30d7\u6642\u9593\u3092 32\u30d3\u30c3\u30c8\u306e\u7b26\u53f7\u306a\u3057\u6574\u6570\u3067\u53d7\u3051\u308b\u304b\u3089\u3001\u6700\u5927\u3067 UINT_MAX \u03bc\u79d2\u307e\u3067\u6307\u5b9a\u53ef\u80fd\u3068\u306a\u308b\u3002\u5177\u4f53\u7684\u306b\u306f\u7d044295\u79d2 \u2252 71.6\u5206\u307e\u3067\u6307\u5b9a\u53ef\u80fd\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u308b\u3002<\/p>\n<p>\u306a\u304a\u3001<em>EspClass::deepSleep()<\/em> \u5185\u3067\u306f\u3001<em>system_deep_sleep();<\/em> \u3068\u3044\u3046SDK\u306eAPI\u306b\u53d7\u3051\u53d6\u3063\u305f\u5f15\u6570\u3092\u305d\u306e\u307e\u307e\u6e21\u3057\u3066\u3044\u308b\u3002SDK \u5074\u306f 64\u30d3\u30c3\u30c8\u306e\u7b26\u53f7\u306a\u3057\u6574\u6570\u3092\u53d7\u3051\u4ed8\u3051\u308b\u306e\u3067\u3001\u306f\u308b\u304b\u306b\u9577\u3044\u6642\u9593\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3002\u73fe\u6bb5\u968e\u3067\u306f Arduino Core 2.4\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u306e\u3067uint32_t\u3067\u30c7\u30a3\u30fc\u30d7\u30b9\u30ea\u30fc\u30d7\u6642\u9593\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u304c\u3001\u5c06\u6765\u7684\u306b\u306f uint64_t\u3067\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u306e\u304b\u3082\u3057\u308c\u306a\u3044\u3002<\/p>\n<p>\u203b <em>ESP8266\u00a0Arduino Core 2.4.1 \u306b\u304a\u3044\u3066\u3001ESP.deepSleep() \u306e\u5f15\u6570\u306f\u00a0uint64_t\u00a0 <\/em>\u306b\u5909\u66f4\u3055\u308c\u305f\u3002<a href=\"https:\/\/github.com\/esp8266\/Arduino\/releases\">https:\/\/github.com\/esp8266\/Arduino\/releases<\/a> \u3092\u53c2\u7167\u3002<\/p>\n<h3>bool ap_connect()<\/h3>\n<p>WiFi\u30a2\u30af\u30bb\u30b9\u30dd\u30a4\u30f3\u30c8\u306b\u63a5\u7d9a\u3059\u308b\u305f\u3081\u306e\u95a2\u6570\u3002\u4ee5\u524d\u304b\u3089\u7591\u3044\u3082\u306a\u304f\u4f7f\u3063\u3066\u3044\u308b\u304c\u3001\u63a5\u7d9a\u304c\u5b8c\u4e86\u3059\u308b\u307e\u30677\uff5e10\u79d2\u307b\u3069\u304b\u304b\u3063\u3066\u3057\u307e\u3046\u3002\u52d5\u4f5c\u306e\u958b\u59cb\u304b\u3089deep sleep\u306b\u5165\u308b\u307e\u3067\u306e\u6642\u9593\u306e\u307b\u3068\u3093\u3069\u306f\u3053\u306e\u95a2\u6570\u304c\u8cbb\u3084\u3057\u3066\u3057\u307e\u3046\u306e\u3067\u3001\u96fb\u6c60\u306e\u30e2\u30c1\u3092\u8003\u3048\u308b\u3068\u6539\u5584\u3059\u3079\u304d\u90e8\u5206\u3002\u63a5\u7d9a\u6642\u9593\u30923\u79d2\u4ee5\u4e0b\u306b\u77ed\u7e2e\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u306f\u672c\u6587\u5074\u306b\u63b2\u8f09\u3057\u305f\u3002<\/p>\n<h3>void ap_disconnect()<\/h3>\n<p>WiFi\u30a2\u30af\u30bb\u30b9\u30dd\u30a4\u30f3\u30c8\u304b\u3089\u5207\u65ad\u3059\u308b\u305f\u3081\u306e\u95a2\u6570\u3002\u3084\u306f\u308a\u6b74\u53f2\u7684\u306b\u4f7f\u3044\u7d9a\u3051\u3066\u3044\u308b\u3002<\/p>\n<h3>bool wifi_send_data(float temp, float humi, float\u00a0 press, float vbat)<\/h3>\n<p><em>remote_host<\/em> \u3067\u6307\u5b9a\u306e\u30db\u30b9\u30c8\u306e\u30dd\u30fc\u30c880\u306btcp\u63a5\u7d9a\u3057\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u6e29\u5ea6\u3001\u76f8\u5bfe\u6e7f\u5ea6\u3001\u6c17\u5727\u304a\u3088\u3073\u96fb\u6c60\u96fb\u5727\u3092HTTP 1.1\u306eGET\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u9001\u4fe1\u3059\u308b\u3002\u30ea\u30af\u30a8\u30b9\u30c8\u5185\u5bb9\u306f\u3001<span class=\"lang:default decode:true crayon-inline\">\/store_data.php?point_id=mac_addr&amp;T=temp&amp;H=humi&amp;P=press&amp;V=vbat<\/span>\u00a0 \u3002<\/p>\n<p>\u9001\u4fe1\u5f8c\u3001\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u53d7\u3051\u53d6\u308a\u30b7\u30ea\u30a2\u30eb\u30e2\u30cb\u30bf\u306b\u8868\u793a\u3059\u308b\u3002\u4f8b\u3048\u3070\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u3084\u30dc\u30c7\u30a3\u5185\u306e\u6587\u5b57\u5217\u3092\u89e3\u91c8\u3057\u3066\u30dc\u30fc\u30c9\u5074\u306e\u52d5\u4f5c\u3092\u5909\u66f4\u3059\u308b\u3088\u3046\u306a\u3053\u3068\u3082\u3042\u308b\u306e\u3067\u3001\u4e01\u5be7\u306b(\uff1f)\u53d7\u4fe1\u3057\u3066\u3044\u308b\u3002<\/p>\n<h3>void setup()<\/h3>\n<p>\u307e\u305a\u306fGPIO15\u306b\u63a5\u7d9a\u3057\u305fLED\u3092\u70b9\u706f\u3055\u305b\u3001BME280\u3092\u521d\u671f\u5316\u3059\u308b\u3002\u521d\u671f\u5316\u306b\u5931\u6557\u3057\u305f\u5834\u5408LED\u3092\u70b9\u6ec5\u3055\u305b\u3066\u505c\u6b62\u3059\u308b\u3002\u7d9a\u3044\u3066<em>ap_connect()<\/em> \u3067WiFi\u30a2\u30af\u30bb\u30b9\u30dd\u30a4\u30f3\u30c8(\u3046\u3061\u306e\u5834\u5408\u306f\u81ea\u5b85\u306e\u30eb\u30fc\u30bf\u30fc)\u306b\u63a5\u7d9a\u3059\u308b\u304c\u3001\u7a00\u306b\u63a5\u7d9a\u304c\u5931\u6557\u3059\u308b\u3053\u3068\u3082\u3042\u308b\u306e\u3067\u3001\u305d\u306e\u5834\u5408\u306f30\u79d2\u5f8c\u306b\u6700\u521d\u304b\u3089\u3084\u308a\u76f4\u3059\u3053\u3068\u306b\u3057\u3066\u3044\u308b\u3002<\/p>\n<p>\u7d9a\u3044\u3066\u3001<em>system_adc_read()<\/em> \u306b\u3088\u3063\u3066WROOM-02\u306eTOUT\u7aef\u5b50\u306b\u63a5\u7d9a\u3057\u3066\u3044\u308b\u5206\u5727\u3057\u305f\u96fb\u6c60\u96fb\u5727\u3092\u6e2c\u5b9a\u3057\u3001\u5206\u5727\u6bd4\u3092\u639b\u3051\u3066\u5b9f\u96fb\u5727\u306e100\u500d\u306e\u5024\u3092\u5f97\u3066\u3044\u308b\u3002\u96fb\u6c60\u96fb\u5727\u306f\u3001NiMH\u76f4\u52174\u672c\u306a\u306e\u3067\u6700\u59275.7V\u3092\u60f3\u5b9a\u3057\u3066\u304a\u308a\u3001\u5185\u8535ADC\u306e\u5206\u89e3\u80fd\u306f1024\u30d3\u30c3\u30c8\u306a\u306e\u30671\u30d3\u30c3\u30c8\u306b\u3064\u304d0.0056V\u3092\u8868\u3057\u3066\u3044\u308b\u3053\u3068\u306b\u306a\u308b\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001<em>bmp280.measure()<\/em> \u306b\u3088\u3063\u3066\u6e29\u5ea6\u3001\u76f8\u5bfe\u6e7f\u5ea6\u3001\u6c17\u5727\u3092\u5f97\u308b\u3002BME280\u306e\u30aa\u30fc\u30d0\u30fc\u30b5\u30f3\u30d7\u30ea\u30f3\u30b0\u306f3\u5bfe\u8c61\u3068\u3082x1\u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u6e2c\u5b9a\u6642\u9593\u306f\u7d0410msec\u3068\u3057\u3066\u3044\u308b\u3002<\/p>\n<p>\u5f97\u3089\u308c\u305f\u5404\u5024\u3092\u30b7\u30ea\u30a2\u30eb\u30e2\u30cb\u30bf\u306b\u8868\u793a\u3057\u3001<em>wifi_send_data()<\/em> \u3092\u4f7f\u3063\u3066\u30b5\u30fc\u30d0\u30fc\u306b\u9001\u308b\u3002\u6700\u5f8c\u306b <em>ap_disconnect()<\/em> \u3067\u5207\u65ad\u3057\u3001<em>deep_sleep(MEASURE_INTERVAL_SECONDS);<\/em> \u306b\u3088\u3063\u3066\u6b21\u306e\u6e2c\u5b9a\u30bf\u30a4\u30df\u30f3\u30b0\u307e\u3067deep sleep\u3059\u308b\u3002<\/p>\n<p>void loop() \u3067\u306f\u4f55\u3082\u3057\u306a\u3044\u3002<\/p>\n<h2 id=\"2\">hdc1000_bme280.h<\/h2>\n<pre class=\"lang:c++ decode:true\">#include &lt;stdint.h&gt;\r\n#include \"Wire.h\"\r\n\r\nclass i2c_support\r\n{\r\nprivate:\r\n  byte i2c_address;\r\npublic:\r\n  i2c_support(byte address) {\r\n    i2c_address = address;\r\n    Wire.begin();\r\n  }\r\n\r\n\/\/ read 8bit data from pointer.\r\n  uint8_t i2c_read8(byte pointer) {\r\n    Wire.beginTransmission(i2c_address);\r\n    Wire.write(pointer);\r\n    Wire.endTransmission();\r\n    Wire.requestFrom(i2c_address,  (byte)1);\r\n    return (uint8_t)Wire.read();\r\n  }\r\n\r\n\/\/ read 16bit data from addr\/pointer. 1st MSB, 2nd LSB.\r\n  uint16_t i2c_read16(byte pointer) {\r\n    Wire.beginTransmission(i2c_address);\r\n    Wire.write(pointer);\r\n    Wire.endTransmission();\r\n    Wire.requestFrom(i2c_address,  (byte)2);\r\n    unsigned short data = Wire.read();\r\n    data &lt;&lt;= 8;\r\n    data |= Wire.read();\r\n    return data;\r\n  }\r\n\r\n\/\/ read 16bit data from addr\/pointer. 1st LSB, 2ns MSB.\r\n  uint16_t i2c_read16_swab(byte pointer) {\r\n    Wire.beginTransmission(i2c_address);\r\n    Wire.write(pointer);\r\n    Wire.endTransmission();\r\n    Wire.requestFrom(i2c_address,  (byte)2);\r\n    uint16_t lsb = (uint16_t)Wire.read();\r\n    uint16_t msb = (uint16_t)(Wire.read() &lt;&lt; 8);\r\n    return msb | lsb;\r\n  }\r\n\r\n\/\/ for HDC1000\r\n  uint32_t i2c_read32(byte pointer, int delay_ms = 0) {\r\n    Wire.beginTransmission(i2c_address);\r\n    Wire.write(pointer);  \/\/ \u3053\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u3067A\/D\u5909\u63db\u304c\u958b\u59cb\u3059\u308b\u3002\r\n    Wire.endTransmission();\r\n    delay(delay_ms);\r\n    Wire.requestFrom(i2c_address,  (byte)4);\r\n    unsigned int data = Wire.read();\r\n    data &lt;&lt;= 8;\r\n    data |= Wire.read();\r\n    data &lt;&lt;= 8;\r\n    data |= Wire.read();\r\n    data &lt;&lt;= 8;\r\n    data |= Wire.read();\r\n    return data;\r\n  }\r\n\r\n  void i2c_read_burst(byte pointer, int byte_count, byte* p) {\r\n    Wire.beginTransmission(i2c_address);\r\n    Wire.write(pointer);\r\n    Wire.endTransmission();\r\n    Wire.requestFrom(i2c_address,  (byte)byte_count);\r\n    while(Wire.available() &amp;&amp; byte_count &gt; 0) {\r\n      *p++ = (byte)Wire.read();\r\n      byte_count--;\r\n    }\r\n  }\r\n\r\n  void i2c_write_reg(byte reg, byte data) {\r\n    Wire.beginTransmission(i2c_address);\r\n    Wire.write(reg);\r\n    Wire.write(data);\r\n    Wire.endTransmission();\r\n  }\r\n};\r\n\r\nclass hdc1000 : public i2c_support\r\n{\r\npublic:\r\n  hdc1000() : i2c_support(0x40) {\r\n    temp = 0.0;\r\n    humi = 0.0;\r\n  }\r\n  enum { reg_measure = 0, reg_config = 2, reg_id = 0xff };\r\n \r\n  bool init() {\r\n    i2c_write_reg(reg_config, 0x90);  \/\/ 10000001B = RESET, 32bit MODE(temp &lt;&lt; 16 + humi)\r\n    return (i2c_read16(reg_id) == 0x1000); \/\/ check device id.\r\n  }\r\n  void measure() {\r\n    uint32_t data = i2c_read32(reg_measure, 15);\r\n    temp = (float)((data &gt;&gt; 16) \/ 65536.0) * 165.0 - 40.0;\r\n    humi = (float)((data &amp; 0xffff) \/ 65536.0) * 100.0;\r\n  }\r\n  float temp;\r\n  float humi;\r\n};\r\n\r\n#ifndef BME280_S32_t\r\n#define BME280_S32_t  int32_t\r\n#endif\r\n#ifndef BME280_U32_t\r\n#define BME280_U32_t  uint32_t\r\n#endif\r\n#ifndef BME280_S64_t\r\n#define BME280_S64_t  int64_t\r\n#endif\r\n\r\nclass bme280 : public i2c_support\r\n{\r\n  bool bme280_flag;  \/\/ true : bme280, false: bmp280\r\n  bool unknown_flag = false;\r\npublic:\r\n  bme280(int address ) : i2c_support(address) {\r\n    temp = 0.0;\r\n    humi = 0.0;\r\n    press = 0.0;\r\n  }\r\n  \/\/ results.\r\n  float temp;\r\n  float humi;\r\n  float press;\r\n  enum { Tmeasure = 10 };  \/\/ oversamplinkg, x1 x1 x1\r\n\/\/\/ registers.\r\n  enum { reg_id = 0xd0, reg_reset = 0xe0, reg_ctrl_hum = 0xf2, reg_ctrl_meas = 0xf4, reg_config = 0xf5 };\r\n  enum { reg_p_result = 0xf7, reg_t_result = 0xfa, reg_h_result = 0xfd };\r\n\r\n\/\/ IIR Filter disable. \r\n\/\/ osrs_p = 3, osrs_t = 3 ---&gt; 18bit either.\r\n  bool init() {\r\n    uint8_t id = i2c_read8(reg_id); \/\/ check device-id.\r\n    if (id == 0x60)\r\n      bme280_flag = true;\r\n    else if (id == 0x58)\r\n      bme280_flag = false;\r\n    else\r\n      return false;\r\n    load_bme280_compensation_params();\r\n    i2c_write_reg(reg_config, 0); \/\/  no stand-by, no IIR filter, no SPI.\r\n    return true;\r\n  }\r\n\r\n\/\/  TEMP resolution = 16 + (osrs_t ? 1) bit, HUM resolution = 16 + (osrs_h ? 1) bit,\r\n\/\/  select forced mode.\r\n  void measure()  {\r\n    if (bme280_flag)\r\n      i2c_write_reg(reg_ctrl_hum, 1);   \/\/ humi measurement control register.00000011  (osrs_h = 1);\r\n    i2c_write_reg(reg_ctrl_meas, 0x25); \/\/ measurement control register. 00100101 (osrs_p = 1, osrs_t = 1, Forced mode);\r\n    delay(Tmeasure);\r\n\r\n    byte buffer[10];\r\n    memset(buffer, 0, sizeof(buffer));\r\n    i2c_read_burst(reg_p_result, 8, buffer);\r\n    uint32_t raw_press = ((uint32_t)buffer[0] &lt;&lt; 12) | ((uint32_t)buffer[1] &lt;&lt; 4) | (((uint32_t)buffer[2] &gt;&gt; 4) &amp; 0xf);\r\n    uint32_t raw_temp = ((uint32_t)buffer[3] &lt;&lt; 12) | ((uint32_t)buffer[4] &lt;&lt; 4) | (((uint32_t)buffer[5] &gt;&gt; 4) &amp; 0xf);\r\n    uint16_t raw_humi = ((uint16_t)buffer[6] &lt;&lt; 8) | (uint16_t)buffer[7];\r\n    \/\/ uint16_t raw_humi = i2c_read16(reg_h_result);\r\n#if 0\r\n    Serial.print(\"raw_press = \");\r\n    Serial.println(raw_press, HEX);\r\n    Serial.print(\"raw_temp = \");\r\n    Serial.println(raw_temp, HEX);\r\n    Serial.print(\"raw_humi = \");\r\n    Serial.println(raw_humi, HEX);\r\n#endif\r\n    temp = BME280_compensate_T_int32(raw_temp) \/ 100.0;\r\n    press = BME280_compensate_P_int64(raw_press) \/ 25600.0;\r\n    if (bme280_flag)\r\n      humi = bme280_compensate_H_int32(raw_humi) \/ 1024.0;\r\n    else\r\n      humi = 0.0;\r\n    \/\/ reset.\r\n  \/\/  i2c_write_reg(reg_reset, 0xb6);\r\n  }\r\n\r\n\/\/ from BST-BME280_DS001-10.pdf Chapter4.2.3 (rev.1.1)\r\nprivate:\r\n  BME280_S32_t t_fine;\r\n\r\n\/\/ Returns temperature in DegC, resolution is 0.01 DegC. Output value of \u201c5123\u201d equals 51.23 DegC.\r\n\/\/ t_fine carries fine temperature as global value\r\n  BME280_S32_t BME280_compensate_T_int32(BME280_S32_t adc_T) {\r\n    BME280_S32_t var1, var2, T;\r\n    var1 = ((((adc_T&gt;&gt;3) - ((BME280_S32_t)dig_T1&lt;&lt;1))) * ((BME280_S32_t)dig_T2)) &gt;&gt; 11;\r\n    var2 = (((((adc_T&gt;&gt;4) - ((BME280_S32_t)dig_T1)) * ((adc_T&gt;&gt;4) - ((BME280_S32_t)dig_T1))) &gt;&gt; 12) * ((BME280_S32_t)dig_T3)) &gt;&gt; 14;\r\n    t_fine = var1 + var2;\r\n    T = (t_fine * 5 + 128) &gt;&gt; 8;\r\n    return T;\r\n  }\r\n\r\n\/\/ Returns pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 integer bits and 8 fractional bits).\r\n\/\/ Output value of \u201c24674867\u201d represents 24674867\/256 = 96386.2 Pa = 963.862 hPa\r\n  BME280_U32_t BME280_compensate_P_int64(BME280_S32_t adc_P)  {\r\n    BME280_S64_t var1, var2, p;\r\n    var1 = ((BME280_S64_t)t_fine) - 128000;\r\n    var2 = var1 * var1 * (BME280_S64_t)dig_P6;\r\n    var2 = var2 + ((var1*(BME280_S64_t)dig_P5)&lt;&lt;17);\r\n    var2 = var2 + (((BME280_S64_t)dig_P4)&lt;&lt;35);\r\n    var1 = ((var1 * var1 * (BME280_S64_t)dig_P3)&gt;&gt;8) + ((var1 * (BME280_S64_t)dig_P2)&lt;&lt;12);\r\n    var1 = (((((BME280_S64_t)1)&lt;&lt;47)+var1))*((BME280_S64_t)dig_P1)&gt;&gt;33;\r\n    if (var1 == 0) {\r\n      return 0; \/\/ avoid exception caused by division by zero\r\n    }\r\n    p = 1048576 - adc_P;\r\n    p = (((p&lt;&lt;31) - var2)*3125) \/ var1;\r\n    var1 = (((BME280_S64_t)dig_P9) * (p&gt;&gt;13) * (p&gt;&gt;13)) &gt;&gt; 25;\r\n    var2 = (((BME280_S64_t)dig_P8) * p) &gt;&gt; 19;\r\n    p = ((p + var1 + var2) &gt;&gt; 8) + (((BME280_S64_t)dig_P7)&lt;&lt;4);\r\n    return (BME280_U32_t)p;\r\n  }\r\n\r\n\/\/ Returns humidity in %RH as unsigned 32 bit integer in Q22.10 format (22 integer and 10 fractional bits).\r\n\/\/ Output value of \u201c47445\u201d represents 47445\/1024 = 46.333 %RH\r\n  BME280_U32_t bme280_compensate_H_int32(BME280_S32_t adc_H)  {\r\n    BME280_S32_t v_x1_u32r;\r\n\r\n    v_x1_u32r = (t_fine - ((BME280_S32_t)76800));\r\n    v_x1_u32r = (((((adc_H &lt;&lt; 14) - (((BME280_S32_t)dig_H4) &lt;&lt; 20) - (((BME280_S32_t)dig_H5) * v_x1_u32r)) +\r\n      ((BME280_S32_t)16384)) &gt;&gt; 15) * (((((((v_x1_u32r * ((BME280_S32_t)dig_H6)) &gt;&gt; 10) * (((v_x1_u32r * \r\n      ((BME280_S32_t)dig_H3)) &gt;&gt; 11) + ((BME280_S32_t)32768))) &gt;&gt; 10) + ((BME280_S32_t)2097152)) * \r\n      ((BME280_S32_t)dig_H2) + 8192) &gt;&gt; 14));\r\n    v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r &gt;&gt; 15) * (v_x1_u32r &gt;&gt; 15)) &gt;&gt; 7) * ((BME280_S32_t)dig_H1)) &gt;&gt; 4));\r\n    v_x1_u32r = (v_x1_u32r &lt; 0 ? 0 : v_x1_u32r);\r\n    v_x1_u32r = (v_x1_u32r &gt; 419430400 ? 419430400 : v_x1_u32r);\r\n    return (BME280_U32_t)(v_x1_u32r&gt;&gt;12);\r\n  }\r\n\r\n\/\/ Chapter4.2.2. Trimming parameters.\r\n  uint16_t  dig_T1;\r\n  int16_t dig_T2;\r\n  int16_t dig_T3;\r\n\r\n  uint16_t  dig_P1;\r\n  int16_t dig_P2;\r\n  int16_t dig_P3;\r\n  int16_t dig_P4;\r\n  int16_t dig_P5;\r\n  int16_t dig_P6;\r\n  int16_t dig_P7;\r\n  int16_t dig_P8;\r\n  int16_t dig_P9;\r\n\r\n  uint8_t dig_H1;\r\n  int16_t dig_H2;\r\n  uint8_t dig_H3;\r\n  int16_t dig_H4;\r\n  int16_t dig_H5;\r\n  uint8_t dig_H6;\r\n\r\n  void load_bme280_compensation_params() {\r\n    dig_T1 = i2c_read16_swab(0x88);\r\n    dig_T2 = (int16_t)i2c_read16_swab( 0x8a);\r\n    dig_T3 = (int16_t)i2c_read16_swab(0x8c);\r\n\r\n    dig_P1 = i2c_read16_swab(0x8e);\r\n    dig_P2 = (int16_t)i2c_read16_swab(0x90);\r\n    dig_P3 = (int16_t)i2c_read16_swab(0x92);\r\n    dig_P4 = (int16_t)i2c_read16_swab(0x94);\r\n    dig_P5 = (int16_t)i2c_read16_swab(0x96);\r\n    dig_P6 = (int16_t)i2c_read16_swab(0x98);\r\n    dig_P7 = (int16_t)i2c_read16_swab(0x9a);\r\n    dig_P8 = (int16_t)i2c_read16_swab(0x9c);\r\n    dig_P9 = (int16_t)i2c_read16_swab(0x9e);\r\n\r\n    if (bme280_flag) {\r\n      dig_H1 = i2c_read8(0xa1);\r\n      dig_H2 = (int16_t)i2c_read16_swab(0xe1);\r\n      dig_H3 = i2c_read8(0xe3);\r\n      uint16_t _e4 = (uint16_t)i2c_read8(0xe4);\r\n      uint16_t _e5 = (uint16_t)i2c_read8(0xe5);\r\n      uint16_t _e6 = (uint16_t)i2c_read8(0xe6);\r\n      dig_H4 = (int16_t)((_e4 &lt;&lt; 4) + (_e5 &amp; 0xf));\r\n      dig_H5 = (int16_t)((_e6 &lt;&lt; 4) + ((_e5 &gt;&gt; 4) &amp; 0xf));\r\n      dig_H6 = (int16_t)i2c_read8(0xe7);\r\n    }\r\n  }\r\n};<\/pre>\n<p>\u5185\u5bb9\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/okiraku-camera.tokyo\/blog\/?p=5291\">\u4ee5\u524d\u306e\u6295\u7a3f\u3092\u53c2\u7167<\/a>\u3002<\/p>\n<h2 id=\"3\">\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u30b9\u30af\u30ea\u30d7\u30c8<\/h2>\n<p>mysql (5.1)\u7528\u306e\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304a\u3088\u3073\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u7528\u30b9\u30af\u30ea\u30d7\u30c8\u3002<\/p>\n<pre class=\"lang:mysql decode:true\">-- create database envdata default character set utf8 collate utf8_general_ci;\r\n-- grant all privileges on envdata.* to envuser@localhost identified by 'xxxxxx';\r\n\r\nuse envdata;\r\ncreate table envdata(\r\n  serial_no  int  not null   AUTO_INCREMENT\r\n  ,point_id varchar (20) not null\r\n  ,T float (7,2) null\r\n  ,H float (7,2) null\r\n  ,P float (7,2) null\r\n  ,V float (7,2) null\r\n  ,X1 float (7,2) null\r\n  ,X2 float (7,2) null\r\n  ,post_datetime timestamp default CURRENT_TIMESTAMP not null\r\n  ,PRIMARY KEY (serial_no)\r\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\r\n--\r\ncreate table envdata2(\r\n  serial_no  int  not null   AUTO_INCREMENT\r\n  ,point_id varchar (20) not null\r\n  ,BMP_T float (7,2) null\r\n  ,BMP_P float (7,2) null\r\n  ,HDC_T float (7,2) null\r\n  ,HDC_H float (7,2) null\r\n  ,V float (7,2) null\r\n  ,X1 float (7,2) null\r\n  ,X2 float (7,2) null\r\n  ,post_datetime timestamp default CURRENT_TIMESTAMP not null\r\n  ,PRIMARY KEY (serial_no)\r\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\r\n--<\/pre>\n<p>\u30c6\u30fc\u30d6\u30ebenvdata\u306b\u306fBME280\u5358\u72ec\u306e\u30dc\u30fc\u30c9\u304b\u3089\u306e\u30c7\u30fc\u30bf\u3092\u3001envdata2\u306b\u306f\u3001BMP280\u3068HDC1000\u3092\u8f09\u305b\u305f\u30dc\u30fc\u30c9\u304b\u3089\u306e\u30c7\u30fc\u30bf\u3092\u683c\u7d0d\u3059\u308b\u3002T\u304c\u6e29\u5ea6\u3001H\u304c\u76f8\u5bfe\u6e7f\u5ea6\u3001P\u304c\u6c17\u5727\u3001V\u304c\u96fb\u5727\u3067\u3001X1\u304a\u3088\u3073X2\u306f\u62e1\u5f35\u7528(\u63a5\u7d9a\u6642\u9593\u306e\u683c\u7d0d\u306a\u3069)\u3002<\/p>\n<h2 id=\"4\">\u30b5\u30fc\u30d0\u30fc\u5074\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9(envdata_db.php)<\/h2>\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 envdb\u306b\u63a5\u7d9a\u3057\u6e2c\u5b9a\u30c7\u30fc\u30bf\u306e\u8ffd\u52a0\u3084\u3001\u30c6\u30fc\u30d6\u30eb\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30c7\u30fc\u30bf\u306e\u30af\u30a8\u30ea\u3092\u884c\u3046\u305f\u3081\u306e\u30af\u30e9\u30b9\u3002Linux\u4e0a\u306ePHP 5.33\u3067\u52d5\u4f5c\u3092\u78ba\u8a8d\u3057\u305f\u3002<\/p>\n<pre class=\"lang:php decode:true\">&lt;?PHP\r\nclass envdata_db {\r\n\tprivate $mysql;\t\/\/ \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\r\n\tprivate $last_error;\r\n\tprivate $sql;\r\n \r\n\tpublic function __construct(){\r\n\t\t$this-&gt;mysql= mysqli_connect(\"localhost\", \"envuser\", \"xxxxxxx\", \"envdata\");\t\r\n\t\t$this-&gt;last_error = mysqli_connect_error();\r\n\t}\r\n \r\n\tpublic function __destruct() {\r\n\t\tif ($this-&gt;mysql)\r\n\t\t\tmysqli_close($this-&gt;mysql);\r\n\t\t$this-&gt;mysql = FALSE ;\r\n\t}\r\n \r\n\tpublic function isConnect() {\r\n\t\treturn ($this-&gt;mysql != FALSE);\r\n\t}\r\n \r\n\tpublic function getLast_error() {\r\n\t\treturn $this-&gt;last_error;\r\n\t}\r\n \r\n\tpublic function getLast_sql() {\r\n\t\treturn $this-&gt;sql;\r\n\t}\r\n\r\n\tpublic function insert_array($table, $ar) {\r\n\t\theader('cotent-type: text\/html');\r\n        if (!$this-&gt;isConnect())\r\n            return FALSE;\r\n\t\tforeach($ar as $k =&gt; $v) {\r\n        \t$s = isset($_GET[$k]) ? $_GET[$k] : \"\";\r\n\t        if (strlen($s) &gt; 0)\r\n    \t            $ar[$k] = $s;\r\n\t\t}\r\n\t\t$cols = \"\";\r\n\t\t$vals = \"\";\r\n\t\tforeach($ar as $k =&gt; $v) {\r\n\t\t    if (strlen($cols) &gt; 0)\r\n        \t\t$cols .= \",\";\r\n\t\t\t$cols .= $k;\r\n\t\t\tif (strlen($vals) &gt; 0)\r\n\t        \t$vals .= \",\";\r\n\t\t    $vals .= is_string($v) ? \"'\" . mysqli_real_escape_string($this-&gt;mysql, $v) . \"'\" : $v;\r\n\t\t}\r\n\t\t$this-&gt;sql = \"insert into \" . $table . \"(\" . $cols . \") values (\" . $vals . \")\";\r\n        if (!mysqli_query($this-&gt;mysql, $this-&gt;sql)) {\r\n            $this-&gt;last_error = mysqli_error($this-&gt;mysql);\r\n            return FALSE ;\r\n        }\r\n        return TRUE;\r\n\t}\r\n\r\n\tpublic function query_json($ar, $sql, $condition, $sel_date = \"\", $hours = \"\") {\r\n\t\tif (!$this-&gt;isConnect())\r\n\t\t\treturn FALSE;\r\n\t\t$where = \"\";\r\n\t\t$group = \"\";\r\n\t\t$order = \"post_datetime\";\r\n\r\n\t\tif ($sel_date != '' &amp;&amp; $hours != '' &amp;&amp; ctype_digit($hours)) {\r\n\t\t\t$num_mins = $hours * 60 + 30;\r\n\t\t\tif ($sel_date == 'current')\r\n\t\t\t\t$where = \"post_datetime &gt;= date_sub(current_timestamp, interval \" . $num_mins . \" minute) \";\t\r\n\t\t\telse\r\n\t\t\t\t$where = \"post_datetime &gt;= '\" . $sel_date . \"' and post_datetime &lt;= date_add('\" . $sel_date . \"', interval \" . $num_mins . \" minute) \";\r\n\t\t}\r\n\r\n\t\tif ($condition == \"interval\") {\r\n\t\t\tif ($sel_date != '' &amp;&amp; $hours != '') {\r\n\t\t\t\t$num_mins = $hours * 60 + 10;\r\n\t\t\t\tif ($sel_date == 'current')\r\n\t\t\t\t\t$where = \"post_datetime &gt;= date_sub(current_timestamp, interval \" . $num_mins . \" minute) \";\t\r\n\t\t\t\telse\r\n\t\t\t\t\t$where = \"post_datetime &gt;= '\" . $sel_date . \"' and post_datetime &lt;= date_add('\" . $sel_date . \"', interval \" . $num_mins . \" minute) \";\r\n\t\t\t}\r\n\t\t\t$group = \"DATE(post_datetime)\";\r\n\t\t} else if ($condition == \"day_list\" || $condition == \"day_rlist\") {\r\n\t\t\t$where = \"\";\r\n\t\t\t$group = \"DATE(post_datetime)\";\r\n\t\t\t$order .= $condition == \"day_rlist\" ? \" desc\" : \" asc\";\r\n\t\t} else {\r\n\t\t\tif ($hours == \"today\")\r\n\t\t\t\t$where = \"date(post_datetime) &gt; date(current_timestamp - interval 1 day)\";\r\n\t\t\telse if ($sel_date != \"\" &amp;&amp; $hours == \"\")\t\/\/ \u4ee5\u964d\u5168\u3066\r\n\t\t\t\t$where = \"date(post_datetime) &gt;= '\" . $sel_date . \"'\";\r\n\t\t}\r\n\t\t$this-&gt;sql = $sql;\r\n\t\tif (strlen($where) &gt; 0)\r\n\t\t\t$this-&gt;sql .= \" where \" . $where;\r\n\t\tif (strlen($group) &gt; 0)\r\n\t\t\t$this-&gt;sql .= \" group by \" . $group;\r\n\t\tif (strlen($order) &gt; 0)\r\n\t\t\t$this-&gt;sql .= \" order by \" . $order;\r\n\r\n\t\tif (($query_result = mysqli_query($this-&gt;mysql, $this-&gt;sql)) == FALSE) {\r\n\t\t\t$this-&gt;last_error = mysqli_error($this-&gt;mysql);\r\n\t\t\treturn FALSE ;\r\n\t\t}\r\n\t\t$result_count = mysqli_num_rows($query_result);\r\n\t\t$result = array();\r\n\t\t$idx = 0;\r\n\t\twhile ($r = mysqli_fetch_assoc($query_result)) {\r\n\t\t\t$one = array('datetime' =&gt; str_replace(\"-\", \"\/\", $r['datetime']));\r\n\t\t\tif (count($ar) &gt; 0) {\r\n\t\t\t\treset($ar);\r\n\t\t\t\tforeach($ar as $val)\r\n\t\t\t\t\t$one += array($val =&gt; (float)$r[$val]);\r\n\t\t\t}\r\n\t\t\t$result[$idx++] = $one;\r\n\t\t}\r\n\r\n\t\tmysqli_free_result($query_result);\r\n\t\t$r = json_encode(array('count' =&gt; $result_count, 'data' =&gt; $result));\r\n\t\t$json_result = str_replace('\\\\\/', '\/', $r);\t\/\/ before php 5.4\r\n\t\treturn $json_result;\r\n\t}\r\n}\r\n<\/pre>\n<p>\u3053\u306e\u30af\u30e9\u30b9\u306f\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u4f5c\u6210\u3055\u308c\u305f\u6642\u70b9\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9envdata\u306b\u63a5\u7d9a\u3057\u3001\u30c7\u30b9\u30c8\u30e9\u30af\u30c8\u6642\u306b\u5207\u65ad\u3059\u308b\u3002<\/p>\n<h6>public function insert_array($table, $ar)<\/h6>\n<p>\u6587\u5b57\u5217$table\u3067\u6307\u5b9a\u3055\u308c\u308b\u30c6\u30fc\u30d6\u30eb\u306b\u3001\u914d\u5217$ar\u306e\u5185\u5bb9\u306b\u3057\u305f\u304c\u3063\u3066\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8aad\u307f\u53d6\u308a\u3084\u521d\u671f\u5024\u306e\u8a2d\u5b9a\u3092\u884c\u3063\u305f\u5f8cINSERT\u3092\u884c\u3046\u3002$ar\u306e\u30ad\u30fc\u540d\u306f$_GET[]\u304b\u3089\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u5f97\u308b\u3068\u304d\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u540d\u3068INSERT\u6642\u306e\u30ab\u30e9\u30e0\u540d\u3092\u517c\u306d\u3066\u3044\u308b\u3002\u6240\u5b9a\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306b\u306f\u3001\u547c\u3073\u51fa\u3057\u6642\u306b$ar\u304c\u4fdd\u6301\u3057\u3066\u3044\u308b\u30ad\u30fc\u540d\u306b\u5bfe\u5fdc\u3059\u308b\u5024\u3092\u8a2d\u5b9a\u3059\u308b\u3002<\/p>\n<h6>public function query_json($ar, $sql, $condition, $sel_date, $hours)<\/h6>\n<p>\u30c6\u30fc\u30d6\u30eb\u304b\u3089\u6e2c\u5b9a\u30c7\u30fc\u30bf\u306e\u30af\u30a8\u30ea\u3092\u884c\u3044\u3001json\u5f62\u5f0f\u306b\u3057\u3066\u8fd4\u3059\u3002\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u306f\u3001GoogleChart\u3067\u30b0\u30e9\u30d5\u3092\u63cf\u753b\u3059\u308b\u305f\u3081\u306e\u30c7\u30fc\u30bf\u3092\u5f97\u308b\u305f\u3081\u306b\u4f5c\u6210\u3057\u305f\u3082\u306e\u3002<\/p>\n<p>$ar\u306b\u306f\u30ab\u30e9\u30e0\u540d(\u307e\u305f\u306f\u5225\u540d)\u306b\u4e00\u81f4\u3057\u305f\u30ad\u30fc\u540d\u306e\u914d\u5217\u3092\u4e0e\u3048\u3001$sql\u306b\u306f\u30c6\u30fc\u30d6\u30eb\u540d\u3092\u542b\u3080\u30af\u30a8\u30ea\u7528\u306eSQL\u6587\u3092\u6307\u5b9a\u3059\u308b\u3002$condition\u306f\u30af\u30a8\u30ea\u306e\u7a2e\u5225(\u5358\u7d14\u306a\u30af\u30a8\u30ea\u3001\u30a4\u30f3\u30bf\u30fc\u30d0\u30eb\u8868\u793a\u7528\u306e\u30af\u30a8\u30ea\u3001\u6e2c\u5b9a\u65e5\u3092\u5f97\u308b\u305f\u3081\u306e\u30af\u30a8\u30ea), $sel_date, $hours\u306b\u306f\u30af\u30a8\u30ea\u6761\u4ef6\u3092\u6307\u5b9a\u3059\u308b\u3002<\/p>\n<p>\u4ee5\u524d\u4f5c\u3063\u305f\u3068\u304d\u306fPHP5.5\u3067\u52d5\u304b\u3057\u3066\u3044\u305f\u304c\u3001\u4eca\u56de\u306fPHP5.33\u3092\u4f7f\u3063\u3066\u3044\u308b\u305f\u3081\u3001json_encode(); \u306eoptions \u306b\u00a0<a href=\"http:\/\/php.net\/manual\/ja\/function.json-encode.php\" target=\"_blank\" rel=\"noopener\"><em>JSON_UNESCAPED_SLASHES<\/em> \u3092\u6307\u5b9a\u3067\u304d\u306a\u3044<\/a>\u3002\u305d\u306e\u305f\u3081\u3001\u30c7\u30fc\u30bf\u5185(\u3053\u306e\u5834\u5408\u306f\u65e5\u4ed8)\u306e&#8221;\/&#8221;\u304c&#8221;\\\/&#8221; \u3068\u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u3066\u3057\u307e\u3046\u305f\u3081\u3001<em>str_replace(&#8216;\\\\\/&#8217;, &#8216;\/&#8217;, $r);<\/em> \u306b\u3088\u3063\u3066\u9664\u53bb\u3057\u3066\u3044\u308b\u3002<\/p>\n<h2 id=\"5\">\u6e2c\u5b9a\u30c7\u30fc\u30bf\u683c\u7d0d\u7528\u30b9\u30af\u30ea\u30d7\u30c8(store_data.php)<\/h2>\n<p>envdata \u30c6\u30fc\u30d6\u30eb\u306b\u6e2c\u5b9a\u30c7\u30fc\u30bf\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306ePHP\u30b9\u30af\u30ea\u30d7\u30c8\u3002\u6e2c\u5b9a\u30dc\u30fc\u30c9\u5185\u306e\u30b9\u30b1\u30c3\u30c1\u306f\u3001\u3053\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u306bGET\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u308b\u3002<\/p>\n<pre class=\"lang:php decode:true \">&lt;?PHP\r\nrequire_once('envdata_db.php');\r\n$ar = array('T' =&gt; 0.0, 'P' =&gt; 0.0, 'H' =&gt; 0.0, 'V' =&gt; 0.0, 'X1' =&gt; 0.0, 'X2' =&gt; 0.0, 'point_id' =&gt; 'unknown');\r\n\r\n$db = new envdata_db();\r\nif (!$db-&gt;insert_array(\"envdata\", $ar)) {\r\n\techo \"NG SQL ERROR: \" . $envdata-&gt;getLast_error() . '&lt;br\/&gt;';\r\n\techo $envdata-&gt;getLast_sql() . '&lt;br\/&gt;';\r\n} else\r\n\techo \"OK\";\r\n?&gt;<\/pre>\n<p>\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf(T, P, H, V, X1, X2)\u3068\u540c\u3058\u540d\u524d\u306e\u30ab\u30e9\u30e0\u306b\u30c7\u30fc\u30bf\u3092\u683c\u7d0d\u3059\u308b\u3002\u914d\u5217$ar\u306f\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30ad\u30fc\u540d\u3068\u30ab\u30e9\u30e0\u540d\u3001\u305d\u308c\u3089\u306b\u5bfe\u5fdc\u3057\u305f\u7701\u7565\u5024\u3092\u4fdd\u6301\u3059\u308b\u3002<\/p>\n<p>\u203b \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u306epoint_id (\u73fe\u72b6\u306fMAC\u30a2\u30c9\u30ec\u30b9)\u306b\u306f &#8220;:&#8221; \u304c\u542b\u307e\u308c\u3066\u3044\u308b\u304c\u3001\u7279\u306b\u554f\u984c\u306a\u3044\u306e\u3067\u30a8\u30b9\u30b1\u30fc\u30d7\u3057\u3066\u3044\u306a\u3044\u3002<\/p>\n<p>\u308f\u3056\u308f\u3056array() \u3092\u4f5c\u3063\u305f\u308a\u30c6\u30fc\u30d6\u30eb\u540d\u3092\u5f15\u6570\u306b\u3057\u3066\u3044\u308b\u306e\u306f\u3001\u30ab\u30e9\u30e0\u69cb\u6210\u3084\u540d\u524d\u306e\u7570\u306a\u308b\u30c6\u30fc\u30d6\u30eb\u3092\u8907\u6570\u500b\u4f5c\u308a\u3001\u6e2c\u5b9a\u30dc\u30fc\u30c9\u3054\u3068\u306b\u5c02\u7528\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u7528\u3044\u308b\u3088\u3046\u306b\u3057\u305f\u305f\u3081\u3002\u4f8b\u3048\u3070envdata2\u30c6\u30fc\u30d6\u30eb\u306b\u683c\u7d0d\u3059\u308b\u305f\u3081\u306e store_data2.php\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n<pre class=\"lang:php decode:true \">&lt;?PHP\r\nrequire_once('envdata_db.php');\r\n$ar = array('BMP_T' =&gt; 0.0, 'BMP_P' =&gt; 0.0, 'HDC_T' =&gt; 0.0, 'HDC_H' =&gt; 0.0, 'V' =&gt; 0.0, 'X1' =&gt; 0.0, 'X2' =&gt; 0.0, 'point_id' =&gt; 'unknown');\r\n\r\n$db = new envdata_db();\r\nif (!$db-&gt;insert_array(\"envdata2\", $ar)) {\r\n\techo \"NG SQL ERROR: \" . $envdata-&gt;getLast_error() . '&lt;br\/&gt;';\r\n\techo $envdata-&gt;getLast_sql() . '&lt;br\/&gt;';\r\n} else\r\n\techo \"OK\";\r\n?&gt;<\/pre>\n<p>envdata_db\u30af\u30e9\u30b9\u306e\u30af\u30a8\u30ea\u95a2\u4fc2\u306e\u4f7f\u3044\u65b9\u3084GoogleChart\u3092\u4f7f\u3063\u305f\u63cf\u753b\u7528JavaScript\u306b\u3064\u3044\u3066\u306f\u3001\u3088\u308a\u7701\u96fb\u529b\u5316\u3092\u56f3\u3063\u305f\u30b9\u30b1\u30c3\u30c1\u3068\u5171\u306b\u63b2\u8f09\u3059\u308b\u4e88\u5b9a\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ESP-WROOM-02\u3068BME280\u3092\u4f7f\u3063\u305f\u6e29\u5ea6\u6e2c\u5b9a\u306b\u95a2\u4fc2\u3059\u308b\u57fa\u672c\u7684\u306a\u30bd\u30fc\u30b9\u985e\u3092\u307e\u3068\u3081\u305f\u3002\u6982\u8981\u3084\u56de\u8def\u306b\u3064\u3044\u3066\u306f\u3001\u3053\u3061\u3089\u3092\u53c2\u7167\u306e\u3053\u3068\u3002 \u76ee\u6b21 \u6539\u826f\u524d\u30e1\u30a4\u30f3\u30b9\u30b1\u30c3\u30c1(ESP_BME280-1.ino) \u30bb\u30f3\u30b5\u30fc\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc &hellip; <a href=\"https:\/\/okiraku-camera.tokyo\/blog\/?page_id=7007\" class=\"more-link\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"screen-reader-text\">bme280 \u6e2c\u5b9a\u30b9\u30b1\u30c3\u30c11<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7007","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/pages\/7007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7007"}],"version-history":[{"count":0,"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/pages\/7007\/revisions"}],"wp:attachment":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}