Tải bản đầy đủ - 0 (trang)
CHƯƠNG 3 THIẾT KẾ HỆ THỐNG THU THẬP DỮ LIỆU QUA MẠNG INTERNET TRÊN CƠ SỞ NGÔN NGỮ PYTHON VÀ RASPBERRY PI

CHƯƠNG 3 THIẾT KẾ HỆ THỐNG THU THẬP DỮ LIỆU QUA MẠNG INTERNET TRÊN CƠ SỞ NGÔN NGỮ PYTHON VÀ RASPBERRY PI

Tải bản đầy đủ - 0trang

Đo độ ẩm ở 20 - 80%RH với sai số ±5%.

Nhiệt độ hoạt động 0 - 50°C sai số ±2°C.

Giao thức hoạt động

Dữ liệu được truyền qua chân Data theo định dạng:

- 8bit phần nguyên độ ẩm + 8bit phần thập phân độ ẩm +

8bit phần nguyên nhiệt độ + 8bit phần thập phân nhiệt độ + 8bit

check sum.

Checksum bằng 8bit thấp của tổng sau:

- 8bit phần nguyên độ ẩm + 8bit phần thập phân độ ẩm +

8bit phần nguyên nhiệt độ + 8bit phần thập phân nhiệt độ

Trình tự truyền nhận dữ liệu như sau:

Trạng thái mặc định của chân data là 1. Khi giao tiếp bắt đầu,

Raspberry Pi sẽ kéo chân data xuống 0 trong 18ms (Start Signal).

DHT22 sẽ phát hiện tín hiệu này. Sau đó, Raspberry Pi sẽ kéo chân

data lên 1 trong 20-40us để chờ DHT22 phản hồi. Khi DHT22 nhận

được Start Signal, sẽ kéo chân data xuống 0 (Response Signal)

trong 80us. Sau đó kéo chân data lên 1 trong 80us, và chuẩn bị gửi

dữ liệu.

Trong quá trình truyền dữ liệu, mỗi 1 bit dữ liệu trước khi

truyền được bắt đầu bằng một tín hiệu mức thấp 50us. Sau đó dữ

liệu được truyền qua tín hiệu ở mức 1, với bit 0 được biểu hiện

bằng một tín hiệu mức 1 với độ rộng 26-28us, bit 1 được biểu hiện

bằng một tín hiệu mức 1 với độ rộng 70us.

Nguyên lí hoạt động

Sau khi đã kết nối và cấp nguồn cho tất cả các khối,

Raspberry Pi (đã được nạp lệnh) sẽ gửi yêu cầu đến bộ cảm biến,

sau đó bộ cảm biến thu thập dữ liệu và gửi lại tới Raspberry Pi. Tại

đây, Raspberry Pi sẽ thực hiện gửi dữ liệu cụ thể là thông tin về

nhiệt độ và độ ẩm lên webserver và máy tính sẽ truy cập để xem

kết quả được hiển thị trên webserver.



62



3.2 Lập trình cho hệ thống sử dụng ngơn ngữ Python và

HTML

3.2.1 Lập trình ngơn ngữ Python

Các chương trình cơ bản trong Python

Python là ngơn ngữ lập trình thơng dịch, điều đó có nghĩa là

bạn có thể viết code ngay trên trình thơng dịch hoặc viết vào file

sau đó chạy chúng. Đầu tiên chúng ta sẽ sử dụng trình thơng dịch

để bắt đầu viết một chương trình đầu tiên (bạn có thể sử dụng

shell trên Windows hoặc Terminal trên Linux)

Ví dụ:

Để có thể in ra dòng chữ "Xin chào Python Viet Nam" bạn có

thể làm như sau:

>>> print "Xin chào Python Viet Nam!"

Hello World!

helloworld.py

Trình thơng dịch Python rất tốt cho các câu lệnh kiểm tra

hoặc các thao tác đơn giản nhưng bạn thường sẽ muốn chạy tập

lệnh Python của bạn như một ứng dụng độc lập Để bắt đầu một

Python mới, chọn File rồi chọn New Window và IDLE sẽ cho mở ra

một cửa sổ chỉnh sửa tập lệnh. Hãy thử gõ một dòng mã và chọn

Run rồi chọn Run Module. Bạn sẽ nhận được một cảnh báo cần lưu

file



đó



để



chạy.



Lưu



tập



lệnh



trong



thư



mục



với



tên



“SalutonMondo.py” và bạn sẽ thấy nó thực hiện trong trình Shell

Ví dụ:

#!/usr/bin/env python

print (“Saluton Modo”)

sẽ in ra trên Shell là

Saluton Mondo

Để thực hiện chạy khi không muốn dùng IDLE, cần trao

quyền cho file đó được thực thi. Dùng lệnh sau:

$ python SalutonMondo.py

63



Khoảng trắng và thụt đầu dòng

Trong Python khoảng trắng rất quan trọng. Chúng ta phân

biệt cách sử dụng dấu khoảng trắng. Khoảng trắng trong dòng đầu

tiên được xem như dấu thụt đầu dòng. Nhưng nếu sử dụng sai thì

sẽ báo lỗi.

Ví dụ như sau:

>>> a = 12

>>> a = 12

File "", line 1

a = 12

IndentationError: unexpected indent

Chú ý: Có một dấu cách đầu tiên gây ra lỗi trong đoạn

chương trình trên, do đó chúng ta cần đặt dấu thụt đầu dòng thích

hợp.

Chúng ta có một số chú ý cho việc sử dụng dấu khoảng trắng

và định danh

Thụt sử dụng 4 khoảng trắng

Không bao giờ kết hợp với dấu cách Tab, hoặc nên thay thế

chúng phù hợp.

Một dòng trống giữa các chức năng giữa.

Hai dòng trống giữa hai lớp.

Có nhiều nơi trong đoạn chương trình mà bạn phải áp dụng

cách dùng dấu cách, ví dụ như:

Add a space after ”,” in dicts, lists, tuples, and argument lists

and after ”:” in dicts.

Spaces around assignments and comparisons (except in

argument list)

No spaces just inside parentheses.

Bình luận là một đoạn văn bản được viết trong chương trình,

chúng được sử dụng để giải thích hoặc chú thích cho người khác



64



hiểu về đoạn code đó. Một đoạn comment bắt đầu bằng dấu “#”,

mọi thứ sau dấu “#” không được thực thi trong chương trình.

>>> # Đây là một bình luận

>>> # Dòng tiếp theo sẽ cộng 2 số

>>> a = 12 + 34

>>> print c # Đây cũng là một bình luận

Bình luận giúp cho lập trình viên dễ dàng cải tiến mã nguồn,

ghi chú các chức năng của đoạn code thực hiện, nó có thể là người

viết, ngày viết.

# FIXME -- fix these code later

# TODO -- in future you have to do this

Modules trong Python là các tập tin chưa các hàm được định

nghĩa sẵn, biến cái mà chúng ta có thể sử dụng lại, nó cũng có

đi mở rộng là “.py”. Python đã cung cấp sẵn một số module mặc

định. Chúng ta có thể sử dụng chúng. Để sử dụng chúng ta cần

dùng lệnh import. Ví dụ như sau:

>>> import math

>>> print math.e

2.71828182846

Nếu bạn muốn xóa các biến và bắt đầu trạng thái mới, chọn

Shell rồi chọn Retstart Shell để bắt đầu lại.

Trong Python, các kiểu chuỗi, danh sách, thư viện và thậm

chí là kiểu số đều dược xem là “đối tượng”. Python có thể được

xem như là một bộ sưu tập các thuộc tính và phương thức mà có

thể truy cập vào bằng cách sử dụng một cú pháp đơn giản là dấu

chấm “.”.

Ví dụ:

>>> myString = “quux”

>>> myString.capitalize()

‘Quux’

65



Hoặc sử dụng ngoặc đơn “()” để sắp xếp lại danh sách theo

thứ tự ngược

>>> myList = [‘a’, ‘man’, ‘a’, ‘plan’, ‘a’, ‘canal’]

>>>myList.reverse()

>>> print (myList)

[‘a’, ‘man’, ‘a’, ‘plan’, ‘a’, ‘canal’]

Lưu ý: Cả chuỗi và danh sách được xây dựng trong các thư

viện của thư viện chuẩn có sẵn từ bất kỳ chương trình Python nào.

Trong mỗi trường hợp, các chuỗi và danh sách, thư viện đã xác

định một loạt các chức năng để làm việc với chuỗi và danh sách,

bao gồm cả capitalize() và reverse ().

Một số các thư viện tiêu chuẩn không được cài đặt sẵn và

cần phải nói rõ ràng rằng sẽ sử dụng chúng với lệnh “import”. Để

sử dụng thư viện thời gian từ thư viện chuẩn nhằm truy cập các

chức năng hữu ích để xử lý thời gian, sử dụng:

import time

Có thể đổi tên thư viện trong chương trình bằng cách

import time as myTime

Hoặc sử dụng “from import” để chọn các chức năng từ thư

viện

from time import clock

Đây là một ví dụ ngắn của một tập lệnh Python sử dụng

“time” và các phần tử “datetime” từ thư viện tiêu chuẩn để in thời

gian hiện tại một lần mỗi giây

from datetime import datetime

from time import sleep

while True:

now = str(datetime.now())

print (now)



66



sleep(1)

Chức năng sleep () ngừng việc thực hiện chương trình trong

một giây. Nhận thấy một điều rằng sau khi chạy mã này là thời

gian sẽ trơi mỗi lần một chút.

Đó là vì hai lý do:

- Mã khơng tính đến số lượng thời gian cần để tính.

- Các quy trình khác đang chia sẻ CPU và có thể thực hiện

các chu kỳ từ thực hiện chương trình. Đây là một điều quan trọng

cần nhớ khi lập trình trên Raspberry Pi, khơng thực hiện trong một

mơi trường thời gian thực.

Nếu đang sử dụng chức năng sleep (), ta sẽ thấy rằng nó

chính xác hơn 5ms trên Raspberry Pi.

Tiếp theo, chúng ta hãy sửa đổi ví dụ để mở tập tin văn bản

và ghi lại một số dữ liệu vào nó. Tất cả mọi thứ là một chuỗi khi xử

lý các tập tin văn bản. Sử dụng hàm str () để chuyển đổi các con

số thành chuỗi (và int() để đổi lại số nguyên):

from datetime import datetime

from time import sleep

import random



log = open (“log.txt”, “w”)

for I in range(5):

now = str (datetime.now())

# Tạo ra một số dữ liệu ngẫu nhiên trong phạm vi 0-1024

data = random.randint(0, 1024)

log.write (now + “” + str (data) + “\n”)

print (“.”)

sleep (.9)



67



log.flush ()

log.close ()

Trong một ứng dụng thực tế về dữ liệu, cần chắc chắn rằng

đã có ngày và thời gian chính xác trên Raspberry Pi.

Dưới đây là một ví dụ khác (tên file là ReadFile.py) có trong

một tên tập tin như một đối số từ dòng lệnh. Chương trình mở tập

tin, đọc từng dòng như một chuỗi và in nó. Lưu ý các kiểu in như

println () khơng có trong một ngơn ngữ khác. Nó được thêm một

dòng mới vào chuỗi được in. Các đối số kết thúc. Dùng end để kết

thúc và ngăn khơng cho in dòng mới:

# Mở và đọc một file từ command-line

import sys



if (len (sys.argv) !=2):

print (“Usage: python ReadFile.py filename”)

sys.exit()

scriptname = sys.argv[0]

filename = sys.argv[1]

file = open(filename, “r”)

lines = file.readlies()

file.close()



for line in lines:

ptint (line, end = ‘’)

Python nổi tiếng vì một lý do khác đó là trong thư viện chuẩn

trên đã được đóng góp và xây dựng nhiều bởi người dùng. PyPI

(Python Package Index) là danh sách đầy đủ của các gói (hay thư

viện). Chúng ta sẽ dùng một vài thư viện trong bảng sau với đề tài

này, đặc biệt là thư viện GPIO dùng để kết nối đầu ra và đầu vào

68



của Raspberry Pi với thiết bị bên ngoài, cụ thể là bộ cảm biến

DHT22

Bảng 3.1 Một số thư viện trên cần quan tâm với người dùng

Raspberry Pi

Thư

viện

RPi.GPIO



GPIOzer

o

Pygame

SimpleC

V

SciPy



Numpy



Mô tả

Truy cập đến các

chân GPIO

Truy cập đơn

giản đến chân



Địa chỉ

sourcefofge.net/pr

ojects/raspberrygpio-python



Underpinings



cs.org



zero



pygame.org



nhỏ cho phát



Pythonpygame



simplecv.org



No package



www.scipy.org



Python-scipy



numpy.scipy.org



của Scipy

Khung làm việc

Flask



rpi.gpio

Python-gpio-



khung làm việc

API dễ dàng cho



cao

Số dạng



Python-



gpiozero.readhedo



GPIO

Trò chơi có



Computer Vision

Tính tốn nâng



Tên gói



flask.poco.org



Pythonnumpy



Python-flask



triển Web

Atom và RSS

Feedpar



nguồn cấp dữ



pypi.python.org/py



ser



liệu phân tích cú



pi/feedparser



Request



pháp

HTTP cho người



docs.python-



Python-



s



dùng



PIL



Xử lí hình ảnh



requests.org

www.pythonware.c



requests

Python-



om/products/pil/



wxPytho



Khung làm việc



imaging

Python-



n



GUI



wxpython.org



69



No package



wxgtk2.8



PySerial

PyUSB



Truy cập vào



http://github.com/



Python-



cổng nối tiếp

Giao diện FTDI-



pyserial/pyserial



serial



bleyer.org/pyusb



No package



USB



Để sử dụng một trong số thư viện đó, cần tải chương trình

thư viện, cấu hình gói và cài đặt nó. Ví dụ cài đặt thư viện NumPy:

sudo apt-get install python-numpy

Nếu một gói đã được “đóng gói” bởi tác giả thì chỉ cần tải gói

xuống, giải nén và nhập vào Terminal:

python setup.py install

Cài đặt thư viện với Pip:

Nhiều thư viện có thể được cài đặt bởi lệnh “apt-get”, ngồi

ra có thể tham khảo “Pip package installer”, một công cụ cài đặt

thư viện khá dễ dàng. Để cài đặt Pip, sử dụng “apt-get”:

sudo apt-get install python-pip

Sau đó, chúng ta có thể cài đặt được hầu hết các thư viện để

quản lí nó.

Ví dụ cài đặt thư viện Flask, sử dụng lệnh:

pip install flask

Trong phần sau, chúng ta sẽ sử dụng các thư viện ứng dụng

cụ thể exten-sively, nhưng đây là một ví dụ cho thấy điểm mạnh

của một thư viện có thể có. Feedparser là một thư viện phân tích

cú pháp phổ biến cho phép bạn lấy RSS hoặc Atom và dễ dàng

truy cập vào con-tent. Bởi vì hầu hết các dòng hoặc các thông tin

trên web do RSS hoặc Atom đặt ra. Feedparser là một trong nhiều

cách để Raspberry Pi thực hiện các dự án IOT.

Đầu tiên, cài đặt thư viện Feedparser sử dụng Pip

sudo pip install feedparser

Để sử dụng nó một cách đơn giản chỉ cần cung cấp cho hàm

phân tích địa chỉ của một nguồn cấp RSS. Feedparser sẽ lấy XML

của nguồn cấp dữ liệu và phân tích nó, rồi biến nó thành một cấu

70



trúc dữ liệu danh sách đặc biệt được gọi là “dictionary”. Dictionary

Python là một danh sách các cặp giá trị quan trọng, đôi khi được

gọi là “mảng băm” hoặc mảng kết hợp. Nguồn cấp dữ liệu được

phân tách là một dictionary, và các mục được phân tích cú pháp

trong nguồn cấp dữ liệu cũng là một dictionary, như thể hiện trong

ví dụ này, lấy các giá trị thời tiết trên Providence, RI, từ trang web

http://weather.gov

import feedparser

feel_url = “http://w1.weather.gov/xml/current_obs/KPVD.rss”

feed = feedparser.parse(feed_url)

RSSitem in RSSitems:

weather = item[“title”]

print weather

Xây dựng chương trình cho hệ thống thu thập dữ liệu dùng

Python và Raspberry Pi

Xây dựng chương trình đọc giá trị nhiệt độ và độ ẩm từ cảm

biến DHT22

Để chương trình đọc giá trị nhiệt độ và độ ẩm chạy được,

điều đầu tiên là cần phải khai báo thư viện giao tiếp giữa

Raspberry Pi và cảm biến DHT22

- Thư viện Adafuirt_DHT

Adafuirt_DHT là thư viện hỗ trợ kết nối và giao tiếp với bộ

cảm biến DHT, nó có thể giao tiếp được với nhiều loại cảm biến

như DHT11, DHT22. Để cài đặt Adafruit_DHT, sử dụng như sau:

Trên Terminal chạy lệnh để tải thư viện về

git clone https://github.com/adafruit/Adafruit_Python_DHT.git

vào file Adafruit_Python_DHT

cd Adafruit_Python_DHT

và cài đặt thư viện

sudo apt-get update

71



sudo apt-get install build-essential python-dev

sudo python setup.py install

- Thư viện RPi.GPIO

Sử dụng Python trên Raspberry Pi mở ra cơ hội kết nối với thế

giới thực thông qua các chân GPIO của Pi. Điều này có thể được

thực hiện với thư viện RPIO GPIO. Nó được cài đặt sẵn trên các hình

ảnh Raspbian gần đây, nhưng nếu bạn có một phiên bản cũ, bạn

có thể cài đặt nó bằng:

sudo apt-get install python-rpi.gpio

hoặc là

sudo apt-get install python3-rpi.gpio

Trong các phiên bản cũ hơn của Raspian, bạn cần truy cập

root để truy cập vào các chân GPIO, do đó sudo python rồi chạy

sudo ipython hoặc sudo idle &, nhưng trong các phiên bản mới

hơn, nếu người dùng ở trong nhóm GPIO thì có thể chạy nó bình

thường.

Trong tập lệnh Python của bạn (hoặc trong REPL), nhập

module GPIO, đặt chế độ hội đồng quản trị sang chế độ ưa thích

của bạn, thiết lập các chân bạn muốn sử dụng và bật chúng lên:

import RPi.GPIO as GPIO

Như vậy chương trình đã hồn tất việc cài đặt thư viện

Adafruit_DHT và RPi.GPIO. Tiếp theo, với yêu cầu của của thư viện

ta tiến hành chọn loại cảm biến và chọn chân truyền sữ liệu trên

Raspberry Pi (chân GPIO data) bằng cách sử dụng:

Trên chương trình Python, ta thực hiện gán loại cảm biến

muốn sử dụng cho thư viện Adafruit_DHT và chọn chân giao tiếp:

chon_cam_bien = Adafruit_DHT.DHT22

GPIO.setmode(GPIO.BCM)

# Chân data của cảm biến được nối với chân GPIO 21 của

Raspberry Pi

pin_sensor = 21

72



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

CHƯƠNG 3 THIẾT KẾ HỆ THỐNG THU THẬP DỮ LIỆU QUA MẠNG INTERNET TRÊN CƠ SỞ NGÔN NGỮ PYTHON VÀ RASPBERRY PI

Tải bản đầy đủ ngay(0 tr)

×