前段时间做了一个激光雕刻,玩的不亦乐乎。对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 = ;
String val = "";
if (!DoATCommand("AT+CIPMODE=1", , , "OK", val)) {
result ++;
} if (!DoATCommand("AT+RST", , , "OK", val)) {
result++;
} if (!DoATCommand("AT+CIPMUX=0", , , "ready", val)) {
result++;
} if (!DoATCommand("AT+CWMODE=1", , , "OK", val)) {
result++;
}
return result;
}

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

2、连接WIFI:

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

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

3、POST请求:

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

    //连接服务器
if (!DoATCommand("AT+CIPSTART=\"TCP\",\""+ Host + "\"," + HostPort , , , "OK", val)) {
if (val.indexOf("FAIL") >= ) {
Serial.println("AT+CIPSTART:ERROR:" + val);
return false;
}
} //进入透传模式
if (!DoATCommand("AT+CIPSEND=" + (String)postRequest.length(), , , ">", val)) {
Serial.println("AT+CIPSEND:ERROR:" + val);
result = false;
}else{
//POST请求
wifi_SoftSerial.println(postRequest);
result = WaitSoftSerialResult(,"SEND OK",val);
} //退出透传模式
wifi_SoftSerial.print("+++");
delay();
//关闭TCP/UDP连接
wifi_SoftSerial.print("AT+CIPCLOSE");
delay();

就是连接服务器,成功之后让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[]);
//设置发送数据
for (int i = ; i<count; i++)
{
data += "{\"Name\":\"" + infos[i].Name + "\",\"Value\":\"" + infos[i].Value + "\"},";
}
data = data.substring(, data.length() - );
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模块,主要说说接线吧,好撸半小时官方文档…各种教程各种图片各种不匹配我也很无奈…测试时识别精度确实不高,容量确实不大,但能用代码解决的就都不叫事儿。

智能家居入门DIY——【一、ESP8266之软串口HTTP请求】的更多相关文章

  1. 智能家居入门DIY——【四、组合】

    前面几篇介绍了一些传感器和代码,这篇介绍一下把它们组合起来.之所以单独列出这部分,原因在于组合更多功能的时候发现使用软串口库驱动ESP8266时由于内存过小导致发送失败甚至整个系统无法工作的情况.所以 ...

  2. 智能家居入门DIY——【二、LD3320之语音识别】

    前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...

  3. 智能家居入门DIY——【六、使用OneNet后台处理数据】

    OneNet使用起来要比lewei50复杂一些,它没有前台需要自己开发.命令下发也和之前介绍的lewei50有一些区别,这里着重介绍一下使用MQTT协议来进行通讯. 一.准备 1.Esp8266开发板 ...

  4. 智能家居入门DIY——【五、执行命令】

    前面几篇介绍了ESP8266使用AT命令来连接WIFI实现一系列功能.这一篇介绍一下使用Wemos D1 Wifi来进行开发,当然也可以用常见的8针ESP8266来完成(只是需要按网上的方法将Ardu ...

  5. 智能家居入门DIY——【七、添加一个LCD12864吧】

    今天加了一个LCD12864,IC看说明上是ST7567,结果一顿U8g2,发现两个问题: 1.买的时候不知道是卖家写的我理解错了还是怎么了,反正是不出汉字的. 2.U8g2太大了…………占了uno的 ...

  6. 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】

    这个传感器接线算比较简单的,程序也不麻烦.不过这东西是颗粒物传感器吧,不是神马PM2.5(总悬浮颗粒物),不是神马PM10(可吸入颗粒物).插个螺丝刀进去度数也是变的,不是说的很清楚原理是反光嘛……… ...

  7. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...

  8. Diy智能家居-1.基于esp8266的语音控制系统(开篇)

    目录Diy智能家居-1.基于esp8266的语音控制系统(开篇) https://blog.csdn.net/arno1988/article/details/82628589 Diy智能家居-2.基 ...

  9. 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)

    入门智能家居,从 IFTTT 到 HomeKit 自动化(二)   目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...

随机推荐

  1. Git提交撤销

    场景:本地修改代码后,执行commit提交,但此时想撤销该提交. 执行命令: git reflog   查看所有commit历史 git reset --hard commitid     将当前远程 ...

  2. R语言数据去重

    R语言常用的去重命令有unique duplicated unique主要是返回一个把重复元素或行给删除的向量.数据框或数组 > x <- c(3:5, 11:8, 8 + 0:5)> ...

  3. 谷歌开发者工具(F12)的使用小坑

    python模拟登陆知乎,用开发者工具跟踪浏览器与服务器的交互,需要知道用户名,密码的字段名,可在文件email中看到:需要注意的是一定要 勾选 preserve log ,否则登陆之前的交互不会显示 ...

  4. java学习之浅谈多线程1

    创建任务和线程 任务就是对象,为了创建任务,必须首先为任务定义一个类.任务类必须实现Runnable接口.Runnable接口非常简单,它只有一个run方法.需要实现这个方法来告诉系统线程将如何运行. ...

  5. /msgsrvmgr.cpp:4:26: fatal error: kdl/frames.hpp: No such file or directory #include <kdl/frames.hpp>

    /home/xxx/ros_workspace/src/bp_protocol_bridge/protospot/src/msgsrvmgr.cpp::: fatal error: kdl/frame ...

  6. Android之仿微信发朋友圈图片选择功能

    最近项目中需要用到发表评论选择多张图片和拍照的功能,于是就仿照微信发表朋友圈的选择图片和拍照做了一个这样的案例,经过查找资料终于完成了此功能, 最近有时间就写出来和大家分享一下,希望对大家有所帮助. ...

  7. Leetcode 23.Merge Two Sorted Lists Merge K Sorted Lists

    Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list shoul ...

  8. vscode的keybindings.json 和 AHK 脚本映射Win键

    vscodehotkey.ahk https://github.com/m2nlight/AHKVSCodeLikeMac ; Shortcuts like mac ; Written by Bob ...

  9. 一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数。

    题目一:一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数. 分析:对于第(i,j)个格子,只有向右走一步到达或者向左走一步到达,dp(i,j) = d(i ...

  10. linux下运行jar

    方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二: java -jar XXX.jar ...