Thực hành IoT với Arduino Uno và ESP8266

MỤC LỤC

Các bài thực hành với màn hình LCD và Serial monitor 1. Hiển thị văn bản

Cách thực hiện như sau: nối dải cực dương trên Breadboard với pin 5V trên mạch Uno, nối dải cực âm trên Breadboard với pin GND trên mạch Uno. Nối các chân VSS, RW, K với dải cực âm trên Breadboard, các chân VDD, A với dải cực dương trên Breadboard. Trong hàm loop(), kiểm tra xem liệu có dữ liệu đã được nhận từ Serial hay không bằng cách sử dụng Serial.available().

Nếu có dữ liệu,chúng ta đọc chuỗi dữ liệu từ Serial cho đến khi gặp ký tự xuống dòng ('\n') bằng cách sử dụng Serial.readStringUntil('\n'). Trong setup() khởi tạo màn hình LCD bằng hàm lcd.init(), sử dụng hàm lcd.begin để thiết lập số hàng và cột, ở đây là 16 cột và 2 hàng. Khai bỏo một biến boolean isBlackLightOn để theo dừi trạng thỏi đốn nền của màn hình LCD, mặc định để là true để bật đèn nền.

Khai báo biến previousMilis để lưu thời điểm trước đó và biến interval để cố định khoảng thời gian nhấp nháy đèn nền, ở đây là 0.5 giây (500ms). Trong setup(), khởi tạo màn hình LCD bằng hàm lcd.init() và sử dụng hàm lcd.begin để thiết lập số hàng và cột, ở đây là 16 cột và 2 hàng. Trong loop(), lấy thời điểm hiện tại bằng hàm milis() và lưu vào biến currentMilis.

Kiểm tra xem đã đủ khoảng thời gian trôi qua (tương đương biến interval) bằng cách so sánh 2 biến previousMilis và currentMilis. Trong hàm if, kiểm tra trạng thái biến isBlackLightOn, nếu là true sẽ tắt đèn nền bằng hàm lcd.noBlacklight() và update biến isBlackLightOn() thành false. Ngược lại, nếu đang tắt thì gọi hàm lcd.BlackLight() và update isBlackLightOn thành true.

Trong loop(), thực biện đọc giá trị biến trở bằng hàm readAnalog() và gán giá trị vào biến aValue. Sử dụng hàm map để ánh xạ giá trị đọc được từ aValue sang khoảng 10 – 10000 và lưu kết quả vào biến changedValue. Sử dụng hàm setCursor() để di chuyển con trỏ đến dòng thứ 2 vị trí đầu tiên của màn hình LCD và dùng.

Sơ đồ kết nối:
Sơ đồ kết nối:

Kết nối với DHT11 và cảnh báo thay đổi nhiệt độ bằng đèn LED Linh kiện

Yêu cầu của bài thực hành là kết nối DHT11 với mạch Uno và thể hiện các cảnh báo thay đổi nhiệt độ thông qua đèn LED. Các bước thực hiện lắp mô hình bao gồm: Nối dải cực dương của Breadboard với pin 3.3V trên mạch Uno, nối dải cực âm với pin GND trên mạch Uno. Bước tiếp theo, lắp các đèn LED sau đó cắm các cực âm vào dải cực âm trên Breadboard, nối cực dương lần lượt đèn đỏ vào chân pin số 8, đèn vàng vào chân pin số 9, đèn xanh vào chân pin số 10.

Cắm DHT11 vào Breadboard, nối chân dương vào dải mạch dương trên Breadboard, chân data vào chân pin số 6 trên mạch Uno, chân âm vào dải âm trên Breadboard. Trong loop(), thực hiện đọc trạng thái của nút nhấn và lưu vào biến buttonState1. Hàm forward(), định hướng motor quay theo chiều thuận kim đồng hồ với mỗi bước là -100.

Hàm backward() định hướng motor quay theo chiều ngược kim đồng hồ với mỗi bước là 100. Trong setup(), dùng lcd.init() để khởi tạo màn hình, bật đèn nền bằng lcd.blacklight(). Trong loop(), mặc định sẽ gọi hàm Dao() để chạy động cơ bước theo chiều thuận và in thông tin lên màn hình LCD.

Nếu nút được nhấn, gọi hàm Thuan() để đảo chiều quay của động cơ và in ra màn hình LCD.

Hình 1.3.1. Sơ đồ mô hình kết nối DHT11 với mạch Uno
Hình 1.3.1. Sơ đồ mô hình kết nối DHT11 với mạch Uno

CÁC BÀI THỰC HÀNH VỚI NODE MCU ESP8266 Linh kiện chung

Các trạng thái làm việc với WiFi

Trong setup(), thiết lập cấu hình ban đầu, khởi tạo serial để giao tiếp với máy tính trông qua cổng Serial với baud là 9600. Các biến ssid và password lần lượt lưu trữ tên và mật khẩu mạng WiFi Trong setup(), khởi tạo Serial để giao tiếp với máy tính với baud là 9600 Trong loop(), thiết lập WiFi của ESP8266 ở chế độ Station (WIFI_STA) Tiến hành kết nối với mạng WiFi với tên (ssid) và mật khẩu (password) Sử dụng vòng lặp While để chờ cho đến khi kết nối thành công. Sau khi kết nối thành công, in ra màn hình địa chỉ IP bằng hàm localIP() In ra màn hình độ mạnh tính hiệu WiFi bằng hàm WiFi.RSSI().

Trong loop(), sử dụng hàm WiFi.scanNetworks() để quét các mạng WiFi và lưu số mạng tìm thấy vào biến “n”. Sau khi quá trình tìm kết thúc, in ra thông tin chi tiết về các mạng (Số thứ tự – Serial Number, tên mạng – SSID, độ mạnh – Signa Strength, địa chỉ MAC và loại bảo mật (Unsercured, WEP, WPA, WPA2, Auto, Unknown). Khai báo biến wifiName chứa tên của WiFi và wifiPass chưa mật khẩu mạng Khởi tạo ESP8266WebServer với cổng 80.

Định nghĩa hàm handleRoot để xử lý khi có yêu cầu truy cập sẽ dẫn đến đường dẫn gốc (“/”) của máy chủ web. Hàm này sẽ nháy 1 đèn led trên bo mạch và gửi một chuỗi văn bản đến Serial Monitor và tắt đèn LED. Sau khi kết nối thành công, , in ra thông tin chi tiết về các mạng (Số thứ tự – Serial Number, tên mạng – SSID, độ mạnh – Signa Strength, địa chỉ MAC và loại bảo mật (Unsercured, WEP, WPA, WPA2, Auto, Unknown).

Khai báo biến wifiName chứa tên của WiFi và wifiPass chưa mật khẩu mạng Khởi tạo ESP8266WebServer với cổng 80. Định nghĩa hàm handleRoot để xử lý khi có yêu cầu truy cập sẽ dẫn đến đường dẫn gốc (“/”) của máy chủ web. Sau khi kết nối thành công, , in ra thông tin chi tiết về các mạng (Số thứ tự – Serial Number, tên mạng – SSID, độ mạnh – Signa Strength, địa chỉ MAC và loại bảo mật (Unsercured, WEP, WPA, WPA2, Auto, Unknown).

Khai báo biến wifiName chứa tên của WiFi và wifiPass chưa mật khẩu mạng Khởi tạo ESP8266WebServer với cổng 80. Định nghĩa hàm handleRoot để xử lý khi có yêu cầu truy cập sẽ dẫn đến đường dẫn gốc (“/”) của máy chủ web. Định nghĩa hàm handleRoot để xử lý khi có yêu cầu truy cập sẽ dẫn đến đường dẫn gốc (“/”) của máy chủ web.

Trong loop(), tạo một đối tượng HTTPClient để thực hiện yêu cầu HTTP Tạo đối tượng WiFiClient để sử dụng hàm Client cho yêu cầu kết nối HTTP Gửi yêu cầu GET đến địa chỉ "http://httpbin.org/get" sử dụng đối tượng HTTPClient và WiFiClient. Nhận HTTP code trả về từ yêu cầu, kiểm tra và in ra serial monitor Nếu yêu cầu thành công, in ra HTTP_Code_OK(200) bằng serial.println(), ngược lại thì in ra yêu cầu thất bại.

Hình 2.1.3. Kết quả mô hình ESP8266 Station Mode Giải thích:
Hình 2.1.3. Kết quả mô hình ESP8266 Station Mode Giải thích:

Thực hành kết nối Arduino Uno với ESP8266

Esp8266 sẽ nhận dữ liệu từ Arduino, in ra Serial Monitor thông qua hàm Uno2Esp() và lưu dữ liệu nhận được vào biến inputString. Trong code của Arduino, khai báo sử dụng chân 2(RX) và chân 3(TX) của Uno. Arduino nhận dữ liệu từ ESP8266, in ra Serial Monitor thông qua hàm Esp2Uno() và lưu vào biến stringComplete (mặc định đặt là false).

Sau khi nhận dữ liệu, thông báo chuỗi đã hoàn chỉnh và đặt stringComplete thành True. In dẽ liệu ra serial monitor và đặt lại inputString thành chuỗi rỗng, stringComplete thành false. Trong loop(), ESP8266 gửi chuỗi “Hello Servant”, nhận dữ liệu từ Uno(Servant) thông qua Wire.requestFrom(8, 13) và in ra Serial Monitor.

Khai báo thêm 2 hàm reveiveEvent() và requestEvent() để xử lý sự kiện nhận dữ liệu và yêu cầu dữ liệu từ Master. Trong loop(), Arduino có một độ trễ ngắn delay(100) để đảm bảo độ ổn định trong giao tiếp I2C. Trong setup(), khởi tạo kết nối serial với baud là 9600 và giao thức SPI bằng hàm SPI.begin().

Trong setup(), khởi tạo kết nối SPI thông qua SPCR |= bit(SPE), đặt chân MISO ở chế độ OUTPUT. Trong loop(), sử dụng biến receiveDone kiểm tra xem đã nhận được dữ liệu thông qua SPI hay chưa. Nếu đã nhận được dữ liệu, in ra Serial Monitor và đặt lại index, receiveDone.

Trong hàm này, ngắt SPI được tắt tạm thời bằng cli(), sau đó dữ liệu nhận được từ SPI thông qua SPDR được lưu vào mảng buff và biến index được tăng lên. Nếu có ký tự xuống dòng, biến receiveDone được đặt thành True và đánh dấu việc nhận dữ liệu hoàn tất.

Hình 2.3.2. Kết nối Arduino với ESP8266 giao thức UART Giải thích:
Hình 2.3.2. Kết nối Arduino với ESP8266 giao thức UART Giải thích:

LẮP MÔ HÌNH CHUNG 3.1. Sơ đồ chân cắm