欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 09:31:40
...

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

我是代码小白,一个正在做毕设的秃头少年。鄙人拙作,有不当之处,还请指教。
最近买了一套arduino设备,打算做一个物联网设备小玩意,可是怎么把数据上传到云服务器可愁坏我了。通过对比实验,我决定用esp8266wifi模块进行通信。
云服务器的话,我现在还没写相应的代码,所以先用Onenet平台进行配置。

Onenet平台进行配置

1.进入Onenet网站,注册账号,登录到开发者中心。网址 https://open.iot.10086.cn/
2.进入开发者中心界面后选中全部产品,点击多协议接入。arduino通过esp8266模块发送数据到云服务器
3.选择HTTP协议,点击添加产品。arduino通过esp8266模块发送数据到云服务器
4.填上相关信息点击确定。arduino通过esp8266模块发送数据到云服务器
5.然后点击设备列表。点击添加设备。
arduino通过esp8266模块发送数据到云服务器
6.填上相关信息,点击添加。
arduino通过esp8266模块发送数据到云服务器
7.记住产品的APIkey和设备ID
arduino通过esp8266模块发送数据到云服务器
arduino通过esp8266模块发送数据到云服务器

arduino代码

#include <stdlib.h>
#include <SoftwareSerial.h>
#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。由于调用宏定义老是出错,不得已才直接写上去

接线方式

arduino通过esp8266模块发送数据到云服务器dh11温湿度传感器的话,data引脚接arduino的引脚7
注意esp8266wifi模块输入电压均为3.3v,温湿度 传感器为5v。

运行结果

接线完毕运行代码,打开串口助手。出现以下画面即为数据上传成功。
arduino通过esp8266模块发送数据到云服务器
接下来我们看服务器方面
arduino通过esp8266模块发送数据到云服务器
arduino通过esp8266模块发送数据到云服务器
arduino通过esp8266模块发送数据到云服务器

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