ESP8266モジュール(ESP-12)のDevelopment Boad、NodeMCU(Amica)をAliExpressで購入し、Arduinoの代わりに使えるか確認した。
■開発環境・・・ArduinoのIDE1.6.5を使用して開発環境を作る
1、 Arduino IDEにESP8266ボードを追加
・まずファイル→環境設定を開きます。
Settingタブ内のAdditional Boards Manager URLsに次のURLを入力 “http://arduino.esp8266.com/stable/package_esp8266com_index.json “
・次に、ツール→マイコンボード→ボードマネージャーを選択
esp8266という項目があるので、バージョンを選択してインストールボタンを押す。今回はESP8266 by ESP8266 community ver 2.3.0を選択。 —> インストール完了
・ボード選択、設定
ツール→マイコンボード→NodeMCU1.0(ESP-12E Module)を選択
<ボードの設定>
CPU Frequency 80MHz
Flash Size 4M(3M SPIFFS)
Upload Speed 115200 <— 2番目のCOMポート設定も必要
IDEをReastartして完了。
これでESP8266の開発ボードをArduino IDEで開発できるようになりました。
2、COM シリアルポートのDriver設定
NodeMCU(Amica)のシリアルI/FはSiLabのCP2102を使っているので、SiLabのサイトよりDriverをダウンロードしてインストール
<https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers> x64版…64bitOS x86版…32bit
Windowsの場合、DeviceManagerでUSB to Serial BridgeのDriverを確認し、115200のレートに設定する。
3、Lチカの動作確認
ESPモジュールをUSBに繋ぎ、サンプルプログラムから”LED Blink”を選択してインストール。Lチカの動作が確認できればOK
参考URL:
http://www.instructables.com/id/Programming-ESP8266-ESP-12E-NodeMCU-Using-Arduino-/
■データシート:
ESP8266EX 0a-esp8266ex_datasheet_en
esp-wroom-02 0c-esp-wroom-02_datasheet_en
NodeMCU回路:NODEMCU_DEVKIT_V1.0
■NodeMCU ESP-12 V1.0 開発キットのピンアサイン
■百葉箱に使う各種センサの動作確認
すべてのセンサーはArduinoのスケッチで動作。
Programの移植が容易であることが判った。
1、Hall素子 パナソニック DN6851
このICは動作電圧が3.6V以上である。一方ESP8266のコアは3.3v動作のためレベルシフトが必要。DN6851の信号出力に手持ちの100kohmの抵抗をPull downとして使用。
DN6851のOutputは27KohmでPullUpされているので、VCC=4.5V※でDN6851のOUTPUTがESP8266の許容入力電圧である3.6V以下になるよう抵抗接続した。
→ Vout =4.5x(100/(100+27))=3.54V ※:NodeMCUのVinは4.5Vである。
DN6851のOUTPUT端子は、NodeMCUのGPIO9(SD2)に接続した。
NodeMCUのGPIO端子のFunctionがいまいちわかりにくい。GPIO16やGPIO15に接続すると動作しない。そこでSerial Peripheral InterfaceのSDIO(SD2 GPIO9)に接続してみたところ、他のセンサーの動作に影響することなく動作した。
SDカードのデータ転送にはSD0,1が使われ、SD2はReserveなので、GPIOとして機能するのだろうか?(参考:http://cellphonerepairtutorials.blogspot.jp/2010/09/understanding-mobile-phones-removable.html)
またSD2はSPI端子(MOSI,CS,MISO,SCLK)にも使われていないので、GPIOとしてのみ機能するのだろうか?
接続動作実験結果:
GPIO7 SD0 MOSO NG
GPIO8 SD1 MOSI NG
GPIO9 SD2 SDD2 OK
GPIO10 SD3 SDD3 OK
GPIO12 D6 HMISO OK
GPIO14 D5 HSCLK OK
GPIO15 D8 TXD2 HCS NG
GPIO3 RX RXD0 OK
GPIO1 TX TXD0 NG
DN6851 DataSheet: DN6851_J_discon
2、I2Cデバイス
ArduinoのWire Libraryを使用する。
GPIO4、5をSDA,SCLに設定して動作可能。(https://www.arduino.cc/en/Reference/Wire)Wire.begin()でピン指定がない場合、SDA,SCLは、UNOと同じで、SDA=4(D2端子:GPIO4)、SCL=5(D1端子:GPIO5 )となる。
いっぽうESP8266のDataSheetでは、SDA=GPIO2(D4端子)、SCL=GPIO12(D5端子)が端子機能として記述されている。このデフォルト指定をする場合は、
Wire.begin(2, 14); // SDA, SCL: NodeMCU I2C pin D4, D5 (GPIO2, GPI14)
で問題なく機能する。
下記のデバイスを、I2Cバスにパラレルに結線することで同時に正常動作した。なおSDA,SCLは製品デバイスの基板上で、10kohmでPull upされている。
<動作確認デバイス>
・Bosch BME280 温度、湿度、気圧センサー
・TI HDC1000 温度、湿度センサー
使用Library <HDC.h>
参考URL
・ローム BH1750(GY302) 光強度Luxセンサー
使用Library <BH1750.h>
参考URL: https://github.com/claws/BH1750
DataSheet: bh1750fvi-e
・STMicro VL53LOX Laser測長センサー
使用Library <VL53L0X.h>
参考URL : https://github.com/pololu/vl53l0x-arduino
DataSheet:vl53l0x-time-of-flight-distance-sensor-carrier-schematic
VL53L0X
3、One-wireデバイス
・MAXIM DS1820 温度センサー
DS18B20のDQピンを5kΩ抵抗でプルアップして、複数センサーをパラレルに結線する。
Hall素子同様、信号線の結線先(GPIO)をいくつか試してみた。
GPIO2 D4 TXD1 OK
GPIO12 D6 HMISO OK
GPIO14 D5 HSCLK OK
GPIO10 SD3 SDD3 OK
コア機能を持たない端子であれば、問題なく動作するようだ。
使用Library <DallasTemperature.h>
参考URL https://github.com/milesburton/Arduino-Temperature-Control-Library
4、Wifi接続でさくらインターネットにデータを送る
最後に<ESP8266WiFi.h>ライブラリーを使って、Wifi接続でさくらインターネットにデータを送ってみた。
設定内容
・network router & serverの指定とWifi機能の開始
const char* ssid = “aterm-******-g”;
const char* password = “*************”;
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(“.”); }
・さくらサーバーにHTTPGETプロトコルでデータを送信
// Use WiFiClient class to create TCP connections
WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println(“connection failed”); return; }
// We now create a URI for the request
String url = “/logdata/testlog/*****.php?temp_act=” + tt
+ “&hum_act=999&press_act=” + pp
+ “&temp_ds0=” + ds0 + “&temp_ds1=” + ds1 ;
Serial.print(“Requesting URL: “); Serial.println(url);
// This will send the request to the server
client.print(String(“GET “) + url + ” HTTP/1.1\r\n” +
“Host: ” + host + “\r\n” +
“Connection: close\r\n\r\n”);
Serial.println(“closing connection”);
参考URL http://qiita.com/umi_kappa/items/c3c929c6f42c5bdf3143
注意:
GET文ではStringデータを送ることが必要。
センサーデータ(sensor_data)が倍精度の場合は、まずセンサーデータをCharデータにして、dtosrtf関数で、桁数を指定する。 さらにこのCharデータをString関数でStringにして、GET文に引き渡す。
例) char data[7]; dtostrf(sensor_data, 3, 1, data);
String(data); or
String str_data;
str_data = String(data);
■NodeMCU ESP-12 V1.0でマルチセンシングのための最終スケッチ
// 2017/09/08 // BMP280 + DS1820をindex※でマルチセンシング (※アドレス指定ではない) // NodeMCU ESP-12 ver1 with Arduino IDE // NodeMCU Amica Purchased from AliExp (Cp2102 nodemcu lua wifiモジュール無線モジュール) // https://ja.aliexpress.com/item/NodeMcu-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266-module/32367355945.html?spm=a2g0s.9042311.0.0.d2OYnO // program name const char* program_name = "ESP12_hall_ds18_BME280_BH1750_HDC1000_VL53_demo" ; #include <ESP8266WiFi.h> #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <BH1750.h> //参考UR https://github.com/claws/BH1750 #include "HDC.h" // 参考URL http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/Humidity/Humidity.htm #include <VL53L0X.h> // 参考URL https://github.com/pololu/vl53l0x-arduino ////network router & server // au router //const char* ssid = "aterm-*******"; //const char* password = "***********"; // Aterm Wp1800 const char* ssid = "aterm-*******"; const char* password = "***********"; const char* host = "******.*****.*****.jp"; ///////////// hall IC setting //////////////////// #define LED_PIN 13 #define hall_pin 9 //GPIO9 assign digital input pin SD2 on ESP12 board int num =0 ; int nn=0; float rain; ///////////// VL53L0X sensor setting //////////////////// VL53L0X sensor; ///////////// BH1750(GY-302) light lx sensor setting //////////////////// BH1750 lightMeter; ///////////// HDC1000 TI temp & humidity sensor setting ///////// #define HDC1000_ADRS 0x40 // HDC1000のI2Cアドレス HDC hdc(HDC1000_ID, HDC1000_ADRS) ;// HDC1000ライブラリを生成する ///////////// dallas_DS18B20 setting //////////////////// // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 // NodeMCU pin D4 (GPIO2) pull up to 3.3V through 5 kohm // Thermometer resolution is programmable from 9 to 12 bits // set the resolution to 9 bit per device #define SENSOR_BIT 12 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); /////////// Bosch BME280 setting /////////////////////// #define BME280_ADDRESS 0x76 unsigned long int hum_raw, temp_raw, pres_raw; signed long int t_fine; // 変数定義例 // int8_t 8ビットの整数を格納する。 // uint8_t 8ビットの非負整数を格納する。 uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3; uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5; int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9; int8_t dig_H1; int16_t dig_H2; int8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6; //////////////////////////////////////////////////////// void setup() { Serial.begin(9600); delay(500); //Wire.begin(); Wire.begin(4, 5); // SDA, SCL: NodeMCU I2C pin D2, D1 (GPIO4, GPIO5) /// hall /// pinMode(LED_PIN, OUTPUT); pinMode(hall_pin, INPUT); //Serial.println("measurement start"); /// BME280 /// uint8_t osrs_t = 1; //Temperature oversampling x 1 uint8_t osrs_p = 1; //Pressure oversampling x 1 uint8_t osrs_h = 1; //Humidity oversampling x 1 uint8_t mode = 3; //Normal mode uint8_t t_sb = 5; //Tstandby 1000ms uint8_t filter = 0; //Filter off uint8_t spi3w_en = 0; //3-wire SPI Disable uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; uint8_t ctrl_hum_reg = osrs_h; writeReg(0xF2, ctrl_hum_reg); writeReg(0xF4, ctrl_meas_reg); writeReg(0xF5, config_reg); readTrim(); ///////// Dallas DS18B20 setup //Start up the library sensors.setResolution(SENSOR_BIT); sensors.begin(); ///////// VL53L0X sensor set sensor.init(); sensor.setTimeout(500); // Start continuous back-to-back mode (take readings as // fast as possible). To use continuous timed mode // instead, provide a desired inter-measurement period in // ms (e.g. sensor.startContinuous(100)). sensor.startContinuous(); /////// light lx sensor BH1750 setup lightMeter.begin(); ////// HDC1000の初期化 int ans ; ans = hdc.Init() ; if (ans != 0) { Serial.print("HDC Initialization abnormal ans=") ; Serial.println(ans) ; } else Serial.println("HDC Initialization normal !!") ; /////////////////////////////////////////////////// //////// We start by connecting to a WiFi network Serial.print("Program Name "); Serial.println( program_name ); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } // setup end ///////////////////////////////////////////////////////////// unsigned long timer; unsigned long t0=millis(); unsigned long ti=millis(); time_t prevDisplay = 0; // when the digital clock was displayed //////////////////////////////////////////////////////////// void loop() { timer = millis() - t0; /// hall measurement //// int hh; hh=digitalRead(hall_pin); if (hh==HIGH) { // if no magnet, LED off digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); nn=1; } if (hh==HIGH && nn==1) { // num= num+1; Serial.print("number of roatation = "); Serial.println(num); nn=0 ; } //%%%% if(timer ...) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (timer >=10000) // mesurement interval setting : 1min { /////rpm///////////////////////// int RPM; RPM = num ; Serial.println (""); Serial.print ("rpm="); Serial.println (RPM); num = 0 ; // number of rotation reset ///// VL53L0X sensor //////////////////// int distance; distance = sensor.readRangeContinuousMillimeters(); Serial.print("distance = "); Serial.print(distance); //Serial.print(sensor.readRangeContinuousMillimeters()); Serial.println(" mm"); if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT");} // convert measdata to string data String Distance; Distance = String(distance); /////light sensor BH1750 ///////////////////////// uint16_t lux = lightMeter.readLightLevel(); Serial.print("Light intensity = "); Serial.print(lux); Serial.println(" lx"); // convert measdata to string data String LUX; LUX = String(lux); //// HDC1000から湿度と温度を読み取る // 読み取った値は、Humi/Temp変数に格納される int ans ; ans = hdc.Read() ; if (ans == 0) { Serial.print("HDC1000: ") ; Serial.print(Humi) ; Serial.print("% ") ; Serial.print(Temp) ; Serial.println("'C") ; } else { Serial.print("Failed to read from HDC ans=") ; Serial.println(ans) ; } //////// convert measdata to string data String hum_HDC, temp_HDC; hum_HDC = String(Humi); temp_HDC = String(Temp); /// BMP280 measurement ///////////////////////////// double temp_act = 0.0, press_act = 0.0, hum_act = 0.0; signed long int temp_cal; unsigned long int press_cal, hum_cal; readData(); temp_cal = calibration_T(temp_raw); press_cal = calibration_P(pres_raw); hum_cal = calibration_H(hum_raw); temp_act = (double)temp_cal / 100.0; press_act = (double)press_cal / 100.0; hum_act = (double)hum_cal / 1024.0; Serial.println("BME280 snesor data... "); Serial.print("TEMP : "); Serial.print(temp_act); Serial.print(" DegC PRESS : "); Serial.print(press_act); Serial.print(" hPa"); Serial.print(" hPa HUM : "); Serial.print(hum_act); Serial.println(" %"); //////// convert measdata to chara data to String data char t_act[7]; dtostrf(temp_act, 3, 1, t_act); char p_act[7]; dtostrf(press_act, 3, 1, p_act); char h_act[7]; dtostrf(hum_act, 3, 1, h_act); String tt, pp, hh; tt = String(t_act); pp = String(p_act); hh = String(h_act); //// Dallas DS18B20 measurement // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus //Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures //Serial.println("DONE"); float temp_ds0, temp_ds1; sensors.setResolution(SENSOR_BIT); temp_ds0 = sensors.getTempCByIndex(0); Serial.println("DS1820 data..."); Serial.print("Temperature for DS18B20 1 (index 0) is "); // Serial.print(sensors.getTempCByIndex(0)); Serial.print(" temp_ds0= "); Serial.println(temp_ds0); //sensors.getTempCByIndex(1)とすれば2個目のDS18B20の値が取り出せます //ただし、2つのセンサーのうちどちらが0番でどちらが1番なのかわかりません //このアドレスを利用するには、実際のデバイスに対して //DallasTemperature::getAddress()メソッドで取得した値をメモっておく必要があります。 ///* sensors.setResolution(SENSOR_BIT); temp_ds1 = sensors.getTempCByIndex(1); Serial.print("Temperature for DS18B20 2 (index 1) is "); //Serial.print(sensors.getTempCByIndex(1)); Serial.print(" temp_ds1= "); Serial.println(temp_ds1); Serial.println(""); //// //////// convert measdata to string data String ds0, ds1; ds0 = String(temp_ds0); ds1 = String(temp_ds1); ///////////////////////////////////////////////////////////// // wifi connect & HTTP GET action execute //////////////////////////////////////////////////////////// Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request // hum_act=999 ... dummy data String url = "/logdata/testlog/****.php?temp_act=" + tt + "&hum_act=" + hh +"&press_act=" + pp + "&temp_hdc=" + temp_HDC + "&hum_hdc=" + hum_HDC + "&temp_ds0=" + ds0 + "&temp_ds1=" + ds1 + "&rpm=" + String(RPM) + "&distance=" + Distance + "&light=" + LUX ; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); //Serial.println(); Serial.println("closing connection"); Serial.println(); /////////////////////////////////////////// t0=millis(); // meas interval set } // if timer... end //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } // void loop end //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //// sub routine function for BME280 ////////// void readTrim() { uint8_t data[32], i = 0; Wire.beginTransmission(BME280_ADDRESS); Wire.write(0x88); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 24); while (Wire.available()) { data[i] = Wire.read(); i++; } Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xA1); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 1); data[i] = Wire.read(); i++; Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xE1); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 7); while (Wire.available()) { data[i] = Wire.read(); i++; } dig_T1 = (data[1] << 8) | data[0]; dig_T2 = (data[3] << 8) | data[2]; dig_T3 = (data[5] << 8) | data[4]; dig_P1 = (data[7] << 8) | data[6]; dig_P2 = (data[9] << 8) | data[8]; dig_P3 = (data[11] << 8) | data[10]; dig_P4 = (data[13] << 8) | data[12]; dig_P5 = (data[15] << 8) | data[14]; dig_P6 = (data[17] << 8) | data[16]; dig_P7 = (data[19] << 8) | data[18]; dig_P8 = (data[21] << 8) | data[20]; dig_P9 = (data[23] << 8) | data[22]; dig_H1 = data[24]; dig_H2 = (data[26] << 8) | data[25]; dig_H3 = data[27]; dig_H4 = (data[28] << 4) | (0x0F & data[29]); dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); dig_H6 = data[31]; } void writeReg(uint8_t reg_address, uint8_t data) { Wire.beginTransmission(BME280_ADDRESS); Wire.write(reg_address); Wire.write(data); Wire.endTransmission(); } void readData() { int i = 0; uint32_t data[8]; Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xF7); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 8); while (Wire.available()) { data[i] = Wire.read(); i++; } pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); hum_raw = (data[6] << 8) | data[7]; } signed long int calibration_T(signed long int adc_T) { signed long int var1, var2, T; var1 = ((((adc_T >> 3) - ((signed long int)dig_T1 << 1))) * ((signed long int)dig_T2)) >> 11; var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T >> 4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14; t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; return T; } unsigned long int calibration_P(signed long int adc_P) { signed long int var1, var2; unsigned long int P; var1 = (((signed long int)t_fine) >> 1) - (signed long int)64000; var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((signed long int)dig_P6); var2 = var2 + ((var1 * ((signed long int)dig_P5)) << 1); var2 = (var2 >> 2) + (((signed long int)dig_P4) << 16); var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((((signed long int)dig_P2) * var1) >> 1)) >> 18; var1 = ((((32768 + var1)) * ((signed long int)dig_P1)) >> 15); if (var1 == 0) { return 0; } P = (((unsigned long int)(((signed long int)1048576) - adc_P) - (var2 >> 12))) * 3125; if (P < 0x80000000) { P = (P << 1) / ((unsigned long int) var1); } else { P = (P / (unsigned long int)var1) * 2; } var1 = (((signed long int)dig_P9) * ((signed long int)(((P >> 3) * (P >> 3)) >> 13))) >> 12; var2 = (((signed long int)(P >> 2)) * ((signed long int)dig_P8)) >> 13; P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4)); return P; } unsigned long int calibration_H(signed long int adc_H) { signed long int v_x1; v_x1 = (t_fine - ((signed long int)76800)); v_x1 = (((((adc_H << 14) - (((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * ((signed long int) dig_H2) + 8192) >> 14)); v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4)); v_x1 = (v_x1 < 0 ? 0 : v_x1); v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); return (unsigned long int)(v_x1 >> 12); }■さくらインターネットサーバーでのPHPファイル
&amp;lt;?php /*** 設定 ***/ // filename: esp12_******.php // 2017/09/18 作成 // 光量、温度、気圧、湿度同時計測用 // データ保存ファイルの相対パス define('TEMP_FILE_PATH', '../testlog/esp12_multi_demo.txt'); // php programのあるDirから、一度相対パスでlogdataに登り、 ../ --&amp;amp;amp;amp;amp;amp;amp;gt; ./bme280log/bme280.txtを指定 // 日時情報(YYYY/MM/DD HH:ii:ss形式) $strDate = date("Y/m/d H:i:s"); // 書き込む文字列 $strLog = ''; /*** 値チェック ***/ // 'temp'という名前の変数に格納された値を受け取る $strTempact = $_GET['temp_act']; $strHumact = $_GET['hum_act']; $strPressact = $_GET['press_act']; $strTemphdc = $_GET['temp_hdc']; $strHumhdc = $_GET['hum_hdc']; $strDS0 = $_GET['temp_ds0']; $strDS1 = $_GET['temp_ds1']; $strRPM = $_GET['rpm']; $strDist = $_GET['distance']; $strLight = $_GET['light']; /*** 値を保存ファイルに書き込み ***/ // 書き込み形式 // 日時情報(YYYY/MM/DD HH:ii:ss) + 温度値(00.0℃) + 改行コード $strLog = $strDate.",".$strTempact.",".$strHumact.",".$strPressact.",".$strTemphdc.",".$strHumhdc.",".$strDS0.",".$strDS1.",".$strRPM.",".$strDist.",".$strLight."\n"; // データを保存するテキストファイルを追記モードでオープン $fp = fopen(TEMP_FILE_PATH, "a"); // ファイルを排他ロック flock($fp, LOCK_EX); // 送信された値をテキストファイルに書き込み fwrite($fp, $strLog); // ロックを開放 flock($fp, LOCK_UN); // ファイルポインタをクローズ fclose($fp); ?&amp;gt;