服务器发送信息给arduino,arduino通过esp8266模块发送数据到云服务器

arduino通过esp8266模块发送数据到云服务器

我是代码小白,一个正在做毕设的秃头少年。鄙人拙作,有不当之处,还请指教。

最近买了一套arduino设备,打算做一个物联网设备小玩意,可是怎么把数据上传到云服务器可愁坏我了。通过对比实验,我决定用esp8266wifi模块进行通信。

云服务器的话,我现在还没写相应的代码,所以先用Onenet平台进行配置。

Onenet平台进行配置

1.进入Onenet网站,注册账号,登录到开发者中心。网址 https://open.iot.10086.cn/

2.进入开发者中心界面后选中全部产品,点击多协议接入。

6eb5b4dab7b79e3bf9ef207ec680a62c.png

3.选择HTTP协议,点击添加产品。

fe696407523a529bb45bc969953a8ecc.png

4.填上相关信息点击确定。

4703741622faa1b6ded06270fb6b8baf.png

5.然后点击设备列表。点击添加设备。

3101fe4893d0715c9d9a8a6509c904d1.png

6.填上相关信息,点击添加。

92335925654b0e74074917b3bdf69701.png

7.记住产品的APIkey和设备ID

3bcf616a84fdbd23d8f63b368afc9e0a.png

8feaddd940fccd7fd91c030b42f2f368.png

arduino代码

#include

#include

#include"dht11.h"

dht11 DHT11;

#define DHT11PIN 7 // 将把 DHT11 的 data pin 连到 arduino Pin 7

#define SSID "xxxx" //wifi名

#define PASS "xxxxxxx" //wifi密码

#define IP "api.heclouds.com" // 连接thingspeak.com服务器

const char OneNetServer[] = "api.heclouds.com";

//String GET = "GET /update?key=ylZJctZfVULDM4NvVRfec97Axxw="; //输入前面记下的API

const char APIKEY[] = "ylZJctZfVULDM4NvVRfec97Axxw="; // 使用时请修改为你的API KEY -- Please use your own API KEY

int32_t DeviceId = 559228290; // 使用时请修改为你的设备ID -- Please use your own device ID

const char DS_Temp[] = "TEMP"; // 数据流 温度TEMP -- Stream "TEMP"

const char DS_Hum[] = "HUMI"; // 数据流 湿度HUMI -- Stream "HUMI"

SoftwareSerial monitor(3, 2); // 定义软串口RX, TX

const int tcpPort = 80;

//初始化-----------------------------------------

void setup()

{

monitor.begin(9600);

Serial.begin(9600);

pinMode(DHT11PIN, OUTPUT);

monitor.println("AT");//指令测试

delay(1000);

if (monitor.find("OK")) //接收指令正常则返回OK

{

Serial.println("Wifi module connection is normal");

connectWiFi();

}

else {

Serial.println("Wifi module connection failed");

}

}

//主循环-----------------------------------------

void loop()

{

int chk = DHT11.read(DHT11PIN);

//Serial.println((float)DHT11.temperature);

//Serial.println((float)DHT11.humidity);

float tempH = DHT11.humidity;

float tempT = DHT11.temperature;

char buffer[10];

String temph = dtostrf(tempH, 4, 1, buffer);

String tempt = dtostrf(tempT, 4, 1, buffer);

updateTemp(temph,tempt);

delay(5000);

}

void updateTemp(String temph, String tempt)

{

String cmd = "AT+CIPSTART=\"TCP\",\"";

cmd += IP;

cmd += "\",80";

//sendDebug(cmd); //发送指令,链接服务器

monitor.println(cmd);

delay(2000);

if (monitor.find("Error"))

{

Serial.print("Connection to server failed");

return;

}

//cmd = GET + "&field1=" + temph + "&field2=" + tempt + "\r\n"; //记录T和H的值

cmd = postData(DeviceId, tempt, temph);

monitor.print("AT+CIPSEND=");

monitor.println(cmd.length());

if (monitor.find(">"))

{

Serial.print(">");

monitor.print(cmd);

Serial.print(cmd);

}

else

{

Serial.println("Data transmission failure");

}

if (monitor.find("OK"))

{

Serial.println("RECEIVED: OK");

monitor.println("AT+CIPCLOSE");

}

else

{

Serial.println("Data transmission failure");

}

}

boolean connectWiFi()

{

//Serial.println("AT+CIPMUX=0");

monitor.println("AT+CWMODE=1");

monitor.println("AT+RST");

delay(2000);

String cmd = "AT+CWJAP=\"";

cmd += SSID;

cmd += "\",\"";

cmd += PASS;

cmd += "\"";

monitor.println(cmd);

delay(1000);

if (monitor.find("OK"))

{

Serial.println("Wifi connection successful");

return true;

} else

{

Serial.println("Wifi connection failed");

return false;

}

}

String postData(int dId, String val_t, String val_h)

{

// 创建发送请求的URL -- We now create a URI for the request

String url = "/devices/559228290";//此处修改为你的设备id

//url += String(dId);

url += "/datapoints?type=3";

String data = "{\"" + String(DS_Temp) + "\":" + val_t + ",\"" +

String(DS_Hum) + "\":" + val_h + "}";

// 创建发送指令 -- We now combine the request to the server

String post_data = "POST " + url + " HTTP/1.1\r\n" +

"api-key:" + APIKEY + "\r\n" +

"Host:" + OneNetServer + "\r\n" +

"Content-Length: " + String(data.length()) + "\r\n" + //发送数据长度

"Connection: close\r\n\r\n" +

data;

// 发送指令 -- This will send the request to server

return post_data;

}

注意postData()函数中,url中还要改成自己的设备id。由于调用宏定义老是出错,不得已才直接写上去

接线方式

6029a80832009ddb3d608ea2d82045f8.pngdh11温湿度传感器的话,data引脚接arduino的引脚7

注意esp8266wifi模块输入电压均为3.3v,温湿度 传感器为5v。

运行结果

接线完毕运行代码,打开串口助手。出现以下画面即为数据上传成功。

0351d295f3d6702027b3da3d4657face.png

接下来我们看服务器方面

14116e01c1c8d498aabb6dc724978f4e.png

776aa514833225bd600dc58b5e9efc0a.png

6911d6867485c8186361f0339fafdee7.png

果然收到数据。接下来就可以自己编写服务器的api接口接收数据,做一下更加有意思的事了。

本帖子中包含资源

您需要 登录 才可以下载,没有帐号?立即注册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值