เป้าหมายของโปรเจคนี้คือเราต้องดูข้อมูลด้วยการเข้าถึงโดเมน ของเราเอง ไม่ว่าจะอยู่ส่วนไหนของโลก โดย ESP8266 จะสร้างไคลเอ็นต์ ที่ทำให้คำขอ HTTP POST ไปยังสคริปต์ PHP เพื่อแทรกข้อมูล (การอ่านเซ็นเซอร์) ลงในฐานข้อมูล MySQL
โดยบทความนี้จะแสดงการส่งข้อมูลจาก ESP8266 ไปเก็บในฐานข้อมูล MySQLโดยใช้ เซนเซอร์ BME280 วัดอุณหภูมิความชื้น เชื่อมต่อกับ ESP8266 และเชื่อมต่อกับ WiFi ออก อินเตอร์เน็ต ทำให้เราสามารถดูข้อมูลจากที่ไหนก็ได้ที่มี อินเตอร์เน็ต และยังนำข้อมูลย้อนหลังไปวิเคราะห์ได้ด้วย
1. จด Domain Name และ Hosting จด Domain Name และ Hosting เพื่อเรียกใช้เว็บแอพพลิเคชั่น PHP และ ฐานข้อมูล MySQL โดยในตัวอย่างเลือกใช้ Hosting ของ appservhosting.com
2. เตรียมฐานข้อมูล MySQL
เข้าใช้งาน Hosting ตาม appservhosting แจ้งข้อมูล ผ่านทาง Email มา ในตัวอย่างเป็น http://ns33.appservhosting.com/vhcs2
ไปที่ Manage SQL
ไปที่ Add SQL Database
ที่ Database name ตั้งชื่อเป็น esp_data -> Add
ไปที่ Add SQL user
ที่ SQL user name เป็น esp_board และ Password ตามต้องการ -> Add
ถ้าสำเร็จ จะแสดง SQL user successfully added!
ไปที่ PhpMyAdmin
Username เป็น esp_board และ Password ตามที่ได้สร้างไว้ก่อนหน้านี้ -> Go
ไปที่ esp_board
ไปที่ SQL
คัดลอก SQL query ด้านล่างไปวางในกรอบสีแดง แล้วกด “Go":
CREATE TABLE SensorData (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sensor VARCHAR(30) NOT NULL,
location VARCHAR(30) NOT NULL,
value1 VARCHAR(10),
value2 VARCHAR(10),
value3 VARCHAR(10),
reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
หลังจากนั้นต้องเห็นตารางที่สร้างขึ้นใหม่ชื่อ SensorData ในฐานข้อมูล
3. สร้าง FTP Accounts สำหรับใช้ Upload ไฟล์ ไปยังโฮส
ไปที่ Email Accounts
ไปที่ Add mail users
ที่ Username เป็น info และ Password ตามต้องการ -> Add
จะพบ mail users ที่สร้างขึ้น
ไปที่ FTP Accounts
ไปที่ Add FTP user
ที่ Username เป็น info และ Password ตามต้องการ -> Add
ถ้าสำเร็จ จะแสดง FTP account added!
4. สร้างสคริปต์ PHP ไฟล์ที่ 1ที่มีหน้าที่ในการรับคำขอขาเข้าจาก ESP8266 และแทรกข้อมูลลงในฐานข้อมูล MySQL
<?php
$servername = "localhost";
$dbname = "REPLACE_WITH_YOUR_DATABASE_NAME";
$username = "REPLACE_WITH_YOUR_USERNAME";
$password = "REPLACE_WITH_YOUR_PASSWORD";
$api_key_value = "tPmAT5Ab3j7F9";
$api_key= $sensor = $location = $value1 = $value2 = $value3 = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$api_key = test_input($_POST["api_key"]);
if($api_key == $api_key_value) {
$sensor = test_input($_POST["sensor"]);
$location = test_input($_POST["location"]);
$value1 = test_input($_POST["value1"]);
$value2 = test_input($_POST["value2"]);
$value3 = test_input($_POST["value3"]);
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO SensorData (sensor, location, value1, value2, value3)
VALUES ('" . $sensor . "', '" . $location . "', '" . $value1 . "', '" . $value2 . "', '" . $value3 . "')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}
else {
echo "Wrong API Key provided.";
}
}
else {
echo "No data posted with HTTP POST.";
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
เปิดโปรแกรม สำหรับเขียนเว็บ เช่น Notepad หรือโปรแกรมอื่นๆ แล้ว คัดลอกโค๊ดไปวาง
นำข้อมูลที่ได้จากขั้นตอนที่ 2 มาแก้ไข สคริปต์ PHP 3 ค่า คือ $dbname, $username และ $password
$dbname = "esp_data";$username = "esp_board";$password = "รหัสผ่าน";
ไปที่ File -> Save As...
ตั้งชื่อไฟล์ เป็น
post-esp-data.php -> Save
5. อัพโหลดไฟล์ จากคอมพิวเตอร์ ไปยัง Hosting.
ดาวน์โหลด FileZilla Client และติดตั้ง
Download FileZilla Client for Windows (64bit)เปิดใช้งาน FileZilla Client
ฝั่ง Hosting : คลิกไปที่ โฟลเดอร์
htdocs
ฝั่ง คอมพิวเตอร์ PC : คลิกเลือกไฟล์
post-esp-data.php แล้วคลิกขวา -> Upload
ถ้าสำเร็จ ไฟล์
post-esp-data.php จะอัพโหลดไปยัง Hosting
6. ทดสอบการทำงานของสคริปต์ PHP ไฟล์ที่ 1.
เปิดเว็บบราวเซอร์ ที่ URL ป้อน
โดเมนเนมที่จดมา.com/post-esp-data.phpถ้าสำเร็จ จะแสดง No data posted with HTTP POST.
7. สร้างสคริปต์ PHP ไฟล์ที่ 2ที่มีหน้าที่ในการ นำข้อมูลมาแสดงผล
<!DOCTYPE html>
<html><body>
<?php
$servername = "localhost";
$dbname = "REPLACE_WITH_YOUR_DATABASE_NAME";
$username = "REPLACE_WITH_YOUR_USERNAME";
$password = "REPLACE_WITH_YOUR_PASSWORD";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, sensor, location, value1, value2, value3, reading_time FROM SensorData ORDER BY id DESC";
echo '<table cellspacing="5" cellpadding="5">
<tr>
<td>ID</td>
<td>Sensor</td>
<td>Location</td>
<td>Value 1</td>
<td>Value 2</td>
<td>Value 3</td>
<td>Timestamp</td>
</tr>';
if ($result = $conn->query($sql)) {
while ($row = $result->fetch_assoc()) {
$row_id = $row["id"];
$row_sensor = $row["sensor"];
$row_location = $row["location"];
$row_value1 = $row["value1"];
$row_value2 = $row["value2"];
$row_value3 = $row["value3"];
$row_reading_time = $row["reading_time"];
echo '<tr>
<td>' . $row_id . '</td>
<td>' . $row_sensor . '</td>
<td>' . $row_location . '</td>
<td>' . $row_value1 . '</td>
<td>' . $row_value2 . '</td>
<td>' . $row_value3 . '</td>
<td>' . $row_reading_time . '</td>
</tr>';
}
$result->free();
}
$conn->close();
?>
</table>
</body>
</html>
เปิดโปรแกรม สำหรับเขียนเว็บ เช่น Notepad หรือโปรแกรมอื่นๆ แล้ว คัดลอกโค๊ดไปวาง จากนั้น นำข้อมูลที่ได้จากขั้นตอนที่ 2 มาแก้ไข สคริปต์ PHP 3 ค่า คือ $dbname, $username และ $password
$dbname = "esp_data";$username = "esp_board";$password = "รหัสผ่าน";.
ไปที่ File -> Save As...
ตั้งชื่อไฟล์ เป็น
esp-data.php -> Save
อัพโหลดไฟล์
esp-data.php จากคอมพิวเตอร์ ไปยัง Hosting
เปิดเว็บบราวเซอร์ ที่ URL ป้อน
โดเมนเนมที่จดมา.com/esp-data.phpถ้าสำเร็จ จะแสดง
ID Sensor
Location
Value 1
Value 2
Value 3
Timestamp
8. ทดสอบ ESP8266 และ BME280ต่อวงจร และ ทดสอบการทำงาน ตามบทความด้านล่าง
โปรเจค IoT ESP8266 NodeMCU วัดอุณหภูมิ ด้วย BME2809. อัพโหลดโค้ดของ ESP8266 เปิด Arduino IDE คัดลอกโค๊ดไปวาง ในส่วนการเขียนโปรแกรม
#ifdef ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#else
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#endif
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
const char* serverName = "http://example.com/post-esp-data.php";
String apiKeyValue = "tPmAT5Ab3j7F9";
String sensorName = "BME280";
String sensorLocation = "Office";
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
while (1);
}
}
void loop() {
if(WiFi.status()== WL_CONNECTED){
HTTPClient http;
http.begin(serverName);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
+ "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
int httpResponseCode = http.POST(httpRequestData);
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
delay(30000);
}
ก่อนการอัพโหลดต้องแก้ไขโค้ด ตามเครือข่าย WiFi ที่เลือกใช้งาน และ โดเมนเนมที่จดมา
const char* ssid = "REPLACE_WITH_YOUR_SSID";
// คือ ชื่อWiFiที่ต้องการเชื่อมต่อconst char* password = "REPLACE_WITH_YOUR_PASSWORD";
// คือ รหัสผ่านconst char* serverName = "http://example.com/post-esp-data.php";
// โดเมนเนมที่จดมา.com/post-esp-data.phpตรวจความถูกต้องแบบละเอียด เช่น...ตัวพิมพ์เล็ก , ตัวพิมพ์ใหญ่ อักขระต่างๆ ให้ถูกต้อง
อัพโหลดโค้ดที่แก้ไขแล้ว
เลือกชนิดของบอร์ด : ไปที่ Tools > Board : เลือกเป็น NodeMCU 0.9 (ESP-12 Module)
เลือกพอร์ตการใช้งาน : ไปที่ Tools > Port แล้วเลือกพอร์ตที่ปรากฏ ในตัวอย่างเลือกเป็น "COM12"
กดปุ่ม
เพื่ออัพโหลด
หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง
10. ทดสอบการทำงานของโปรเจคเปิดเว็บบราวเซอร์ ที่ URL ป้อน
โดเมนเนมที่จดมา.com/esp-data.php
ถ้าสำเร็จ ที่หน้าจอจะแสดง อุณหภูมิ (Temperature) ความชื้นสัมพัทธ์ (Humidity) ความกดอากาศ (Pressure) ตามรูปด้านล่าง
credit : https://randomnerdtutorials.com/esp32-esp8266-mysql-database-php/