0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CW32的物联网应用

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2023-11-02 15:55 次阅读

一、简介

1.这期视频向大家介绍如何使用CW32单片机通过ESP8266连接OneNET物联网平台,发送温湿度数据到平台,并接受平台的云控制。

二、所需物料

2.本实验使用到了CW32-48F大学计划开发板、DHT11温湿度传感器模块、ESP8266WIFI模块及Keil5开发环境。
图片2.png

CW32-48F大学计划板
图片

DHT11温湿度传感器模块
图片

ESP8266WIFI模块
图片

ESP8266WIFI模块引脚分布
图片1.png

实物图

3.接线:根据原理图,把模块连接到开发板上

(1)ESP8266WIFI模块:

开发板上预留了该模块接口,通过串口向ESP8266写入指令。

图片

(2)DHT11模块:开发板上预留了该模块接口

图片

4.(1)MQTT协议介绍:

MQTT是一种轻量级的发布/订阅消息传输协议,常用于物联网领域。它的特点是简化和减少了网络流量,可以高效地进行数据传输。在本次应用中,我们将使用MQTT协议进行数据上传。

(2)OneNET代码介绍:

在使用OneNet平台时,我们需要使用TCP协议进行连接。首先需要设置好TCP协议的相关参数,然后通过POST方法将温湿度数据上传到OneNet平台中。在上传数据时需要使用OneNet平台提供的API接口进行数据传输。

注: **#define ** PROID"XXX **" ** //xxx产品ID

#define ACCESS_KEY "XXX **" ** //xxx为acess_key访问密钥

#define DEVICE_NAME ** "** XXX" //xxx为设备名称

图片

图片

三、核心代码

main.c

int main(void)
{  
 unsigned short timeCount = 0;  //发送间隔变量  
 unsigned char *dataPtr = NULL;

 Hardware_Init();        //初始化外围硬件
  while(DHT11_Init())    //检测DHT11
   Delay_ms(200);
 ESP8266_Init();          //初始化ESP8266
 UsartPrintf(USART_DEBUG, "Connect MQTTs Server...rn");
 while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) //ESP8266联网
   Delay_ms(500);
 UsartPrintf(USART_DEBUG, "NET_OKrn");  
 while(OneNet_DevLink())      //接入OneNET
   Delay_ms(500);
 OneNET_Subscribe();     //订阅消息传输,允许接受下发指令
 TFTShowString(0,0,"     OneNET     ");  //界面
 TFTShowString(1,0,"  智能物联平台  ");
 TFTShowString(3,0,"humidity:    %");
 TFTShowString(4,0,"temperature:  C");
 while(1)
 {
   if(++timeCount >= 50)                  
   {
     DHT11_Read_Data(&temperature,&humidity);  //读取温湿度值  
     TFTShowNumber(3,10,humidity);
     TFTShowNumber(4,12,temperature);
     UsartPrintf(USART_DEBUG,"TEMP:%d HUMI:%drn",temperature,humidity);
     UsartPrintf(USART_DEBUG, "OneNet_SendDatarn");
     OneNet_SendData();        //数据上传
     timeCount = 0;
     ESP8266_Clear();    //清除缓存
   }  

   dataPtr = ESP8266_GetIPD(0); //接收OneNET平台返回的数据
   if(dataPtr != NULL)
     OneNet_RevPro(dataPtr); //确认返回数据,执行下发命令

   Delay_ms(10);
 }
}

Onenet.c:

#define PROID      "3OB4R7cKCw"       //产品ID(名称)
#define ACCESS_KEY    "n7GptYNpf9U97zHTz2ltc1Pvy4GB+0MXsU1nKel9ixc="  //产品访问密钥
#define DEVICE_NAME    "111"     //设备ID(名称)
void OneNet_RevPro(unsigned char *cmd)
{
 char *req_payload = NULL;
 char *cmdid_topic = NULL;
 unsigned short topic_len = 0;
 unsigned short req_len = 0;
 unsigned char qos = 0;
 static unsigned short pkt_id = 0;
 unsigned char type = 0;
 short result = 0;
 char *dataPtr = NULL;
 char numBuf[10];
 int num = 0;

 type = MQTT_UnPacketRecv(cmd);
 switch(type)
 {
   case MQTT_PKT_PUBLISH:                                //接收的Publish消息

     result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
     if(result == 0)
     {
       char *data_ptr = NULL;
       UsartPrintf(USART_DEBUG, "topic: %s, topic_len: %d, payload: %s, payload_len: %drn",  cmdid_topic, topic_len, req_payload, req_len);
       data_ptr = strstr(cmdid_topic, "request/");                  //查找cmdid
       if(data_ptr)
       {
         char topic_buf[80], cmdid[40];

         data_ptr = strchr(data_ptr, '/');
         data_ptr++;

         memcpy(cmdid, data_ptr, 36);                      //复制cmdid
         cmdid[36] = 0;
         snprintf(topic_buf, sizeof(topic_buf), "$sys/%s/%s/cmd/response/%s",
                             PROID, DEVICE_NAME, cmdid);
         OneNET_Publish(topic_buf, "ojbk");                    //回复命令
       }
     }
     case MQTT_PKT_PUBACK:                            //发送Publish消息,平台回复的Ack
         if(MQTT_UnPacketPublishAck(cmd) == 0)
       UsartPrintf(USART_DEBUG, "Tips:  MQTT Publish Send OKrn");
   break;
   case MQTT_PKT_SUBACK:                                //发送Subscribe消息的Ack

     if(MQTT_UnPacketSubscribe(cmd) == 0)
       UsartPrintf(USART_DEBUG, "Tips:  MQTT Subscribe OKrn");
     else
       UsartPrintf(USART_DEBUG, "Tips:  MQTT Subscribe Errrn");
   break;
   default:
     result = -1;
   break;
 }

 ESP8266_Clear();                  //清空缓存

 if(result == -1)
   return;

 dataPtr = strchr(req_payload, ':');          //搜索':'
 if(dataPtr != NULL)          //如果找到了
 {
   dataPtr++;
   while(*dataPtr >= '0' && *dataPtr <= '9')    //判断是否是下发的命令控制数据
   {
     numBuf[num++] = *dataPtr++;
   }
   numBuf[num] = 0;
   num = atoi((const char *)numBuf);        //转为数值形式
   if(strstr((char *)req_payload, "light"))    //搜索"light",判断":"后面的数值进行控制
   {
     if(num == 1)                //控制数据如果为1,代表开
     {
       UsartPrintf(USART_DEBUG, "接收到1rn");
       //开灯
       PA07_SETLOW();
       TFTShowString(5,0,"light: ON ");
     }
     else if(num == 0)              //控制数据如果为0,代表关
     {
       UsartPrintf(USART_DEBUG, "接收到0rn");
       //关灯
       PA07_SETHIGH();
       TFTShowString(5,0,"light: OFF");
     }
   }
 }
 if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
 {
   MQTT_FreeBuffer(cmdid_topic);
   MQTT_FreeBuffer(req_payload);
 }
}

附件:基于CW32的物联网应用源码.zip
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2870

    文章

    41639

    浏览量

    358412
  • OneNET
    +关注

    关注

    1

    文章

    44

    浏览量

    12577
  • 单片机
    +关注

    关注

    0

    文章

    168

    浏览量

    16658
  • CW32
    +关注

    关注

    1

    文章

    122

    浏览量

    232
收藏 人收藏

    评论

    相关推荐

    CW32移植Free-RTOS】CW32开发者扶持计划

    CW32配置Free-RTOS全过程,CW32开发者扶持计划
    的头像 发表于 04-18 09:38 5566次阅读
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>开发者扶持计划

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 871次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    【产品介绍】CW32_IoT_EVA联网开发评估套件介绍

    (Pin2Pin兼容),软件及固件库与进口品牌风格一致,可快速上手。CW32_IoT-EVA评估套件例程丰富,入手简单:既有CW32的入门应用例程、ADC、串口、定时器等各种外设应用功能例程,也有丰富的
    发表于 09-22 16:19

    CW32饭盒派开发板试用体验】开箱测试

    CW32饭盒派开发板试用体验】+开箱测试 硬件资源介绍 CW32饭盒派是一款基于CW32F030C8T6的开发板。板载资源丰富:一电位器、蜂鸣器、3路用户按键、3路指示灯、USART接口、电源接口
    发表于 05-13 00:20

    CW Programmer CW32系列芯片烧录工具配套软件

    CW Programmer CW32系列芯片的烧录工具配套软件
    发表于 09-15 07:44

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 2259次阅读

    cw32和gd32的区别

    cw32和gd32的区别 CW32和GD32是两种不同的芯片系列,分别由WCH和GigaDevice公司推出,两者有很多不同之处,下面我们来详细介绍。 首先从CW32系列开始,CW32
    的头像 发表于 08-16 11:15 1121次阅读

    基于CW32的无刷水泵方案

    基于CW32的无刷水泵方案
    的头像 发表于 11-03 17:28 448次阅读
    基于<b class='flag-5'>CW32</b>的无刷水泵方案

    基于CW32热敏电阻采集温度应用

    基于CW32热敏电阻采集温度应用
    的头像 发表于 10-25 16:45 247次阅读
    基于<b class='flag-5'>CW32</b>热敏电阻采集温度应用

    CW32 电容式触摸按键设计指南

    CW32 电容式触摸按键设计指南
    的头像 发表于 10-25 16:36 588次阅读
    <b class='flag-5'>CW32</b> 电容式触摸按键设计指南

    CW32 PWM输出功能介绍

    CW32 PWM输出功能介绍
    的头像 发表于 09-27 16:12 414次阅读
    <b class='flag-5'>CW32</b> PWM输出功能介绍

    CW32实时时钟(RTC)介绍

    CW32实时时钟(RTC)介绍
    的头像 发表于 10-24 15:36 528次阅读
    <b class='flag-5'>CW32</b>实时时钟(RTC)介绍

    2023电赛A题国奖CW32 开源分享

    电赛A题开源分享,主控为CW32
    的头像 发表于 11-02 10:16 787次阅读
    2023电赛A题国奖<b class='flag-5'>CW32</b> 开源分享

    基于CW32的RC522刷卡模块的应用

    基于CW32的RC522刷卡模块的应用
    的头像 发表于 11-02 14:53 540次阅读
    基于<b class='flag-5'>CW32</b>的RC522刷卡模块的应用