Kết nối ESP8266 với STM32F103C8: Tạo máy chủ web
Nếu bạn quam tâm các công nghệ của tương lai thì hai cái tên ngay lập tức xuất hiện trong đầu bạn là Trí tuệ nhân tạo (AI) và Internet of Things (IoT). AI vẫn đang trong giai đoạn ban đầu và còn nhiều thứ nữa sẽ được phát triển. Nhưng IoT đang trong giai đoạn Tăng trưởng và rất nhiều sản phẩm dựa trên IoT đã có mặt trên thị trường. Ngoài ra, có rất nhiều công cụ và phần cứng có sẵn trên thị trường để làm cho sản phẩm của bạn giao tiếp với ‘ mọi thứ ‘ trên internet. Trong số đó, ESP8266 là mô-đun phổ biến, rẻ tiền và dễ sử dụng nhất, có thể kết nối phần cứng của bạn với Internet.
Chúng tôi đã phát triển rất nhiều Dự án IoT sử dụng ESP8266 , không chỉ bao gồm giao tiếp cơ bản với các bộ vi điều khiển khác như Arduino, PIC, AVR mà còn bao gồm nhiều dự án thông minh như Giám sát ô nhiễm không khí dựa trên IOT, Theo dõi xe trên Google Maps , Tự động điều khiển bằng giọng nói dựa trên IOT vv Hôm nay trong hướng dẫn này, chúng tôi sử dụng ESP8266 để kết nối STM32F103C8 với internet. Tại đây, chúng tôi sẽ kết nối mô-đun Wi-Fi ESP8266 với board Blue Pill STM32F103C8 của chúng tôi và gửi dữ liệu đến một trang web được lưu trữ trên máy chủ web ESP8266.
Linh kiện cần thiết
- Board STM32F103C8
- Mô-đun Wi-Fi ESP8266
- Điểm truy cập máy tính xách tay & Wi-Fi
Mô-đun Wi-Fi ESP8266
Hầu hết mọi người gọi ESP8266 là một mô-đun WIFI, nhưng nó thực sự là một vi điều khiển. ESP8266 là tên của bộ vi điều khiển được phát triển bởi Espressif Systems, một công ty của shanghai. Bộ vi điều khiển này có khả năng thực hiện các hoạt động liên quan đến WIFI do đó nó được sử dụng rộng rãi như một mô-đun WIFI .
- GND , đất (0 V)
- TX , Truyền dữ liệu bit X
- GPIO 2 , đầu vào / đầu ra đa năng số 2
- CH_PD , chip power-down
- GPIO 0 , đầu vào / đầu ra đa năng số 0
- RST , thiết lập lại
- RX , Nhận bit dữ liệu X
- VCC , nguồn (+3.3 V)
Lệnh AT được sử dụng để liên lạc với ESP8266. Board dưới đây cho thấy một số lệnh AT hữu ích
THÔNG TIN |
SỬ DỤNG |
AT |
Lời cảm ơn trả về ‘OK’ |
AT + RST |
Mô-đun RESTART |
AT + GMR |
Hiển thị CHI TIẾT PHẦN MỀM |
AT + CWMODE = 1 hoặc 2 hoặc 3 |
Chế độ Wi-Fi 1-Station, 2- AP, 3-Cả hai |
AT + CWLAP |
Liệt kê AP |
AT + CWJAP = SSID,, PASSWORD |
Tham gia AP |
AT+ CWQAP |
Thoát khỏi AP |
AT + CIFSR |
Nhận địa chỉ IP |
AT + CIPMUX = 0 hoặc 1 |
Đặt nhiều kết nối 0- Đơn, 1 nhiều |
AT + CIPSTART
AT + CIPSTART = <loại>, <địa chỉ>, <cổng> AT + CIPSTART = <id>, <loại>, <địa chỉ>, <cổng> |
Thiết lập kết nối TCP / UDP Địa chỉ- Địa chỉ IP Địa chỉ cổng của ip Kết nối đơn: Loại-TCP, UDP Nhiều kết nối: Id-0 đến 4, Loại-TCP, UDP |
AT + CIPSEND AT + CIPSEND = <chiều dài> AT + CIPSEND = <id>, <length> |
Gửi dữ liệu Kết nối đơn, Độ dài – Độ dài của dữ liệu Nhiều kết nối, Id = 0 đến 4 |
AT + CIPSTATUS |
Có trạng thái kết nối |
AT + CIPSERVER = <chế độ>, <cổng> |
Đặt làm Máy chủ 0 – Đóng máy chủ, Cổng 1 mở |
AT + CIPCLOSE |
Đóng kết nối TCP hoặc UDP |
Sơ đồ mạch và kết nối
Dưới đây sơ đồ cho thấy kết nối giữa mô-đun Wi-Fi STM32 & ESP8266 .
Tham khảo board dưới đây để kết nối chân ESP8266 với chân STM32:
ESP8266 |
STM32 |
VCC |
3.3V |
GND |
G |
CH_PD |
3.3V |
TX |
PA3 |
RX |
PA2 |
SMT32F103C8 có ba bộ giao tiếp nối tiếp UART. Trong hình dưới đây, bạn có thể thấy các chân tương ứng của nó:
Serial Port |
Pins |
Tolerant |
Serial1 (TX1,RX1) |
PA9,PA10 PB6,PB7 |
5V |
Serial2 (TX2,RX2) |
PA2,PA3 |
3.3V |
Serial3 (TX3,RX3) |
PB10,PB11 |
5V |
ESP8266 sử dụng giao tiếp nối tiếp để tương tác với vi điều khiển. Vì vậy, ở đây TX & RX của ESP8266 được nối với cổng serial2 (PA2 & PA3) của board STM32.
Giải thích về Code & Nguyên lý hoạt động
Công việc kết nối ESP8266 với STM32 rất đơn giản. Bạn có thể tìm thấy toàn bộ hoạt động trong video được đưa ra ở cuối hướng dẫn này cùng với code.
Chúng tôi sử dụng arduino IDE để viết và tải code lên STM32.
Đầu tiên chúng ta cần thực hiện các kết nối mạch như hình trên trong sơ đồ mạch. Sau khi tải lên code, hãy mở Serial Monitor (Tools>>Serial Monitor) để theo dõi quá trình hoạt động. Bạn sẽ thấy địa chỉ IP trên Serial Monitor, sao chép địa chỉ IP từ Serial Monitor và dán nó vào trình duyệt và nhấp vào để xem trang web của chúng ta. Nhớ kết nối máy tính và mô-đun ESP8266 trên cùng một mạng Wi-Fi.
Code hoàn chỉnh được đưa ra ở cuối bài đăng.
Trước tiên, chúng tôi bắt đầu giao tiếp nối tiếp cho Serial Monitor và cho ESP8266, bằng cách sử dụng hai câu lệnh sau:
Serial.println(cmd); Serial2.println(cmd);
LƯU Ý: Tôi đã sử dụng các chân (PA2, PA3) của cổng serial2 của STM32 vì nó có nguồn 3,3V.
Sau đó, chúng ta cần chuẩn bị sẵn sàng cho ESP8266 bằng cách thoát khỏi mọi AP được kết nối cũ bằng cách đặt lại và đặt chế độ Wi-Fi thành cả AP & STA
connect_wifi("AT",100); //Sends AT command with time(Command for Acknowledgement) connect_wifi("AT+CWMODE=3",100); //Sends AT command with time (For setting mode of Wi-Fi) connect_wifi("AT+CWQAP",100); //Sends AT command with time (for Quit AP) connect_wifi("AT+RST",5000); //Sends AT command with time (For RESETTING WIFI)
Sau đó kết nối ESP8266 với mạng Wi-Fi . Bạn phải điền chi tiết Wi-Fi của mình như được hiển thị trong đoạn code dưới đây:
connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000); //provide your WiFi username and password here
Sau đó, chúng tôi nhận được địa chỉ IP của mô-đun ESP8266 và hiển thị nó trên serial monitor bằng cách sử dụng code dưới đây
Serial2.println("AT+CIFSR"); //GET IP AT COMMAND if(Serial2.find("STAIP,")) //This finds the STAIP that is the STATIC IP ADDRESS of ESP8266 Serial.print(IP); //prints IP address in Serial monitor
Tiếp theo chúng tôi sẽ viết code HTML cho trang web . Để chuyển đổi code HTML thành code Arduino, bạn có thể sử dụng liên kết này .
webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; //This is the heading line with black font colour String name="<p>Circuit Digest</p><p>A community of electrical and electronics students, engineers and makers</p>"; String data="<p>Data Received Successfully.....</p>"; //These two lines are of two paragraph webpage = "<a href=\"http://circuitdigest.com/\""; webpage+="\">Click Here to get into circuitdigest.com</a>"; //At last we insert the hyperlink to link the website address
Tiếp theo trong hàm void send () , chúng tôi đã in HTML bằng hàm sendwebdata và đóng kết nối máy chủ bằng AT + CIPCLOSE = 0
void Send() //This function contains data to be sent to local server { webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; sendwebdata(webpage); webpage=name; sendwebdata(webpage); delay(1000); webpage = "<a href=\"http://circuitdigest.com/\""; webpage+="\">Click Here to get into circuitdigest.com</a>"; webpage+=data; sendwebdata(webpage); Serial2.println("AT+CIPCLOSE=0"); //Closes the server connection }
Sau khi hoàn thành công việc, bạn có thể kiểm tra hoạt động bằng cách mở IP của ESP8266 trong bất kỳ trình duyệt web nào và nhấp vào liên kết hiển thị trên trang web, Click Here to get into circuitdigest.com, như bên dưới
Sau khi nhấp vào liên kết, bạn sẽ thấy trang web hiển thị “Data Received Successfully…..”
Code hoàn chỉnh với Video trình diễn được đưa ra dưới đây.
CODE:
//Interfacing ESP8266 Wi-Fi with STM32F103C8 //CIRCUIT DIGEST //NOTE: Serial is serial monitor with baud rate(9600) //NOTE: Serial2 (TX2, RX2)is connected with ESP8266(RX,TX)respectively with baud rate (9600) String webpage=""; //String variable to store characters int i=0,k=0,x=0; //integer variables String readString; //using readString feature to read characters boolean No_IP=false; //boolean variables String IP=""; //String variable to store data char temp1='0'; //character variable String name="<p>Circuit Digest</p><p>A community of electrical and electronics students, engineers and makers</p>"; //String with html notations String data="<p>Data Received Successfully.....</p>"; //String with html void check4IP(int t1) //A function to check ip of ESP8266 { int t2=millis(); while(t2+t1>millis()) { while(Serial2.available()>0) { if(Serial2.find("WIFI GOT IP")) { No_IP=true; } } } } void get_ip() //After cheacking ip ,this is a function to get IP address { IP=""; char ch=0; while(1) { Serial2.println("AT+CIFSR"); //GET IP AT COMMAND while(Serial2.available()>0) { if(Serial2.find("STAIP,")) //This finds the STAIP that is the STATIC IP ADDRESS of ESP8266 { delay(1000); Serial.print("IP Address:"); while(Serial2.available()>0) { ch=Serial2.read(); //Serial2 reads from ESP8266 if(ch=='+') break; IP+=ch; } } if(ch=='+') break; } if(ch=='+') break; delay(1000); } Serial.print(IP); //prints IP address in Serial monitor Serial.print("Port:"); Serial.println(80); } void connect_wifi(String cmd, int t) //This function is for connecting ESP8266 with wifi network by using AT commands { int temp=0,i=0; while(1) { Serial.println(cmd); //Sends to serial monitor Serial2.println(cmd); //sends to ESP8266 via serial communication while(Serial2.available()) { if(Serial2.find("OK")) i=8; } delay(t); if(i>5) break; i++; } if(i==8) Serial.println("OK"); else Serial.println("Error"); } void wifi_init() //This function contains AT commands that passes to connect_wifi() { connect_wifi("AT",100); //Sends AT command with time(Command for Achknowledgement) connect_wifi("AT+CWMODE=3",100); //Sends AT command with time (For setting mode of Wifi) connect_wifi("AT+CWQAP",100); //Sends AT command with time (for Quit AP) connect_wifi("AT+RST",5000); //Sends AT command with time (For RESETTING WIFI) check4IP(5000); if(!No_IP) { Serial.println("Connecting Wifi...."); connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000); //provide your WiFi username and password here } else { } Serial.println("Wifi Connected"); get_ip(); connect_wifi("AT+CIPMUX=1",100); //Sends AT command with time (For creating multiple connections) connect_wifi("AT+CIPSERVER=1,80",100); //Sends AT command with time (For setting up server with port 80) } void sendwebdata(String webPage) //This function is used to send webpage datas to the localserver { int ii=0; while(1) { unsigned int l=webPage.length(); Serial.print("AT+CIPSEND=0,"); Serial2.print("AT+CIPSEND=0,"); Serial.println(l+2); Serial2.println(l+2); delay(100); Serial.println(webPage); //sends webpage data to serial monitor Serial2.println(webPage); //sends webpage data to serial2 ESP8266 while(Serial2.available()) { if(Serial2.find("OK")) { ii=11; break; } } if(ii==11) break; delay(100); } } void setup() { Serial.begin(9600); //begins serial monitor with baud rate 9600 Serial2.begin(9600); //begins serial communication with esp8266 with baud rate 9600 (Change according to your esp8266 module) wifi_init(); Serial.println("System Ready.."); } void loop() { k=0; Serial.println("Please Refresh your Page"); while(k<1000) { k++; while(Serial2.available()) { if(Serial2.find("0,CONNECT")) { Serial.println("Start Printing"); Send(); Serial.println("Done Printing"); delay(1000); } } delay(1); } } void Send() //This function contains data to be sent to local server { webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; sendwebdata(webpage); webpage=name; sendwebdata(webpage); delay(1000); webpage = "<a href=\"http://circuitdigest.com/\""; webpage+="\">Click Here to get into circuitdigest.com</a>"; webpage+=data; sendwebdata(webpage); Serial2.println("AT+CIPCLOSE=0"); //Closes the server connection }
VIDEO: