一、硬件简介

  1. Arudino 是一种开源的电子平台,该平台最初主要基于AVR单片机的微控制器和相应的开发软件,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。

  

  2. ESP8266 是深圳安信可科技有限公司开发的基于乐鑫ESP8266的超低功耗的UART-WIFI模块的模组,可以方便进行二次元开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。

二、硬件接线

  1. 所用到的硬件有:Arudino Mega 2560, ESP8266-12F.

  2. 接线如下表所示

  

Arduino ESP8266
3.3V  VCC
GND GND
RXD TXD
TXD RXD

三、硬件编程

  1.  ESP8266 芯片接收的AT指令顺序

  • AT: 发送 AT 指令判断供电,TTL和WIFI模块是否正常 返回OK表示正常
  • AT+ CWMODE=?  : 发送 AT+CWMODE=? 指令 选择模式 1.Station模式,2. AP 模式, 返回字节中有OK表示连接成功
  • AT+CWJAP="ssid","password" : 发送 AT+CWJAP="ssid","password" 来连接AP 返回字节中有CONNECT表示连接成功
  • AT+CIPSTART="TCP","hostServer",hostPort : 链接服务器, 返回OK表示连接成功
  • AT+CIPSEND=dataLen :向服务器发送数据,dataLen表示HTTP的请求的长度,返回> 表示发送成功,继续发送数据
  • data : 向服务器发送数据
  • AT+CIPCLOSE: 关闭请求链接,返回CLOSED表示断开连接

  2. 程序代码

  

 /**
*
*/
#include <TimerOne.h>
#include <HttpPacket.h>
#include <ArduinoJson.h>
/**'
* ESP8266 采用串口3通讯
*/
#define ESP8266Serial Serial3
#define mySerial Serial #define RES_MAX_LENGTH 500 #define SEND_SUCCESS 1
#define SEND_FAIL 0 /**
* 链接的AP的账户密码
*/
char ssid[] = "zlei";
char pass[] = ""; /**
* Onenet 互联网信息
*/
char oneNetServer[] = "api.heclouds.com"; //不需要修改
char deviceId[] = "";
char API_KEY[] = "qB40IZOP6Rx58EZ7ow16mA=VkRQ=";
char sensorID1[] = "waterLevel"; // ESP8266于Arduino交互的数据缓存
char ESP8266Response[RES_MAX_LENGTH]; // 交互数据缓存的世纪存储长度
int resLength = ; // 请求时间计算的最小分度值
const unsigned long interval = ; // 计时器,以毫秒为最小计数单位
unsigned long curTime = ; HttpPacketHead packet;
void setup() {
ESP8266Serial.begin();
mySerial.begin(); Timer1.initialize(interval);
Timer1.attachInterrupt(timeClock);
intiESP8266(); } void loop() {
postDataToServer(API_KEY,deviceId,sensorID1,1.00); // 发送数据(数据为模拟数据)
delay();
} /**
* 制造重启命令
*/
void(* resetFunc) (void) = ; /**
* ESP8266 板子进行初始化
* 1. 发送 AT 指令判断供电,TTL和WIFI模块是否正常 返回OK表示正常
* 2. 发送 AT+CWMODE=? 指令 选择模式 1.Station模式,2. AP 模式
* 3. 发送 AT+CWJAP="ssid","password" 来连接AP
*/
void intiESP8266(){ // AT 指令, 返回OK表明供电,TTL和WIFI模块通讯正常
if(sendATCommead("AT\r\n","OK", , ) == SEND_SUCCESS );
else ESP8266_Error();
delay();
// AT+CWMODE=? 选择模式 1.Station模式,2. AP 模式
if(sendATCommead("AT+CWMODE=1\r\n","OK",,) == SEND_SUCCESS );
else ESP8266_Error(); // AT+CWJAP="sid","pass" 加入AP
char cwjap[];
strcat(cwjap,"AT+CWJAP=\"");
strcat(cwjap,ssid);
strcat(cwjap,"\",\"");
strcat(cwjap,pass);
strcat(cwjap,"\"\r\n");
if(sendATCommead(cwjap,"OK",,) == SEND_SUCCESS );
else ESP8266_Error();
} /**
* ESP8266 错误信息处理
* @param type 错误信息类型
*/
void ESP8266_Error(int type){
mySerial.println("ERROR");
mySerial.println(type);
while(){
if(sendATCommead("AT\r\n","OK", , ) == SEND_SUCCESS){
mySerial.print("\r\nRESET!!!!!!\r\n");
resetFunc();
}
}
} /**
* Arduino 向ESP8266中发送AT指令
* @param commoned 需要发送的指令
* @param response 发送之后接收到response之后表示成功
* @param timeout 在发送命令之后 timeout 毫秒之后重新发送消息
* @param reTry 重新发送的次数
*/
unsigned int sendATCommead(char *commoned, char *response, int timeout, unsigned char reTry){ // 多次重复发送消息,直到接收到消息。
for(unsigned char tryTime = ; tryTime < reTry; tryTime++){
clearResponse(); // 清理接收缓存
mySerial.print("send commoned ");
mySerial.print(commoned);
mySerial.print(" to ESP8266.\n");
ESP8266Serial.write(commoned); // 通过串口发送命令
curTime = ; // 在延时范围内查看回复消息,如果回复消息成功,返回成功
while(curTime < timeout){
readResponse();
if(strstr(ESP8266Response, response) != NULL){
mySerial.println("Response is ");
mySerial.println("-------------- Response Start ----------------");
mySerial.println(ESP8266Response);
mySerial.println("-------------- Response end ------------------");
return SEND_SUCCESS;
}
}
}
// 发送失败
mySerial.print("response received, content is \n >>>> ");
mySerial.println(ESP8266Response);
return SEND_FAIL;
} /**
* 向服务器发送数据请求
* @param apiKey 访问网站的apiKey
* @param deviceID 设备ID
* @param sensorID 传感器ID
* @param data 发送的数据
*/
void postDataToServer(char *apiKey, char *deviceID, char *sensorID, double data){
StaticJsonBuffer<> jsonBuffer; JsonObject &value = jsonBuffer.createObject();
value["value"] = data; JsonObject &idDataPoints = jsonBuffer.createObject();
idDataPoints["id"] = sensorID;
JsonArray &dataPoints = idDataPoints.createNestedArray("dataPoints");
dataPoints.add(value); JsonObject &myJson = jsonBuffer.createObject();
JsonArray &dataStreams = myJson.createNestedArray("dataStreams");
dataStreams.add(idDataPoints); // 设置POST的请求表头
char postData[];
int postLength = myJson.printTo(postData, sizeof(postData)); packet.setHostAddress(oneNetServer);
packet.setDevId(deviceId);
packet.setAccessKey(API_KEY); packet.createCmdPacket(POST, TYPE_DATAPOINT, postData); int httpLength = strlen(packet.content) + postLength; char cmd[];
// 链接服务器
memset(cmd, , );
sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",80\r\n",oneNetServer);
if(sendATCommead(cmd,"CONNECT", , ) == SEND_SUCCESS);
else ESP8266_Error(); // 发送数据
memset(cmd,,);
sprintf(cmd, "AT+CIPSEND=%d\r\n",httpLength);
if(sendATCommead(cmd,">",,) == SEND_SUCCESS);
else ESP8266_Error(); memset(cmd,,);
strcpy(cmd,packet.content);
strcat(cmd,postData);
if(sendATCommead(cmd,"succ\"}",,) == SEND_SUCCESS);
else ESP8266_Error(); if(sendATCommead("AT+CIPCLOSE\r\n","CLOSED",,) == SEND_SUCCESS);
else ESP8266_Error();
} /**
* @TODO 将ESP8266返回的数据返回到缓存数组中
* 1. 清理缓存数据
* 2. 将读取的数据存入全局数组中
* 3. 超出数组长度之后
*/
void readResponse(){
clearResponse();
while(ESP8266Serial.available()){
ESP8266Response[resLength++] = ESP8266Serial.read();
if(resLength == RES_MAX_LENGTH) clearResponse();
}
} /**
* @todo 清理数据交互缓存区
*/
void clearResponse(){
memset(ESP8266Response,,RES_MAX_LENGTH);
resLength = ;
} /**
* 计时器函数,单位为毫秒
*/
void timeClock(){
curTime++;
}

  

【Arduino】、Arduino+ESP8266上传至oneNet云的更多相关文章

  1. STM32+Air202+Air530+HXDZ-30102-ACC心率血氧GPS采集上传到阿里云

    所有资料都在QQ群1121445919 主要功能 HXDZ-30102-ACC采集心率血氧数据 STM32通过串口将数据转发到air202模块 air202将数据上传到阿里云平台进行展示与处理 整合合 ...

  2. Wordpress上传到阿里云服务器

    Wordpress上传到阿里云服务器 登录服务器 https://account.aliyun.com/login/login.htm 绑定域名 获取FTP信息.数据库信息 在本地修改wordpres ...

  3. Windows环境下用C#编程将文件上传至阿里云OSS笔记

    Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...

  4. idea项目上传到码云

    从idea托管项目到码云相对其他软件来说是非常简单的,只要第一次下载好git插件,然后托管如下: 1. 2. 3.登陆成功后,默认会将项目所有项全选,托管成功后右下角会显示 4.当以后项目有变化时再如 ...

  5. JavaScript进阶(九)JS实现本地文件上传至阿里云服务器

    JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...

  6. OSS文件上传到阿里云

    <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script&g ...

  7. eclipse如何将项目上传到码云

    把Eclipse项目上传到码云的步骤: 一.将代码提交到本地 1.登录码云:新建项目 2.输入项目名: 3.空项目创建成功如下图: 4.右键点击Eclipse的项目,选择“Team”——>“Sh ...

  8. git本地项目代码上传至码云远程仓库总结【转】

    转载自 :https://blog.csdn.net/fox9916/article/details/78253714 git基本使用小结 之前公司的版本控制工具一直用的是svn,最近要改用git,之 ...

  9. Myeclipse10.7安装git插件并将Java项目上传到码云(github)

    注:本文来源:外匹夫的<Myeclipse10.7安装git插件并将Java项目上传到码云(github)> 一.先说说安装egit插件的步骤(安装egit不成功的原因主要是下载的egit ...

随机推荐

  1. [转载]java正则表达式

    转载自:http://butter.iteye.com/blog/1189600 1.正则表达式的知识要点1.正则表达式是什么?正则表达式是一种可以用于模式匹配和替换的强有力的工具.2.正则表达式的优 ...

  2. Sonar在ant工程中读取单元测试和覆盖率报告

    虽然sonar支持ant工程的构建,但目前最大的不足是无法在分析过程中产生单元测试和覆盖率报告,这样在sonar面板上覆盖率板块就始终没有数据.但幸运的是,sonar可以读取已经生成好的报告,让报告的 ...

  3. HDU 1198

    http://acm.hdu.edu.cn/showproblem.php?pid=1198 裸并查集,主要工作在根据题目给出关系构图 #include <iostream> #inclu ...

  4. scikit-learn 学习笔记-- Generalized Linear Models (三)

    Bayesian regression 前面介绍的线性模型都是从最小二乘,均方误差的角度去建立的,从最简单的最小二乘到带正则项的 lasso,ridge 等.而 Bayesian regression ...

  5. POJ 2236:Wireless Network(并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 36363   Accepted: 150 ...

  6. flask第二十四篇——模板【6】自定义过滤器

    请关注孟船长的公众号:自动化测试实战 大家想了解其他过滤器可以参考这里: http://jinja.pocoo.org/docs/dev/templates/#builtin-filters ---- ...

  7. Python中定时任务框架APScheduler

    前言 大家应该都知道在编程语言中,定时任务是常用的一种调度形式,在Python中也涌现了非常多的调度模块,本文将简要介绍APScheduler的基本使用方法. 一.APScheduler介绍 APSc ...

  8. 9 CSS in JS Libraries You Should Know in 2018

    转自:https://blog.bitsrc.io/9-css-in-js-libraries-you-should-know-in-2018-25afb4025b9b 实际上  wix 的 styl ...

  9. 打造基于jQuery的日期选择控件

    终于把jQuery拼写正确了哈,哈哈javascript也是区分大小写的,所以确实不能写错,今天我来和大家分享的是日期选择控件的实现,功能也许不够强大,但是能够满足需求. 我之前也写过(正确的说是改过 ...

  10. python连接redis sentinel集群

    安装 python redis 客户端 pip install redis #!/usr/bin/env python # -*- coding:utf-8 -*- #!/usr/bin/env py ...