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. Show 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ư:
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ợ:
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.
Hãy thử một vài so sánh và kiểm tra kết quả: >>> 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ếnNế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ệuCá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:
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
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íchChú 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 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à ForVò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<= 10: print (number) number= number + 1 Các dòng lệnh trong vòng lặp while được chỉ ra bởi thụt đầu dòng, được thực hiện miễn là giá trị trong số biến là nhỏ hơn hoặc bằng (<=) 10. Trong mỗi vòng lặp, dòng số được in và sau đó 1 là thêm vào nó Bạn cũng có thể in các số từ 1 đến 10 bằng vòng lặp for , như thế này: number = 1 for number in range (1, 11): print (number) Các vòng lặp for được thực hiện miễn là giá trị của biến nằm trong phạm vi từ 1 đến 11. range () là hàm tự động gán giá trị bên cạnh các số thay đổi, cho đến khi 1 bên dưới con số cuối cùng bạn chỉ định. Bạn nên sử dụng vòng lặp for khi bạn muốn lặp lại một đoạn chương trình một số lần nhất định. Sử dụng vòng lặp while khi bạn muốn lặp lại đoạn chương trình đó cho đến khi một điều kiện nhất định không còn được đáp ứng. Tương tự như các câu lệnh có điều kiện, các biểu thức Boolean for và while phải có dấu hai chấm : ngay sau chúng và các biểu thức sẽ được thực hiện phải được thụt lề. Hàm do người dùng định nghĩaĐể xác định hàm mới, bạn sử dụng từ def theo sau là tên bạn muốn đặt hàm và một dấu ngoặc đơn (và các đối số bên trong, nếu cần). Sau dấu ngoặc đơn bạn thêm dấu hai chấm : và sau đó cho hàm biết hướng dẫn nào để thực hiện. Các câu lệnh nên được thụt lề với 2 khoảng trắng (trong MicroPython). Ví dụ: def my_feft ( Ví dụ: chức năng chuyển đổi nhiệt độ tính theo độ C sang Fahrenheit có thể là như sau: def celsius_to_fahrenheit (temp_celsius): temp_fahrenheit = temp_celsius * (9/5) + 32 return temp_fahrenheit Hàm celsius_to_fahrenheit () chấp nhận làm đối số nhiệt độ tính bằng Celsius ( temp_celsius ). Sau đó, nó thực hiện tính toán để chuyển đổi nhiệt độ. Cuối cùng, nó trả về nhiệt độ bằng Fahrenheit ( temp_fahrenheit ). Lưu ý : các chức năng không nhất thiết phải trả lại một cái gì đó. Nó có thể thực hiện một số công việc mà không cần phải trả lại bất cứ điều gì. Class và ObjectPython là ngôn ngữ lập trình hướng đối tượng (OOP). Có hai khái niệm quan trọng bạn cần hiểu về OOP: class và object. Một class (lớp) là một định nghĩa cho một nhóm các đối tượng (object) giống nhau về đặc tính và hành vi, như con người, động vật, xe cộ… Class khai báo tập hợp các thuộc tính mà các đối tượng thuộc class đó có còn object là chỉ 1 thực thể cụ thể như anh A, chị B trong lớp con người. Các hàm bên trong một lớp gọi là các methods. Chúng ta khai báo các lớp trong micorpython bằng từ khóa classvà theo sau là tên lớp.Ví dụ: class MyClass: (...) Đoạn code sau khai báo một lớp Person có các thuộc tính như name, age và country. Trong lớp Person này, ta cũng khai báo 1 method tên là getDescription để trả về thông tin cá nhân. class Person: name = "" age = 0 country = "" def getDescription(self): print("%s is %d years old and he is from %s." %(self.name, self.age, self.country)) Sau khi khai báo, tao có thể tạo ra nhiều đối tượng từ lớp Person này: >>> 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 MicroPythonModule 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é. |