ในบทช่วยสอนนี้ เราจะนำเสนอวิธีการส่งข้อมูลจาก WiFi node ราคาถูกไปยัง Raspberry Pi ผ่านเครือข่าย WiFi ภายใน
เราจะใช้วิธีการส่งสัญญาณจากบอร์ด SparkFun ESP8266 Thing ไปยัง Raspberry Pi 3 เพื่อเปิดหรือปิด LED ที่เชื่อมต่ออยู่กับ Raspberry Pi ซึ่งจะเป็นการสาธิตพื้นฐานในการส่งสัญญาณจาก ESP8266 ไปยัง Raspberry Pi ผ่านเครือข่าย WiFi
คุณจะต้องมีสิ่งเหล่านี้เพื่อทำบทช่วยสอนนี้ให้เสร็จสมบูรณ์ คุณสามารถทดแทนได้ เช่น สามารถใช้ Raspberry Pi Zero W แทน Pi 3 และสามารถหาซื้อชิ้นส่วนแต่ละชิ้นแทนชุดเริ่มต้นแบบครบชุดได้:
- Raspberry Pi 3 B+ Starter Kit
- SparkFun ESP8266 Thing
- SparkFun Beefy 3 - FTDI Basic Breakout
- Break Away Headers - Straight
- USB Micro-B Cable - 6 Foot
- Break Away Headers - 40-pin Male (Long Centered, PTH, 0.1")
ข้อควรทราบ: การติดตั้งหรือการใช้เครื่องมือพิเศษไม่จำเป็นสำหรับการทำตามบทช่วยสอนนี้ แต่คุณจะต้องมีหัวแร้งและอุปกรณ์บัดกรีทั่วไป
การเชื่อมต่อกับ Raspberry Pi
การเชื่อมต่อ Raspberry Pi นั้นง่ายมาก เพียงแค่เชื่อมต่อ LED หนึ่งดวงเข้ากับพิน GPIO 2 ดูแผนภาพ Fritzing ด้านล่างสำหรับรายละเอียดการเชื่อมต่อ
การเชื่อมต่อกับ ESP8266
เชื่อมต่อปุ่มสองปุ่มตามแผนภาพ Fritzing ด้านล่าง
โดยปุ่มหนึ่งจะเปิดไฟ LED ของรีโมท และอีกปุ่มจะปิดไฟ เราจะถือว่าคุณสามารถบัดกรีหัวต่อเข้ากับบอร์ด ESP8266 Thing ได้ด้วยตัวเอง แต่ถ้าคุณต้องการความช่วยเหลือ โปรดดูบทช่วยสอนการบัดกรีของเรา
นอกจากนี้ คุณสามารถใช้หัวต่อแบบแยกที่ยาวตรงกลาง โดยเสียบหัวต่อแบบ 6 พินเข้ากับแผงทดลองให้ตรงกับพินการเขียนโปรแกรมบน Thing เพื่อให้คุณเสียบบอร์ด FTDI เข้าไปได้
มาเริ่มเขียนโปรแกรมบน Raspberry Pi เพื่อรองรับเว็บแอปที่สามารถใช้ในการเชื่อมต่อข้อมูลกันเลย ในบทช่วยสอนนี้ถือว่าคุณมีความคุ้นเคยกับ Linux และ Python อยู่ในระดับหนึ่งเพื่อทำตามได้
การติดตั้ง Flask
ขั้นตอนแรกคือการติดตั้ง Flask บน Raspberry Pi โดยที่ Python และการรองรับ GPIO ผ่าน Python ได้ถูกติดตั้งไว้แล้ว ดังนั้นคุณไม่ต้องกังวลเรื่องนั้น
คุณสามารถรันคำสั่งเหล่านี้ได้ทั้งจากเทอร์มินัลที่เปิดบน Raspberry Pi โดยตรง หรือรันจากระยะไกลผ่านการเชื่อมต่อ SSH
สิ่งแรกที่คุณต้องทำคือติดตั้งเฟรมเวิร์ก Flask:
sudo pip install flask
ต่อไปเราจะสร้างไดเรกทอรีที่แอปจะทำงาน คำสั่งเหล่านี้จะสร้างไดเรกทอรีและตรวจสอบว่าคุณกำลังทำงานอยู่ภายในไดเรกทอรีนั้น
mkdir FlaskTutorial
cd FlaskTutorial
ขั้นตอนต่อไปคือการสร้างไฟล์ Python เปล่าในไดเร็กทอรีชื่อ "app.py" นี่คือไฟล์ที่เราจะใส่โค้ดลงไป เปิดไฟล์นั้นในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ (Pi มี vi, nano และ textpad)
touch app.py
จากนั้นใส่โค้ดต่อไปนี้ลงไป
#!/usr/bin/python
from flask import Flask
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # Sets up the RPi lib to use the Broadcom pin mappings
# for the pin names. This corresponds to the pin names
# given in most documentation of the Pi header
GPIO.setwarnings(False) # Turn off warnings that may crop up if you have the
# GPIO pins exported for use via command line
GPIO.setup(2, GPIO.OUT) # Set GPIO2 as an output
app = Flask(__name__) # Create an instance of flask called "app"
@app.route("/") # This is our default handler, if no path is given
def index():
return "hello"
# The magic happens here. When some http request comes in with a path of
# gpio/x/y, the Flask app will attempt to parse that as x=pin and y=level.
# Note that there is no error handling here! Failure to properly specify the
# route will result in a 404 error.
@app.route('/gpio/<string:id>/<string:level>')
def setPinLevel(id, level):
GPIO.output(int(id), int(level))
return "OK"
# If we're running this script directly, this portion executes. The Flask
# instance runs with the given parameters. Note that the "host=0.0.0.0" part
# is essential to telling the system that we want the app visible to the
# outside world.
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
โค้ดมีคำอธิบายประกอบเพื่อช่วยตอบคำถามส่วนใหญ่ แต่มีสามประเด็นสำคัญที่ต้องเน้น:
• ไม่มีการตรวจสอบข้อผิดพลาด – ค่าพารามิเตอร์ถูกส่งผ่านเส้นทางของ HTTP request ซึ่งหมายความว่าสามารถป้อนค่าใดก็ได้ ตัวอย่างเช่น GET /gpio/2/0 จะตั้งค่าพินให้ต่ำ แต่หากใช้ GET /bats/are/bugs แอปจะไม่ทำงานและส่งกลับ 404 Error
• พารามิเตอร์ host='0.0.0.0' – กำหนดให้แอปสามารถเข้าถึงได้จากอุปกรณ์อื่น หากละเว้นพารามิเตอร์นี้ แอปจะทำงานได้เฉพาะใน localhost:5000 บน Pi เท่านั้น และจะไม่สามารถเข้าถึงจากภายนอกได้
• หมายเลขพอร์ต – ค่าเริ่มต้นที่ใช้กันทั่วไปคือ 5000 แต่สามารถเปลี่ยนเป็นพอร์ตอื่นได้ตามต้องการ
ตอนนี้เราจะต้องเขียนโปรแกรมสำหรับบอร์ด ESP8266 Thing เพื่อส่งคำขอ HTTP ไปยัง Raspberry Pi โดยโค้ดนี้จะช่วยให้คุณส่งคำขอไปยังพิน GPIO ของ Raspberry Pi
ตัวอย่างโค้ด
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
ESP8266WiFiMulti WiFiMulti;
void setup()
{
Serial.begin(115200);
// ESP8266 takes a few moments to boot, so we give it a few seconds
for(uint8_t t = 4; t > 0; t--)
{
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
// Add the WiFi access point information
WiFiMulti.addAP("SSID", "PASSWORD");
// Set our buttons pins to inputs with pullup resistors enabled
pinMode(12, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);
}
void loop()
{
// wait for WiFi connection
if((WiFiMulti.run() == WL_CONNECTED))
{
// Check if button 12 is pressed...
if (digitalRead(12) == LOW)
{
//...and if so, issue a GET request of the format
// gpio/x/y, where x is the desired pin and y is the
// desired level to set the pin to. Currently the
// Flask app only supports pin 2.
HTTPClient http;
// Be sure to change this IP address and port number
// to match yours!!!
http.begin("http://10.8.253.193:5000/gpio/2/0");
int httpCode = http.GET();
http.end();
}
// Repeat the process for pin 13.
if (digitalRead(13) == LOW)
{
HTTPClient http;
// Be sure to change this IP address and port number
// to match yours!!!
http.begin("http://10.8.253.193:5000/gpio/2/1");
int httpCode = http.GET();
http.end();
}
}
else
{
Serial.println("No WiFi");
}
}
โค้ดและคำอธิบายน่าจะช่วยให้เข้าใจได้ว่าทุกอย่างทำงานอย่างไร แต่มีสองเรื่องที่ต้องจำไว้:
• ที่อยู่ IP และพอร์ต ที่ใช้ใน http.begin() เป็นค่าที่ตั้งไว้ตอนพัฒนา ต้องเปลี่ยนให้ตรงกับ IP และพอร์ตของ Raspberry Pi ที่ใช้งานจริง
• SSID และรหัสผ่าน Wi-Fi ต้องใส่ให้ถูกต้อง เพื่อให้ ESP8266 เชื่อมต่อเครือข่ายได้
ตอนนี้ทุกอย่างน่าจะพร้อมแล้ว! เริ่มรันสคริปต์บน Raspberry Pi ได้โดยใช้คำสั่งต่อไปนี้ในไดเร็กทอรีที่มีไฟล์ app.py:
chmod a+x app.py
./app.py
คุณควรจะเห็นข้อความที่คล้ายกับตัวอย่างด้านล่างนี้
เมื่อกดปุ่ม ระบบจะส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์ Flask ซึ่งจะรายงานที่อยู่ IP ของไคลเอนต์ วันที่และเวลาของคำขอ เนื้อหาของคำขอ และผลลัพธ์ (เช่น รหัส 200 หรือ "สำเร็จ") ข้อมูลเหล่านี้ช่วยตรวจสอบว่าคำขอถูกส่งไปยังเซิร์ฟเวอร์ Flask อย่างถูกต้อง ไม่ได้หลงทางหรือเกิดข้อผิดพลาดระหว่างทาง
ตอนนี้คุณได้ติดตั้งและใช้งาน Flask ระหว่าง Raspberry Pi และ ESP8266 สำเร็จแล้ว สามารถนำไปใช้ในการควบคุม GPIO และพัฒนาโปรเจกต์ของคุณต่อไปได้!