智能家居入门DIY——【一、ESP8266之软串口HTTP请求】

        前段时间做了一个激光雕刻,玩的不亦乐乎。对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管、一体化红外接收头、DHT11温湿度传感器、ESP8266等,以及某宝来的LD3320、GP2Y1014AUOF准备搞一波屌丝智能家居。看了各种教程,感觉自己距离大神只差那么一丢丢了,于是在各种自我感觉良好中,掉下各种坑去……反正我是用一个模块下一个坑,弄得现在有点不太敢测试颗粒物传感器了……这个主要还是连接硬件和写Arduino程序了,与上一个主要是写上位机代码不同——没有那么多准确而深入的教程看的。所以,必要时撸一下官方文档还是很有必要的。今天先说ESP软串口通讯这个坑如何爬上来:

1、模块:某宝买Arduino套件时送的某飞莱,当我敲SoftwareSerial wifi_SoftSerial后面的括号时隐约就看见了坑影憧憧……

2、学习:虽然谷哥死了十几年了,但是我还是忍不住找不到有用的东西的时候吐槽。卖家给的教程先撸了一遍,发现确实RX,TX需要交换一下——无论是在代码还是接线上都可以;然后有那么一丢丢连接wifi的代码……之后各种度娘各种搜,然而各种参差不齐、说法不一的卵用不大的基础教程并没有什么真正的帮助,看了几篇国外网站的问题帖子倒是解决了几个问题。也许是我搜索时没有目视正前方,抬头挺胸,双肩同高,两脚与肩同宽,又或者椅子有点不太水平?总之,发过牢骚之后还得自己写一点不成熟的逻辑,因为没找到可以用的软串口HTTP请求的库,又没有给软转促销的决心……

        所以,让我们找一个AT命令详解先打开。撸一遍之后,发现大体分这么几个部分:

1、初始化这个开发板:并没有什么其他接口,RX,TX,GND,VCC还是5V,反正我接了5V这么久没烧。不用刷所以也不用下载什么开发板,修改什么开发环境,还是UNO就可以。命令主要就是这么几条:

int initESP8266() {
    int result = 0;
    String val = "";
    if (!DoATCommand("AT+CIPMODE=1", 1000, 10, "OK", val)) {
        result ++;
    }

    if (!DoATCommand("AT+RST", 1000, 100, "OK", val)) {
        result++;
    }

    if (!DoATCommand("AT+CIPMUX=0", 1000, 10, "ready", val)) {
        result++;
    }

    if (!DoATCommand("AT+CWMODE=1", 1000, 10, "OK", val)) {
        result++;
    }
    return result;
}

就是客户端、单链接、透传模式什么的,参考AT文档吧,这个有顺序,注意一下。然后,这个函数返回了错误个数,但其实从来没测试过,这样过去就可以了,因为有的已经设置过或者各种我不懂的原因不成功也不影响后面。

2、连接WIFI:

bool initWifi(String ssid, String pwd) {
    String val = "";
    //查询是否连接到了指定的wifi
    if (DoATCommand("AT+CWJAP?", 1000, 10, ssid, val)) {
        return true;
    }
    //连接到WIFI
    if (!DoATCommand("AT+CWJAP=\"" + ssid + "\",\"" + pwd + "\"", 20000, 100, "OK", val)) {
        Serial.println("AT+CWJAP:ERROR:" + val);
        return false;
    }
    return true;
}

这个函数也没有太多内容,只是先判定是否已经连接了,否则就重连。

3、POST请求:

        因为自己的主机早就到期,连个域名都不让申请,所以申请了lewei50.com的服务,用起来比较简单,免费用户也没有多少用到收费功能的地方,所以成本比较低咯:

    //连接服务器
    if (!DoATCommand("AT+CIPSTART=\"TCP\",\""+ Host + "\"," + HostPort , 10000, 500, "OK", val)) {
        if (val.indexOf("FAIL") >= 0) {
            Serial.println("AT+CIPSTART:ERROR:" + val);
            return false;
        }
    }

    //进入透传模式
    if (!DoATCommand("AT+CIPSEND=" + (String)postRequest.length(), 10000, 500, ">", val)) {
        Serial.println("AT+CIPSEND:ERROR:" + val);
        result = false;
    }else{
        //POST请求
        wifi_SoftSerial.println(postRequest);
        result = WaitSoftSerialResult(20000,"SEND OK",val);
    }
    
    //退出透传模式
    wifi_SoftSerial.print("+++");
    delay(10);
    //关闭TCP/UDP连接
    wifi_SoftSerial.print("AT+CIPCLOSE");
    delay(10);

就是连接服务器,成功之后让ESP8266进入收什么发什么模式……好吧,透传模式,然后写构造的POST请求内容,等待发送完成(当然,也可以等待对方返回正确返回值),之后退出透传,关闭TCP连接。

        关于POST请求构建这块,各种说法各种都有,贵圈真乱!

//必要信息
struct sensor{
 String Name;
 String Value;
};
String Crlf = "\r\n";
sensor infos[] = { {"T1","22.33"},{"H1","44.55"} }; //传感器名,数值 String Host = "www.lewei50.com";       //主机地址
String HostPort = "80";
String HostApiPath = "/api/V1/gateway/Updatesensors/01"; //API地址
String UserKey = "*****************************";  //用户识别码

//开始构建 String data
= "["; int count = sizeof(infos) / sizeof(infos[0]); //设置发送数据 for (int i = 0; i<count; i++) { data += "{\"Name\":\"" + infos[i].Name + "\",\"Value\":\"" + infos[i].Value + "\"},"; } data = data.substring(0, data.length() - 1); data += "]"; String postRequest = (String)("POST") + " " + HostApiPath + " " + "HTTP/1.1" + Crlf + "userkey:" + UserKey + Crlf + "Accept:*/*" + Crlf + "Host: " + Host + Crlf + "Content-Length: " + data.length() + Crlf + "Connection: close" + Crlf + Crlf + data;

不多说,测试代码就可以了。下一篇说说这个LD3320模块,主要说说接线吧,好撸半小时官方文档…各种教程各种图片各种不匹配我也很无奈…测试时识别精度确实不高,容量确实不大,但能用代码解决的就都不叫事儿。

posted @ 2018-06-19 22:36 zcsor~流浪dè风 Views(...) Comments(...) Edit 收藏