W tym przykładzie połączymy się najmniejszą wersją STM32 (bluepill) z WiFi i postawimy pierwszy serwer www.
Serwer będzie serwował plik tekstowy Hello World i nic więcej. Nagłówki jednak są znacznie bardziej rozbudowane, niż to jedno zdanie. Mój przykład oparłem na tym poradniku. Tam jednak nie ma prawidłowych nagłówków HTTP, więc strona się nie ładowała.
Hardware
- STM32
- ESP8266 WiFi
- Programator/konsola UART (np. FTDI)
Łączymy:
1. STM32 UART1 (PA9,PA10) – FTDI UART (łączymy na krzyż RX-TX i TX-RX), oprócz tego zasilanie 5v z programatora FTDI VCC podłączamy do 5V STM32, a GND do GND.
2. STM32 UART2 (PA2,PA3) – ESP8266 (RX-TX, TX-RX), napięcie to 3,3V (UWAGA!), dodatkowy pin w WiFi EN też łączymy z 3,3V, GND-GND
Schematy połączeń ww znajdziecie w powyższym poradniku.
C++
W kodzie z ww. poradnika zmieniono: nagłówki HTML, usunięto zbędne zmienne oraz kilka drobnych poprawek naniesiono. UWAGA! Zmieniono prędkość terminali na 115200 baud (dla nowej wersji kart WiFi). Źle dobrana prędkość powoduje, że program nie nawiąże połączenia, alternatywnie 9600.
Najważniejsza jest linia, w której trzeba zmienić hasło sieci WiFi i ID (funkcja wifi_init())
1 | AT+CWJAP="NetworkID","NetworkPassword\ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | boolean No_IP=false; String IP=""; //String variable to store IP Address 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 fx_println(String cmd) { //wysyła polecenie na oba złącza serial (konsola + WiFi) + znak LN Serial.println(cmd); //Sends to serial monitor Serial2.println(cmd); //sends to ESP8266 via serial communication } void fx_print(String cmd) { //wysyła polecenie na oba złącza serial (konsola + WiFi) Serial.print(cmd); //Sends to serial monitor Serial2.print(cmd); //sends to ESP8266 via serial communication } void get_ip() //After cheacking ip ,this is a function to get IP address { IP=""; char ch=0; while(1) { fx_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.println("Port:80"); } void connect_wifi(String cmd, int t) //This function is for connecting ESP8266 with wifi network by using AT commands { uint8_t i=0; while(1) { fx_println(cmd); //wysłanie na oba UARTy while(Serial2.available()) { if(Serial2.find("OK")) i=8; } delay(t); if(i>5) break; i++; } Serial.println(i==8 ? "OK" : "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("Łączę z siecią Wifi...."); connect_wifi("AT+CWJAP=\"NetworkID\",\"NetworkPassword\"",7000); //USER I HASŁO DO WIFI if(No_IP) Serial.println("Połączone!"); } get_ip(); connect_wifi("AT+CIPMUX=1",100); //Sends AT command with time (For creating multiple connections) Wiele połączeń - obsługa connect_wifi("AT+CIPSERVER=1,80",100); //Sends AT command with time (For setting up server with port 80) Serwer www! } 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(); fx_print("AT+CIPSEND=0,"); Serial.println(l+2); Serial2.println(l+2); delay(100); fx_println(webPage); while(Serial2.available()) { if(Serial2.find("OK")) { ii=11; break; } } if(ii==11) break; delay(100); } } void setup() { delay(5000); //not neccessary, time to open console. Serial.begin(115200); //begins serial monitor with baud rate 9600 Serial2.begin(115200); //begins serial communication with esp8266 with baud rate 9600 (Change according to your esp8266 module) wifi_init(); Serial.println("System Ready.."); } void loop() { uint16_t k=0; Serial.print("."); while(k<1000) { k++; while(Serial2.available()) { if(Serial2.find("0,CONNECT")) { Serial.println("Start Sending..."); Send(); Serial.println("..Done. Connection Closed."); delay(1000); } } delay(1); } } void Send() { //MINIMALNA STRONA WWW (nagłówki HTTP konieczne jeśli otwieramy przeglądarką) String webpage = "HTTP/1.1 200 OK\nContent-Length: 13\nContent-Type: text/plain; charset=utf-8\n\nHello World!\n"; sendwebdata(webpage); fx_println("AT+CIPCLOSE=0"); //Closes the server connection } |