Подключаем микроконтроллер к Интернету через ,модуль ESP8266 WiFi, который представляет собой полноценную сеть Wi-Fi.
Модуль WIFI ESP8266 представляет собой полноценную сеть Wi-Fi, к которой вы можете легко подключиться в качестве обслуживающего адаптера Wi-Fi, интерфейса беспроводного доступа в Интернет к любому микроконтроллеру на основе простой связи через последовательную связь или интерфейс UART.
Добавление этого модуля в Arduino UNO откроет нам новые и интересные проекты и возможности.
Шаг 1. Схема сборки
Соединение выходов лучше описано в таблице выше. Следуйте этим шагам:
- соедините красный провод к VIN(3.3V) к +3.3V питанию микроконтроллера
- соедините черный провод с землей
- соедините зеленый провод к TX модуля Wi-Fi и микроконтроллера
- соедините желтый провод к RX модуля Wi-Fi и микроконтроллера
ESP8266 строго рассчитан только на 3,3 В. Большее напряжение может разрушить модуль.
Подключите VIN к 3,3 В для включения питания, а также контакт ENABLE, чтобы включить модуль.
TX присоединен к RX, и это означает, что все что мы передаем в ESP8266 получит Arduino UNO. И наоборот, от RX к TX. При построении этой схемы мы теперь готовы к работе WI-FI с Arduino Uno (Ардуино Уно).
Шаг 2. Общение с модулем
Связь с ESP8266 осуществляется с помощью Attention команд или AT Commands. Проверьте таблицу AT-команд, прилагаемую для просмотра кодов.
Шаг 3. Код проекта
Скопировать или скачать код проекта вы можете ниже:
Сам код программы, скетч, для подключения Wi-Fi к Ардуино:
#include <SoftwareSerial.h> SoftwareSerial wifiSerial(2, 3); // RX, TX for ESP8266 bool DEBUG = true; //show more logs int responseTime = 10; //communication timeout void setup() { pinMode(13,OUTPUT); //set build in led as output // Open serial communications and wait for port to open esp8266: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } wifiSerial.begin(115200); while (!wifiSerial) { ; // wait for serial port to connect. Needed for Leonardo only } sendToWifi("AT+CWMODE=2",responseTime,DEBUG); // configure as access point sendToWifi("AT+CIFSR",responseTime,DEBUG); // get ip address sendToWifi("AT+CIPMUX=1",responseTime,DEBUG); // configure for multiple connections sendToWifi("AT+CIPSERVER=1,80",responseTime,DEBUG); // turn on server on port 80 sendToUno("Wifi connection is running!",responseTime,DEBUG); } void loop() { if(Serial.available()>0){ String message = readSerialMessage(); if(find(message,"debugEsp8266:")){ String result = sendToWifi(message.substring(13,message.length()),responseTime,DEBUG); if(find(result,"OK")) sendData("\nOK"); else sendData("\nEr"); } } if(wifiSerial.available()>0){ String message = readWifiSerialMessage(); if(find(message,"esp8266:")){ String result = sendToWifi(message.substring(8,message.length()),responseTime,DEBUG); if(find(result,"OK")) sendData("\n"+result); else sendData("\nErrRead"); //At command ERROR CODE for Failed Executing statement }else if(find(message,"HELLO")){ //receives HELLO from wifi sendData("\\nHI!"); //arduino says HI }else if(find(message,"LEDON")){ //sending ph level: digitalWrite(13,HIGH); }else if(find(message,"LEDOFF")){ //sending ph level: digitalWrite(13,LOW); } else{ sendData("\nErrRead"); //Command ERROR CODE for UNABLE TO READ } } delay(responseTime); } /* * Name: sendData * Description: Function used to send string to tcp client using cipsend * Params: * Returns: void */ void sendData(String str){ String len=""; len+=str.length(); sendToWifi("AT+CIPSEND=0,"+len,responseTime,DEBUG); delay(100); sendToWifi(str,responseTime,DEBUG); delay(100); sendToWifi("AT+CIPCLOSE=5",responseTime,DEBUG); } /* * Name: find * Description: Function used to match two string * Params: * Returns: true if match else false */ boolean find(String string, String value){ if(string.indexOf(value)>=0) return true; return false; } /* * Name: readSerialMessage * Description: Function used to read data from Arduino Serial. * Params: * Returns: The response from the Arduino (if there is a reponse) */ String readSerialMessage(){ char value[100]; int index_count =0; while(Serial.available()>0){ value[index_count]=Serial.read(); index_count++; value[index_count] = '\0'; // Null terminate the string } String str(value); str.trim(); return str; } /* * Name: readWifiSerialMessage * Description: Function used to read data from ESP8266 Serial. * Params: * Returns: The response from the esp8266 (if there is a reponse) */ String readWifiSerialMessage(){ char value[100]; int index_count =0; while(wifiSerial.available()>0){ value[index_count]=wifiSerial.read(); index_count++; value[index_count] = '\0'; // Null terminate the string } String str(value); str.trim(); return str; } /* * Name: sendToWifi * Description: Function used to send data to ESP8266. * Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no) * Returns: The response from the esp8266 (if there is a reponse) */ String sendToWifi(String command, const int timeout, boolean debug){ String response = ""; wifiSerial.println(command); // send the read character to the esp8266 long int time = millis(); while( (time+timeout) > millis()) { while(wifiSerial.available()) { // The esp has data so display its output to the serial window char c = wifiSerial.read(); // read the next character. response+=c; } } if(debug) { Serial.println(response); } return response; } /* * Name: sendToWifi * Description: Function used to send data to ESP8266. * Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no) * Returns: The response from the esp8266 (if there is a reponse) */ String sendToUno(String command, const int timeout, boolean debug){ String response = ""; Serial.println(command); // send the read character to the esp8266 long int time = millis(); while( (time+timeout) > millis()) { while(Serial.available()) { // The esp has data so display its output to the serial window char c = Serial.read(); // read the next character. response+=c; } } if(debug) { Serial.println(response); } return response; }
Шаг 4. Настройка платы
Нам нужно проделать некоторые действия для настройки платы:
- Загрузите образец эскиза, прикрепленный выше, в ваш Arduino Uno.
- Скачайте Telnet Client для Android.
- Подключите к вашему ESP8266 Wi-Fi
- После подключения получите IP-адрес
- Откройте клиент Telnet на телефоне Android.
- Создайте соединение, щелкнув соединение, добавьте IP-адрес и порт 80.
После подключения отправьте запрос:
esp8266: <any AT Commands>
Или включите встроенный светодиод, используя команду:
LEDON
Или выключите встроенный светодиод, используя команду:
LEDOFF
Или просто скажите:
HELLO
Шаг 5. Объяснение кода
Весь наш запрос будет прочитан и проанализирован в функции loop()
if(wifiSerial.available()>0){ String message = readWifiSerialMessage(); if(find(message,"esp8266:")){ String result = sendToWifi(message.substring(8,message.length()),responseTime,DEBUG); if(find(result,"OK")) sendData("\n"+result); else sendData("\nErrRead"); //At command ERROR CODE for Failed Executing statement }else if(find(message,"HELLO")){ //receives HELLO from wifi sendData("\\nHI!"); //arduino says HI }else if(find(message,"LEDON")){ digitalWrite(13,HIGH); }else if(find(message,"LEDOFF")){ digitalWrite(13,LOW); } else{ sendData("\nErrRead"); //Command ERROR CODE for UNABLE TO READ } }
Если вы хотите общаться с Arduino UNO или попросить что-то сделать, просто добавьте свое условие:
if(find(message,"")){ //something do do here }
Я добавил некоторые функции для связи с ESP8266:
/* * Name: sendData * Description: Function used to send string to tcp client using cipsend * Params: * Returns: void */ void sendData(String str){ String len=""; len+=str.length(); sendToWifi("AT+CIPSEND=0,"+len,responseTime,DEBUG); delay(100); sendToWifi(str,responseTime,DEBUG); delay(100); sendToWifi("AT+CIPCLOSE=5",responseTime,DEBUG); } /* * Name: find * Description: Function used to match two string * Params: * Returns: true if match else false */ boolean find(String string, String value){ if(string.indexOf(value)>=0) return true; return false; } /* * Name: readSerialMessage * Description: Function used to read data from Arduino Serial. * Params: * Returns: The response from the Arduino (if there is a reponse) */ String readSerialMessage(){ char value[100]; int index_count =0; while(Serial.available()>0){ value[index_count]=Serial.read(); index_count++; value[index_count] = '\0'; // Null terminate the string } String str(value); str.trim(); return str; } /* * Name: readWifiSerialMessage * Description: Function used to read data from ESP8266 Serial. * Params: * Returns: The response from the esp8266 (if there is a reponse) */ String readWifiSerialMessage(){ char value[100]; int index_count =0; while(wifiSerial.available()>0){ value[index_count]=wifiSerial.read(); index_count++; value[index_count] = '\0'; // Null terminate the string } String str(value); str.trim(); return str; } /* * Name: sendToWifi * Description: Function used to send data to ESP8266. * Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no) * Returns: The response from the esp8266 (if there is a response) */ String sendToWifi(String command, const int timeout, boolean debug){ String response = ""; wifiSerial.println(command); // send the read character to the esp8266 long int time = millis(); while( (time+timeout) > millis()) { while(wifiSerial.available()) { // The esp has data so display its output to the serial window char c = wifiSerial.read(); // read the next character. response+=c; } } if(debug) { Serial.println(response); } return response; } /* * Name: sendToUNO * Description: Function used to send data to UNO. * Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no) * Returns: The response from the UNO (if there is a response) */ String sendToUno(String command, const int timeout, boolean debug){ String response = ""; Serial.println(command); // send the read character to the esp8266 long int time = millis(); while( (time+timeout) > millis()) { while(Serial.available()) { // The esp has data so display its output to the serial window char c = Serial.read(); // read the next character. response+=c; } } if(debug) { Serial.println(response); } return response; }
Теперь, когда вы знаете как общаться с ESP8266, вы можете сделать и изучить больше проектов. Увеличьте мощность этого модуля Wi-Fi и станьте полноценным изобретателем.