Lập trình esp32 bằng python

MicroPython là một sự thực hiện lại của ngôn ngữ lập trình Python, mục tiêu dành cho cho các bộ vi điều khiển và các hệ thống nhúng như ESP32 hoặc ESP8266.

Lập trình trong MicroPython rất giống với lập trình trong Python: tất cả các tính năng ngôn ngữ của Python cũng có trong MicroPython, ngoài một vài ngoại lệ. Do các bộ vi điều khiển và hệ thống nhúng bị hạn chế hơn nhiều so với máy tính của chúng ta, MicroPython không đi kèm đầy đủ các thư viện chuẩn mặc định.

Nếu đã biết cách lập trình trong Python, lập trình trong MicroPython cũng vậy. Chỉ cần nhớ rằng MicroPython được sử dụng cho các thiết bị bị hạn chế. Vì vậy, code của bạn sẽ càng đơn giản càng tốt.

Bài viết này giải thích những điều cơ bản về cú pháp trong ngôn ngữ lập trình Python cũng áp dụng cho MicroPython, như:

  • Toán tử toán học
  • Toán tử quan hệ
  • Kiểu dữ liệu
  • Hàm print[]
  • Câu lệnh điều kiện
  • Vòng lặp while và for
  • Hàm do người dùng định nghĩa
  • Class và object
  • Các module

Bài này học này giới thiệu nhiều về kiến thức lập trình cơ bản trong MicroPython giúp bạn nắm vững cách sử dụng ngôn ngữ. Nếu bạn nôn nóng muốn làm việc ngay với MicroPython và ESP32 thì các bạn có thể bỏ qua bài này và chuyển sang bài kế tiếp và có thể quay lại tham khảo sau cũng không sao cả.

Toán tử toán học

Micropython có thể thực hiện các hoạt động toán học. Bảng sau đây cho thấy các toán tử được hỗ trợ:

Toán tử Hoạt động toán học
+ Phép cộng
Phép trừ
* Phép nhân
/ Phép chia
// Phép chia lấy nguyên
% Phép chia lấy dư

Trong command line của uPycraft, bạn hãy thử một vài thao tác để xem nó hoạt động như thế nào. Bạn nhớ kết nối với board để có thể sử dụng được command line nhé. Ví dụ:

>>> 2+2*9-3
17
>>> 28594/2312
12.36765
>>> 214522236/7.5
2.860297e+07
>>> 23//2
11
>>> 25%3
1

Bạn có thể thực hiện các hoạt động toán học khác nếu bạn nhập module toán học, như căn bậc hai, hàm lượng giác, logarit, lũy thừa,.v.v.

Toán tử quan hệ

Bạn có thể so sánh bằng cách sử dụng các toán tử quan hệ. Chúng so sánh các giá trị ở hai bên và cho thấy mối quan hệ giữa chúng.

Toán tử Ý nghĩa toán tử
== Bằng
!= Không bằng
> Lớn hơn
< Bé hơn
> = Lớn hơn hoặc bằng
>> 2 == 3 False >>> 4 == 4 True >>> 3 > 2 True >>> 489808234 != 2223 True >>> 4.5 >= 4.5 True

Gán các giá trị cho các biến

Nếu trong  Arduino IDE phải khai báo kiểu dữ liệu khi tạo biến mới thì với Python lại không cần làm điều đó.

Các biến chỉ đơn giản chỉ làm nhiệm vụ “giữ chỗ” để lưu trữ các giá trị số hoặc văn bản. Để gán giá trị cho một biến, bạn sử dụng dấu bằng [=], với tên biến ở bên trái và giá trị ở bên phải.

Ví dụ: để tạo một biến để lưu lại số GPIO kết nối với LED, bạn chỉ cần nhập như sau:

led_pin = 23

Trong Arduino IDE, bạn sẽ cần khai báo tương tự như:

const int led_pin = 23;

Có thể thấy, Python đơn giản hơn nhiều so với lập trình bằng ngôn ngữ lập trình C [trong Arduino IDE].

Lưu ý: tên biến không được chứa khoảng trắng và có phân biệt chữ hoa, chữ thường, vì vậy biến led_pin sẽ khác với LED_PIN hoặc Led_Pin.

Loại dữ liệu

Các biến có thể lưu trữ một số loại giá trị, không chỉ toàn bộ số. Đó là nơi các kiểu dữ liệu xuất hiện. Kiểu dữ liệu là một phân loại của một giá trị cho biết những thao tác nào có thể được thực hiện với giá trị đó và cách lưu trữ nó.

Bảng sau đây cho thấy các loại dữ liệu thường xuyên được sử dụng:

Kiểu dữ liệu Mô tả
int [Int] Kiểu số nguyên
float [Float] Kiểu số thực
str [String] Kiểu chuỗi
bool [Boolean] True hoặc False

Hãy tạo các biến với các loại dữ liệu khác nhau:

>>> a = 6
>>> b = 95,32
>>> c = 'Xin chào thế giới!'
>>> d = True
  • Giá trị đầu tiên được gán cho a ,  , là một số nguyên.
  • Biến b chứa giá trị float , là số có số thập phân.
  • Giá trị thứ ba, ‘Hello World!’, Là một chuỗi , là một chuỗi các ký tự. Một chuỗi phải được đặt bên trong các dấu đơn [‘Xin chào thế giới!’] Hoặc dấu ngoặc kép [Thế giới Hello Hello!].
  • Cuối cùng, dlà Boolean , là loại chỉ có thể lấy Đúng hoặc Sai.

Có một hàm để kiểm tra kiểu dữ liệu của một biến: hàm type []. Hàm này chấp nhận làm đối số cho biến bạn muốn kiểm tra kiểu dữ liệu.

type[variable]

Ví dụ, sau khi khai báo các biến trong ví dụ trước a , b , c và d , bạn có thể kiểm tra kiểu dữ liệu của nó. Ví dụ: nếu bạn gõ:

>>> type[a]

Nó trở lại:

Điều này cho biết a là một số nguyên, thuộc kiểu dữ liệu integer. Thử nghiệm với các biến khác và bạn sẽ nhận được:

>>>

type[b]

>>>

type[c]

>>>

type[d]

 

Hàm print[]

Hàm print [] in thông báo giữa các dấu ngoặc đơn vào Shell. Điều này đặc biệt hữu ích trong việc tìm và gỡ lỗi cũng như theo dõi những thứ đang diễn ra. Ví dụ:

>>> print ['LED is on']
LED is on

Chú thích

Chú thích trong Python bắt đầu bằng ký tự # và tiếp tục đến cuối dòng. Có thể dùng chú thích để thêm ghi chú của người lập trình trong chương trình, hoặc cho bất kỳ ai đọc chương trình đều có biết chương trình làm gì. 

# Đây chỉ là một nhận xét

Bởi vì trong MicroPython, chúng ta đang làm việc trong các điều kiện hạn chế, bạn nên tránh thêm những comment không thật sự cần thiết để tiết kiệm dung lượng trên bộ nhớ ESP.

Câu lệnh điều kiện

Để viết các chương trình hữu ích, có lẽ bạn sẽ cần phải thực hiện các hành động khác nhau tùy thuộc vào việc một điều kiện nhất định là Đúng hay Sai. Chúng ta đang nói về các câu lệnh điều kiện. Chúng có cấu trúc như sau:

if :
  
elif :
  
elif :
  
[...]
else:
  

là biểu thức Boolean và nó chỉ có thể là Đúng hoặc Sai. Nếu đúng, theo sau đó sẽ được thực thi. nên được thụt lề để Python biết câu lệnh nào thuộc về mỗi biểu thức.

Câu lệnh elif là viết tắt của else if và chỉ chạy nếu các điều kiện phía trước trả về False.

Câu lệnh else chỉ chạy nếu không có biểu thức điều kiện nào trả về True.

Câu lệnh điều kiện không có giới hạn về số lượng câu lệnh elif trong một chương trình. Cũng không cần thiết phải bao gồm một mệnh đề else, nhưng nếu có mệnh đề else, nó phải nằm cuối trong câu lệnh if.

Trong Arduino IDE, ta sử dụng {} dấu ngoặc nhọn để xác định đoạn code. Với MicroPython, chúng tôi dùng cách thụt lề. Ngoài ra, bạn cần sử dụng dấu hai chấm “:” sau mỗi biểu thức và các biểu thức cũng không cần phải nằm trong dấu ngoặc đơn như trong Arduino IDE.

Quan trọng: tiêu chuẩn thụt lề trong Python là 4 khoảng trắng. TrongMicroPython, thụt lề chỉ nên có 2 khoảng trắng để chứa nhiều code hơn vào bộ nhớ của vi điều khiển.

Vòng lặp While và For

Vòng lặp cho phép bạn thực thi một khối mã nhiều lần miễn là đáp ứng một điều kiện. Có hai loại vòng: while và for. Ví dụ, bạn có thể in tất cả các số từ 1 đến 10 với một trong khi vòng lặp:

number = 1
while number> person1 = Person[]

Chúng ta cũng có thể thay đổi giá trị của các thuộc tính:

>>> person1.name = "Blocky"
>>> person1.age = 25
>>> person1.country = "Vietnam"

hay gọi các hàm mà nó có:

>>> person1.getDescription[]

và hàm này sẽ trả về giá trị theo như khai báo trong hàm:

Blocky is 25 years old and he is from Vietnam.

Sử dụng Module trong MicroPython

Module là một file code chứa khai báo một hoặc nhiều các class và các function mà bạn có thể sử dụng lại ở một nơi khác. Gọi một cách khác thì module giống như các thư viện giúp bạn sử dụng lại code một cách dễ dàng. Để sử dụng các class và function trong một module, bạn chỉ cần import module đó trong code của bạn là được.

import module_name

Bạn có thể tạo ra module cho riêng mình hoặc sử dụng các module sẵn có trong thư viện của MicroPython.

Ví dụ, để làm việc với các GPIO bạn cần import module machine:

import machine

Trong trường hợp bạn chỉ muốn import 1 class hay 1 hàm nào đó trong module, bạn có thể viết như sau:

from machine import Pin

Trên đây là một số khái niệm lập trình cơ bản nhất của MicroPython nhưng cũng là rất đủ cho bạn viết các chương trình phức tạp. Hãy tiếp tục ở các bài tiếp theo nhé.

Chủ Đề