Hẹn mãi giờ mới làm được bài hướng dẫn giao tiếp giữa TIVA C và ESP8266 cho các bạn. Mình đi vào vấn đề luôn, bài viết này mình xin chia sẻ cách giao tiếp điều khiển ESP8266 thông qua tập lệnh AT. Cách này khác hẳn với những bài viết về lập trình trực tiếp trên ESP8266.
Chuẩn bị
Phần cứng
- TIVA C Launchpad
- Mạch ESP8266 phiên bản bất kỳ.
- Dây nối
- Nguồn 3v3
- Mạch USB2UART PL2303 hoặc mạch tương tự (có thể có hoặc không)
Lưu ý:
Ở đây mình sử dụng bản esp8266 có sẵn là bản v1, nếu các bạn mua mới thì nên mua từ bản v7 hoặc v12 thì tốt hơn.
Cách lập trình cho esp8266 các phiên bản là giống nhau, kể cả NodeMCU cũng vậy (NodeMCU là esp8266 v12)
Nguồn cấp cho esp8266 nên dùng nguồn ngoài 3v3. Dùng nguồn có sẵn từ TIVA cũng được nhưng mình không khuyến khích.
Phần mềm
- Energia IDE
- Firmware AT-command ai-thinker cho ESP8266
Trước khi bắt đầu, các bạn nên xem qua bài ESP8266 cho người không biết gì, đây là bài cơ bản cũng như là cách để bạn kiểm tra hoạt động của ESP8266 dùng firmware ai-thinker. Nếu gửi lệnh AT và nhận OK là modul hoạt động bình thường, có thể lấy để lập trình với TIVA C được.
Nếu bạn có từng lập trình trực tiếp nạp firmware vào ESP8266 thông qua các bài hướng dẫn trước của mình thì nên tham khảo cách nạp lại firmware AT-command cho ESP8266.
Sơ đồ chân của ESP8266 v1
Kiểm tra lệnh AT
Sau khi đã kiểm tra xong đảm bảo modul esp8266 hoạt động bình thường thì mình thử viết chương trình để thực hiện gửi lệnh AT và nhận phản hồi.
Nói thêm 1 chút về vai trò của TIVA C ở đây, như các bạn biết thì quá trình kiểm tra modul ban đầu phải qua các bước: mở phần mềm -> kết nối com -> gõ lệnh -> gửi lệnh -> chờ và xem phản hồi. Với 1 lệnh và mục đích test bình thường thì quá đơn giản, nhưng nếu nhiều lệnh hơn thì chẳng lẽ phải ngồi gõ lệnh hoài, làm thế chắc sớm muộn gì cũng lên đường sớm thôi. Cảm ơn TIVA C đã xuất hiện như một vị cứu tinh, giờ chỉ lập trình cho TIVA một chút thôi là chúng ta chỉ việc ngồi chơi xơi nước.
Thôi nhảm hơi nhiều rồi, mình vào vấn đề chính, dưới đây là cách mình kết nối dây và lập trình, chương trình đơn giản nên mình gom hết kết nối mô tả vào làm một
Lệnh sử dụng
Lệnh | Phản hồi | Mô tả |
---|---|---|
AT | OK | Nếu nhận được OK nghĩa là modul hoạt động bình thường |
/* Chương trình giao tiếp giữa TIVA và ESP8266 dùng firmware AT-Command của ai-thinker
* Tạo bởi Hocarm.org
* Kết nối
* ESP8266 | TIVA | Nguồn ngoài
* VCC | x | 3.3v
* GND | GND | GND
* CH_PD | x | 3.3v
* RX | PB1 | x
* TX | PB0 | x
*
* Tốc độ baud kết nối với ESP tùy thuộc vào baud của firmware.
*/
void setup() {
// Khởi tạo serial debug baud 115200
Serial.begin(115200);
// Khởi tạo serial giao tiếp với ESP8266 baud 9600
// Nếu bạn dùng firmware ai-thinker baud 115200 thì đổi lại
Serial1.begin(9600);
// Delay chút cho chắc ăn
delay(1000);
}
void loop() {
// Khai báo biến dạng chuỗi
String inData;
// In ra thông báo
Serial.println("Gui AT command...");
// Gửi lệnh AT xuống ESP8266
Serial1.println("AT");
// Chờ phản hồi và lưu dữ liệu
delay(30);
inData = "";
// Kiểm tra nếu có dữ liệu từ cổng serial thì in dữ liệu nhận được ra
while (Serial1.available()){
inData = Serial1.readStringUntil('\n');
Serial.println("Nhan tu ESP8266: " + inData);
}
// Delay 1s cho ESP còn thở
delay(1000);
}
Kết quả
Kết nối wifi
Coi như bước đầu giao tiếp đã thành công, giờ mình viết lại hàm gửi lệnh AT cho đơn giản hơn một chút, hàm
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout) có 3 tham số là
- ATcommand: lệnh AT gửi
- expected_answer: kết quả phản hồi mong muốn
- timeout: thời gian timeout cho lệnh
Với hàm này không cần phải delay chờ đợi gì nữa, cứ kiểm tra kết quả nhận được đúng với expected_answer thì thoát hàm, thực hiện lệnh tiếp theo.
Lệnh sử dụng
Lệnh AT | Phản hồi | Mô tả |
---|---|---|
AT+CWMODE =1 | OK | Cài đặt chế độ station |
AT+CWJAP = "ten_wifi", "pass" | OK | Kết nối với mạng wifi |
AT+CIPMUX = 1 | OK | Cài đặt chế độ đa kết nối |
AT+CIFSR | OK | Hiển thị IP |
/* Chương trình giao tiếp giữa TIVA và ESP8266 dùng firmware AT-Command của ai-thinker
* Tạo bởi Hocarm.org
* Kết nối
* ESP8266 | TIVA | Nguồn ngoài
* VCC | x | 3.3v
* GND | GND | GND
* CH_PD | x | 3.3v
* RX | PB1 | x
* TX | PB0 | x
*
* Tốc độ baud kết nối với ESP tùy thuộc vào baud của firmware.
*/
void setup() {
Serial.begin(115200);
Serial1.begin(9600);
sendATcommand("AT", "OK", 3000); //Kiểm tra kết nối
sendATcommand("AT+CWMODE=1", "OK", 3000); //Cấu hình chế độ station
sendATcommand("AT+CWJAP=\"ten_wifi\",\"mat_khau\"","OK", 3000); //Thay ten_wifi và mat_khau của bạn
sendATcommand("AT+CIPMUX=1", "OK", 3000); // Bật chế độ đa kết nối
sendATcommand("AT+CIFSR", "OK", 3000); // Hiển thị ip
}
void loop() {
}
// Hàm gửi lệnh AT
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){
uint8_t x=0, answer=0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // xóa buffer
delay(100);
while( Serial1.available() > 0) Serial1.read(); // đọc input
Serial1.println(ATcommand); // Gửi lệnh AT
x = 0;
previous = millis();
// Chờ phản hồi
do{
if(Serial1.available() != 0){
// Nếu có dữ liệu trong buffer UART, đọc và kiểm tra nó với expected_answer
response[x] = Serial1.read();
x++;
// Nếu đúng thì trả kết quả answer = 1, thoát hàm
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
}while((answer == 0) && ((millis() - previous) < timeout)); // Nếu sai thì tiếp tục thử lại cho tới hết thời gian timeout
Serial.println(response); // In giá trị nhận được để debug
return answer;
}
Kết quả
Tạm kết
Thế là tạm xong những bước ban đầu để kiểm tra kết nối của TIVA C và ESP8266, thử được kết nối tới server, có vẻ là hơi vất vả một chút nhưng giờ TIVA gánh được phần xử lý dữ liệu từ các cảm biến, io,.. còn ESP chỉ lo mỗi việc kết nối wifi và gửi dữ liệu lên cloud. Cách gửi dữ liệu lên server mình sẽ giới thiệu với các bạn ở bài tiếp theo.