การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

ในบทช่วยสอนนี้ เราจะนำเสนอวิธีการส่งข้อมูลจาก WiFi node ราคาถูกไปยัง Raspberry Pi ผ่านเครือข่าย WiFi ภายใน

การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

เราจะใช้วิธีการส่งสัญญาณจากบอร์ด 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

มาเริ่มเขียนโปรแกรมบน 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

ตอนนี้เราจะต้องเขียนโปรแกรมสำหรับบอร์ด 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 และพัฒนาโปรเจกต์ของคุณต่อไปได้!

บทความที่เกี่ยวข้อง

การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

ในบทช่วยสอนนี้ เราจะนำเสนอวิธีการส่งข้อมูลจาก WiFi node ราคาถูกไปยัง Raspberry Pi ผ่านเครือข่าย WiFi ภายใน

นักเขียนบทความ
by 
นักเขียนบทความ
การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

ในบทช่วยสอนนี้ เราจะนำเสนอวิธีการส่งข้อมูลจาก 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

มาเริ่มเขียนโปรแกรมบน 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

ตอนนี้เราจะต้องเขียนโปรแกรมสำหรับบอร์ด 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 และพัฒนาโปรเจกต์ของคุณต่อไปได้!

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

บทความที่เกี่ยวข้อง

การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

การใช้ Flask ส่งข้อมูลไปยัง Raspberry Pi

ในบทช่วยสอนนี้ เราจะนำเสนอวิธีการส่งข้อมูลจาก WiFi node ราคาถูกไปยัง Raspberry Pi ผ่านเครือข่าย WiFi ภายใน

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

เราจะใช้วิธีการส่งสัญญาณจากบอร์ด 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

มาเริ่มเขียนโปรแกรมบน 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

ตอนนี้เราจะต้องเขียนโปรแกรมสำหรับบอร์ด 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 และพัฒนาโปรเจกต์ของคุณต่อไปได้!

Related articles