ที่เคยเขียนเกี่ยวกับบทช่วยสอนบันทึกข้อมูล Arduino ไปยังฐานข้อมูล MySQL. ด้วยแนวคิดที่เกือบจะเหมือนกัน คราวนี้ฉันจะพูดถึงวิธีบันทึกข้อมูล esp 8266 และอื่นๆ ที่คล้ายกัน (NodeMCU, Wemos ฯลฯ) ลงในฐานข้อมูล MySQL ด้วย PHP Rest API พื้นฐานของการสื่อสารนี้คือคำขอ HTTP ซึ่งเกี่ยวข้องกับไคลเอนต์-เซิร์ฟเวอร์ โดยทั่วไปมี 2 วิธีที่ใช้กันทั่วไปในคำขอ HTTP คือ GET และ POST ข้อมูลที่เราจะใช้สำหรับตัวอย่างคือข้อมูลอุณหภูมิและความชื้นจาก DHT 22 คุณยังสามารถใช้ข้อมูลอื่นหรือจะใช้ค่าสุ่มก็ได้ ต่อไปเราจะส่งข้อมูลไปยังเซิร์ฟเวอร์ภายในเพื่อจัดเก็บไว้ในฐานข้อมูล MySQL จากฐานข้อมูลเราสามารถประมวลผลให้แสดงเป็นตารางหรือกราฟได้
เครื่องมือและวัสดุ
โมดูล/ฮาร์ดแวร์ที่ใช้คือ NodeMCU, DHT 22 Sensor (AM2302) ถัดไปสำหรับเซิร์ฟเวอร์ท้องถิ่นเราใช้ XAMPP โปรแกรมแก้ไขข้อความ (notepad ++ หรือ Sublime)บุรุษไปรษณีย์(สำหรับ API ทดสอบที่เราทำ) การเชื่อมต่อใช้ wifi ดังนั้นตรวจสอบให้แน่ใจว่ามีฮอตสปอต (จุดเข้าใช้งาน / ฮอตสปอตแบบพกพา (โทรศัพท์มือถือ Android)) ตรวจสอบให้แน่ใจว่าคุณใช้ XAMPP และเปิดใช้งานบริการ Apache และ Mysql
โปรแกรมฝั่งเซิร์ฟเวอร์
สร้างฐานข้อมูลที่คุณจะจัดเก็บข้อมูล ตัวอย่างเช่นด้านล่าง (ชื่อ DB: nodemcu_log, ชื่อตาราง: station1) ในการทดลองนี้ข้อมูลที่จะจัดเก็บคืออุณหภูมิและความชื้น
*การสร้างฐานข้อมูลสามารถทำได้ผ่านไฟล์ในลิงค์ดาวน์โหลด
สร้างฐานข้อมูล `nodemcu_log`; สร้างตาราง `station1` ( `id` int(20) unsigned NOT NULL AUTO_INCREMENT, `suhu` double NOT NULL, `kelembaban` double NOT NULL, `created_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), คีย์หลัก (`id`))
จากนั้นสร้างโปรแกรม PHP API สำหรับตำแหน่งของไฟล์ที่จะสร้าง คุณสามารถปรับและสร้างโฟลเดอร์ได้arducoding_tutorialใน htdocs
เริ่มจากไฟล์ฐานข้อมูล.phpบันทึกลงในไดเร็กทอรี C:\xampp\htdocs\arducoding_tutorial\nodemcu_log\เว็บปิ\กำหนดค่า
ระดับ ฐานข้อมูล{ส่วนตัว $โฮสต์ = "โฮสต์ท้องถิ่น";ส่วนตัว $database_name = "nodemcu_log";ส่วนตัว $ชื่อผู้ใช้ = "ราก";ส่วนตัว $รหัสผ่าน = "";สาธารณะ $เชื่อมต่อ;สาธารณะ การทำงาน รับการเชื่อมต่อ(){$นี่->คอน = โมฆะ;พยายาม{$นี่->คอน = ใหม่พีดีโอ("mysql:โฮสต์=" . $นี่->เจ้าภาพ . ";dbname=" . $นี่->ฐานข้อมูล_ชื่อ,$นี่->ชื่อผู้ใช้,$นี่->รหัสผ่าน);$นี่->คอน->ผู้บริหาร("ตั้งชื่อ utf8"); }จับ(PDOException$ข้อยกเว้น){เสียงสะท้อน "ไม่สามารถเชื่อมต่อฐานข้อมูลได้:" . $ข้อยกเว้น->รับข้อความ(); }กลับ $นี่->คอน; } }?>
ต่อไปก็สร้างไฟล์nodemcu_log.phpไดเรกทอรี
C:\xampp\htdocs\arducoding_tutorial\nodemcu_log\เว็บปิ\ระดับ
ระดับ Nodemcu_log{// การเชื่อมต่อ ส่วนตัว $เชื่อมต่อ;// โต๊ะ ส่วนตัว $db_table = "สถานี1";// คอลัมน์ สาธารณะ $รหัส;สาธารณะ $ อุณหภูมิ;สาธารณะ $ความชื้น;สาธารณะ $created_at;// การเชื่อมต่อฐานข้อมูล สาธารณะ การทำงาน __สร้าง($db){$นี่->คอน = $db; }// สร้าง สาธารณะ การทำงาน createLogData(){$sqlQuery = "ใส่ลงใน". $นี่->db_table ."ชุดอุณหภูมิ = : อุณหภูมิ,ความชื้น = :ความชื้น";$stmt = $นี่->คอน->เตรียมตัว($sqlQuery);//ฆ่าเชื้อ $นี่->อุณหภูมิ=htmlอักขระพิเศษ(strip_tags($นี่->อุณหภูมิ));$นี่->ความชื้น=htmlอักขระพิเศษ(strip_tags($นี่->ความชื้น));//ผูกข้อมูล $stmt->ผูกพารามิเตอร์(":อุณหภูมิ",$นี่->อุณหภูมิ);$stmt->ผูกพารามิเตอร์(":ความชื้น",$นี่->ความชื้น);ถ้า($stmt->ดำเนินการ()){กลับ จริง; }กลับ เท็จ; } }?>
ในที่สุดก็สร้างไฟล์create.phpไดเรกทอรี
C:\xampp\htdocs\arducoding_tutorial\nodemcu_log\เว็บปิ\เอพีไอ
หัวข้อ("การควบคุมการเข้าถึง-อนุญาต-แหล่งกำเนิด: *"); หัวข้อ("ประเภทเนื้อหา: application/json; charset=UTF-8");รวม_ครั้งเดียว '../config/database.php';รวม_ครั้งเดียว '../class/nodemcu_log.php';$ฐานข้อมูล = ใหม่ฐานข้อมูล();$db = $ฐานข้อมูล->รับการเชื่อมต่อ();$รายการ = ใหม่Nodemcu_log($db);ถ้า($_เซิร์ฟเวอร์['คำขอ_วิธีการ']=== 'โพสต์') {// คำขอใช้วิธี POST$ข้อมูล = json_decode(file_get_contents("php://input"));$รายการ->อุณหภูมิ = $ข้อมูล->อุณหภูมิ;$รายการ->ความชื้น = $ข้อมูล->ความชื้น;}อย่างอื่น($_เซิร์ฟเวอร์['คำขอ_วิธีการ']=== 'รับ'){// คำขอใช้วิธี GET$รายการ->อุณหภูมิ = ไอเซต($_GET['อุณหภูมิ'])? $_GET['อุณหภูมิ']: : ตาย('โครงสร้างผิด!');$รายการ->ความชื้น = ไอเซต($_GET['ความชื้น'])? $_GET['ความชื้น']: : ตาย('โครงสร้างผิด!');}อื่น{ตาย('วิธีการร้องขอไม่ถูกต้อง');}ถ้า($รายการ->createLogData()){เสียงสะท้อน 'สร้างข้อมูลสำเร็จแล้ว'; }อื่น{เสียงสะท้อน 'ไม่สามารถสร้างข้อมูลได้'; }?>
ตกลง API ส่วนที่เหลือของบริการพร้อมใช้งานแล้ว หากต้องการบันทึกข้อมูลลงฐานข้อมูล mysql เราสามารถใช้วิธี POST หรือ GET ได้ เพียงปรับตามความต้องการของคุณ รูปแบบคำขอมีดังนี้ (ในโปรแกรม nodemcu ให้แทนที่ localhost ด้วยที่อยู่ IP ของพีซีของคุณ):
รับ - http://localhost/arducoding_tutorial/nodemcu_log/webapi/api/create.php?suhu=20.82&kelembaban=88.99 โพสต์ - http://localhost/arducoding_tutorial/nodemcu_log/webapi/api/create.php
เราสามารถทดสอบได้ว่า API สามารถทำงานได้ผ่านแอปพลิเคชันบุรุษไปรษณีย์หรือไม่
โปรแกรม php rest API นี้สามารถพัฒนาเพิ่มเติมสำหรับฟังก์ชั่นของมันได้ ตัวอย่างเช่น หากต้องการขอข้อมูลที่จัดเก็บไว้ในฐานข้อมูล ลบข้อมูล หรือแก้ไข/อัปเดตข้อมูล ซึ่งโดยทั่วไปจะเรียกโดยย่อว่า CRUD
ตอนนี้เรามาดูการตั้งค่าฮาร์ดแวร์ (nodeMCU) กันดีกว่า
แผนภาพการเดินสายไฟ
โปรแกรม NodeMCU
ห้องสมุด
ก่อนเขียนโปรแกรม ตรวจสอบให้แน่ใจว่าได้ติดตั้งไลบรารีต่อไปนี้แล้ว ได้แก่ Adafruit Unified Sensor, ไลบรารีเซ็นเซอร์ DHT และ ArduinoJSON ปรับรุ่นตามที่แสดงในภาพ
นอกจากนี้ เพื่อบันทึกข้อมูลลงฐานข้อมูล โปรแกรม nodeMCU จะถูกปรับให้เข้ากับวิธีการใช้
บันทึกข้อมูล nodeMCU ไปยังฐานข้อมูล MySQL ด้วยวิธี GET
วิธี GET มักใช้สำหรับการขอข้อมูล แต่ก็สามารถใช้เพื่อจัดเก็บข้อมูลได้เช่นกัน ข้อมูลทั้งหมดจะอยู่ใน URL ซึ่งจะถูกแยกวิเคราะห์เพื่อประมวลผลบนเซิร์ฟเวอร์
// NodeMCU esp8266 บันทึกข้อมูลลงในฐานข้อมูล mysql ด้วยวิธีการ GET//www.arducoding.com#รวม#รวม #รวม "DHT.h"#กำหนด DHTPIN 4//#define DHTTYPE DHT11 // DHT 11#กำหนด DHTTYPE DHT22// DHT 22 (AM2302), AM2321//#กำหนด DHTTYPE DHT21 // DHT 21 (AM2301) ค่าคงที่ ถ่าน*เอสเอส= "SSID Wifi ของคุณ";ค่าคงที่ ถ่าน*รหัสผ่าน= "รหัสผ่าน Wifi ของคุณ";ดีเอชทีdht(DHTPIN, DHTTYPE);เป็นโมฆะ ติดตั้ง() { Serial.begin(9600);//Serial.println(F("ทดสอบ DHTxx!"));dht.begin(); WiFi.โหมด(WIFI_STA); WiFi.begin(ssid, รหัสผ่าน);ภายในฉัน=0;ในขณะที่(WiFi.สถานะ()!=WL_CONNECTED) { Serial. พิมพ์ ("."); ล่าช้า(1,000); } อนุกรม.println(""); อนุกรม.println("เชื่อมต่อ WiFi แล้ว"); อนุกรม.println("ที่อยู่ IP: "); Serial.println(WiFi.localIP()); อนุกรม.println(); ล่าช้า(2000); }เป็นโมฆะ วนซ้ำ() {สองเท่าความชื้น=dht.readความชื้น();// อ่านอุณหภูมิเป็นเซลเซียส (ค่าเริ่มต้น) สองเท่าอุณหภูมิ=dht.readอุณหภูมิ();// ตรวจสอบว่าการอ่านล้มเหลวและออกก่อนเวลาหรือไม่ (เพื่อลองอีกครั้ง) ถ้า(อิสาน(ความชื้น)||isnan (อุณหภูมิ)) { Serial.println (F ("ไม่สามารถอ่านจากเซ็นเซอร์ DHT!"));กลับ; } อนุกรม.พิมพ์(F("อุณหภูมิ:")); Serial.print(ซูฮู); Serial.พิมพ์(F("°C ความชื้น:")); Serial.พิมพ์(ความชื้น); Serial.println(F("%"));ถ้า((WiFi.สถานะ()==WL_CONNECTED)) { ไคลเอนต์ WiFiClient; HTTPไคลเอนต์ http; ที่อยู่สตริง;//เท่ากับที่อยู่ IP ของคอมพิวเตอร์และแอปพลิเคชันไดเร็กทอรีของคุณ // C:\xampp\htdocs\arducoding_tutorial\nodemcu_log\webapi\api\create.phpที่อยู่="http://192.168.0.8/arducoding_tutorial/nodemcu_log/webapi/api/create.php?suhu="; ที่อยู่+=สตริง(ซูหู); ที่อยู่+= "&ความชื้น="; ที่อยู่+=สตริง(เคเลมบาบัน); http.begin(ลูกค้า,ที่อยู่);//ระบุปลายทางคำขอ ภายในhttpโค้ด=http.GET();//ส่งคำขอเพย์โหลดสตริง;ถ้า(httpCode> 0) {//ตรวจสอบโค้ดที่ส่งคืนน้ำหนักบรรทุก=http.getString();// รับเพย์โหลดการตอบกลับคำขอน้ำหนักบรรทุก.trim();ถ้า( น้ำหนักบรรทุก.ความยาว()> 0){ Serial.println(เพย์โหลด+ "\n"); } } http.end();//ปิดการเชื่อมต่อ}อื่น{ อนุกรม.พิมพ์("ไม่ได้เชื่อมต่อกับ wifi");Serial.println(ssid); } ล่าช้า(60000);// ช่วงเวลา 60 วินาที}
ผลลัพธ์ของโปรแกรมข้างต้นจะมากหรือน้อยดังนี้
บันทึกข้อมูล nodeMCU ไปยังฐานข้อมูล MySQL ด้วยวิธี POST
สำหรับวิธี POST ข้อมูลที่จะจัดเก็บไว้ในฐานข้อมูลจะถูกส่งในรูปแบบ JSON ตอนนี้เพื่อให้ง่ายต่อการสร้างข้อมูลในรูปแบบ JSON จึงใช้ไลบรารี Arduino JSON
// NodeMCU esp8266 บันทึกข้อมูลลงฐานข้อมูล mysql ด้วยวิธีการ POST//www.arducoding.com#รวม#รวม #รวม #รวม "DHT.h"#กำหนด DHTPIN 4//#define DHTTYPE DHT11 // DHT 11#กำหนด DHTTYPE DHT22// DHT 22 (AM2302), AM2321//#กำหนด DHTTYPE DHT21 // DHT 21 (AM2301) ค่าคงที่ ถ่าน*เอสเอส= "SSID Wifi ของคุณ";ค่าคงที่ ถ่าน*รหัสผ่าน= "รหัสผ่าน Wifi ของคุณ";ดีเอชทีdht(DHTPIN, DHTTYPE);เป็นโมฆะ ติดตั้ง() { Serial.begin(9600);//Serial.println(F("ทดสอบ DHTxx!"));dht.begin(); WiFi.โหมด(WIFI_STA); WiFi.begin(ssid, รหัสผ่าน);ภายในฉัน=0;ในขณะที่(WiFi.สถานะ()!=WL_CONNECTED) { Serial. พิมพ์ ("."); ล่าช้า(1,000); } อนุกรม.println(""); อนุกรม.println("เชื่อมต่อ WiFi แล้ว"); อนุกรม.println("ที่อยู่ IP: "); Serial.println(WiFi.localIP()); อนุกรม.println(); ล่าช้า(2000); }เป็นโมฆะ วนซ้ำ() {สองเท่าความชื้น=dht.readความชื้น();// อ่านอุณหภูมิเป็นเซลเซียส (ค่าเริ่มต้น) สองเท่าอุณหภูมิ=dht.readอุณหภูมิ();// ตรวจสอบว่าการอ่านล้มเหลวและออกก่อนเวลาหรือไม่ (เพื่อลองอีกครั้ง) ถ้า(อิสาน(ความชื้น)||isnan (อุณหภูมิ)) { Serial.println (F ("ไม่สามารถอ่านจากเซ็นเซอร์ DHT!"));กลับ; } อนุกรม.พิมพ์(F("อุณหภูมิ:")); Serial.print(ซูฮู); Serial.พิมพ์(F("°C ความชื้น:")); Serial.พิมพ์(ความชื้น); Serial.println(F("%"));ถ้า((WiFi.สถานะ()==WL_CONNECTED)) { ไคลเอนต์ WiFiClient; HTTPไคลเอนต์ http; เอกสาร Json แบบคงที่<200>หมอ; URL สตริง, nodemcuData;//เท่ากับที่อยู่ IP ของคอมพิวเตอร์และแอปพลิเคชันไดเร็กทอรีของคุณ // C:\xampp\htdocs\arducoding_tutorial\nodemcu_log\webapi\api\create.phpURL="http://192.168.0.8/arducoding_tutorial/nodemcu_log/webapi/api/create.php"; เอกสาร["อุณหภูมิ"]=สตริง(ซูหู); เอกสาร["ความชื้น"]=เชือก(เคเลมบาบัน); http.begin(ลูกค้า,url); http.addHeader("ชนิดของเนื้อหา","แอปพลิเคชัน / json"); ทำให้เป็นอนุกรมJson(doc, nodemcuData); อนุกรม.พิมพ์("โพสต์ข้อมูล >>"); Serial.println(nodemcuData);ภายในhttpโค้ด=http.POST(nodemcuData);//ส่งคำขอเพย์โหลดสตริง;ถ้า(httpCode> 0) {//ตรวจสอบโค้ดที่ส่งคืนน้ำหนักบรรทุก=http.getString();// รับเพย์โหลดการตอบกลับคำขอน้ำหนักบรรทุก.trim();ถ้า( น้ำหนักบรรทุก.ความยาว()> 0){ Serial.println(เพย์โหลด+ "\n"); } } http.end();//ปิดการเชื่อมต่อ}อื่น{ อนุกรม.พิมพ์("ไม่ได้เชื่อมต่อกับ wifi");Serial.println(ssid); } ล่าช้า(60000);// ช่วงเวลา 60 วินาที}
ผลลัพธ์ของโปรแกรมข้างต้นจะมากหรือน้อยเหมือนกับวิธี GET ดังแสดงในรูปต่อไปนี้
สามารถดาวน์โหลดโปรแกรมโค้ดแบบเต็มจาก PHP rest API ได้ที่ลิงค์ต่อไปนี้ มันมีฟังก์ชั่นสำหรับดำเนินการกระบวนการ CRUD ทั้งกับวิธีการโพสต์และรับ นอกจากนี้ยังมีโค้ดสำหรับสร้างฐานข้อมูลที่ต้องการ ผลลัพธ์สามารถดูได้ในวิดีโอด้านล่าง
บทสรุป
ทั้งเมธอด GET และ POST ทำงานอย่างถูกต้องในกระบวนการจัดเก็บข้อมูลลงในฐานข้อมูล mysql นี้ หากข้อมูลประกอบด้วยพารามิเตอร์หลายตัว วิธี POST จะใช้งานได้สะดวกยิ่งขึ้น สิ่งที่ชัดเจนคือทุกอย่างจะต้องซิงโครไนซ์ระหว่างโปรแกรม PHP เพื่อบันทึกลงในฐานข้อมูล ข้อมูลที่จะจัดเก็บ และตำแหน่งไดเร็กทอรีของแอปพลิเคชัน นอกเหนือจาก nodeMCU แล้ว เรายังสามารถส่งคำขอไปยังบริการ API ส่วนที่เหลือของ PHP นี้ได้อีกด้วยโดยใช้อาดูโน่(เพียงปรับตำแหน่งเว็บ API) และอุปกรณ์อื่นๆ
การค้นหาที่เกี่ยวข้อง
- ฐานข้อมูล NodeMCU MySQL
- วิธีการร้องขอ NodeMCU POST/GET HTTP
- การเชื่อมต่อ NodeMCU กับฐานข้อมูล MySQL
- บันทึกข้อมูล NodeMCU ไปยังฐานข้อมูล MySQL