如何用arduino uno esp8266来测试ESP8266 WIFI模块

推荐这篇日记的豆列
&&&&&&&&&&&&大牛带你评测ESP8266EX WiFI模块–LinkNode D1(附程序讲解) - 通用控制 - Tensilica技术社区
后使用快捷导航没有帐号?
查看: 594|回复: 4
大牛带你评测ESP8266EX WiFI模块–LinkNode D1(附程序讲解)
不久前,爱板网收到来自LINKSPRITE的BLE蓝牙开发板并进行了评测,这是一块面向物联网开发的评估板,使用的是蓝牙互联技术。1999 年,Kevin Ashton 首先提出物联网(IOT)这个名词。当时 Ashton 为 P&G,开始引入 RFID 管理 P&G 的供应链。经过十几年的发展,物联网技术已经比较成熟,基于无线通信的产品和方案全面绽放,正逐步进入大众的视线。在IOT的领域,BT、WIFI和ZIGBEE三种技术最为广泛和普及。这三种技术,各有所长,分别适用不同的领域和应用场景,成为物联网无线通信最流行的通信协议。
LinkNode D1是LINKSPRITE推出的另一款物联网开发评估板,使用的是WIFI技术,板载ESP8266EX模块,提供Arduino兼容接口,使用开源社区提供的源代码,可以在Arduino IDE中轻松访问ESP8266EX。
打开快递包装盒,看到的是一个小巧的包装盒。包装盒设计简洁,正面是LINKSPRITE的LOGO及文字标识。不干胶贴纸上列出了产品型号,编号等信息。当然最重要的是有产品配套的WIKI页面,可以迅速入门,立即体验产品的特色及功能。包装整体感觉就是:醒目、简洁、实用。
图1:包装盒,醒目、简洁、实用打开包装盒,LinkNode D1映入眼帘。整个PCB基板使用白色油墨覆盖,丝印清晰,整体感觉比较舒服。LinkNode D1整个开发板上元器件数目较少,显得非常宽松,这主要得益于ESP8266模块的高度集成特性。Arduino兼容接口分布在开发板两侧,除此之外,还有一个DC电源接口,可外接9-24V外部DC电源。MICRO USB接口也可以供电,同时还兼有UART通信功能。
图2:开发板正面,上有USB及DC接口,Arduino兼容接口肯定是少了不了图3:ESP8266模块,高集成度多功能模块资源
LinkNode D1开发板上主要包含的资源如下
ESP-8266EX模块11 个数字接口1 个模拟接口1 个MICRO USB接口,可用于供电或通信9-24V 直流外部供电接口
ESP8266EX是乐鑫推出的一款高集成度WIFI芯片,ESP8266EX 高度集成了天线开关,射频 balun,功率放大器,低噪放大器,过滤器,电源管理模块,仅需很少的外围电路。包括前端模块在内的整个解决方案可将所占 PCB 空间降到最低。这也是LinkNode D1上元器件数目这么少的主要原因。
ESP8266EX 内置 Tensilica L106,32 位微型控制器(MCU),具有超低功耗和 16 位 RSIC。CPU 时钟速度高达 80 MHz,最高可达 160 MHz。支持实时操作系统(RTOS)。目前 Wi-Fi 协议栈只用了 20% 左右,其它的都可用于用户编程和开发。ESP8266EX 专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了最低功耗。ESP8266EX 有三种省电模式:激活模式、睡眠模式和深度睡眠模式。工作温度范围达到 -40°C 到 +125°C。
ESP8266目前广泛用户智能灯具、智能开关等应用场景。
LinkNode D1提供Arduino兼容接口,同时,社区爱好者也将ESP8266的SDK集成到了Arduino IDE中,可以在Arduino IDE中开发ESP8266程序了,听到这个消息有木有激动3秒钟?呃,没有激动?你一定是绝顶高手,请路过!
先安装Arduino IDE,从附录给出的列表去下载并安装,一并安装好ESP8266EX的BSP支持模块,如此这般,不赘述。
接下来通个信,初步熟悉下开发板,如果你不熟悉Arduino IDE,也借此机会好好熟悉一下。
ESP8266自带一个UART通信设备,通过LinkNode D1上的CH340G引出至USB接口,这样板载的MICRO USB接口就同时具有供电及UART通信的功能了。在代码里只需要简单的配置好通信参数,就能实现与PC通信了。
图5:ESP8266外设引脚测试用代码如下
void setup() {
&&// put your setup code here, to run once:
&&pinMode(BUILTIN_LED, OUTPUT);
&&Serial.begin(115200);
void loop() {
&&// put your main code here, to run repeatedly/
&&digitalWrite(BUILTIN_LED, HIGH);
&&delay(500);
&&digitalWrite(BUILTIN_LED, LOW);
&&delay(500);
&&Serial.println(&Hello, LINK D1&);
将上述代码编译后下载到开发板。LinkNode D1上的指示灯以1HZ的频率开始闪烁,同时终端窗口会显示来自开发板的消息。
图4:UART通信测试WIFI
ESP8266EX本质是一个WIFI模块,使用并体验WIFI功能才是重点。
ESP8266EX模块集成了MCU模块在内部,加上一系列的外设模块,其功能框图如下
图5:ESP8266EX功能框图ESP8266EX主要参数
802.11 b/g/nIntegrated low power 32-bit MCUIntegrated 10-bit ADCIntegrated TCP/IP protocol stackIntegrated TR switch, balun, LNA, power amplifier and matching networkIntegrated PLL, regulators, and power management unitsSupports antenna diversityWiFi 2.4 GHz, support WPA/WPA2Support STA/AP/STA+AP operation modesSupport Smart Link Function for both Android and iOS devicesSDIO 2.0, (H) SPI, UART, I2C, I2S, IR Remote Control, PWM, GPIOSTBC, 1x1 MIMO, 2x1 MIMOMPDU & A-MSDU aggregation & 0.4sguard intervalDeep sleep power &10uA, Power down leakage current & 5uAWake up and transmit packets in & 2msStandby power consumption of & 1.0mW (DTIM3)+20 dBm output power in 802.11b modeOperating temperature range -40C ~ 125CFCC, CE, TELEC, WiFi Alliance, and SRRC certified
ESP8266EX模块既可以配置为工作站模式,也可以配置为AP模式,还可以配置为二者的组合。ESP8266EX工作在2.4G频段,支持WPA/WPA2加密。
下述代码将LinkNode D1配置为AP工作模式,并且可能通过WEB配置来配置SSID及PASSWORD等。
#include &ESP8266WiFi.h&& && && & ///esp8266/Arduino
//needed for library
#include &DNSServer.h&
#include &ESP8266WebServer.h&
#include &WiFiManager.h&& && && &///tzapu/WiFiManager
void setup() {
& & // put your setup code here, to run once:
& & Serial.begin(115200);
& & //WiFiManager
& & //Local intialization. Once its business is done, there is no need to keep it around
& & WiFiManager wifiM
& & //reset saved settings
& & //wifiManager.resetSettings();
& & //set custom ip for portal
& & wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
& & //fetches ssid and pass from eeprom and tries to connect
& & //if it does not connect it starts an access point with the specified name
& & //here&&&AutoConnectAP&
& & //and goes into a blocking loop awaiting configuration
& & wifiManager.autoConnect(&LinkNodeAP&);
& & //or use this for auto generated name ESP + ChipID
& & //wifiManager.autoConnect();
& & //if you get here you have connected to the WiFi
& & Serial.println(&connected...&&&);
void loop() {
& & // put your main code here, to run repeatedly:
编译并下载到开发板后,可以通过手机连接并登录到AP上查看相关信息。
图6:连接到LinkNode AP图7:WEB配置界面图8:关于AP的基本信息实际使用测试,LinkNode D1能够实现AP的基本功能,但功能比较简陋,离真正的AP还差很远,毕竟像OPENWRT之类的设备都有LINUX的支撑,功能丰富程度自是不可同日而语。
好在LinkNode D1的定位也并非是AP,他只不过是收集、传递信息而已。
LINKSPRITE IO
LINKSPRITE IO是一个物联网平台,借助该平台,我们可以在该平台上注册自己的网络结点,通过移动设备来控制这些结点工作。首先到LINKSPRITE IO的网站注册一个用户名,注册好并登录进去。然后创建自己的设备结果,本测试使用到LinkNode D1上的LED灯,通过远程来控制LED灯的亮、灭。
图9:注册一个设备结点注意两个地方,一个是APIKEY,另一个是DEVICEID,这两个值随注册信息而异,SPRITELINK IO内部使用该值来区分不同的网络节点设备,通信数据包使用JSON格式封装,通过分析提取JSON数据包信息,从而来控制IO状态。下面是测试用代码,注意用自己的ID及KEY替换
#include &ESP8266WiFi.h&
#include &WString.h&
//the library are needed for autoconfig WiFi
#include &DNSServer.h&
#include &ESP8266WebServer.h&
#include &WiFiManager.h&
// replace with your own API key and device ID,
String apikey = &e2e-a40f34b0d28&;
const char* deviceID = &&;
const char* server = &www.linksprite.io&;
void setup() {
&&Serial.begin(115200);
&&pinMode(BUILTIN_LED, OUTPUT);
&&WiFiManager wifiM
&&wifiManager.setAPStaticIPConfig(IPAddress(192, 168, 99, 200), IPAddress(192, 168, 99, 1), IPAddress(255, 255, 255, 0));
&&wifiManager.autoConnect(&LinkNodeAP&);
&&Serial.print(&WiFi Connected ...\n&);
&&Serial.println(&WiFi connected&);
void loop() {
&&if (client.connect(server, 80)) {
& & String&&postStr = &{&;
& & postStr += &\&action\&:\&query\&,&;
& & postStr += &\&apikey\&:\&&;
& & postStr +=
& & postStr += &\&,&;
& & postStr += &\&deviceid\&:\&&;
& & postStr += deviceID;
& & postStr += &\&,&;
& & postStr += &\&params\&:&;
& & postStr += &[&;
& & postStr += &\&light\&&;
& & postStr += &]&;
& & postStr += &}&;
& & client.print(&POST /api/http HTTP/1.1\n&);
& & client.print(&Host: &);
& & client.print(server);
& & client.print(&\nContent-Type: application/json\n&);
& & client.print(&Content-Length: &);
& & client.print(postStr.length());
& & client.print(&\n\n&);
& & client.print(postStr);
&&delay(1000);
&&Serial.println(&Store response...&);
&&String request = &&;
&&while (client.available()) {
& & char c = client.read();
& & request +=
&&if (request != NULL)
& & int index1 = request.indexOf(&:{&);
& & int index2 = request.indexOf(&},&);
& & String param = request.substring(index1, index2 + 1);
& & Serial.print(&The param is &);
& & Serial.println(param);
& & if (param.indexOf(&off&) & 0) {
& && &digitalWrite(BUILTIN_LED, HIGH);
& && &Serial.println(&OFF&);
& & } else if (param.indexOf(&on&) & 0) {
& && &digitalWrite(BUILTIN_LED, LOW);
& && &Serial.println(&ON&);
& & client.stop();
& & Serial.println(&Waiting...&);
& & delay(2000);
编译并上传到开发板。为了和LINKSPRITE IO平台连接,选择自己平时上网用的WIFI路由器(注意,不是开发板本身,而是你自己上网用的WIFI路由),连接上上网用的WIFI路由后,就可以通过WEB来控制开发板上的LED灯亮或灭的效果了。下面是测试结果
图10:SPRITELINK IO平台WEB控制效果,此时开发板上的LED灯与WEB上指示状态应当一致LINKSPRITE IO提供了一个通过JSON数据传递控制的通信机制,这也是大部分网络通信比较常用的格式。和传统的通过CGI网关来通信相比较,这样对结点的开销要求更低,不需要一个独立的WEB服务器来实现信息的收集,大部分工作由LINKSPRITE IO平台完成并处理实现了。
LinkNode D1板载ESP8266EX WIFI通信模块,模块集成了必要MCU及基本的外设,使得开发板的设计非常简洁。ESP8266EX本身提供了丰富的文档,加上官方SDK及各种示例代码,一般用户都能迅速上手,集中精力于功能上的设计。开源社区将ESP8266EX的SDK移植到Arduino IDE环境中,进一步简化了这一过程,Arduino爱好者在不需要更换开发环境的情况下就能集成ESP8266强大的WIFI功能到产品中,无疑是锦上添花!
实际使用过程中发现在将二进制代码上传至开发板的过程中,偶尔会出现类似“error: espcomm_open failed”的错误,具体原因不详,需要重插拔USB接口才能解决错误。估计应该是Arduino IDE与硬件兼容性问题。测试过程中LinkNode D1本身运行稳定,没有出现死机及其它异常情况。
和小e开发板比,感觉还差点~
不错,不错
先收藏着&&好像也不错的样子
站长推荐 /1
欢迎关注社区微信公众号!
&2017 Tensilica Corporation
Tel: 3-8063
备案号: 苏ICP备号-2
Powered by原本计划这一篇就直接讲tcpserver,但是我发现如果没有透传的基本概念的话,很难讲清楚整个流程以及应用。
如果读者以前就明白透传的概念,那么可以直接跳过这一篇了。 接下来以零基础的方式来解释。
透传的概念
所谓透传,可以理解为“透过传输”或者“透明传输”。想像对着一块透明玻璃打激光灯,激光会穿过透明玻璃而不发生什么变化,这个过程就可以理解为透传的一种。更精确的一个例子是互联网,我们用户(或者程序)输入的数据后,这个数据并不是直接到达我们要发往的地方,而要经过分包路由等步骤之后,到达彼方之后再重新解包变为原本我们发送的数据,数据在这个过程中确实被操作过,但是如果将传输的过程也想象成一块“玻璃”,数据想象成“激光“,事实上对于我们的数据,穿过这层玻璃并没有发生改变。
这就是透传,穿过处理块之后数据并没有发生改变,也就是对于毫不了解的用户的观察来说,这层处理是“透明的”(并非是指处理过程可见,相反,是指用户看不见处理,而且对用户来说这并没有什么影响,即数据不变)。
透传概念具体到此次实践
为什么要讲透传?因为既然题目标签是arduino,必然要将8266和arduino结合起来啊。
截止到上一篇为止,我们都只是对8266进行编程,8266本身有一定的处理能力,但是复杂的处理当然还是要交给arduino。我们用8266这个模块并不是让其运算,而是能够通过网络传输arduino的数据,因此,我们应该讲8266模块做成“透明的”。即:arduino向其传输数据,可以相当于直接向彼方的接收端传输数据。
所以如何将8266模块与arduino相连呢?用串口通信就行了。
将8266的tx,rx针脚分别与arduino的rx,tx(即0,1针脚)相连。
编写程序时,只需要输入以下代码即可开启串口(8266和arduino都是如此)
Serial.start(115200);
如果arduino还有其他模块需要连接rx,tx针脚,一定不要把它们并联起来了事,正确的解决方法是使用软串口。会在以后的博客中讲解。
以下是透传的代码原理
while (client.available())
uint8_t c = client.read();
Serial.write(c);
if (Serial.available())
size_t counti = Serial.available();
uint8_t sbuf[counti];
Serial.readBytes(sbuf, counti);
client.write(sbuf, counti);
代码解释:
while的判断条件中的client.available()判断服务器是否发来了信息(事实上,是返回位于等待队列的数据位数)当有数据时,下面两句代码用于读取数据,并将其写入arduino。
而if的判断条件也差不多,判断arduino有多少数据发送过来,但这时我们是先将串口的数据缓存之后再发送的。
下面附上8266的完整透传代码
#include &ESP8266WiFi.h&
const char *ssid
const char *password = "";
const char *host = "192.168.43.218";
const int tcpPort = 8266;
WiFiClient client;
void setup() {
Serial.begin(115200);
delay(10);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED)
delay(100);
void loop() {
while(!client.connected())
if(!client.connect(host, tcpPort))
delay(500);
while (client.available())
uint8_t c = client.read();
Serial.write(c);
if (Serial.available())
size_t counti = Serial.available();
uint8_t sbuf[counti];
Serial.readBytes(sbuf, counti);
client.write(sbuf, counti);
本文已收录于以下专栏:
相关文章推荐
Arduino使用ESP8266通信的实践一、
nRF24L01的成本较低,但内部需通过SPI通信,略显复杂,同时RF过于专用,接入其他系统时需要转换,不方便。
ESP8266是乐鑫公...
Linux老难题解决了!
Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU、内存资源等的真正分布,具体的工作机制,这使得他们对很多问题的分析都摸不到方向。比如进程的调度延时是多少?linux能否硬实时?多核下多线程如何执行?
本文转载于http://blog.csdn.net/q/article/details/
感谢这位网友的无私分享,在我那可有可无的指导下给做出来了,经博主同意就转过...
上一篇中我们配置好了ide的环境,这一次我们来讲如何将代码烧录进8266中吧!
你需要准备的:
Esp-8266模块一个
usb转tll串口模块如CH340,PL2302,这里我强烈推...
好的,既然有空今天就再写一篇……
前面的都只是铺垫,从这篇就开始讲正文啦,如何使用8266进行局域网通信
WiFi通信中有TCP和UDP两种方式,各有优劣,请自行百度
这次用TCP进行示范
在模块测试之后,确保ESP8266能正常工作,开始与Arduino连接,将DHT11温湿度传感器检测的数据上传到监控平台。之前了解的平台有yeelink和thingspeak,原理应该都一样,我这里选...
ESP8266调试篇
ESP8266整合Arduino~~~~
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【分享1】ARDUINO MEGA2560 经过ESP8266 WIFI模块上传温湿度数据... -
Arduino专区 -
OneNET设备云论坛
查看: 28798|回复: 25
【分享1】ARDUINO MEGA2560 经过ESP8266 WIFI模块上传温湿度数据...
主题帖子积分
注册会员, 积分 87, 距离下一级还需 113 积分
注册会员, 积分 87, 距离下一级还需 113 积分
本帖最后由 arthasarthas 于
07:36 编辑
原来写了一个C++的wifi库但是发现用c++ arduino这小身板有点扛不住,代码比较大,使用String类型数据处理速度慢,而且很容易无缘无故跑飞。而且封装成库后使用还需要修改arduino的串口缓存大小才能使用。
今天抽空重新用c写了一下代码,运行速度明显加快,也不需要修改Arduino IDE了。本代码主要借鉴 中移物联-周家绪 的http头合成的库,和 DFRobot-Strictus 对AT指令数据处理的方法,在这里感谢两位发布的代码。
下面把测试成功的代码发布出来,供后来者使用。代码有不足之处欢迎指正。
发布链接:
1.png (0 Bytes, 下载次数: 953)
19:58 上传
1.主控:ARDUINO MEGA2560开发板
特点:多个串口,IO口丰富,内存比较大,使用方便
2.jpg (0 Bytes, 下载次数: 949)
19:58 上传
2.WIFI模块:使用ARDUINO MEGA2560的带ESP8266的扩展板
特点:带有贴片的ESP8266 WIFI模块,DHT11温湿度传感器,继电器等功能,和ARDUINO MEGA2560即插即用,扩展很多IO和电源接口方便后续扩展各种传感器。
3.png (0 Bytes, 下载次数: 1136)
19:58 上传
3.温湿度传感器:DHT11单总线温湿度传感器(扩展板带的有这个传感器)
1.使用DHT11温湿度传感器的库&dht11.h&,读取温湿度值。
2.使用定时器&TimerOne.h&库,监控AT指令发送和获取返回数据的时间。
3.使用OneNet提供的&HttpPacket.h&库,合成POST请求的HTTP头
4.使用&ArduinoJson.h&库,合成需要的JSON数据流
5.使用ESP8266连接路由器将数据发送到OneNet服务器
用到的库文件下载地址:
链接: 密码:y8ks
传感器和硬件的对应接口
ESP8266&&---&&&Serial3(TX3/RX3)& & 用户发送和读取WIFI指令
DHT11& & ---&&&D8& && && && && && &&&单总线读取温湿度数据值
DEBUG接口---&&&Serial(D0/D1)& && & 1.把发送给ESP8266的数据,也在DEBUG串口输出,观看指令运行到哪一步,2.ESP8266接收的数据,也通过DEBUG口转发出来,观看反馈数据是否正确。 3.错误跳转,观看错误发生的位置
串口反馈数据界面
4.png (0 Bytes, 下载次数: 1152)
19:58 上传
源代码(使用ARDUINO IDE 1.06版本测试)#include &TimerOne.h&
#include &HttpPacket.h&
#include &ArduinoJson.h&
#include &dht11.h&
dht11 DHT11;
#define DHT11PIN 8 //DHT11 连接ARDUINO 8
HttpPacketH
#define DebugSerial Serial
#define ESP8266Serail Serial3
#define Success 1U
#define Failure 0U
int L = 13; //LED指示灯引脚
unsigned long&&Time_Cont = 0;& && & //定时器计数器
const unsigned int esp8266RxBufferLength = 600;
char esp8266RxBuffer[esp8266RxBufferLength];
unsigned int ii = 0;
char OneNetServer[] = &&;& && & //不需要修改
const char ssid[] = &PushPull&;& &&&//修改为自己的路由器用户名
const char password[] = &********&; //修改为自己的路由器密码
char device_id[] = &600911&;& & //修改为自己的设备ID
char API_KEY[] = &R9xO5NZm6oVI4YBHvCPKEqtwYtMA&;& & //修改为自己的API_KEY
char sensor_id1[] = &TEMP&;
char sensor_id2[] = &HUMI&;
void setup() {
& & pinMode(L, OUTPUT);
& & digitalWrite(L, LOW);
& & DebugSerial.begin(9600);
& & ESP8266Serail.begin(115200);
& & Timer1.initialize(1000);
& & Timer1.attachInterrupt(Timer1_handler);
& & initEsp8266();
& & DebugSerial.println(&setup end!&);
}
void loop() {
& & //获取温湿度数据
& & int chk = DHT11.read(DHT11PIN);& && && && && && && && && &&&//读取温湿度值
& && &//串口调试DHT11输出信息
& && &DebugSerial.print(&Read sensor: &);
& && &switch (chk)
& && &{
& && &case DHTLIB_OK:
& && &&&DebugSerial.println(&OK&);
& && &&&
& && &case DHTLIB_ERROR_CHECKSUM:
& && &&&DebugSerial.println(&Checksum error&);
& && &&&
& && &case DHTLIB_ERROR_TIMEOUT:
& && &&&DebugSerial.println(&Time out error&);
& && &&&
& && &default:
& && &&&DebugSerial.println(&Unknown error&);
& && &&&
& && &}
& && &//发送数据到Onenet
& && &postDataToOneNet(API_KEY,device_id,sensor_id1,DHT11.temperature);
& && && & delay(100);& && &
& && &postDataToOneNet(API_KEY,device_id,sensor_id2,DHT11.humidity);
& && &delay(5000);
}
void postDataToOneNet(char* API_VALUE_temp,char* device_id_temp,char* sensor_id_temp,double thisData)
{
& && &&&//合成POST请求
& & StaticJsonBuffer&200& jsonB
& & JsonObject& value = jsonBuffer.createObject();
& & value[&value&] = thisD
& & JsonObject& id_datapoints = jsonBuffer.createObject();
& & id_datapoints[&id&] = sensor_id_
& & JsonArray& datapoints = id_datapoints.createNestedArray(&datapoints&);
& & datapoints.add(value);
& & JsonObject& myJson = jsonBuffer.createObject();
& & JsonArray& datastreams = myJson.createNestedArray(&datastreams&);
& & datastreams.add(id_datapoints);
& & char p[200];
& & int num = myJson.printTo(p, sizeof(p));
& & packet.setHostAddress(OneNetServer);
& & packet.setDevId(device_id_temp);& &//device_id
& & packet.setAccessKey(API_VALUE_temp);&&//API_KEY
& & // packet.setDataStreamId(&&datastream_id&&);& & //datastream_id
& & // packet.setTriggerId(&&trigger_id&&);
& & // packet.setBinIdx(&&bin_index&&);
& & /*create the http message about add datapoint */
& & packet.createCmdPacket(POST, TYPE_DATAPOINT, p);
& & // if (strlen(packet.content))
& & //&&Serial.print(packet.content);
& & // Serial.print(p);
& & int httpLength = strlen(packet.content) +
& && &&&//连接服务器
& & char cmd[400];
& & memset(cmd, 0, 400);& & //清空cmd
& & strcpy(cmd, &AT+CIPSTART=\&TCP\&,\&&);
& & strcat(cmd, OneNetServer);
& & strcat(cmd, &\&,80\r\n&);
& & if (sendCommand(cmd, &CONNECT&, 7, 10000, 5) == Success);
& & else ESP8266_ERROR(1);
& & //发送数据
& & memset(cmd, 0, 400);& & //清空cmd
& & sprintf(cmd, &AT+CIPSEND=%d\r\n&, httpLength);
& & if (sendCommand(cmd, &&&, 1, 3000, 1) == Success);
& & else ESP8266_ERROR(2);
& & memset(cmd, 0, 400);& & //清空cmd
& & strcpy(cmd, packet.content);
& & strcat(cmd, p);
& & if (sendCommand(cmd, &\&succ\&}&, 7, 3000, 3) == Success);
& & else ESP8266_ERROR(3);
& & if (sendCommand(&AT+CIPCLOSE\r\n&, &CLOSED&, 6, 3000, 1) == Success);
& & else ESP8266_ERROR(4);
}
void initEsp8266()
{
& & if (sendCommand(&AT\r\n&, &OK&, 2, 3000, 10) == Success);
& & else ESP8266_ERROR(5);
& & if (sendCommand(&AT+RST\r\n&, &ready&, 5, 10000, 10) == Success);
& & else ESP8266_ERROR(6);
& & if (sendCommand(&AT+CWMODE=1\r\n&, &OK&, 2, 3000, 10) == Success);
& & else ESP8266_ERROR(7);
& & char cmd[50];
& & strcpy(cmd, &AT+CWJAP=\&&);
& & strcat(cmd, ssid);
& & strcat(cmd, &\&,\&&);
& & strcat(cmd, password);
& & strcat(cmd, &\&\r\n&);
& & if (sendCommand(cmd, &OK&, 2, 20000, 10) == Success);
& & else ESP8266_ERROR(8);
& & if (sendCommand(&AT+CIPMUX=0\r\n&, &OK&, 2, 3000, 10) == Success);
& & else ESP8266_ERROR(9);
& & if (sendCommand(&AT+CIFSR\r\n&, &OK&, 2, 20000, 10) == Success);
& & else ESP8266_ERROR(10);
}
void(* resetFunc) (void) = 0; //制造重启命令
void ESP8266_ERROR(int num)
{
& & DebugSerial.print(&ERROR&);
& & DebugSerial.println(num);
& & while (1)
& & {
& && &&&digitalWrite(L, HIGH);
& && &&&delay(300);
& && &&&digitalWrite(L, LOW);
& && &&&delay(300);
& && &&&if (sendCommand(&AT\r\n&, &OK&, 2, 100, 10) == Success)
& && &&&{
& && && && &DebugSerial.print(&\r\nRESET!!!!!!\r\n&);
& && && && &resetFunc();
& && &&&}
& & }
}
unsigned int sendCommand(char *Command, char *Response, unsigned int Res_Length, unsigned long Timeout, unsigned char Retry)
{
& & clrEsp8266RxBuffer();
& & for (unsigned char n = 0; n & R n++)
& & {
& && &&&DebugSerial.print(&\r\nsend AT Command:\r\n----------\r\n&);
& && &&&DebugSerial.write(Command);
& && &&&ESP8266Serail.write(Command);
& && &&&Time_Cont = 0;
& && &&&while (Time_Cont & Timeout)
& && &&&{
& && && && &esp8266ReadBuffer();
& && && && &if ((mystrstr(esp8266RxBuffer, Response, ii, Res_Length)) != NULL)
& && && && &{
& && && && && & DebugSerial.print(&\r\nreceive AT Command:\r\n==========\r\n&);
& && && && && & DebugSerial.print(esp8266RxBuffer); //输出接收到的信息
& && && && && & clrEsp8266RxBuffer();
& && && && && & return S
& && && && &}
& && &&&}
& && &&&Time_Cont = 0;
& & }
& & DebugSerial.print(&\r\nreceive AT Command:\r\n==========\r\n&);
& & DebugSerial.print(esp8266RxBuffer);//输出接收到的信息
& & clrEsp8266RxBuffer();
& & return F
}
unsigned char mystrstr(char *s, char *t, unsigned int Length_s, unsigned int Length_t)
{& &char x = 0; char *p; p =
& & int i = 0, j = 0;
& & for (; i & Length_s; s++, i++)
& & {
& && &&&while (*t == *s)
& && &&&{& &s++; t++; i++; j++;
& && && && &if (j &= Length_t) return 1;
& && &&&}
& && &&&s -=
& && &&&t = j = 0;
& & }
& & return NULL;
}
void Timer1_handler(void)
{
& & Time_Cont++;
}
void esp8266ReadBuffer() {
& & while (ESP8266Serail.available())
& & {
& && &&&esp8266RxBuffer[ii++] = ESP8266Serail.read();
& && &&&if (ii == esp8266RxBufferLength)clrEsp8266RxBuffer();
& & }
}
void clrEsp8266RxBuffer(void)
{
& & memset(esp8266RxBuffer, 0, esp8266RxBufferLength);& && &//清空
& & ii = 0;
}复制代码
主题帖子积分
新手上路, 积分 30, 距离下一级还需 20 积分
新手上路, 积分 30, 距离下一级还需 20 积分
drduino库的下载地址失效了&&下载不了库& &楼主可否更新一下下载地址?
主题帖子积分
注册会员, 积分 87, 距离下一级还需 113 积分
注册会员, 积分 87, 距离下一级还需 113 积分
本帖最后由 arthasarthas 于
20:36 编辑
嗯,好的。我加上一些延时看一下,&&ESP8266用串口调试助手调试的时候没问题,应该也不是这个的原因。还 ...
你单独串口调试ESP8266时候,手动发送指令间隔都比较长,单片机去控制时候是判断看到 关键字,就开始下一条指令的发送。所以会存在一定的问题,最好每条指令之间稍微加一些延时,或者看清楚每条指令最后返回的数据是什么,把最后返回的数据当 判定的关键字。如果判定的关键字靠前,后面还有数据,可能会存在还没接收完数据就开始下一条指令的情况。就会出现busy 的情况。
主题帖子积分
注册会员, 积分 87, 距离下一级还需 113 积分
注册会员, 积分 87, 距离下一级还需 113 积分
这个是错误的信息busy p...复制代码
这个一般是ESP8266一条指令没指令完时候,又发送一条指令造成的,
1.你可以把判断接收完毕语句加上一些后缀,比如\r\n(一般指令都是以\r\n结尾的)
2.每条AT指令之间加一些延时。
3.换个ESP8266模块。
4.换ARDUINO IDE1.0.6版本
目前的代码,我这里跑好几天都没出过错误。
主题帖子积分
新手上路, 积分 30, 距离下一级还需 20 积分
新手上路, 积分 30, 距离下一级还需 20 积分
POST /devices/3254430/datapoints HTTP/1.1
api-key:=n4Qxfef3=CCQCoXvDnFH1JYGAw=
Host:
Content-Length:65
{&datastreams&:[{&id&:&water1&,&datapoints&:[{&value&:126.00}]}]}
receive AT Command:
==========
Recv 190 bytes
SEND OK
POST /devices/3254430/datapoints HTTP/1.1
api-key:=n4Qxfef3=CCQCoXvDnFH1JYGAw=
busy p...
Host:api.heclouds.c
ERROR
om
ERROR
Content-Length:65
ERROR
{&datastreams&:[{&id&:&water1&,&datapoints&:[{&value&:126.00}]}]}
+IPD,203:HTTP/1.1 200 OK
Date: Mon, 15 Aug :46 GMT
Content-Type: application/json
Content-Length: 26
Connection: keep-alive
Server: Apache-Coyote/1.1
Pragma: no-cache
{&errno&:0,&error&:&succ&}POST /devices/3254430/dat
send AT Command:
----------
AT+CIPCLOSE
receive AT Command:
==========
apoints HTTP/1.1
api-key:=n4Qxfef3=CCQCoXvDnFH1JYGAw=
busy AT+CIPCLOSE
ERROR
ERROR4
send AT Command:
复制代码这个是错误的信息
主题帖子积分
新手上路, 积分 30, 距离下一级还需 20 积分
新手上路, 积分 30, 距离下一级还需 20 积分
各位我是用旋转编码器做的一个调试程序,想看看能不能把数据上传到onenet,现在是数据可以上传,但是运行一会就会出现错误就不运行了,我想问一下是什么原因,下面是我的代码
#include &TimerOne.h&
#include &HttpPacket.h&
#include &ArduinoJson.h&
#define ENCODER_A_PIN 2
#define ENCODER_B_PIN 3
#define SWITCH_PIN& & 4
HttpPacketH
#define DebugSerial Serial
#define ESP8266Serail Serial3
#define Success 1U
#define Failure 0U
int L = 13; //LED指示灯引脚
unsigned long&&Time_Cont = 0;& && & //定时器计数器
const unsigned int esp8266RxBufferLength = 600;
char esp8266RxBuffer[esp8266RxBufferLength];
unsigned int ii = 0;
char OneNetServer[] = &&;& && & //不需要修改
const char ssid[] = &HXDwifi_SYS&;& &&&//修改为自己的路由器用户名
const char password[] = &&; //修改为自己的路由器密码
char device_id[] = &3254430&;& & //修改为自己的设备ID
char API_KEY[] = &=n4Qxfef3=CCQCoXvDnFH1JYGAw=&;& & //修改为自己的API_KEY
char sensor_id1[] = &water1&;
char sensor_id2[] = &water2&;
void setup() {
& & pinMode(ENCODER_A_PIN, INPUT);
&&pinMode(ENCODER_B_PIN, INPUT);
&&pinMode(SWITCH_PIN, INPUT);
&&attachInterrupt(0, read_quadrature, CHANGE);
& & pinMode(L, OUTPUT);
& & digitalWrite(L, LOW);
& & DebugSerial.begin(9600);
& & ESP8266Serail.begin(115200);
& & Timer1.initialize(1000);
& & Timer1.attachInterrupt(Timer1_handler);
& & initEsp8266();
& & DebugSerial.println(&setup end!&);
}
void loop() {
& & int A=position+20;
& && &//发送数据到Onenet
& && &postDataToOneNet(API_KEY,device_id,sensor_id1,A);
& && && & delay(100);& && &
& && &postDataToOneNet(API_KEY,device_id,sensor_id2,position);
& && &delay(5000);
}
void read_quadrature(){&&
&&// found a low-to-high on channel A ENA脚下降沿中断触发
&&if (digitalRead(ENCODER_A_PIN) == LOW){& &
& & // check channel B to see which way 查询ENB的电平以确认是顺时针还是逆时针旋转
& & if (digitalRead(ENCODER_B_PIN) == LOW)
& && &position++;
& && &
&&}
&&// found a high-to-low on channel A ENA脚上升沿中断触发
&&else{
& & // check channel B to see which way 查询ENB的电平以确认是顺时针还是逆时针旋转
& & if (digitalRead(ENCODER_B_PIN) == LOW)
& && &position--;
&&}
&&}
void postDataToOneNet(char* API_VALUE_temp,char* device_id_temp,char* sensor_id_temp,double thisData)
{
& && &&&//合成POST请求
& & StaticJsonBuffer&200& jsonB
& & JsonObject& value = jsonBuffer.createObject();
& & value[&value&] = thisD
& & JsonObject& id_datapoints = jsonBuffer.createObject();
& & id_datapoints[&id&] = sensor_id_
& & JsonArray& datapoints = id_datapoints.createNestedArray(&datapoints&);
& & datapoints.add(value);
& & JsonObject& myJson = jsonBuffer.createObject();
& & JsonArray& datastreams = myJson.createNestedArray(&datastreams&);
& & datastreams.add(id_datapoints);
& & char p[200];
& & int num = myJson.printTo(p, sizeof(p));
& & packet.setHostAddress(OneNetServer);
& & packet.setDevId(device_id_temp);& &//device_id
& & packet.setAccessKey(API_VALUE_temp);&&//API_KEY
& & // packet.setDataStreamId(&&datastream_id&&);& & //datastream_id
& & // packet.setTriggerId(&&trigger_id&&);
& & // packet.setBinIdx(&&bin_index&&);
& & /*create the http message about add datapoint */
& & packet.createCmdPacket(POST, TYPE_DATAPOINT, p);
& & // if (strlen(packet.content))
& & //&&Serial.print(packet.content);
& & // Serial.print(p);
& & int httpLength = strlen(packet.content) +
& && &&&//连接服务器
& & char cmd[400];
& & memset(cmd, 0, 400);& & //清空cmd
& & strcpy(cmd, &AT+CIPSTART=\&TCP\&,\&&);
& & strcat(cmd, OneNetServer);
& & strcat(cmd, &\&,80\r\n&);
& & if (sendCommand(cmd, &CONNECT&, 7, 10000, 5) == Success);
& & else ESP8266_ERROR(1);
& & //发送数据
& & memset(cmd, 0, 400);& & //清空cmd
& & sprintf(cmd, &AT+CIPSEND=%d\r\n&, httpLength);
& & if (sendCommand(cmd, &&&, 1, 3000, 1) == Success);
& & else ESP8266_ERROR(2);
& & memset(cmd, 0, 400);& & //清空cmd
& & strcpy(cmd, packet.content);
& & strcat(cmd, p);
& & if (sendCommand(cmd, &\&succ\&}&, 7, 3000, 3) == Success);
& & else ESP8266_ERROR(3);
& & if (sendCommand(&AT+CIPCLOSE\r\n&, &CLOSED&, 6, 3000, 1) == Success);
& & else ESP8266_ERROR(4);
}
void initEsp8266()
{
& & if (sendCommand(&AT\r\n&, &OK&, 2, 3000, 10) == Success);
& & else ESP8266_ERROR(5);
& & if (sendCommand(&AT+RST\r\n&, &ready&, 5, 10000, 10) == Success);
& & else ESP8266_ERROR(6);
& & if (sendCommand(&AT+CWMODE=1\r\n&, &OK&, 2, 3000, 10) == Success);
& & else ESP8266_ERROR(7);
& & char cmd[50];
& & strcpy(cmd, &AT+CWJAP=\&&);
& & strcat(cmd, ssid);
& & strcat(cmd, &\&,\&&);
& & strcat(cmd, password);
& & strcat(cmd, &\&\r\n&);
& & if (sendCommand(cmd, &OK&, 2, 20000, 10) == Success);
& & else ESP8266_ERROR(8);
& & if (sendCommand(&AT+CIPMUX=0\r\n&, &OK&, 2, 3000, 10) == Success);
& & else ESP8266_ERROR(9);
& & if (sendCommand(&AT+CIFSR\r\n&, &OK&, 2, 20000, 10) == Success);
& & else ESP8266_ERROR(10);
}
void(* resetFunc) (void) = 0; //制造重启命令
void ESP8266_ERROR(int num)
{
& & DebugSerial.print(&ERROR&);
& & DebugSerial.println(num);
& & while (1)
& & {
& && &&&digitalWrite(L, HIGH);
& && &&&delay(300);
& && &&&digitalWrite(L, LOW);
& && &&&delay(300);
& && &&&if (sendCommand(&AT\r\n&, &OK&, 2, 100, 10) == Success)
& && &&&{
& && && && &DebugSerial.print(&\r\nRESET!!!!!!\r\n&);
& && && && &resetFunc();
& && &&&}
& & }
}
unsigned int sendCommand(char *Command, char *Response, unsigned int Res_Length, unsigned long Timeout, unsigned char Retry)
{
& & clrEsp8266RxBuffer();
& & for (unsigned char n = 0; n & R n++)
& & {
& && &&&DebugSerial.print(&\r\nsend AT Command:\r\n----------\r\n&);
& && &&&DebugSerial.write(Command);
& && &&&ESP8266Serail.write(Command);
& && &&&Time_Cont = 0;
& && &&&while (Time_Cont & Timeout)
& && &&&{
& && && && &esp8266ReadBuffer();
& && && && &if ((mystrstr(esp8266RxBuffer, Response, ii, Res_Length)) != NULL)
& && && && &{
& && && && && & DebugSerial.print(&\r\nreceive AT Command:\r\n==========\r\n&);
& && && && && & DebugSerial.print(esp8266RxBuffer); //输出接收到的信息
& && && && && & clrEsp8266RxBuffer();
& && && && && & return S
& && && && &}
& && &&&}
& && &&&Time_Cont = 0;
& & }
& & DebugSerial.print(&\r\nreceive AT Command:\r\n==========\r\n&);
& & DebugSerial.print(esp8266RxBuffer);//输出接收到的信息
& & clrEsp8266RxBuffer();
& & return F
}
unsigned char mystrstr(char *s, char *t, unsigned int Length_s, unsigned int Length_t)
{& &char x = 0; char *p; p =
& & int i = 0, j = 0;
& & for (; i & Length_s; s++, i++)
& & {
& && &&&while (*t == *s)
& && &&&{& &s++; t++; i++; j++;
& && && && &if (j &= Length_t) return 1;
& && &&&}
& && &&&s -=
& && &&&t = j = 0;
& & }
& & return NULL;
}
void Timer1_handler(void)
{
& & Time_Cont++;
}
void esp8266ReadBuffer() {
& & while (ESP8266Serail.available())
& & {
& && &&&esp8266RxBuffer[ii++] = ESP8266Serail.read();
& && &&&if (ii == esp8266RxBufferLength)clrEsp8266RxBuffer();
& & }
}
void clrEsp8266RxBuffer(void)
{
& & memset(esp8266RxBuffer, 0, esp8266RxBufferLength);& && &//清空
& & ii = 0;
}复制代码
主题帖子积分
新手上路, 积分 8, 距离下一级还需 42 积分
新手上路, 积分 8, 距离下一级还需 42 积分
drduino库的下载地址失效了&&下载不了库& &楼主可否更新一下下载地址?
点击地址栏 再按下回车 就能正常访问了
主题帖子积分
新手上路, 积分 38, 距离下一级还需 12 积分
新手上路, 积分 38, 距离下一级还需 12 积分
非常不错,支持一下,学习了
主题帖子积分
注册会员, 积分 87, 距离下一级还需 113 积分
注册会员, 积分 87, 距离下一级还需 113 积分
嗯,好的。我加上一些延时看一下,&&ESP8266用串口调试助手调试的时候没问题,应该也不是这个的原因。还 ...
一直在连接你的路由器SSID和密码的指令说明一直没连接上路由器,重启下路由器试试。
主题帖子积分
中级会员, 积分 289, 距离下一级还需 211 积分
中级会员, 积分 289, 距离下一级还需 211 积分
主题帖子积分
新手上路, 积分 30, 距离下一级还需 20 积分
新手上路, 积分 30, 距离下一级还需 20 积分
这个一般是ESP8266一条指令没指令完时候,又发送一条指令造成的,
1.你可以把判断接收完毕语句加 ...
嗯,好的。我加上一些延时看一下,&&ESP8266用串口调试助手调试的时候没问题,应该也不是这个的原因。还有有时候他会一直发送同一条命令,这是为什么,是wifi模块没返回消息导致的吗&&就像下面这样load 0AT+CWMODE=1
send AT Command:
----------
AT+CWJAP=&HXDwifi_SYS&,&&
send AT Command:
----------
AT+CWJAP=&HXDwifi_SYS&,&&
send AT Command:
----------
主题帖子积分
新手上路, 积分 8, 距离下一级还需 42 积分
新手上路, 积分 8, 距离下一级还需 42 积分
谢谢分享,正在学习}

我要回帖

更多关于 esp8266 arduino 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信