
Sử dụng Flask để gửi dữ liệu đến Raspberry Pi
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách gửi dữ liệu từ một nút WiFi giá rẻ đến Raspberry Pi qua mạng WiFi cục bộ.
Chúng tôi sẽ sử dụng phương pháp gửi tín hiệu từ bo mạch SparkFun ESP8266 Thing đến Raspberry Pi 3 để bật hoặc tắt đèn LED được kết nối với Raspberry Pi. Đây sẽ là phần trình diễn cơ bản về cách gửi tín hiệu từ ESP8266 đến Raspberry Pi qua mạng WiFi.
Vật liệu cần thiết
Bạn sẽ cần những vật dụng này để hoàn thành hướng dẫn này. Ví dụ, bạn có thể thay thế nó bằng Raspberry Pi Zero W thay vì Pi 3 và bạn có thể mua các bộ phận riêng lẻ thay vì bộ khởi động hoàn chỉnh:
- Bộ khởi động Raspberry Pi 3 B+
- Thứ SparkFun ESP8266
- SparkFun Beefy 3 - FTDI Cơ Bản Đột Phá
- Tiêu đề Break Away - Thẳng
- Cáp USB Micro-B - 6 feet
- Đầu cắm rời - Đầu đực 40 chân (Dài ở giữa, PTH, 0,1")
LƯU Ý: Không cần cài đặt hoặc công cụ đặc biệt nào để làm theo hướng dẫn này. Nhưng bạn sẽ cần một chiếc máy hàn và các thiết bị hàn thông thường.
Kết nối phần cứng
Kết nối với Raspberry Pi
Việc kết nối Raspberry Pi rất dễ dàng, chỉ cần kết nối một đèn LED vào chân GPIO 2, xem sơ đồ Fritzing bên dưới để biết thông tin chi tiết về kết nối.

Kết nối với ESP8266
Kết nối hai nút theo sơ đồ Fritzing bên dưới.

Một nút để bật đèn LED của điều khiển từ xa và nút còn lại để tắt đèn. Chúng tôi sẽ cho rằng bạn có thể tự hàn các chân cắm vào bo mạch ESP8266 Thing. Nhưng nếu bạn cần trợ giúp, vui lòng xem hướng dẫn hàn của chúng tôi.
Bạn cũng có thể sử dụng đầu chia dài ở giữa. Cắm đầu cắm 6 chân vào bảng mạch để khớp với chân lập trình trên Thing để bạn có thể cắm bảng FTDI vào đó.
Thiết lập chương trình trên Raspberry Pi
Hãy bắt đầu lập trình trên Raspberry Pi để hỗ trợ các ứng dụng web có thể được sử dụng để kết nối dữ liệu. Hướng dẫn này giả định rằng bạn đã có đôi chút hiểu biết về Linux và Python để có thể thực hiện theo.
Lắp đặt bình
Bước đầu tiên là cài đặt Flask trên Raspberry Pi, hỗ trợ Python và GPIO đã được cài đặt sẵn thông qua Python. Vì vậy, bạn không cần phải lo lắng về điều đó.
Bạn có thể chạy các lệnh này trực tiếp từ thiết bị đầu cuối được mở trên Raspberry Pi hoặc từ xa thông qua kết nối SSH.
Điều đầu tiên bạn cần làm là cài đặt framework Flask:
sudo pip install flask
Tiếp theo, chúng ta sẽ tạo thư mục nơi ứng dụng sẽ chạy. Các lệnh này sẽ tạo một thư mục và xác minh rằng bạn đang làm việc trong thư mục đó.
mkdir FlaskTutorial
cd FlaskTutorial
Bước tiếp theo là tạo một tệp Python trống trong thư mục có tên là “app.py”. Đây là tập tin chúng ta sẽ đưa mã vào. Mở tệp đó trong trình soạn thảo văn bản yêu thích của bạn (Pi có vi, nano và textpad)..
touch app.py
Sau đó nhập mã sau:
#!/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)
Mã được chú thích để giúp trả lời hầu hết các câu hỏi. Nhưng có ba điểm chính cần nhấn mạnh:
- Không có kiểm tra lỗi – giá trị tham số được truyền qua đường dẫn yêu cầu HTTP, nghĩa là có thể nhập bất kỳ giá trị nào. Ví dụ, GET /gpio/2/0 sẽ đặt chân pin ở mức thấp, nhưng nếu sử dụng GET /bats/are/bugs, ứng dụng sẽ không hoạt động và trả về Lỗi 404.
- Tham số host='0.0.0.0' – Cho phép ứng dụng có thể truy cập được từ các thiết bị khác. Nếu bỏ qua tham số này Ứng dụng sẽ chỉ hoạt động trên localhost:5000 chỉ có trên Pi và không thể truy cập từ bên ngoài.
- Số cổng – Mặc định thường được sử dụng là 5000, nhưng có thể thay đổi thành bất kỳ cổng nào khác nếu cần.
Phần mềm bo mạch ESP8266 Thing
Bây giờ chúng ta cần viết chương trình cho bo mạch ESP8266 Thing để gửi yêu cầu HTTP đến Raspberry Pi. Mã này sẽ cho phép bạn gửi yêu cầu đến các chân GPIO của Raspberry Pi.
Mẫu mã
#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");
}
}
Mã và mô tả sẽ giúp bạn hiểu cách mọi thứ hoạt động. Nhưng có hai điều cần nhớ:
- Địa chỉ IP và cổng được sử dụng trong http.begin() là các giá trị được thiết lập trong quá trình phát triển. Phải thay đổi để phù hợp với IP và cổng thực tế của Raspberry Pi.
- Phải nhập đúng SSID và mật khẩu Wi-Fi để ESP8266 có thể kết nối với mạng.
Hãy thử xem!
Mọi thứ đã sẵn sàng rồi! Bạn có thể bắt đầu chạy tập lệnh trên Raspberry Pi bằng cách chạy lệnh sau trong thư mục chứa tệp app.py:
chmod a+x app.py
./app.py
Bạn sẽ thấy một thông báo tương tự như ví dụ bên dưới.

Khi nhấn nút, một yêu cầu HTTP sẽ được gửi đến máy chủ Flask, máy chủ này sẽ báo cáo địa chỉ IP của máy khách, ngày và giờ của yêu cầu. Nội dung của yêu cầu và kết quả (chẳng hạn như mã 200 hoặc mã "thành công"). Thông tin này giúp xác minh rằng yêu cầu đã được gửi chính xác đến máy chủ Flask và không bị mất hoặc gặp lỗi trong quá trình gửi.
tóm tắt
Bây giờ bạn đã cài đặt và chạy Flask thành công giữa Raspberry Pi và ESP8266. Bạn có thể sử dụng nó để điều khiển GPIO và phát triển thêm dự án của mình!