ESP32-微信小程序获取OneNET温湿度数据

d6265e759d1655b2acc5918ee7634fbb.png

查询OneNet平台多协议接入文档,地址链接如下,这里直接查看MQTT的API使用方法:
https://open.iot.10086.cn/doc/v5/develop/detail/582

7e2664340ffff211377cdb6d92e4c24c.png

新版MQTT好像无法利用微信小程序调用API,旧版的可以,即在多协议接入中配置,配置方法和新版的配置方法一致,找到API地址和API密钥。

8d66495adc313a11eb266346535444a3.png

我用ApiPost来进行测试是否能获取数据,网页地址如下:
https://console.apipost.cn/apis/project
ApiPost设置如下,采用GET方式,填写好API地址和API密钥,然后发送,可以看到正确返回数据,数据格式如下:

171520855140aa050cc53ede7851139e.png

微信小程序注册网上有很多教程,微信小程序项目中的每个文件的作用:

index.js
页面逻辑代码用js实现
index.json
json数据
index.wxml
页面标记语言与HTML相似
index.wxss
页面样式

a5ecd5e22e9946cb76f94bae7863a579.png

index.js代码如下,主要修改API地址和API密钥。

Page({


  data: {
    temperature:"0",
    humidity: "0",
  },


  //周期函数
  onLoad: function () {
    setInterval(function () {
      this.init() 
    }.bind(this), 1000)
  },


  init: function () {
    var that = this
    wx.request({
      url: "https://api.heclouds.com/devices/********/datapoints",   //将请求行中的数字换成自己的设备ID
      header: {
        "api-key": "***************"                     //换成自己的api-key
      },
      data: {
        limit: 1
      },
      method: "GET",
      success: function (e) {
        console.log(e.data.data)
        that.setData({
          humidity: e.data.data.datastreams[0].datapoints[0].value,
          temperature : e.data.data.datastreams[1].datapoints[0].value,
        })
      }
    });
  }
})

温湿度数据主要是根据上面ApiPost解析出来数据格式定位,代码如下:

humidity: e.data.data.datastreams[0].datapoints[0].value,
temperature : e.data.data.datastreams[1].datapoints[0].value

页面配置可以用可视化选项进行配置(像拖拽,添加文本等),所有配置完成后,可以看到小程序上可以显示自己的温湿度数据。

53ed3a5d420cc428ac1fb90ff0ec1b0c.png

演示视频如下:

将完成的小程序进行上传发布,选择上传选项,如下图所示:

e1a8fd53ad5ad2f4b49958d9bbc28c8a.png

填写版本号:

5b08186019dfe5bdc6dc07d7eb22da92.png

上传成功如下:

a7f0344c573cb9342095f58237f4a47d.png

登录微信公众平台,登录小程序平台,找到版本管理选项,可以看到刚才上传的小程序,如下图所示。

758e7ed5a545838e5dbf9e4785075c67.png

提交审核,下一步。

2210fbb389571e73e4e3bb2c81e7ec71.png

继续提交。

a13a21449adc06cf3e6f8f969baeb7a0.png

填写相关信息。

365a4c8ee1f3ac72fa1f81eb43756c7e.png

确定提交。

c559b1a9a5ac16c987ac34a08424103e.png

等待审核。

67cf7eb7774fd045c770cd632f98447d.png

审核通过,发布即可。

7db2c325cdc266094de1ee58a45f7953.png

发布后,手机上会自动出现发布的小程序,可以打开查看。

ESP32 MQTT旧版本程序与新版本有区别但不大,旧版本鉴权信息可以自己设定。

#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"
#include "Ticker.h"
#include <Wire.h>
const char *ssid = "Redmi K40";               //wifi名
const char *password = "********";       //wifi密码
const char *mqtt_server = "183.230.40.39"; //onenet 的 IP地址
const int led =2; //灯的接口
#define mqtt_devid "*****" //设备ID
#define mqtt_pubid "*****"        //产品ID
//鉴权信息
#define mqtt_password "*****" //鉴权信息(自己设定的不需要token)
#define Addr_SHT30 0x44     // SHT30 IIC 7位地址为0x44
#define SDA_PIN 21          //引脚接法在这里
#define SCL_PIN 22
WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端


char msg_buf[200];                                //发送信息缓冲区
char dataTemplate[] = "{\"temp\":%.2f,\"hum\":%.2f}"; //信息模板
char msgJson[75];                                 //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
Ticker tim1;                                      //定时器,用来循环上传数据


//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("连接WIFI");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi连接成功");
}


//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.println("message rev:");
  Serial.println(topic);
  for (size_t i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
    if ((char)payload[0] == '0') {
    digitalWrite(led, LOW);   // 
  } if ((char)payload[0] == '1') {
    digitalWrite(led, HIGH);  // 
  }
  else{}
}


//向主题发送模拟的温湿度数据
void sendTempAndHumi()
{
  if (client.connected())
  {
      unsigned int data[6]; //存储获取到的六个数据
      Wire.beginTransmission(Addr_SHT30);//开始IIC //写地址
      Wire.write(0x2C);    //发送测量命令 0x2C06,但是因为IIC一次只能发一个8位数据,所以得发两次
      Wire.write(0x06);    //停止IIC
      Wire.endTransmission();   //等待500ms是等待SHT30器件测量数据,实际上这个时间可以很短
      delay(500);
      Wire.requestFrom(Addr_SHT30, 6);   //请求获取6字节的数据,然后会存到8266的内存里
      if (Wire.available() == 6)  //读取6字节的数据,这六个字节分别为:温度8位高数据,温度8位低数据,温度8位CRC校验数据,湿度8位高数据,湿度8位低数据,湿度8位CRC校验数据
    {
         data[0] = Wire.read();
         data[1] = Wire.read();
         data[2] = Wire.read();
         data[3] = Wire.read();
         data[4] = Wire.read();
         data[5] = Wire.read();
     }
    float temp = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45;  //然后计算得到的数据,要转化为摄氏度、相对湿度
    float hum = ((((data[3] * 256.0) + data[4]) * 100) / 65535.0);
    snprintf(msgJson, 40, dataTemplate, temp, hum); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
    json_len = strlen(msgJson);                   //msgJson的长度
    msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
    msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
    msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
    memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
    msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
    Serial.print("public message:");
    Serial.println(msgJson);
    client.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  }
}


//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
  while (!client.connected()) //再重连客户端
  {
    Serial.println("reconnect MQTT...");
    if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
    {
      Serial.println("connected");
    }
    else
    {
      Serial.println("failed");
      Serial.println(client.state());
      Serial.println("try again in 5 sec");
      delay(5000);
    }
  }
}


void setup()
{
     pinMode(led,OUTPUT);//输出 
  Wire.begin(SDA_PIN, SCL_PIN);                          //初始化IIC(作为主设备)
  Serial.begin(115200);                                  //初始化串口
  delay(3000);                                           //这个延时是为了让我打开串口助手
  setupWifi();                                           //调用函数连接WIFI
  client.setServer(mqtt_server, 6002);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  client.setCallback(callback);                          //设置好客户端收到信息是的回调
  tim1.attach(1, sendTempAndHumi);                      //定时每1秒调用一次发送数据函数sendTempAndHumi
}


void loop()
{
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
  }
  client.loop(); //客户端循环检测
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值