1. 程式人生 > 實用技巧 >【RT-Thread】 RT-Thread上傳DS18B20溫度值到OneNet

【RT-Thread】 RT-Thread上傳DS18B20溫度值到OneNet

<一> 新增雲平臺產品和裝置

進入https://open.iot.10086.cn/官網登入開發者中心。

在全部產品中選擇多協議接入,因為RT-Thread的軟體包支援的時舊版MQTT,如果使用MQTT物聯網套件需要修改RT-Thread軟體包的部分內容,這裡為了方便,使用的是舊版的MQTT,而且僅僅只是為了學習,新版與舊版也就差了一個鑑權資訊的不同。新版需要計算。

點選 新增產品

填入對應的資訊

新增裝置,需要填入相關資訊。

裝置新增完成後如下,可以點選詳情看一下裝置資訊:注意裝置ID和鑑權資訊,連線雲時需要使用

注意產品ID和Master-APIkey,連線雲時需要使用。

至此,雲平臺這邊已經設定完了,記住幾個RT-Thread 的oneNet軟體包需要的引數資訊:裝置ID,鑑權資訊,產品ID,Master-APIKey

<二> RT-Thread Studio 工程建立

esp8266的聯網可以參考日記ota升級,連結:https://www.cnblogs.com/Raowz/p/13276647.html中有這部分操作。

在對應的引數欄中填入在雲平臺註冊道德裝置引數資訊。

此時,裝置已經可以登入到oneNet雲平臺,編譯下載到開發板上。

測試如下:

下面新增DS18B20測量的溫度資料到oneNet:

ds18b20的新增檢視日記連結:

https://www.cnblogs.com/Raowz/p/13131841.html

需要修改一點程式碼。將測量的得到的溫度通過郵箱傳送給oneNet上傳資料的執行緒。

建立mb

ds18b20傳送mb。oneNet接收mb。

static void read_temp_entry(void *parameter)
{
    rt_device_t dev = RT_NULL;
    struct rt_sensor_data sensor_data;
    rt_size_t res;
    rt_err_t result ;

    rt_mailbox_t rb = (rt_mailbox_t)rt_object_find("temperature", RT_Object_Class_MailBox);
     if(RT_NULL == rb)
     {
         rt_kprintf("not exist %s mailbox \n","temperature");
         return
; } dev = rt_device_find(parameter); if (dev == RT_NULL) { rt_kprintf("Can't find device:%s\n", parameter); return; } if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) { rt_kprintf("open device failed!\n"); return; } rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100); while (1) { res = rt_device_read(dev, 0, &sensor_data, 1); if (res != 1) { rt_kprintf("read data failed!size is %d\n", res); rt_device_close(dev); return; } else { result = rt_mb_send(rb, (rt_ubase_t)sensor_data.data.temp); if(result != 0) { rt_kprintf("rt_mb_send failed\n"); rt_device_close(dev); rt_mb_delete(rb); return; }else{ if (sensor_data.data.temp >= 0) { rt_kprintf("temp:%3d.%dC, timestamp:%5d\n", sensor_data.data.temp / 10, sensor_data.data.temp % 10, sensor_data.timestamp); } else { rt_kprintf("temp:-%2d.%dC, timestamp:%5d\n", abs(sensor_data.data.temp / 10), abs(sensor_data.data.temp % 10), sensor_data.timestamp); } } } rt_thread_mdelay(7000); } }
/* upload random value to temperature*/
static void onenet_upload_entry(void *parameter)
{
    int value = 0;
    rt_err_t result;
    char upload_buf[16] = {0};
    rt_mailbox_t rb = (rt_mailbox_t)rt_object_find("temperature", RT_Object_Class_MailBox);
    if(RT_NULL == rb)
    {
        rt_kprintf("not exist %s mailbox \n","temperature");
        return;

    }
    while (1)
    {
        result = rt_mb_recv(rb,(rt_ubase_t *) &value,  RT_WAITING_FOREVER);
        if(result != 0)
        {
            rt_kprintf("rt_mb_recv failed\n");
            rt_mb_delete(rb);
            return;
        }

        rt_sprintf(upload_buf, "%3d.%2dC",value/10,value%10);
        if (onenet_mqtt_upload_string("temperature", upload_buf) < 0)
        {
            LOG_E("upload has an error, stop uploading");
            break;
        }
        else
        {
            LOG_D("buffer : {\"temperature\":%s}", upload_buf);
        }

        rt_thread_delay(rt_tick_from_millisecond(5 * 1000));
    }
}

結果圖: