2022-04-10

智慧园区能源管控系统

1.实验目的

1.1采集温度、湿度、光照值,并上传OneNET平台
1.2实现公共区域照明系统的灯光自动控制。当光照充足的时候,灯光熄灭。光照暗时,照明灯亮起。
(LED灯模拟照明灯,通过HTTP数据推送将光照值推送给应用程序,由应用程序控制LED开关)

2.实验步骤

2.1代码更改

在程序中设置接入机的地址和鉴权信息(即IMEI和IMSI)

char uri[] = "coap://183.230.102.118:5683";   // 引导机服务
char *serv_addr = "183.230.102.118";          // 接入机 IP 地址,暂时无用
const char endpoint_name[] = "318790567959252;318790567959252";     //IMEI;IMSI

向SDK添加外围硬件驱动,本项目Demo中已经做好LED和光照传感器驱动程序

#include "BH1750.h"     /* 光照传感器 */
#include "Lcd_Driver.h" /* lcd屏 */
nbiot_value_t illumi;   /* 光照 */
nbiot_value_t led;      /* led灯*/
extern float result_lx; /*光照*/

光照传感器的对象ID:3301
灯光控制的对象ID:3311

写回调函数

// "写"回调函数
void write_callback(
        uint16_t       objid,
        uint16_t       instid,
        uint16_t       resid,
        nbiot_value_t *data)
{   
    printf("write /%d/%d/%d:%d\r\n",
            objid,
            instid,
            resid, data->value.as_bool);
      if (objid == 3311 && instid == 0 && resid == 5850)
      {
      if(data->value.as_bool)
      {
      Lcd_Clear(WHITE);
          ledStatus.Led1Sta=1;
      }else
      {
       Lcd_Clear(BLACK);
          ledStatus.Led1Sta=0;
      }
      }
}

读回调函数

// "读"回调函数
void read_callback(
        uint16_t       objid,
        uint16_t       instid,
        uint16_t       resid,
        nbiot_value_t *data)
{   if (objid == 3301 && instid == 0 && resid == 5700) { /* 光照 */
        BH1750_test();
       illumi.value.as_float=result_lx;
}   else if (objid == 3303 && instid == 0 && resid == 5700) {        /* 温度 */
        SHT20_INFO sht20 = { 0 };
        sht20 = SHT20_GetValue();
        temp.value.as_float = sht20.tempreture;
    } else if (objid == 3304 && instid == 0 && resid == 5700) { /* 湿度 */
        SHT20_INFO sht20 = { 0 };
        sht20 = SHT20_GetValue();
        humi.value.as_float = sht20.humidity;
    }

}

添加温湿度,光照资源

   // 添加温度资源
    temp.type = NBIOT_FLOAT;
    temp.flag = NBIOT_READABLE;
    ret = nbiot_resource_add(dev,
            3303,   /* objId */
            0,      /* instId */
            5700,   /* resId */
            &temp);
    if (ret)
    {
        nbiot_device_destroy(dev);
        printf("device add resource(temp) failed, code = %d.\r\n", ret);
    }
    // 添加湿度资源
    humi.type = NBIOT_FLOAT;
    humi.flag = NBIOT_READABLE;
    ret = nbiot_resource_add(dev,
            3304,
            0,
            5700,
            &humi);
    if (ret)
    {
        nbiot_device_destroy(dev);
        printf("device add resource(humi) failed, code = %d.\r\n", ret);
    }
    
    // 添加光照资源
    illumi.type = NBIOT_FLOAT;
    illumi.flag = NBIOT_READABLE;
    ret = nbiot_resource_add(dev,
            3301,
            0,
            5700,
            &illumi);
    if (ret)
    {
        nbiot_device_destroy(dev);
        printf("device add resource(illumi) failed, code = %d.\r\n", ret);
    }

    // 添加LED灯资源
    led.type = NBIOT_BOOLEAN;
    led.flag = NBIOT_READABLE | NBIOT_WRITABLE;
    ret = nbiot_resource_add(dev,
            3311,
            0,
            5850,
            &led);
    if (ret)
    {
        nbiot_device_destroy(dev);
        printf("device add resource(led) failed, code = %d.\r\n", ret);
    }

温湿度资源更新

// 更新资源
void res_update(time_t interval)
{
    SHT20_INFO sht20;
    if (cur_time >= last_time + interval) {
        cur_time = 0;
        last_time = 0;

        /* 更新温湿度数值 */
        temp.flag |= NBIOT_UPDATED;
        humi.flag |= NBIOT_UPDATED;
        sht20 = SHT20_GetValue();
        temp.value.as_float = sht20.tempreture;
        humi.value.as_float = sht20.humidity;
            
    } else if (cur_time == 0 && last_time == 0) {
        cur_time = nbiot_time();
        last_time = cur_time;
    } else {
        cur_time = nbiot_time();
    }
}

int main(int argc, char *argv[])
{
    int life_time = 300;
    int ret;

2.2平台控制

资源列表
资源列表
读写控制

2.3Postman

返回现象

LCD屏现象


屏幕亮

屏幕暗

实验总结

通过此次项目的实施,能够实现对园区内的温湿度实时检测
认知了南向通信协议和北调API
熟悉了北调API
在这次项目中更熟悉了postman的用法
了解到了通过数据推送的方式控制LCD屏幕

你可能感兴趣的:(2022-04-10)