20Ở dự án này, chúng ta sẽ xem cách cài đặt một con ESP8266 và làm một mạng server với nó.
Về cơ bản, ESP8266 có chức năng kết nối internet bằng Wi-fi với vi mạch điều khiển. Một con ESP8266 có thể kết nối với bất kể Wi-fi network nào và gửi hoặc nhận thông tin qua nhiều protocol như TCP hay UDP. Thêm vào đó, nó có thể dựng điểm phát Wi-fi và điều khiển các thiết bị khác.

Thiết kế mạch
ESP8266 cần nguồn ít nhất 250mA để chuyển data. Vì vậy khuyến khích cấp nguồn ít nhất 500mA để cấp nguồn ESP8266, không nên cấp nguồn ESP8266 từ dây cáp USB vì nguồn này k ổn định. Trong dự án này đã dùng nguồn 5V 1A và một LM1086 3.3V làm ổn áp để cấp nguồn cho ESP8266. Cách lắp đặt để sử dụng:

Lắp thêm cho Arduino
Cài đặt ESP8266 cần update board manager trong ARDUINO IDE. Thêm URL board manager có thể vào File->Preferences-> Aditional Boards Manager URLs. Ở phần URL, dưới URL có thể nhập vào như sau :


Bằng cách cập nhật URL, ESP8266 bổ sung có thể truy cập được bằng cái vào Tools->Boards->BoardsManager. Mạch ESP8266 sau đó có thể dùng được. Sau khi cài đặt xong, ở phần các mạch ( boards),module ESP8266 sẽ xuất hiện. Module khác nhau có thể được chọn nhưng trong dự án này chỉ dùng ESP8266 thuần thúy.

Đăng tải sketch lên ESP8266
Để lập trình một con ESP8266, chúng ta cần UART bootloader mà ESP8266 đã có sẵn. Bạn có thể làm một con mạch ESP8266 với sơ đồ như sau:

Danh sách các linh kiện cần dùng:
1. ESP8266-12 ( E hoặc F đều được
2.  Trở 3.3K x 2
3. Trở 470R cho LED
4. 1 LED để kiểm tra xem mạch đã được cấp nguồn hay chưa
5. 1 ổn áp AMS1117-3.3
6. Tụ 10uF-25v
7. Tụ 22uF-25v
8. Tụ 100nF capacitor
Để vào boot mode, GPIO0 nên được kéo âm khi khởi động ESP8266.Sau đó bằng cắt đặt cổng COM ở Arduino IDE, sketch có thể được tải lên bằng nút Upload. Sau khi lập trình xong,GPIO0 sẽ ở trạng thái lơ lửng vì ESP8266 bắt đầu bằng mode bình thường và chạy chương trình

Kết nối với điểm truy cập
Nếu ESP8266 có EEPROM được dựng sẵn có thể áp dụng vào lưu chứa data để xây dựng trang đăng n hập. Dùng EEPROM rất giống với các mạch Arduino khác với một số điểm khác
Đầu tiên, bạn cần khai báo EEPROM.begin(size) trước khi bạn bắt đầu đọc hoặc viết. Kích thước chính là số byte bạn muốn sử dụng, tần giữa 4 và 4096 byte.Ghi nhớ rằng EEPROM/write() không được viết để flash ngay. Bạn phải gọi EEPROM.commit() obaats cứ lúc nào bạn uốn để mọi thay đổi dến flash
Trong dự án này, chúng tôi muốn làm một cái web server cài đặt lại được mà có thể đăt ở mọi network( ví dụ một network mới mà không có SSID và mk để kết nối, ESP8266 vẫn đến điểm truy cập và đợi chế độ cài đặt. (SSID và mật khẩu)
Đầu tiên, chúng ta lấy 512 byte của EEPROM và kiểm tra xem có username và pass dùng được không. Chúng ta còn có thể chọn một địa chỉ IP cụ thể cho thiết bị và tự cài đặt nó, cần được lưu trữ trong EEPROM.Tự cài đặt địa chỉ IP chỉ hữu dụng khi chúng ta cần tạo một database thiết bị của mình để biết “ location and definition “.
Ở đoạn code này , 512 được để dành từ EEPROM và sau khi thu nhập thông tin xong, kết nối với điểm truy cập. Khi hoàn thành code, code sẽ bỏ qua giai đoạn kết nối nếu EEPROM trống rỗng
EEPROM.begin(512);
IPAddress ipad(192, 168, 1, eip.toInt());
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
WiFi.begin(esid.c_str(), epass.c_str());
WiFi.config(ipad, gateway, subnet);

Code ở trên cố gắng kết nối đến network có địa chỉ IP cụ thể và được lưu trữ ở trong EEPROM. Một điều cần phải nhớ khi dùng địa chỉ IP cụ thể là chúng ta cần biết cổng địa chỉ IP và network subnet nhưng không cần thiết để tự động kết nối địa chỉ IP mà cần DHCP server
Có thể kiểm tra tình trạng Wi-fi bằng cách sử dụng hàm WiFi.status(). Theo trang web Arduino, hàm trả lại những điều sau:
• WL_CONNECTED: khi kết nối được với Wi-fi
• WL_NO_SHIELD: Khi không có Wi-fi shield nào
• WL_IDLE_STATUS: Một trạng thái tạm thời khi WiFi.begin() được gọi và giữ nguyên trạng thái cho đến khi số lần thử kết nối hết ( dẫn đến WL_CONNECT_FAILED) hoặc kết nối thành công ( WL_CONNECTED) WL_NO_SSID_AVAIL: khi không có SSID nào
• WL_SCAN_COMPLETED: khi quét các network xong
• WL_CONNECT_FAILED: khi không kết nối được sau các lần thử
• WL_CONNECTION_LOST: khi mất kết nối
• WL_DISCONNECTED: khi thoát kết nối từ một network
Nhờ sử dụng hàm WiFi.status() chúc ta có thể kiểm tra tình trạng kết nối và, nếu nó không có ở đó, ESP8266 sẽ quay trở về với một điểm truy cập.
Cấu hình điểm truy cập, có thể làm với WiFi.mode(WIFI_AP), cần một username và pass. Đặt username và pass bằng hàm WiFi.softAP. Bạn nào muốn xem tài liệu về các hàm Wi-Fi và thư viện khác cho ESP8266 có thể lên GitHub và trang web Arduino.
Ở dự án này chúng ta kết nối với network có sẵn. Đầu tiên, khi thiết bị không có SSID và pass để kết nối với network, nó sẽ chuyển sang chế độ điểm truy cập và chúng ta có thể cấu hình nó.Cấu hình xong, thiết bị có thể kết nối với network. Có người có thể muốn dùng ESP8266 chỉ với chế độ điểm truy cập.Trong trường hợp này, chúng ta cần phải kết nối với thiết bị mỗi khi chúng ta cần chuyển dữ liệu.
Vì vậy, ở chế độ điểm truy cập, ESP8266 sẽ đợi cấu hình mới. Quét các điểm truy cập wifi có trong khu vực có thể làm được với WiFi.scanNetworks mà trả về các số nguyên, quyết định sự có mặt các điểm truy cập hiện có. Sau khi thu thập các số của các network, các hàm sau có thể lấy được các thông tin bạn cần :
• WiFi.SSID: lấy SSID của network hiện tại
• WiFi.RSSI: lấy độ mạnh tín hiệu của kết nối với router
• WiFi.encryptionType: lấy giải mã của loại network hiện
Hình dưới hiện các thông tin trả lại được từ WiFi.scanNetworks. Dữ liệu được lưu lại bằng giao tiếp RS232 và phần mềm TeraTerm

mDNS
Tạo một web server trên ESP khá dễ nếu sử dụng các thư viện có sẵn, hoàn toàn có thể tạo được một mDNS liên kết tên tới server IP của network sử dụng thư viện ESP8266mDNS . mDNS giải quyết tên host tới địa chỉ IP ở các network nhỏ mà không có tên server nội bộ. TIếp theo, “mdns.begin(‘esp8266’)” làm cho một mDNS server được đặt với tên của ESP8266. Nếu mọi thứ chạy suôn sẻ, hàm mdns.begin sẽ trả lại true và chúng ta có thể bắt đầu server bằng server.begin()

Đọc một yêu cầu GET ( GET request )
Chúng ta có thể cập nhật các yêu cầu mDNS bằng mdns.update() và đọc các yêu cầu đọc dưới dạng client. Code ở dưới đầu tiên cập nhật yêu cầu cho mDNS và đọc nó.

mdns.update();
WiFiClient client = server.available();
if (!client) {
return(20);
}
String req = client.readStringUntil(‘\r’);
// Wait for data from client to become available
if(client.connected() && !client.available()){
return(20);
}

Ở code trên, ESP8266 sẽ kiểm tra nếu có client hay không. Nếu có thì nó sẽ đọc dữ liệu của nó cho đến khi nó nhận ‘\r’ , nghĩa là kết thúc gói dữ liệu. Từ thời điểm đó, web server có thể nhận yêu cầu GET nhưng không thể đáp ứng, trả lời yêu cầu.
Gửi trả lời của client có thể thực hiện bằng cách dùng client.print(). Đối với client, để xem nó là dữ liệu mạng, câu trả lời nên ở dạng HTML. Bằng cách này chúng ta có thể dựng một HTML web server với ESP8266.
Với code ở trên, chúng ta đọc yêu cầu GET của client và chứa nó bằng biến ‘req’. ‘req’ bây giờ có dữ liệu GET và chúng ta có thể biên dịch được chúng, tạo hàm xâu và dùng hàm client.print() để hiển thị câu trả lời.Ở dưới là đoạn sketch tạo một trang HTML đơn giản để trả lời client.

s = “HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\nALL ABOUT CIRCUITS!”;
s += ”
“;
s += “\r\n\r\n”;
client.print(s);

Như ở đây, lệnh ‘ 200 ‘ đã được gửi tới client
Kết luận
Như vậy, ở dự án này thư viện ESP8266 giúp tạo một web server đơn giản. Một web server có thể lên cấu hình được, lấy SSID và pass của wifi tùy chọn đã được tạo. Sau khi kết nối với mạng nội bộ, yêu cầu GET được chuyển giữa thiết bị và client.

Mời mn xem video tham khảo ^^

Nguồn : allaboutcircuits.com