You are on page 1of 66

Buổi 1:

Làm quen với lập trình Arduino


trên module ESP8266

Reporter:
- Nguyen Quoc Uy
Nội dung chính

▰ Giới thiệu về IoT, các ứng dụng của IoT trong các lĩnh vực khác nhau, đặc
biệt SmartHome, SmartFactory...

▰ Giới thiệu về bộ kit ESP (Arduino)


▰ Cài đặt phần mềm cần thiết dành cho khóa học
▰ Lập trình cơ bản trên phần mềm Arduino sử dụng ngôn ngữ C/C++
▰ Lập trình làm việc với GPIO, nút nhấn, ngắt… trên bộ kit ESP
▰ Tìm hiểu về các chuẩn truyền tải dữ liệu UART, I2C, SPI…
▰ Lập trình làm việc với cảm biến trên bộ kit ESP
▰ Lập trình kết hợp cảm biến và GPIO cho bài toán cảnh báo (cháy, bụi, ánh
sáng…) 2
1
Giới thiệu về IoT
3
1. Giới thiệu về IoT

▰ IoT là gì?
– IoT (tiếng Anh: Internet of Things) là là một mạng lưới mà trong đó, mỗi đồ
vật, con người được cung cấp một định danh của riêng mình, và tất cả có khả
năng truyền tải, trao đổi thông tin, dữ liệu qua một mạng duy nhất mà không
cần đến sự tương tác trực tiếp giữa người với người, hay người với máy tính.

4
1. Giới thiệu về IoT

• Ứng dụng của IoT

➢ Nhà thông minh (Smart Home)

5
1. Giới thiệu về IoT

▰ Ứng dụng của IoT


➢ Nhà thông minh (Smart Home)

• Hệ thống chiếu sáng


• Các thiết bị gia dụng
• Giải trí
• An ninh
6
1. Giới thiệu về IoT

▰ Ứng dụng của IoT


➢ Nông nghiệp thông minh (Smart Farm)

Áp dụng các hệ thống cảm biến, theo dõi, tự động hoá vào các
quá trình từ chuẩn bị, nuôi dưỡng đến phân phối
7
1. Giới thiệu về IoT

▰ Ứng dụng của IoT


➢ Công nghiệp thông minh, nhà máy thông minh

8
2
Tổng quan về Arduino
9
2.1 Tổng quan về Arduino

▰ Arduino là gì?
• Arduino là một nền tảng gồm có phần cứng là các board mạch vi điều khiển và phần
mềm là hệ thống IDE, thư viện
• Có 2 thành phần chính để phân biệt giữa các board Arduino với nhau: Vi điều khiển
và Board mạch
• Vi điều khiển là một máy tính nhỏ, với CPU, RAM, ROM, các thiết bị ngoại vi (I/O),
timers, counters,…tất cả được nhúng vào trong một mạch tích hợp (Intergraed
Circuit/IC) - nơi tất cả các khối này được kết hợp vào trong một board thông qua hệ
thống bus
• Một board arduino là một mạch điện tử hoàn chỉnh, với trái tim là một vi điều khiển
AVR, board sẽ có nhiệm vụ cung cấp các điều kiện cần thiết để vi điều khiển có thể
hoạt động.
10
2.1 Tổng quan về Arduino

▰ Phần cứng

• MCU: ESP8266EX, Wifi: 2.4GHz, 802.11 b/g/n


• Chế độ hoạt động: AP, STA và (AP + STA)
• Kích thước: 16mm x 24mm
• Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire, trừ chân D0)
11
2.2 Bộ kit LHV.IoT

▰ Bộ kit LHV.IoT
1. Cảm biến nhiệt độ, độ ẩm DHT11
2. Màn hình OLED
3. Đèn RGB WS2812
4. Mic
5. Quang trở
6. Led
7. Cảm biến gia tốc MPU6050
8. Module ESP8266
9. Nút nhấn
10. Còi
11. Nút Reset & Flash
12. Công tắc
12
2.3 Arduino IDE

▰ Phần mềm
• Ngôn ngữ lập trình chính của Arduino là C/C++
• Người lập trình được cung cấp vô số các thư viện
• Việc lập trình sẽ được thực hiện trên một công cụ được gọi là IDE (Intergrated Development
Environment). Công cụ này được đội ngũ kỹ sư của Arduino xây dựng và phát triển.

13
3
Cài đặt Arduino
IDE và setup môi
trường lập trình
14
3.1 Cài đặt Arduino IDE

▰ Cài đặt IDE


o Mở trình duyệt web của Raspbian lên
o Truy cập vào trang chủ của arduino: https://www.arduino.cc/
o Trên thanh menu của trang web chọn mục Software -> Downloads
o Kéo xuống phần “Download the Arduino IDE”, chọn phiên bản Linux ARM 32bit
o Giải nén file cài đặt được thư mục cài đặt
o Mở Terminal, vào thư mục vừa giải nén được, chạy lệnh dưới để cài:
$ sudo ./install.sh

15
• Ô công cụ: gồm có các nút lệnh menu (File, Edit, Sketch, Tools, Help).
• Ô code: Đây là nơi chúng ta sẽ viết chương trình của mình
• Ô thông báo: Nơi hiển thị tất cả các thông báo của IDE trong quá trình biên
dịch/upload chương trình.
3.2 Setup môi trường lập trình

▰ Setup cho bộ kit


• Mở IDE lên, chọn File -> Preferences
• Ở cửa sổ hiện lên, thêm vào ô “Additional Board Manager URLs” dòng sau:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
• Chọn “OK”

17
3.2 Setup môi trường lập trình

▰ Setup cho bộ kit


• Mở Tools -> Boards -> Boards Manager. Ở cửa sổ hiện lên, tìm “esp8266”, chọn phiên bản
Community rồi chọn Install

18
3.2 Setup môi trường lập trình

▰ Setup cho bộ kit


• Tại IDE, chọn Tools, phần Board chọn “NodeMCU 1.0 (ESP-12E Module)”, phần Port chọn cổng
COM tương ứng với cổng đang được kết nối, thường có dạng “dev/ttyUSB”

19
3.2 Setup môi trường lập trình

▰ Setup cho bộ kit


• Tại IDE, chọn Tools, phần Board chọn “NodeMCU 1.0 (ESP-12E Module)”, phần Port chọn cổng
COM tương ứng với cổng đang được kết nối, thường có dạng “dev/ttyUSB”

20
4
Một số chương
trình cơ bản
21
Cấu trúc một chương trình

• Trong một chương trình, có 2 hàm cố định luôn phải có là hàm setup() và hàm loop()

• Hàm setup() là hàm chạy 1 lần khi bắt đầu chương trình, dùng để khai báo các tham
số, khai báo các thư viện, thiết lập các chân, …
• Hàm loop() sẽ được chạy ngay sau hàm setup(). Hàm này sẽ được chạy lặp đi lặp
lại liên tục đến khi bị ngắt nguồn

22
Cấu trúc một chương trình

• Chúng ta có thể viết thêm nhiều hàm con khác bên cạnh 2 hàm chính

• Việc đặt tên hàm và biến phải tuân thủ theo các quy tắc đặt tên trong ngôn ngữ C

23
1. Blink

• Hàm “pinMode( );” : cấu hình một chân bất kỳ


hoạt động như là một đầu vào tín hiệu (INPUT)
hoặc đầu ra tín hiệu (OUTPUT).
• Hàm “digitalWrite( );” : để xuất tín hiệu ra một
chân digital.
• Hàm “delay( );” : có tác dụng dừng/giữ nguyên
trạng thái chương trình trong một khoảng thời
gian nhất định tính bằng mili giây
• Khi ta vừa làm cho led sáng, hàm delay(1000);
này sẽ giữ cho led sáng 1s, tương tự khi led tắt
cũng vậy
1. Blink ➢ Ví dụ: 3 led D3, D4, D8 cùng nhấp nháy

void setup() {
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D8, OUTPUT);
}

void loop() {
cung_nhap_nhay();
}

void cung_nhap_nhay(){
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D8, HIGH);
delay(1000);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
digitalWrite(D8, LOW);
delay(1000);
}
1. Blink ➢ Ví dụ: 3 led D3, D4, D8 sáng lần lượt, tắt lần lượt

void setup() {
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D8, OUTPUT);
}
void loop() {
sang_lan_luot();
tat_lan_luot();
}
void sang_lan_luot(){
digitalWrite(D3, HIGH);
delay(1000);
digitalWrite(D4, HIGH);
delay(1000);
digitalWrite(D8, HIGH);
delay(1000);
}
void tat_lan_luot(){
digitalWrite(D3, LOW);
delay(1000);
digitalWrite(D4, LOW);
delay(1000);
digitalWrite(D8, LOW);
delay(1000);
}
2. Vòng lặp

❖ Vòng lặp For


• Lặp đi lặp lại một số lần xác định trước của một hoặc một chuỗi hành động nào đó.

for (khởi đầu; điều kiện lặp; bước nhảy){


khối lệnh;
};

• Khối lệnh sẽ được thực hiện lặp đi lặp lại cho đến khi biểu thức khởi đầu không còn thoả
mãn theo điều kiện lặp nữa
2. Vòng lặp ➢ Ví dụ: Sử dụng vòng for, in ra dòng chữ “Tinasoft
Viet Nam!” 5 lần.

Code Kết quả

void setup() {
Serial.begin(9600);
for(int i=0; i<5; i++){
Serial.print("i = ");
Serial.println(i);
Serial.println("Tinasoft Viet Nam!");
}
}

void loop() {
}
2. Vòng lặp
Code
❖ Vòng lặp While
• Cách vận hành tương tự như vòng for, void setup() {
chỉ khác một chút về cú pháp int i = 0;
Serial.begin(9600);
while(biểu thức){ while(i<5){
Khối lệnh; Serial.print("i = ");
} Serial.println(i);
Serial.println("Tinasoft Viet
Nam!");
• Khối lệnh lặp đi lặp lại liên tục trong khi i++;
}
biểu thức còn đúng }

void loop() {
}
2. Vòng lặp ➢ Ví dụ: Sử dụng vòng lặp, điều khiển đèn led bất kỳ
nhấp nháy 5 lần rồi từng đèn nháy lần lượt 3 lần.

void setup() { for(int i=0; i<3; i++){


pinMode(D3, OUTPUT); digitalWrite(D3, HIGH);
pinMode(D4, OUTPUT); delay(500);
pinMode(D8, OUTPUT); digitalWrite(D3, LOW);
} delay(500);
digitalWrite(D4, HIGH);
void loop() { delay(500);
for(int i=0; i<5; i++){ digitalWrite(D4, LOW);
digitalWrite(D4, HIGH); delay(500);
delay(500); digitalWrite(D8, HIGH);
digitalWrite(D4, LOW); delay(500);
delay(500); digitalWrite(D8, LOW);
}; delay(500);
};
}
3. Rẽ nhánh

• Cú pháp:
if(điều kiện){
khối lệnh 1;
}
else{
khối lệnh 2;
}
• Có thể viết hàm if không có else hoặc nhiều hàm if lồng vào với nhau
3. Rẽ nhánh ➢ Ví dụ 1: Bấm nút thì đèn sáng, không bấm nút thì
đèn tắt

int LED = D3;


int BUTTON = D7;
int buttonStatus = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
buttonStatus=digitalRead(BUTTON);
if (buttonStatus == 0){
digitalWrite(LED, HIGH);
}
if (buttonStatus == 1){
digitalWrite(LED, LOW);
}
}
3. Rẽ nhánh ➢ Ví dụ 2: Bấm nút đổi trạng thái đèn

int LED = D3;


int BUTTON = D7;
int buttonStatus = 0;
int oldButton = 0;
int ledStatus = 0;

void setup() {
pinMode(BUTTON, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
buttonStatus = digitalRead(BUTTON);
if (buttonStatus != oldButton) {
oldButton = buttonStatus;
delay(50);
if (buttonStatus == 0) {
ledStatus = !ledStatus;
}
}
if (ledStatus == 1 ) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}
4. Xung PWM

• Xung là các trạng thái cao / thấp (HIGH/LOW) về mức điện áp được lặp đi lặp lại. Đại
lượng đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency)
và chu kì xung (duty cycle).
• Tần số là số lần lặp lại dao động trong khoảng thời gian 1 giây, đơn vị Hz. Ví dụ, 1Hz = 1
dao động trong 1 giây. 2Hz = 2 dao động trong 1 giây. 16MHz = 16 triệu dao động trong
1 giây.
• Dao động được xác định từ trạng thái bắt đầu và kết thúc ngay trước khi trạng thái bắt
đầu được lặp lại.

• Một dao động sẽ bao gồm 2 trạng thái điện: mức cao (x giây) và mức thấp (y giây). Tỉ lệ
phần trăm thời gian giữa 2 trạng thái điện này chính là chu kì xung T = x/y
4. Xung PWM

• Xung khi sử dụng với hàm analogWrite() trong Arduino:


4. Xung PWM ➢ Ví dụ 1: Sử dụng xung PWM để làm thay đổi độ
sáng đèn LED

int LED = D4;


int brightness = 0; // mặc định độ sáng của đèn là 0
int fadeAmount = 5; // giá trị thay đổi mỗi lần thay đổi độ sáng

void setup() {
pinMode(LED, OUTPUT);
}

void loop() {
analogWrite(LED, brightness);

brightness = brightness + fadeAmount;

//Nếu độ sáng = 0 hoặc = 255 thì sẽ đổi chiều của biến thay đổi độ
sáng.
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
delay(50);
}
4. Xung PWM ➢ Ví dụ 2: Dùng 2 nút nhấn để tăng/giảm độ sáng đèn
LED

void loop() {
analogWrite(D4, brightness);
if (brightness <= 0) {
int brightness = 0; brightness = 0;
int fadeAmount = 15; }
int button1 = D7; if (brightness >= 255) {
int button2 = D5; brightness = 255;
int b1Status = 0; }
int b2Status = 0;
b1Status = digitalRead(D7);
void setup() { b2Status = digitalRead(D5);
pinMode(D7, INPUT); if (b1Status == 0) {
pinMode(D5, INPUT); brightness = brightness + fadeAmount;
pinMode(D4, OUTPUT); }
Serial.begin(9600); if (b2Status == 0) {
} brightness = brightness - fadeAmount;
}
delay(200);
Serial.println(brightness);
Serial.println(analogRead(D4));
}
5. Đọc cảm biến Cảm biến nhiệt độ, độ ẩm DHT11

• DHT11 là cảm biến có thể đọc


được nhiệt độ và độ ẩm cùng
lúc.
• Cấu tạo gồm 4 chân:
o VCC (chân nguồn dương)
o DATA (chân tín hiệu)
o NC (Not Connected - chân này
chúng ta không dùng đến)
o GND (chân nối đất).
5. Đọc cảm biến Cảm biến nhiệt độ, độ ẩm DHT11

• Dữ liệu truyền về của DHT11 gồm 40bit dữ liệu theo thứ tự: 8 bit biểu
thị phần nguyên của độ ẩm + 8 bit biểu thị phần thập phân của độ ẩm +
8 bit biểu thị phần nguyên của nhiệt độ + 8 bit biểu thị phần thập phân
của nhiệt độ + 8 bit check sum.
• Ví dụ: ta nhận được 40 bit dữ liệu như sau:
0011 0101 0000 0000 0001 1000 0000 0000 0100 1101
• Tính toán:
8 bit checksum: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0000
= 0100 1101
• Độ ẩm: 0011 0101 = 35H = 53% (ở đây do phần thập phân có giá trị
0000 0000, nên ta bỏ qua không tính phần thập phân)
• Nhiệt độ: 0001 1000 = 18H = 24°C (ở đây do phần thập phân có giá trị
0000 0000, nên ta bỏ qua không tính phần thập phân)
➢ Ví dụ 1: Đọc giá trị nhiệt độ/độ ẩm từ cảm biến
5. Đọc cảm biến DHT11 và hiển thị lên màn hình Serial

• Trước tiên ta thêm thư viện: chọn Code


Sketch -> Include Library -> ADD .Zip
Library; chọn đến 2 file thư viện đã tải #include <DHT.h>
về là Adafruit_Sensor-master và #define DHTPIN D0
DHT_sensor_library rồi thêm vào. #define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
Kết quả
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.println();
Serial.print("Do am la: ");
Serial.println(h);
Serial.print("Nhiet do la: ");
Serial.println(t);
Serial.println("------------------");
delay(1000);
}
➢ Ví dụ 2: Chương trình cảnh báo nhiệt độ, khi nhiệt
5. Đọc cảm biến
độ lên quá cao, vượt một ngưỡng nào đấy thì nháy
đèn và có còi cảnh báo.

void loop() {
float h = dht.readHumidity();
#include <DHT.h> float t = dht.readTemperature();
#define DHTPIN D0 Serial.println();
#define DHTTYPE DHT11 Serial.print("Do am la: ");
DHT dht(DHTPIN, DHTTYPE); Serial.println(h);
int led = D3; Serial.print("Nhiet do la: ");
int coi = D6; Serial.println(t);
Serial.println("---------------");
void setup() { if (t > 27) {
Serial.begin(9600); canh_bao();
dht.begin(); }
pinMode(led, OUTPUT); }
pinMode(coi, OUTPUT);
} void canh_bao() {
digitalWrite(led, HIGH);
digitalWrite(coi, HIGH);
delay(200);
digitalWrite(led, LOW);
digitalWrite(coi, LOW);
delay(200);
}
➢ Ví dụ 1: Đọc giá trị cường độ ánh sáng thông qua
6. Đọc quang trở quang trở

Code Kết quả

• Khi rê tay lại gần quang trở (giảm


int quangtro = A0;
void setup() {
cường độ ánh sáng chiếu vào) thì
Serial.begin(9600); hiệu điện thế khá nhỏ, giá trị đọc
}
được khoảng 400-500. Cường độ ánh
void loop() {
sáng càng lớn thì hiệu điện thế càng
int giatriQuangtro =
analogRead(quangtro); cao, giá trị đọc được càng nhỏ.

Serial.println(giatriQuangtro);
}
➢ Ví dụ 2: Tự động bật đèn khi thiếu ánh sáng, tắt đèn
6. Đọc quang trở khi đủ ánh sáng.

int quangtro = A0;


int led = D4;

void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
}

void loop() {
int giatriQuangtro = analogRead(quangtro);
Serial.println(giatriQuangtro);
if (giatriQuangtro > 700) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
5
Tìm hiểu một số chuẩn
truyền tải dữ liệu
44
5. Tìm hiểu một số chuẩn truyền tải
dữ liệu

▰ UART/Serial
• Khi Arduino được kết nối với máy tính qua dây USB, lúc đó ta có thể bật
Serial Monitor lên để có thể gửi cũng như nhận dữ liệu từ Arduino, đó
chính là nhờ sự giúp đỡ của UART.
• UART không phải chỉ truyền qua USB.
• UART là một phương thức giao tiếp giữa 2 thiết bị, còn về cách truyền
thì UART có rất nhiều cách như dây cáp, các loại sóng…

45
5. Tìm hiểu một số chuẩn truyền tải
dữ liệu

▰ UART/Serial
• Việc sử dụng Serial để Debug là do Arduino truyền tín hiệu qua máy
tính. Trong trường hợp này, các nội dung truyền sẽ được lưu trong
output buffer của Arduino truyền qua máy tính và lưu input buffer. Máy
tính sẽ đọc các dữ liệu đó và quy ra Serial Command. Tương đương thì
Arduino cũng có thể được truyền ngược lại theo phương thức ấy theo
mô hình sau:

46
5. Tìm hiểu một số chuẩn truyền tải
dữ liệu

▰ UART/Serial
• Với Serial, dữ liệu sẽ truyền từng chút một cho đến hết.
• Khi giao tiếp theo chuẩn này chúng ta chỉ cần một đường tín hiệu cho
một chiều truyền dữ liệu.
• Mỗi lần truyền dữ liệu, hệ thống chỉ gửi một bit, dù dữ liệu có nhiều hay
ít thì cũng chỉ có một bit được truyền trong một thời điểm

47
5. Tìm hiểu một số chuẩn truyền tải
dữ liệu

▰ I2C
• I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đường Bus
giao tiếp giữa các IC với nhau.
• I2C sử dụng hai đường truyền tín hiệu:
o Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông
thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz)
o Một đường dữ liệu(SDA) có thể đi theo 2 hướng.

48
5. Tìm hiểu một số chuẩn truyền tải
dữ liệu

▰ I2C
• Có thể có nhiều thiết bị cùng được kết nối vào một bus I2C. Mỗi thiết bị
sẽ được nhận ra bởỉ một địa chỉ duy nhất với một quan hệ chủ/tớ tồn tại
trong suốt thời gian kết nối.
• Mỗi thiết bị có thể hoạt động như là thiết bị nhận hoặc truyền dữ liệu hay
có thể vừa truyền vừa nhận. Hoạt động truyền hay nhận còn tùy thuộc
vào việc thiết bị đó là chủ (master) hãy tớ (slave)
• Master nắm vai trò tạo xung đồng hồ cho toàn hệ thống, khi giữa hai
master/slave giao tiếp thì master tạo xung đồng hồ và quản lý địa chỉ của
slave trong suốt quá trình giao tiếp. Master giữ vai trò chủ động, còn
slave giữ vai trò bị động trong việc giao tiếp. 49
5. Tìm hiểu một số chuẩn truyền tải
dữ liệu

▰ SPI
• SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao
Master-Slave
• Tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời
(truyền song công - full duplex). SPI đôi khi được gọi là chuẩn truyền
thông “4 dây” vì có 4 đường giao tiếp trong chuẩn này
o MISO - Mang các dữ liệu từ các thiết bị SPI về arduino
o MOSI - Mang các dữ liệu từ Arduino đến các thiết bị SPI
o SS - Chọn thiết bị SPI cần làm việc
o SCK - dòng đồng bộ
50
6
Các chương trình nâng
cao
51
1. OLED

• OLED (Organic Light Emitting Diode): là loại công nghệ màn hình có
cấu tạo gồm các Diode phát sáng hữu cơ, có khả năng phát sáng khi có
dòng điện chạy qua.
• Trong board mạch của chúng ta sử dụng là module OLED 0.96 inch
giao tiếp I2C, độ phân giải 128x64 pixel
1. OLED

• Để lập trình cho module OLED này chúng ta sẽ sử dụng thư viện
esp8266-oled-SSD1306 của ThingPulse:
https://github.com/ThingPulse/esp8266-oled-ssd1306
• Có 2 thông số bắt buộc phải biết trước khi lập trình với module OLED
I2C, đó là địa chỉ I2C của OLED và 2 chân được nối với 2 chân SDA,
SDL. Trên bộ kit của chúng ta thì chân SDA nối với D2, chân SDL nối
với D1. Còn địa chỉ I2C của SSD1306 thông thường là 0x3c
1. OLED if (error == 0)
{
Serial.print("Phat hien thiet bi I2C
tai dia chi 0x");
• Chúng ta cũng có thể xác định if (address < 16)
địa chỉ I2C bằng chương trình Serial.print("0");
Serial.print(address, HEX);
sau Serial.println(" !");
#include <Wire.h>
nDevices++;
void setup() }
{ else if (error == 4)
Wire.begin(); {
Serial.begin(9600); Serial.print("Loi khong xac dinh tai
while (!Serial); dia chi 0x");
Serial.println("\nI2C Scanner"); if (address < 16)
} Serial.print("0");
Serial.println(address, HEX);
void loop() }
{ }
byte error, address; if (nDevices == 0)
int nDevices; Serial.println("Khong tim thay thiet bi
I2C nao\n");
Serial.println("Dang quet..."); else
Serial.println("done\n");
nDevices = 0;
for (address = 1; address < 127; delay(5000);
address++ ) }
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
1. OLED

• Sau khi nạp code, mở Serial Monitor lên, có thể thấy các thiết bị I2C đang kết
nối đã được liệt kê, ta thấy có 2 thiết bị ở địa chỉ 0x3c và 0x68, 0x3c chính là
địa chỉ của màn hình OLED chúng ta đang sử dụng (0x68 là địa chỉ của
module cảm biến gia tốc MPU6050).
1. OLED ➢ Ví dụ 1: Chương trình hiển thị chữ đơn giản
1. OLED ➢ Ví dụ 2: Chương trình hiển thị nhiều dòng chữ

for (uint8_t i = 0; i < 11; i++) {


#include "SSD1306Wire.h" display.clear(); /*Xoa man
/*Thiet lap ket noi voi Oled bang thu hinh*/
vien Wire*/ display.println(test[i]);/*In ra man
SSD1306Wire display(0x3c, D2, D1); hinh co xuong dong*/
/*0x3c la dia chi i2c cua Oled; D2,D1 display.drawLogBuffer(0, 0);/*In ra
la 2 chan SDA,SDL*/ tai vi tri x,y*/
void printBuffer(void) { display.display(); /*Hien thi
/*Thiet lap the log buffer*/ len man hinh*/
/*Cap phat bo nho de hien thi 5 hang delay(500);
text va 30 ky tu moi hang.*/ }
display.setLogBuffer(5, 30); }

/*Tao du lieu de test*/ void setup() {


const char* test[] = { display.init(); /*Thiet lap Oled*/
"Hello", display.flipScreenVertically(); /*Dao
"This is a test" , nguoc theo chieu doc*/
"----", display.setContrast(255); /*Thiet
"Tinasoft", lap do sang*/
"Viet", printBuffer();
"Nam", delay(1000);
"from", display.clear();
"Lophocvui",
"with", }
"love",
"test completed!!!" void loop() {
}; }
1. OLED

• Từ những hàm có sẵn của thư viện, chúng ta có thể hiển thị bất cứ thứ gì
mình muốn lên màn hình, danh sách đầy đủ các hàm được thư viện cung
cấp ta có thể xem ở thư mục lưu trữ thư viện của Arduino, thường có đường
dẫn là /home/pi/Arduino/libraries/:
2. OLED + cảm biến

• Chúng ta đã biết lập trình đọc giá trị các cảm biến, nhưng việc theo dõi mới
chỉ diễn ra trên cửa sổ Serial Monitor, việc theo dõi là rất thụ động, nhưng
giờ có thêm màn hình OLED, chúng ta có thể kết hợp các phần cũ lại, lập
trình hiển thị trực tiếp giá trị cảm biến đọc được lên màn hình OLED thời gian
thực
2. OLED + cảm biến ➢ Ví dụ: Hiển thị dữ liệu cảm biến lên màn hình OLED

void loop() {
int l = analogRead(quangtro);

/*---Oled---*/ float h = dht.readHumidity();


#include "SSD1306Wire.h" float t = dht.readTemperature();
SSD1306Wire display(0x3c, D2, D1); Serial.print("Do am: ");
Serial.print(h);
/*---DHT11---*/ Serial.print("\tNhiet do: ");
#include <DHT.h> Serial.print(t);
#define DHTPIN D0 Serial.print("\tAnh sang: ");
#define DHTTYPE DHT11 Serial.println(l);
DHT dht(DHTPIN, DHTTYPE);
display.clear();
/*---Quang Tro---*/ display.setTextAlignment(TEXT_ALIGN_CENTER); /*Can
int quangtro = A0; le giua*/
display.drawString(64, 0, "~ Tinasoft Viet Nam ~");
void setup() { /*64, 0, <=> x=64, y=0: giua dong dau tien*/
Serial.begin(9600); display.setLogBuffer(4, 30);
dht.begin();
display.print("Temp: ");
display.init(); display.println(t);
display.flipScreenVertically(); display.print("Hum: ");
display.setContrast(255); display.println(h);
} display.print("Light: ");
display.println(l);

display.drawLogBuffer(0, 14);
display.display();
}
3. Phát Wifi Biến bộ kit thành một chiếc router wifi, phát ra một
mạng wifi riêng của mình, cho phép các thiết bị bên
ngoài có thể kết nối vào được

void setup() {
Serial.begin(115200);
Serial.print("Dang ket noi...");
#include <ESP8266WiFi.h> Serial.println("\n");
#include <WiFiClient.h> WiFi.softAP(ssid, password);

const char* ssid = "testWifi"; IPAddress myIP = WiFi.softAPIP();


const char* password = "12345678"; Serial.print("Dia chi IP cua AP: ");
Serial.println(myIP);
const int port = 1; Serial.print("PORT: ");
Serial.println(port);
WiFiServer server(port); server.begin();
}

void loop() {
}
3. Phát Wifi Biến bộ kit thành một chiếc router wifi, phát ra một
mạng wifi riêng của mình, cho phép các thiết bị bên
ngoài có thể kết nối vào được
4. Kết nối Wifi Bộ kit chủ động kết nối tới mạng wifi có sẵn

Serial.println("");
Serial.println("WiFi connected");
#include <ESP8266WiFi.h>
#include <WiFiClient.h> Serial.print("Dia chi IP cua AP: ");
Serial.println( WiFi.localIP());
const char* ssid = "lophocvui.com";
const char* password = "88889999"; Serial.print("PORT: ");
const int port = 1; Serial.println(port);

WiFiServer server(port); s server.begin();


}
void setup() { void loop() {
Serial.begin(115200); }
Serial.print("Dang ket noi...");
Serial.println("\n");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
5. Wifi + LED Điều khiển đèn led từ xa qua Wifi

• Khi truy cập vào địa chỉ IP của bộ kit, ta sẽ nhìn thấy dao diện web điều
khiển, đồng thời có thể thực hiện thao tác bật/tắt 2 led D3 và D4 ngay ở
đây.
6. Wifi + Cảm biến Hiển thị dữ liệu cảm biến lên Web

• Khi truy cập vào địa chỉ IP của bộ kit, ta sẽ thấy các thông số nhiệt độ,
độ ẩm, ánh sáng. Dữ liệu cảm biến sẽ được đọc như bình thường, sau
đó hiển thị lên web theo thời gian thực
THANK YOU!

66

You might also like