PHẦN THỰC HÀNH VỚI ARDUINO UNO
Các bài thực hành với đèn LED
1.1.1 8 đèn nháy đuổi Các linh kiện cần có:
Mạch Arduino Uno Dây cắm Đèn LED Breadboard
Code: void setup() { // put your setup code here, to run once: pinMode ( , 1 OUTPUT); pinMode ( , 2 OUTPUT); pinMode ( , 3 OUTPUT); pinMode ( , 4 OUTPUT); pinMode ( , 5 OUTPUT); pinMode ( , 6 OUTPUT); pinMode ( , 7 OUTPUT); pinMode ( , 8 OUTPUT);
} void loop() { // put your main code here, to run repeatedly: digitalWrite (1, HIGH ); delay (1000); digitalWrite (1, LOW); delay (1000); digitalWrite (2, HIGH ); delay (1000); digitalWrite (2, LOW); delay (1000); digitalWrite (3, HIGH ); delay (1000); digitalWrite (3, LOW); delay (1000); digitalWrite (4, HIGH ); delay (1000); digitalWrite (4, LOW); delay (1000); digitalWrite (5, HIGH ); delay (1000); digitalWrite (5, LOW); delay (1000); digitalWrite (6, HIGH ); delay (1000); digitalWrite (6, LOW); delay (1000); digitalWrite (7, HIGH ); delay (1000); digitalWrite (7, LOW); delay (1000); digitalWrite (8, HIGH ); delay (1000); digitalWrite (8, LOW); delay (1000);
} Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 2
Hình 1.1.2 Kết quả bài thực hành 8 đèn LED nháy đuổi Giải thích:
Yêu cầu của bài thực hành trên là điều khiển sao cho 8 đèn LED nháy theo thứ tự nối tiếp nhau Để thực hiện điều đó, ta cần có 8 đèn LED cắm nối tiếp vào mạch Sau đó ta nối liền chân âm của các đèn LED vào phần dải điện âm trên Breadboard rồi nối phần này vào chân GND trên mạch UNO Tiếp đến, nối các chân dương của đèn LED vào mạch UNO theo thứ tự lần lượt từ chân 2 - 9
Về phần code, ở phần setup khai báo các chân LED từ 2-9 Ở phần loop(),làm lần lượt các hàm bật và tắt đèn bao gồm 2 bước: digitgalWrite(x, HIGH) và digitgalWrite(x, HIGH) với công dụng lần lượt là bật và tắt đèn Thực hiện lần lượt cho từng chân LED từ 2 – 9, ta sẽ có 8 đèn LED nháy đuổi.
1.1.2 Đèn LED sáng dần, tối dần Linh kiện: Đèn LED Bo mạch UNO Breadboard Dây cắm
Hình 1.1.3 Sơ đồ kết nối mô hình đèn LED sáng, tối dần Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 4
Yêu cầu của bài thực hành trên là lắp một mô hình 8 đèn LED nháy theo thứ tự nối tiếp nhau và điều khiển tốc độ nháy của 8 đèn LED bằng biến trở Để thực hiện, đầu tiên lắp 8 đèn LED nối tiếp nhau vào Breadboard, nối tiếp cực âm của các đèn led vào dải điện âm trên Breadboard và nối dải này vào chân GND trên mạch UNO Kế đến nối các chân từ 2 – 9 theo thứ tự vào các cực dương của đèn LED.
Về phần code, ở phần setup() khai báo các ledPin từ 2 – 9, đặt biến ledCount số lượng đèn LED = 8 và khai báo chân Analog = A0 Kế đến sử dụng một vòng lặp for để thiết lập các ledPin trên là OUTPUT tức là có thể xuất ra điện áp Ở phần loop(), thực hiện đọc giá trị analog A0 và lưu vào biến t để quyết định thời gian nhấp nháy của đèn LED Sử dụng một còng for để duyệt qua các chân LED và thực hiện các bước tuần tự: bật đèn LED -> dừng trong khoảng thời gian t -> tắt đèn LED.
1.1.4 Điều khiển độ sáng của đèn LED bằng biến trở Linh kiện:
Mạch Arduino UnoDây cắm Đèn LEDBreadboardBiến trở
Hình 1.1.7 Sơ đồ kết nối mô hình điều khiển độ sáng đèn LED bằng biến trở
Code: int brightness = 0; int analog = A0; void setup() { pinMode ( 9, OUTPUT);
{ int a = analogRead(analog); if(a>255) a = 255; analogWrite ( 9, a);
} Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 9
Hình 1.1.8 Kết quả mô hình điều khiển độ sáng đèn LED bằng biến trở Giải thích
Yêu cầu của bài thực hành là lắp mô hình điều khiển độ sáng của đèn LED bằng biến trở Để thực hiện mô hình, đầu tiên ta lắp đèn LED vào Breadboard, nối cực âm của đèn LED vào dải âm trên Breadboard và nối vào chân GND trên bo mạch UNO.
Về phần code, phần setup() khai báo ledPin 9, biến brightness để lưu độ sáng.
Phần loop(), thực hiện đọc giá trị analog A0 và lưu vào biến A để quyết định độ sáng của đèn LED Sử dụng một hàm if để định dạng lại giá trị max của độ sáng.
Cuối cùng là dùng analogWrite để thực hiện thay đổi độ sáng của đèn LED.
1.1.5 Đèn giao thông cho người đi bộ Linh kiện:
Mạch Arduino Uno Dây cắm Đèn LED Breadboard Công tắc bấm
Hình 1.1.9 Sơ đồ kết nối mô hình đèn giao thông cho người đi bộ Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 11
Code: int carRed = 10; carYellow = int 9; int carGreen = 8; int button = 11; int pedRed = 7; int pedGreen = 6; int crossTime P00; unsigned long changeTime;\ void setup() { pinMode(carRed, OUTPUT); pinMode(carYellow, OUTPUT); pinMode(carGreen, OUTPUT); pinMode(pedRed, OUTPUT); pinMode(pedGreen, OUTPUT); pinMode(button, INPUT); digitalWrite(carGreen, HIGH); digitalWrite(pedRed, HIGH );
} void loop() { int state = digitalRead(button); if(state == HIGH && ( millis () - changeTime)> 500){ changeLights();
} } void changeLights() { digitalWrite(carGreen, LOW ); digitalWrite(carRed, HIGH ); digitalWrite(pedRed, LOW); digitalWrite(pedGreen, HIGH); delay(crossTime); for ( x= int 0; x 0) { receivedChar = Serial.read(); lcd.clear(); lcd.setCursor( 0, 0 ); Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 17 lcd.print("Received Char:"); lcd.setCursor( 0, 1 ); lcd.print(receivedChar);
Hình 1.2.4 Kết quả mô hình đọc từ Serial Monitor Giải thích:
Trong hàm setup(), khởi tạo màn hình LCD bằng cách gọi lcd.init() và lcd.begin(16, 2) Bật đèn nền của màn hình LCD bằng cách gọi lcd.backlight() Tiếp theo, khởi tạo giao tiếp Serial với tốc độ 9600 bps.
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ụngSerial.readStringUntil('\n') Sau đó, xóa màn hình LCD bằng cách gọi lcd.clear() và
1.2.3 Hiển thị các số từ 1 – 100 Linh kiện:
Mạch Arduino Uno Dây cắm Breadboard Module LCD
Hình 1.2.5 Sơ đồ kết nối mô hình hiển thị các số từ 1 – 100 Code:
LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd init(); lcd begin(16, 2) ; lcd backlight() ; } void loop() { Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 19 for (int i = 1; i = interval) { previousMillis = currentMillis; if (isBacklightOn) { lcd noBacklight() ; isBacklightOn = false;
} else { lcd backlight() ; isBacklightOn = true;
Hình 1.2.8 Kết quả mô hình màn hình nhấp nháy
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.
1.2.5 Hiển thị giá trị của biến trở Linh kiện:
Mạch Arduino Uno Dây cắm Breadboard Module LCD Biến trở Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 23
Hình 1.2.9 Sơ đồ kết nối mô hình đọc giá trị biến trở Code:
LiquidCrystal_I2C lcd(0x27, 16, ; 2) int analog = A0; void setup() { lcd init(); lcd begin(16, 2) ; lcd backlight() ; } void loop() { int aValue = analogRead(analog); int changedValue = map(aValue, 0, 1023, 10, 10000); lcd.clear(); lcd print("Potentiometer:"); lcd setCursor(0, 1); lcd print(changedValue); delay( 500 ) ;
Hình 1.2.10 Kết quả mô hình đọc giá trị biến trở Giải thích:
Khai báo biến analog để lưu giá trị đọc được từ biến trở.
Trong setup(), khơi tạo màn hình lcd bằng hàm init() và begin() Bật đèn nền bằng hàm blacklight().
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 Giá trị đọc được sẽ nằm trong khoảng 0 – 1023.
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.
Xóa màn hình LCD bằng hàm lcd.clear(), dùng lcd.print() để in chuỗi
“Potentionmeter: ” lên màn hình 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 lcd.print(changedValue) để in ra giá trị của biến trở.
Kết nối với DHT11 và cảnh báo thay đổi nhiệt độ bằng đèn LED
Linh kiện: Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 25
Mạch Arduino Uno Dây cắm Đèn LED Breadboard DHT11 Sơ đồ kết nối:
Hình 1.3.1 Sơ đồ mô hình kết nối DHT11 với mạch Uno
#include const int DHTPIN = 4; const int red = 13; const int yellow = 12; const int green = 7; const int DHTTYPE = DHT11;
LiquidCrystal_I2C lcd(0x27, , ); 16 2 void setup() { Serial begin ( 9600); dht.begin(); pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT);
} void loop() { float h = dht.readHumidity(); float t = dht.readTemperature();
Serial print ( "Nhiet do: "); Serial println(t); Serial print ( "Do am: "); Serial println(h); delay ( 1000); if (t >60) { // B t đèn LED ậ digitalWrite(red, HIGH); digitalWrite(yellow, LOW); digitalWrite(green, LOW);
// T t đèn LED ắ digitalWrite(red, LOW); digitalWrite(yellow, HIGH); digitalWrite(green, LOW);
} else { digitalWrite(red, LOW); digitalWrite(yellow, LOW); digitalWrite(green, HIGH);
} } Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 27
Hình 1.3.2 Kết quả mô hình kết nối DHT11 với mạch Uno Giải thích:
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ênBreadboard, chân data vào chân pin số 6 trên mạch Uno, chân âm vào dải âm trênBreadboard. if (buttonState1 == HIGH ) { forward();
} } void forward(){ myStepper.setSpeed(speed); myStepper.step(-100 );
} void backward(){ myStepper.setSpeed(speed); myStepper.step(100 );
Hình 1.4.6 Kết quả mô hình đảo chiều bằng nút nhấn Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 35
Giải thích Trong setup(), đặt chế độ của nút nhấn là INPUT
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 Nếu là HIGH thì thực hiện hàm favorable(), ngược lại thì là reverse().
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
1.4.4 Hiển thị tốc độ, chiều quay lên màn hình LCD Linh kiện:
Bo mạch Arduino Uno Động cơ bước – Step motor Driver module ULN2003 Dây nối
Hình 1.4.7 Sơ đồ kết nối hiển thị tốc độ, chiều quay Code:
LiquidCrystal_I2C lcd( 0x27, , 20 4 ); const int stepsPerRevolution = 2038;
Stepper myStepper(stepsPerRevolution, 8, , , 10 9 11); const int buttonPin1 = 2; int buttonState1 = LOW; int speed = 15; void setup() { pinMode ( 2, INPUT);
Serial begin ( 9600); lcd.init(); lcd.backlight();
// dao(); int t = analogRead (A); Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 37 buttonState1 = digitalRead(buttonPin1); if (buttonState1 == HIGH ) { thuan();
} } void thuan(){ myStepper.setSpeed(speed); myStepper.step(100 );
Serial println(speed); lcd.setCursor(3 0 , ); lcd.print("Thuan"); lcd.setCursor(3 1 , ); lcd.print(speed);
} void dao(){ myStepper.setSpeed(speed); myStepper.step(-100 );
Serial println(speed); lcd.setCursor(3 0 , ); lcd.print("Dao"); lcd.setCursor(3 1 , ); lcd.print(speed);
Hình 1.4.8 Kết quả mô hình hiển thị tốc độ, chiều quay Giải thích
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.
2 A Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 39
Các bài thực hành với động cơ bước
Module ESP8266 Dây nối Micro-USB Sơ đồ kết nối chung:
Hình 2.1 Sơ đồ kết nối ESP8266
2.1 Các trạng thái làm việc với WiFi
2.1.1 Tạo điểm truy cập WiFi (Access Point Mode) Code:
#include const char *ssid = "khanh"; const char *password = "123456a@"; void setup() { Serial begin ( 9600); delay ( 10);
CÁC BÀI THỰC HÀNH VỚI NODE MCU ESP8266
Các trạng thái làm việc với WiFi
2.1.1 Tạo điểm truy cập WiFi (Access Point Mode) Code:
#include const char *ssid = "khanh"; const char *password = "123456a@"; void setup() { Serial begin ( 9600); delay ( 10);
Serial println(WiFi.softAPIP()); int dev = WiFi.softAPgetStationNum();
Serial.printf("Devices connected = %d\n", dev); delay ( 3000);
Hình 2.1.2 Kết quả mô hình ESP8266 Access Mode Giải thích:
Khai báo thư viện ESP8266WiFi.h để hỗ trợ kết nối WiFi
Các biến ssid và password lưu trữ tên và mật khẩu của điểm truy cập WiFi muốn tạo
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.
Trong loop(), sử dụng hàm WiFi.softAP(ssid, password) để thiết lập một điểm truy cập In ra màn hình Serial thông báo rằng điểm truy cập đã được khởi động với tên ssid. Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 41
In ra màn hình địa chỉ IP của điểm truy cập WiFi bằng softAPIP()
Sử dụng hàm WiFi.softAPgetStationNum() để lấy số lượng thiết bị đã kết nối đến điểm truy cập.
2.1.2 Truy cập 1 WiFi (Station Mode) Code:
#include const char* ssid = "Khanh"; const char* password = "123456a@"; void setup() { Serial begin ( 9600 );
} void loop() { Serial println ( "Setting WIFI mode ");
Serial print(ssid); while(WiFi.status()!=WL_CONNECTED){ delay ( 500);
Serial print ( "Connected,IP address");
Serial println(WiFi.localIP()); Serial.printf("Signal Strength in dB = %d\n",WiFi.RSSI()); delay ( 3000);
Hình 2.1.3 Kết quả mô hình ESP8266 Station Mode Giải thích:
Khai báo thư viện ESP8266WiFi.h 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() Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 43
#include void setup() { Serial begin ( 9600);
Serial println(); WiFi.mode(WIFI_STA); delay ( 100);
Serial println ( "Wi-Fi Network Scan Started");
} void loop() { int n = WiFi.scanNetworks();
Serial println ( "Scan done"); if (n == 0) { Serial println ( "No Networks Found");
} else { Serial print(n); Serial println ( " Networks found"); for (int i = 0; i < n; ++i) { Serial print ( "Sr No: ");
Serial print(i + 1); // Serial Number Serial print ( ": SSID: ");
Serial print(WiFi.SSID(i)); // SSID Serial print ( " (Signal Strength: ");
Serial print(WiFi.RSSI(i)); // Signal Strength Serial print ( " dBm, MAC: ");
Serial print(WiFi.BSSIDstr(i)); // MAC Address Serial print ( ", Security: "); switch (WiFi.encryptionType(i)) { case ENC_TYPE_NONE:
Serial println ( "Unsecured"); break; case ENC_TYPE_WEP:
Serial println ( "WEP"); break; case ENC_TYPE_TKIP:
Serial println ( "WPA"); break; case ENC_TYPE_CCMP:
} } Serial println ( ""); // Wait a bit before starting a new scan again delay ( 5000);
Hình 2.1.4 Kết quả mô hình ESP8266 Scan WiFi Giải thích:
Trong setup(), thiết lập Serial để giao tiếp với máy tính với baud là 9600.
Thiết lập WiFi của ESP8266 ở chế độ Station (WIFI_STA)
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)
Nếu không tìm thấy mạng nào (n==0) in ra màn hình “No Networks Found”. Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 45
2.2 Các phương thức làm việc với WebServer
#include const char* wifiName = "Khanh"; const char* wifiPass = "123456a@";
ESP8266WebServer server(80); void handleRoot() { digitalWrite(2, 0); // Blinks on board LED on page request server.send(200, "text/plain", "My fullname is Do Quoc Khanh"); digitalWrite(2, 1);
} void setup() { Serial begin ( 9600); delay ( 10); pinMode ( 2, OUTPUT);
Serial println(); Serial println ( "Connecting");
WiFi begin (wifiName, wifiPass); while (WiFi.status() != WL_CONNECTED) { delay ( 500);
Serial println ( "Wi-Fi connected");
Serial println(WiFi.localIP()); server.on( , handleRoot); "/" server.begin();
Serial println ( "HTTP server started");
Hình 2.2.1 Kết quả mô hình HTTPS Giải thích:
Khai báo các thư viện ESP8266WiFi.h, ESP8266WebServer.h, ESP8266mDNS.h
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.
Trong setup(), khởi động serial với baud 9600 và đặt pin số 2 ở chế độ OUTPUT.
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)
Trong loop(), gọi hàm server.handleClient để xử lý các yêu cầu đền máy chủ web
2.2.2 Tạo trang web giới thiệu bản thân Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 47
#include const char* wifiName = "fourcongchua"; const char* wifiPass = "gaugaugau";
ESP8266WebServer server(80); const char htmlPage[] PROGMEM = R"=====(
body { font-family: Arial, sans-serif;
} rounded-avatar { width: 200px; height: 200px; border-radius: 50%; object-fit: cover;
} container { max-width: 500px; margin: 0 auto; padding: 20px; background-color: #f5f5f5; border-radius: 10px;
} img { width: 300px; height: 300px;
)====="; void handleRoot() { server.send( 200 , "text/html", htmlPage);
} void setup() { pinMode ( LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH);
} void loop() { Serial println(); Serial println ( "Đang k t n i" ế ố );
WiFi.begin(wifiName, wifiPass); while (WiFi.status() != WL_CONNECTED) { delay ( 500);
Serial println ( "Wi-Fi đã k t n i" ế ố );
Serial println(WiFi.localIP()); if (MDNS.begin ( "esp8266")) { Serial println ( "MDNS responder đã kh i đ ng" ở ộ );
} server.on("/", handleRoot); server.begin();
Serial println ( "HTTP server đã kh i đ ng" ở ộ ); server.handleClient();
} Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 49
Hình 2.2.2 Kết quả Web giới thiệu bản thân Giải thích:
Khai báo các thư viện ESP8266WiFi.h, ESP8266WebServer.h, ESP8266mDNS.h
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.
Trong setup(), khởi động serial với baud 9600 và đặt pin số 2 ở chế độ OUTPUT.
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)
#include // Thêm dòng này const char* ssid = "Khanh"; const char* password = "123456a@"; void setup() { Serial begin ( 9600); delay ( 10);
WiFi begin (ssid, password); while (WiFi.status() != WL_CONNECTED) { delay ( 500);
} Serial println(); Serial println ( "Wi-Fi connected");
} void loop() { // Th c hi n yêu c u POST ự ệ ầ HTTPClient http2;
WiFiClient client2; // T o m t đ i t ạ ộ ố ượ ng WiFiClient khác http2 begin (client2, "http://httpbin.org/post"); http2.addHeader("Content-Type", "application/x-www-form-urlencoded");
String postData = "data3&sensor=temperature"; int httpCode2 = http2.POST(postData); if (httpCode2 > 0) { Serial print ( "HTTP Code (POST): ");
Serial println(httpCode2); if (httpCode2 == HTTP_CODE_OK) { String payload = http2.getString();
Serial println ( "Response Data (POST): ");
} else { Serial println ( "Failed to connect (POST)");
} Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 51
Hình 2.2 3 Kết quả HTTP POST Giải thích:
Khai báo các thư viện ESP8266WiFi.h, ESP8266WebServer.h, ESP8266mDNS.h
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.
Trong setup(), khởi động serial với baud 9600 và đặt pin số 2 ở chế độ OUTPUT.
Trong loop(), gọi hàm server.handleClient để xử lý các yêu cầu đến máy chủ web Khởi tạo yêu cầu HTTP bằng hàm HTTPClient.POST.
#include const char* ssid = "Khanh"; const char* password = "123456a@"; void setup() { Serial begin( 9600 ) ; delay( ) 10 ; WiFi.begin(ssid, password); while (WiFi status() != WL_CONNECTED) { delay( 500 ) ;
Serial println(); Serial println("Wi-Fi connected"); } void loop() { // Th c hi n yêu c u GET ự ệ ầ HTTPClient http;
WiFiClient client; // T o m t đ i t ạ ộ ố ượ ng WiFiClient http begin(client, "http://httpbin.org/get"); int httpCode = http GET(); if (httpCode > 0) { Serial print("HTTP Code: "); Serial println(httpCode); if (httpCode == HTTP_CODE_OK) { String payload = http.getString();
Serial println("Response Data: "); Serial println(payload); }
} else { Serial println("Failed to connect"); } http end(); }
Kết quả: Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 53
Hình 2.2.4 Kết quả kết nối HTTP Get
Khai báo các thư viện ESP8266WiFi.h, ESP8266WebServer.h, Đị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 setup(), khởi động serial với baud 9600 và đặt pin số 2 ở chế độ OUTPUT.
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
Kết thúc yêu cầu HTTP Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 55
Thực hành kết nối Arduino Uno với ESP8266
2.3.1 Kết nối bằng UART Linh kiện:
Module ESP8266 Bo mạch Arduino Uno Dây cắm micro USB Dây nối giữa 2 mạch Sơ đồ kết nối:
Hình 2.3.1 Sơ đồ kết nối ESP8266 với Uno giao thức UART
Phần code chạy trên ESP8266:
#include const byte TX = 14; const byte RX = 12;
SoftwareSerial mySerial = SoftwareSerial(RX, TX);
String inputString = ""; bool stringComplete1 = false; void setup() { Serial begin ( 9600); mySerial.begin(9600);
} void loop() { Uno2Esp(); delay ( 2000);
} void Uno2Esp() { while (mySerial available ()) { char inChar = (char)mySerial read (); inputString += inChar; if (inChar == '\n') { stringComplete1 = true;
} } if (stringComplete1 == true) { Serial print ( "Uno sent to Esp: ");
Serial println(inputString); inputString = ""; stringComplete1 = false;
} } void Esp2Uno() { mySerial.println("ESP"); delay ( 1000); mySerial.flush();
} Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 57
Code chạy trên bo mạch Uno:
#include const byte RX = 2; const byte TX = 3;
SoftwareSerial mySerial= SoftwareSerial(RX, TX);
String inputString = ""; // a String to hold incoming data bool stringComplete = false; // whether the string is complete void setup() { // Serial, mySerial Begin at 9600 Baud Serial begin ( 9600); mySerial.begin(9600);
} void loop() { Uno2Esp(); delay ( 2000);
} void Esp2Uno() { while (mySerial available ()) { char inChar = (char)mySerial read (); inputString += inChar; if (inChar == '\n') { stringComplete = true;
} } if (stringComplete == true) { Serial print ( "Esp sent to Uno: ");
Serial println(inputString); inputString = ""; stringComplete = false; // Reset the flag }
Hình 2.3.2 Kết nối Arduino với ESP8266 giao thức UART Giải thích:
Trong code chạy trên ESP8266, khai báo chân 14(TX) và 12(RX) của ESP8266 Tạo đối tượng SoftwareSerial 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 hàm Esp2Uno(), ESP8266 sẽ gửi chuỗi “ESP” đến Uno thông qua Serial.Println().
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 hàm Uno2Esp(), Uno gửi chuỗi “UNO” đến Esp8266 thông qua Serial.Println(). Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 59
2.3.2 Kết nối bằng I2C Linh kiện:
Module ESP8266 Bo mạch Arduino Uno Dây cắm micro USB Dây nối giữa 2 mạch Sơ đồ kết nối:
Hình 2.3.3 Sơ đồ kết nối ESP8266 với Uno giao thức I2C Code:
( Wire write "Hello Servant"); /* sends hello servant string */
Wire.requestFrom(8, ); 13 /* request & read data of size 13 from slave */
( while Wire available()){ char c = Wire read(); Serial print(c); }
Code chạy trên mạch Uno:
#include void setup() { Wire begin ( ); 8 /* join i2c bus with address 8 */
Wire.onReceive(receiveEvent); /* register receive event */
Wire.onRequest(requestEvent); /* register request event */
Serial begin ( 9600 ); /* start serial for debug */
// function that executes whenever data is received from master void receiveEvent( howMany) { int while (0 < Wire available()) { char c = Wire read (); /* receive byte as a character */
Serial print (c); /* print the character */
// function that executes whenever data is requested from master void requestEvent() {
Wire write ( "Hello Master"); /*send string on request */
} Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 61
Hình 2.3.4 Kết nối ESP8266 với mạch Uno giao thức I2C Giải thích:
Thiết lập ESP8266 sẽ là Master:
Trong setup(), khởi tạo kết nối ESP8266 qua I2C thông qua Wire.begin(SDA, SCL) Ở đây, chân SDA (D1) là 5 và SCL (D2) là 4
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.
Thiết lập Arduino Uno là Servant:
Trong setup(), khởi tạo kết nối I2C thông qua Wire.begin(8), đặt địa chỉ servant là 8 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.
2.3.3 Kết nối bằng SPI Linh kiện:
Module ESP8266 Bo mạch Arduino Uno Dây cắm micro USB Dây nối giữa 2 mạch Sơ đồ kết nối:
Hình 2.3.5 Sơ đồ kết nối ESP8266 với Uno giao thức SPI Đỗ Quốc Khánh – Lớp CNTT 14-05 Trang 63
#include char buff[]="Hello Slave\n"; void setup() {
Serial begin 9600); /* begin serial with 9600 baud */
} void loop() { ( for int i=0; i