Placeholder

ENTHERNET ESP8266 (V1)

 

80.000

Giá bán 

80.000

Quantity:
Save
Compare
Category: .

Product Description

ESP8266 là một chip tích hợp cao – System on Chip (SoC), có khả năng xử lý và lưu trữ tốt, cung cấp khả năng vượt trội để trang bị thêm tính năng wifi cho các hệ thống khác hoặc đóng vai trò như một giải pháp độc lập. ESP8266 cung cấp khả năng kết nối mạng wifi đầy đủ và khép kín, bạn có thể sử dụng nó để tạo một web server đơn giản hoặc sử dụng như một access point.

Giới thiệu Module Wifi ESP8266 V1

ESP8266 là một chip tích hợp cao – System on Chip (SoC), có khả năng xử lý và lưu trữ tốt, cung cấp khả năng vượt trội để trang bị thêm tính năng wifi cho các hệ thống khác hoặc đóng vai trò như một giải pháp độc lập.

Module wifi ESP8266 v1 cung cấp khả năng kết nối mạng wifi đầy đủ và khép kín, bạn có thể sử dụng nó để tạo một web server đơn giản hoặc sử dụng như một access point.

Đối tượng hướng đến

Bạn đọc bài viết này để tiếp cận trọn vẹn bắt buộc phải có các khối kiến thức vững về:

  • Lập trình C/C++.
  • Kiến trúc phần mềm.
  • Lập trình Arduino.
  • Lập trình web front-end.
  • Mạng máy tính, giao thức HTTP.
  • Thao tác với tập lệnh AT.

Thông số kỹ thuật Module Wifi ESP8266 V1

  • Wifi 802.11 b/g/n
  • Wifi 2.4 GHz, hỗ trợ WPA/WPA2
  • Chuẩn điện áp hoạt động 3.3V
  • Chuẩn giao tiếp nối tiếp UART với tốc độ Baud lên đến 115200
  • Có 3 chế độ hoạt động: Client, Access Point, Both Client and Access Point
  • Hỗ trợ các chuẩn bảo mật như: OPEN, WEP, WPA_PSK, WPA2_PSK, WPA_WPA2_PSK
  • Hỗ trợ cả 2 giao tiếp TCP và UDP
  • Tích hợp công suất thấp 32-bit CPU có thể được sử dụng như là bộ vi xử lý ứng dụng
  • SDIO 1.1 / 2.0, SPI, UART
  • Làm việc như các máy chủ có thể kết nối với 5 máy con

Sơ đồ chân và các chức năng Module Wifi ESP8266 V1

lập trình esp8266 bằng arduino IDE

  • URXD(RX) — dùng để nhận tín hiệu trong giao tiếp UART với vi điều khiển
  • VCC — đầu vào 3.3V
  • GPIO 0 — kéo xuống thấp cho chế độ upload bootloader
  • RST — chân reset cứng của module, kéo xuống mass để reset
  • GPIO 2 — thường được dùng như một cổng TX trong giao tiếp UART để debug lỗi
  • CH_PD — kích hoạt chip, sử dụng cho Flash Boot và updating lại module, nối với mức cao
  • GND — nối với mass
  • UTXD (TX) — dùng để truyền tín hiệu trong giao tiếp UART với vi điều khiển

Giao tiếp ARDUINO với ESP8266

Sơ đồ lắp đặt mạch Arduino giao tiếp với ESP8266 điều khiển bật tắt LED thông qua wifi

Ở đây tôi sử dụng trực tiếp LED nối với chân D13 được tích hợp sẵn trên board Arduino.

lập trình esp8266 bằng arduino IDE

Những điểm cần lưu ý khi nạp code cho Arduino Uno để giao tiếp với ESP8266

Arduino Uno nạp code bằng bootloader sử dụng USB UART. Arduino Uno gửi lệnh điều khiển (tập lệnh AT) cho ESP8266 cũng bằng giao tiếp UART. Tuy nhiên board Arduino chỉ có 1 chân RX và 1 chân TX cho phép thực hiện giao tiếp UART. Điều đó dẫn đến 2 sự lựa chọn:

  1. Sử dụng chân RX và TX có sẵn trên Arduino để nạp code sau khi nạp code xong thì mới kết nối 2 chân đó với ESP8266. Với phương pháp này bạn phải thêm một khoảng thời gian delay ở hàm setup() để đảm bảo là sau khi kết nối ESP8266 với Arduino, thì ESP8266 vẫn nhận được đầy đủ các tập lệnh AT từ Arduino. Tuy nhiên, bạn không thể debug qua cổng Serial do cổng này đang đóng vai trò kết nối với ESP8266.
  2. Sử dụng SoftwareSerial để giả lập thêm 1 cổng Serial nữa để gửi tập lệnh AT cho ESP8266. Thư viện SoftwareSerial đã được trang bị sẵn trong Arduino IDE nên bạn không cần phải tải thêm. Với cách này thì bạn có thể debug thông qua Serial tuy nhiên code sẽ phức tạp hơn.

Ở ví dụ dưới đây tôi chọn phương án thứ nhất và chọn thời gian delay là 5s để kết nối chân TX và RX của Arduino với chân RX và TX của ESP8266 ngay sau khi nạp code thành công.

……………………………………………………………………………………………………………………………………..

#define LED_PIN 13

#define CMD_SEND_BEGIN  “AT+CIPSEND=0”
#define CMD_SEND_END    “AT+CIPCLOSE=0”

#define TDHshop_PROTOCOL_HTTP     80
#define TDHshop_PROTOCOL_HTTPS    443
#define TDHshop_PROTOCOL_FTP      21
#define TDHshop_PROTOCOL_CURRENT  TDHshop_PROTOCOL_HTTP

#define TDHshop_CHAR_CR     0x0D
#define TDHshop_CHAR_LF     0x0A

#define TDHshop_STRING_EMPTY  “”

#define TDHshop_DELAY_SEED  1000
#define TDHshop_DELAY_1X    (1*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_2X    (2*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_3X    (3*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_4X    (4*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_0X    (5*TDHshop_DELAY_SEED)
bool hasRequest = false;
void setup()
{
delay(TDHshop_DELAY_0X);
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
initESP8266();
}
void loop()
{
while(Serial.available())
{
bufferingRequest(Serial.read());
}
if(hasRequest == true)
{
String htmlResponse = “<!doctype html>”
“<html>”
“<head>”
“<title>TDHshop.com.vn</title>”
“</head>”
“<body>”
“<h1>TDHshop.com.vn ESP8266 DEMO</h1>”
“<form action=” method=’GET’>”
“<input type=’radio’ name=’LED’ name=’TDHshop’ value=’TDHshop_ON’ /> LED ON<br/>”
“<input type=’radio’ name=’LED’ name=’D2K’ value=’TDHshop_OFF’ /> LED OFF<br/>”
“<input type=’submit’ value=’Submit’ />”
“</form>”
“</body>”
“</html>”;

String beginSendCmd = String(CMD_SEND_BEGIN) + “,” + htmlResponse.length();
deliverMessage(beginSendCmd, TDHshop_DELAY_1X);
deliverMessage(htmlResponse, TDHshop_DELAY_1X);
deliverMessage(CMD_SEND_END, TDHshop_DELAY_1X);
hasRequest = false;
}
}
void initESP8266()
{
deliverMessage(“AT+RST”, TDHshop_DELAY_2X);
deliverMessage(“AT+CWMODE=2”, TDHshop_DELAY_3X);
deliverMessage(“AT+CWSAP=\”TDHshop.com.vn\”,\”123456789\”,1,4″, TDHshop_DELAY_3X);
deliverMessage(“AT+CIFSR”, TDHshop_DELAY_1X);
deliverMessage(“AT+CIPMUX=1”, TDHshop_DELAY_1X); // để cho phép các kết nối TCP
deliverMessage(String(“AT+CIPSERVER=1,”) + TDHshop_PROTOCOL_CURRENT, TDHshop_DELAY_1X);  //để tạo 1 TCP server
}
void bufferingRequest(char c)
{
static String bufferData = TDHshop_STRING_EMPTY;
switch (c)
{
case TDHshop_CHAR_CR:
break;
case TDHshop_CHAR_LF:
{
TDHshopProcedure(bufferData);
bufferData = TDHshop_STRING_EMPTY;
}
break;
default:
bufferData += c;
}
}
void TDHshopProcedure(const String& command)
{
hasRequest = command.startsWith(“+IPD,”);

if(command.indexOf(“TDHshop_OFF”) != -1)
{
digitalWrite(LED_PIN, LOW);
}
else if(command.indexOf(“TDHshop_ON”) != -1)
{
digitalWrite(LED_PIN, HIGH);
}
}
void deliverMessage(const String& msg, int dt)
{
Serial.println(msg);
delay(dt);

}

……………………………………………………………………………………………………………..

 

 

Giao tiếp PIC với ESP8266

Trong ứng dụng lấy dữ liệu thời tiết từ internet này mình sử dụng vi điều khiển Pic18f4550 của Microchip, module esp8266 được sử dụng là module esp-01

 

Module wifi esp8266

Module wifi esp8266

Sơ đồ chân của module ESP8266:

ESP8266 wifi module-ESP01

ESP8266 wifi module-ESP01

esp8266 pinout

esp8266 pinout

 

ESP8266-Rboard-1

ESP8266-Rboard-1

UTXD (TX) – chân truyền tín hiệu của module  nối với chân RX của vi điều khiển

URXD(RX) – chân truyền tín hiệu của module  nối với chân RX của vi điều khiển

RST – chân reset cứng của module. Reset xảy ra khi tín hiệu xuống mức thấp

GPIO0, GPIO2, CH_PD nối với mức cao.

VCC: Nối với 3.3V

GND: Nối với 0V

Để giao tiếp module ta sử dụng truyền các lệnh AT qua RS232 ở  tốc độ baud 115200.

//COMMAND 
#define AT_ECHO_ON                  "ATE1"  
#define AT_ECHO_OFF                 "ATE0"  
#define AT_RESET                    "AT+RST"  
#define AT_CFW                      "AT+GMR"  
#define AT_WIFI_MODE                "AT+CWMODE"
#define AT_JOIN_AP                  "AT+CWJAP" 
#define AT_GET_IP                   "AT+CIFSR" 
#define AT_LIST_AP                  "AT+CWLAP"
#define AT_QUIT_AP                  "AT+CWQAP"  
#define AT_SET_AP_PARAMS            "AT+CWSAP" 
#define AT_CHECK_JOIN_AP            "AT+CWQAP" 
#define AT_GET_CON_STATUS           "AT+CIPSTATUS"
#define AT_START_CON                "AT+CIPSTART" 
#define AT_CIP_MODE                 "AT+CIPMODE"  
#define AT_SEND                     "AT+CIPSEND"  
#define AT_CLOSE_CON                "AT+CIPCLOSE"           
#define AT_SET_MUL_CON              "AT+CIPMUX=1"
#define AT_SET_SERVER               "AT+CIPSERVER"  
#define AT_SET_SERVER_TIMEOUT       "AT+CIPSTO"  
#define AT_RECEIVED_DATA            "+IPD"

Xem thêm tập lệnh AT của ESP8266: ESP8266 AT command

Các lệnh hay được sử dụng:

STEPS AND NOTE

  • AT+RST restart the module, received some strange data, and “ready”
  • AT+CWMODe=3 change the working mode to 3, AP+STA, only use the most versatile mode 3 (AT+RST may be necessary when this is done.)

Join Router

  • AT+CWLAP search available wifi spot
  • AT+CWJAP=“you ssid”, “password” join my mercury router spot (ops, the wifi password is here :) )
  • AT+CWJAP=? check if connected successfully, or use AT+CWJAP?

TCP Client

  • AT+CIPMUX=1 turn on multiple connection
  • AT+CIPSTART=4,”TCP”,”192,168.1.104″,9999 connect to remote TCP server 192.168.1.104 (the PC)
  • AT+CIPMODE=1 optionally enter into data transmission mode
  • AT+CIPSEND=4,5 send data via channel 4, 5 bytes length (see socket test result below, only “elect” received), link will be “unlink” when no data go through

TCP Server

  • AT+CIPSERVER=1,9999 setup TCP server, on port 9999, 1 means enable
  • AT+CIFSR check module IP address

Trong ví dụ này mình cài đặt cho module esp8266 hoạt động ở chế độ client kết nối tới openweathermap.org thực hiện HTTP GET để lấy chuỗi json trả về, sau đó sẽ thực hiện việc phân tích chuổi json này để  lấy các thông tin về nhiệt độ, độ ẩm, áp suất khí quyển.

 

Chuỗi json:

{
  "coord": {
    "lon": 105.84,
    "lat": 21.02
  },
  "sys": {
    "message": 0.0293,
    "country": "VN",
    "sunrise": 1414623502,
    "sunset": 1414664532
  },
  "weather": [
    {
      "id": 803,
      "main": "Clouds",
      "description": "broken clouds",
      "icon": "04d"
    }
  ],
  "base": "cmc stations",
  "main": {
    "temp": 300.516,
    "temp_min": 300.516,
    "temp_max": 300.516,
    "pressure": 1013.51,
    "sea_level": 1023.88,
    "grnd_level": 1013.51,
    "humidity": 88
  },
  "wind": {
    "speed": 1.87,
    "deg": 137.5
  },
  "clouds": {
    "all": 64
  },
  "dt": 1414656101,
  "id": 1581130,
  "name": "nhattung",
  "cod": 200
}

Ở đây ta sẽ lấy các thông tin trong phần tử “main”:

“temp”: 300.516,//Giá trị nhiệt độ (độ K)
“temp_min”: 300.516,
“temp_max”: 300.516,
“pressure”: 1013.51,//Giá trị áp suất
“sea_level”: 1023.88,
“grnd_level”: 1013.51,
“humidity”: 88//Giá trị độ ẩm

#include <18F45K20.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=12000000,crystal=12000000)

#use rs232(UART1,baud=115200,parity=N,bits=8,stream=WIFI_ESP,errors)//Khai bao su dung uart cung  

#define ledv  PIN_C2                                 
#define ledr  PIN_C1
#define ledon output_low                                      
#define ledoff output_high                     
#define led_on output_low                                                      
#define led_off output_high 

#define LCD_ENABLE_PIN PIN_B3                   
#define LCD_RS_PIN PIN_B1               
#define LCD_RW_PIN PIN_B2               
#define LCD_DATA4 PIN_B4                                           
#define LCD_DATA5 PIN_B5                      
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#include <lcd.c>      

const int8 NEW_VERSION=1;
const int8 OLD_VERSION=2;
int8 VERSION_CODE=NEW_VERSION;
#include"esp/wifi.c"   
#include"sonbui/mystr.c" 

                                                                                        
char *SSID_JOIN="linhkiennhattung";
char *PASS_JOIN="linhkiennhattung.com";  
char *DATA_SEND="GET /data/2.5/weather?id=1581130&APPID=903b74aeb9f6e1fbae449f0067dbbd1a HTTP/1.0rnHost: api.openweathermap.orgrnrn" ;
char *WEATHER_IP= "139.59.9.23"; //api.openweathermap.org    
void get_internet()
{    
   char *write = ">";  
   int1 OK = False;
   printf(LCD_PUTC, "fGData Hanoi,VNnopenweathermap.org");  
   delay_ms(1000);
   if( client_Start(0,TYPE_TCP,WEATHER_IP,80))   //kET NOI TOI SERVER DE LAY DU LIEU  
   {  
      printf(LCD_PUTC, "fGet data"); 
      int16 length=strlen(DATA_SEND);                                                           
      DO
      {
         clear_mem();
         fprintf(WIFI_ESP, AT_SEND);                     
         fprintf(WIFI_ESP, "=%u", 0);       
         fprintf(WIFI_ESP, ",%lu",length);  
         fprintf(WIFI_ESP, CRLF); 
         for (int mem_loop = 0; mem_loop < 150; mem_loop++) { 

            wifi_buff[n] = timed_getc();
            n++;
            if (n > 150) n = 0;
            if (timeout_error) break;
         }

         char *pch = strstr(wifi_buff, write);

         IF(pch) {
            OK = TRUE;
            break;                                
         }
         delay_ms(100);
      }
      WHILE(!OK);  
      //Send http get
      clear_mem();       
      printf(LCD_PUTC, "fSend Get"); 
      fprintf(WIFI_ESP, "%s",DATA_SEND);
      Long LONG timeout;   
      timeout = 0;
      WHILE(!kbhit(WIFI_ESP) && (++timeout < 2000000))  //20 second 
      {
         delay_us(10); 
                                      
      }                                                         
      WHILE(!(fgetc(WIFI_ESP)=='{')) ;        
      printf(LCD_PUTC, "f{"); 
      
      wifi_buff[0]='{';n=1;                               
      do {         
         wifi_buff[n] = timed_getc();           
         n++;                                           
         if (n > 512) n = 0;   
         
      }while(!timeout_error) ;
      printf(LCD_PUTC, "fPrint Data");
      //printf(usb_cdc_putc, "rnWF:%s"wifi_buff);   
      char *jstart=""main":{";
      char *jstop=","wind"";
      char *p1 = strstr(wifi_buff,jstart);
      
      if(p1)                              
      {    
         // printf(usb_cdc_putc, "rnfp1:%s"p1);  
         char *p2 = strstr(p1,jstop); 
         if(p2)  
         {  
            // printf(usb_cdc_putc, "rnfp2:%s"p2);
            size_t len = p2-p1;   
            char *jmain = (char*)malloc(sizeof(char)*(len+1));  
            strncpy(jmain, p1, len);                                  
            jmain[len] = '

Reviews

There are no reviews yet.

Be the first to review “ENTHERNET ESP8266 (V1)”

Your email address will not be published. Required fields are marked *