techiall / Blog

🍋 [My Blog] See discussions
https://github.com/techiall/Blog/discussions
MIT License
8 stars 1 forks source link

ESP8266 #4

Open techiall opened 6 years ago

techiall commented 6 years ago

------------ 2018.5.5 -----------------------

补充:该文章写得不够全面,只是一些简单的使用,我会抽时间继续写有关这个模块更加深入使用的文章。而这篇文章适合刚刚接触esp8266新人阅读。 https://github.com/techial1042/Blog/issues/7

ESP8266 模块基本使用

准备材料

连接示意图

http://image.geek-workshop.com/forum/201601/06/234002of3b55cavjfg23et.jpg

针脚分布图

img

USB_TLL 与 ESP8266 连接图

调试 ESP8266 模块

ESP8266 AT 指令

这里只列出项目过程中使用较为频繁的指令,更多指令参考 ESP8266 帮助文档。

// 模块重启
AT+RST 

/*
工作模式设置
AT+CWMODE=1  ->  Station 客户端模式
AT+CWMODE=2  ->  AP 接入点模式
AT+CWMODE=3  ->  Station + AP 两种模式共存
*/
AT+CWMODE=3

// 连接到路由器,路由器名称 + 密码,路由器的名称不要使用中文
AT+CWJAP="123","0123456789"

// 连接到 TCP 服务器,地址 + 端口号
AT+CIPSTART="TCP","192.168.1.100",8080

// 发送数据,带上发送的字节长度,不要使用不带参数的发送指令
AT+CIPSEND=4

最后

如果以上没问题,也就说明 ESP8266 模块没问题了,可以接下来使用 Arduino UNO 板子连模块了。

线的问题会导致一直无法调试成功。

注意电脑兼容性问题,windows 10 连接调试模块表示躺枪,更新下驱动或者找兼容 windows 10 版本的驱动即可解决。

通过 Arduino 调试 ESP8266

针脚连接

连接时,按照 WIFI 模块的工作模式来接线。

即 GND 接 Arduino 的 GND ,

VCC 和 CH_PD 接 Arduino 的 3.3V 输出。

UTXD 和 URXD分别接 Arduino 的 13和12引脚

(即程序中由 SoftwareSerial 定义的 RX 和 TX)。

作者:rollingstarky
链接:https://www.jianshu.com/p/64024d8c3773
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考这份资料和 ESP8266 针脚的示意图,稍微修改了 Arduino 上连接的软串口,其实软串口选哪个没啥影响的。就是烧录程序的时候配置一下就可以了。

面包板是绝配,可以让线看起来不会那么乱,不然后期检查是否连错很麻烦……

下面是我的自己的连接方式

ESP8266 <---------> Arduino

GND <---------> GND

VCC, CH_PD <---------> 3.3V // 可以用 3.0V 电压

UTXD, URXD <---------> 11 和 10 引脚 // RX, TX 配置10、11为软串口

// Arduino UNO 上的 RX, TX  接口理论上可行,但我并未进行测试,自行可进行测试。

烧录

打开 Arduino IDE,板子型号和端口选好,然后上传即可。代码如下

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX 配置10、11为软串口
void setup()
{
        Serial.begin(9600);
        while (!Serial);
        mySerial.begin(9600);
}

void loop()
{
        if (mySerial.available())
                Serial.write(mySerial.read());
        if (Serial.available())
                mySerial.write(Serial.read());
}

最后

如果以上都没问题,也就说明传输方面没问题了,剩下的可以和其他模块进行集成。如测电压模块,利用测电压的模块获得电压后,然后构造发送的数据报文,即可发送数据到服务器。

发送数据到服务器

ESP8266 AT 指令集成库

发送电压到服务器参考代码

#include <Wire.h>
#include "Adafruit_ADS1015.h"
#include <SoftwareSerial.h>
#include "ESP8266.h"

//Adafruit_ADS1015 ads;

Adafruit_ADS1015 ads1015;
Adafruit_ADS1115 ads1115(0x49);

SoftwareSerial mySerial(13, 12); // RX, TX 配置10、11为软串口
ESP8266 wifi(mySerial, 115200);

// 服务器地址,WiFi 名称,WiFi 密码
const char url[] = "192.168.1.200";
const uint32_t port = 80;
const char ssid[] = "123";
const char pwd[] = "0123456789";

const float multiplier = 3.0;

// init
void setup()
{

    ads1015.begin();
    ads1015.setGain(GAIN_ONE);
    pinMode(10, OUTPUT);
    //ads.begin();
    Serial.begin(115200);
    while (!Serial) {
        ;
    }
    wifi.restart();
    delay(1000);
}

double get_voltage()
{
    uint16_t adc0 = ads1015.readADC_SingleEnded(0);
    double res = (adc0 * 2) / 1000.0;
    Serial.print(">>>> voltage = ");
    Serial.print(res);
    Serial.print("\r\n");
    return res;
}

const char str_post_1[] = "GET /index.php?content=";
const char str_post_2[] = " HTTP/1.1\n"
        "Host: 192.168.1.200\n"
        "Connection: close\n"
        "Accept: text/html\n\n\n\n";

void loop(void)
{
    // 连接 WiFi
    if (wifi.joinAP(ssid, pwd)) {
        Serial.print(">>>> wifi connection success\n");
    } else {
        Serial.print(">>>> wifi connection error\n");
        wifi.restart();
        delay(1000);
        return;
    }

    while (true) {
        // 与服务器进行 TCP 连接
        if (wifi.createTCP(url, port)) {
            Serial.print(">>>> creat tcp success\n");
        } else {
            Serial.print(">>>> creat tcp error\n");
            continue;
        }

        float voltage = get_voltage();
        String get = str_post_1;
        get += voltage;
        get += str_post_2;

        if (wifi.send(get.c_str(), get.length())) {
            Serial.println(">>>> send success");
        } else  {
            Serial.println(">>>> send error");
            break;
        }
        Serial.println(">>> get_string ------------");
        Serial.println(get.c_str());
        Serial.println("------------ <<<\n");

        char result[100];
        wifi.recv(result, 100);
        Serial.println(">>>> result >>> ------------");
        Serial.println(result);
        delay(10000);
    }
    delay(2000);
    // 断开 WiFi 连接
    Serial.print(">>>> leave wifi ");
    Serial.println(wifi.leaveAP() ? "success" : "error");
}