NUC980开发板DIY项目大挑战:室内环境采集监测系统

基于STM32的空气质量监测系统简单案例 基于STM32的空气质量监测系统简单案例系统简介软硬件介绍STM32F103开发板MQ135空气质量传感器DS18B20温度传感器设计流程硬件连接涉及内容效果显示项目源码ADC部分DS18B20RTC部分main部分 系统简介 系统使用正点原子的STM32F103 Mini开发板,通过MQ135空气质量传感器,实现简单的空气质量监测案例。 部分代码参考正点原子实验板代码。 软硬件介绍 软件:Kei... 阅读详情

本文由RT-Thread论坛用户@纯白酱原创发布:https://club.rt-thread.org/ask/article/75b0b1edc9ec7289.html

#项目描述
使用新唐公司的NUC980,开发一款室内环境监测平台。采集端通常位于家庭中的室内,采集传感器数据,如温湿度数据,光照数据,空气质量数据等,读取完成后,打包成json格式的数据,通过以太网,使用http post方式传输传感器数据。
#设备清单
主控板:NUC980-IOT
传感器扩展板:板载多种传感器
服务器:基于腾讯云搭建的一款云服务器,运行的是Windows server 2019,已安装thingsboard开源物联网云平台。
#传感器扩展板简介
定位模块:基于华大北斗的TAU1202,默认波特率为115200,双频定位,亚米级定位,定位效果优异。

光照度:基于vishy的vcnl4040

温湿度:基于盛思锐的SHT30

二氧化碳浓度/空气质量指数(TVOC):基于盛思锐的SGP30

PM2.5:基于攀藤科技的PMS7003

甲醛:基于达特的WS-K-S甲醛传感器模组

大气压强:基于歌尔电子的SPL06-007(可以等效替代SPL06-001)

姿态:基于invensense的mpu-6050
#重要提示
1、服务器部分,运行的thingsboard社区版,可以自用/商用,本次是运行在腾讯云的服务器上的,也可以运行在树莓派等嵌入式linux平台上,方便用户管理传感器数据,确保传感器数据不流通至外网。
2、传感器扩展板支持多种传感器,通信接口为I2C和串口。本次只用到I2C接口,且I2C接口的姿态传感器并未使用(因为感觉室内不需要监测自身的姿态数据)。串口接口的传感器并未使用。
#测试截图
QQ图片20220515164301.png
QQ图片20220515165127.png
#开发流程
##采集端开发流程
###一、RT-Thread Studio下载并安装
在https://www.rt-thread.org/page/studio.html中,下载并安装RT-Thread Studio,并提前注册好RT-Thread账号,并在安装好后登录RT-Thread Studio
###二、安装开发板资源包
1、打开RT-Thread Studioccb65c3e1812a315b5b758b98cb415ca.png

2、进入主页面后,点击SDK Manager,可以安装本次活动的开发板NUC980-IOT的支持包
b32599090bbc15745d25f30b0cbb7e92.png

3、拖动右侧的滑块到下面,选择NK-980IOT,安装BSP资源包
e403b5cedb9886d4eabbe28bbb45d23b.png.webp

4、使用两根microusb数据线,分别连接两根USB接口(在左上方),将拨码开关均调节至off模式,即boot from usb模式,此模式可以下载程序用,例如下载到DDR中直接运行程序,方便程序调试阶段,不间断更新程序。或者下载到板载SPI NAND中,并通过调节拨码开关均至ON,按图中最左侧RESET按键后,即可从SPI NAND中运行程序,即正常发出给客户时,运行程序的模式。
ff87923ab651bdfa1d5df371501f8528.png.webp

两个USB接口分别为虚拟串口和调试下载的功能,同时连接,方便观测调试数据和下载程序。
###三、创建工程
选择文件-新建-RT-THhread项目,创建基于开发板资源包的工程
2e85b76b95d566af314439efb0dc7db8.png.webp

点击基于开发板,并选择开发板为NK-980IOT,自定义取名工程名称,注意不要与现有的工程名称重复,填写完毕后,点击完成,并等待IDE创建工程,约半分钟到两分钟左右,具体时间由开发者的电脑性能决定。
337f404df2a38bb9eff6ca68e656e4f6.png.webp

###四、编译程序
创建好工程后,双击project name/application/main.c,可以看到main.c中有一个点灯例程。
c55f39c01884295cc05facf5e4fb94d5.png.webp

图中定义了板载的三个LED对应的引脚,其中,PG15引脚对应板载的绿色LED灯,但是PG15引脚上电默认为JTAG功能,并非普通GPIO,需要在project name/board/nu_pin_init.c文件中,初始化该引脚,系统会自动调用该函数
1c1ee4aafa4f5618af33392b5c741af2.png.webp

初始化后,板载的三个LED灯则均能正常闪烁
ec1ee4499537746975d07aa2cf8f97bb.png.webp

点击左上角的编译按钮,即可编译好程序,并在project name/Debug目录下生成rtthread.bin文件,初始demo工程,通常编译用时在一分钟左右,时间由电脑CPU性能决定。
f27678dbb08d0a3e14d1d542a0b8e7d3.png.webp

###五、下载程序
下载NU_Wrtier软件,链接:https://gitee.com/OpenNuvoton/NUC980_NuCWriter.git,可以git clone该仓库,并在NUC980_NuCWriter/ Release / Win64中运行。

下载好后,运行软件,并参考https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/nk-rtu980,readme.md中,下载程序到DDR的内容。

使用 NuWriter 将 rtthread.bin 下载到 SDRAM 中,然后运行它。

选择类型:DDR/SRAM << Press Re-Connect >> 选择文件:指定您的 rtthread.bin 文件(在project name/Debug目录下)。 执行地址:0x0 选项:下载并运行 << Press Download >> Enjoy!!!
2770f284faf0d4e873f89965d02feb59.png.webp
###六、正式开发程序
根据本次项目需求,确定需要使用的传感器驱动程序和设备驱动程序和数据处理驱动程序,目录如下:

序号名称功能是否已适配软件包?
1温湿度传感器通过I2C,读取温湿度传感器数据是
2光照度传感器通过I2C,读取光照度传感器数据否,需要自行根据编写驱动程序
3空气质量传感器通过I2C,读取空气质量传感器数据是
4CJSON将读取出的各项传感器数据处理为JSON格式是
5以太网驱动通过以太网,传输数据到指定地址是
6HTTP POST基于TCP通信,通过HTTP协议,POST方法,向指定地址发送处理好的传感器数据(JSON格式)是

根据上述分析,分别添加各项软件包:

双击RT-Thread Setting
74b24ad981258b291280334b70535803.png
添加如图的软件包
e220f0b2ccb53bc8d79507e98674cbd8.png
在硬件栏中使能传感器通信接口I2C2
d3739bda2bce5afd6d8498d9aae47d6a.png.webp
使能完毕后,在main.c中添加初始化sgp30的相关函数

#define SGP30_I2C_BUS_NAME       "i2c2"
#define SGP30_I2C_ADDRESS        0x58

static int rt_hw_sgp30_port(void)
{
    struct rt_sensor_config cfg;

    cfg.intf.type = RT_SENSOR_INTF_I2C;
    cfg.intf.dev_name = SGP30_I2C_BUS_NAME;
    cfg.intf.user_data = (void *) SGP30_I2C_ADDRESS;
    rt_hw_sgp30_init("sg3", &cfg);

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_sgp30_port);

根据论坛,及官方文档,分别调用软件包,并读取传感器数据。由于vcnl4040光照度传感器,并未有软件包适配,我们根据RT-Thread统一的I2C通信驱动,编写读取程序:

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-07-09     coolwhite       the first version
 */
#include <rtthread.h>
#define DBG_ENABLE
#define DBG_LEVEL DBG_LOG
#define DBG_SECTION_NAME  "VCNL4040"
#define DBG_COLOR
#include <rtdevice.h>
#include <stdio.h>
#include <ulog.h>
#include <rtdbg.h>



#define HW_ADR 0x60
rt_uint32_t test;
rt_uint32_t Illuminance_als;
static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */
rt_uint8_t l;
rt_uint8_t h;
static rt_err_t vcnl4040_write(struct rt_i2c_bus_device *bus, uint8_t hwadr, uint8_t reg, rt_uint8_t *data)
{
    rt_uint8_t buf[3];
    struct rt_i2c_msg msgs;
    rt_uint32_t buf_size = 1;
    buf[0] = reg; //cmd
    if (data != RT_NULL)
    {
        buf[1] = data[0];
        buf[2] = data[1];
        buf_size = 3;
    }

    msgs.addr = hwadr;
    msgs.flags = RT_I2C_WR;
    msgs.buf = buf;
    msgs.len = buf_size;

    /* 调用I2C设备接口传输数据 */
    if (rt_i2c_transfer(bus, &msgs, 1) == 1)
    {
        return RT_EOK;
    }
    else
    {
        return -RT_ERROR;
    }
}
rt_err_t read_regs(struct rt_i2c_bus_device *bus, uint8_t reg, rt_uint8_t *data)
{
    struct rt_i2c_msg msgs[2];
    rt_int8_t res = 0;
    msgs[0].addr = HW_ADR; /* Slave address */
    msgs[0].flags = RT_I2C_WR; /* Write flag */
    msgs[0].buf = &reg; /* Slave register address */
    msgs[0].len = 1; /* Number of bytes sent */

    msgs[1].addr = HW_ADR; /* Slave address */
    msgs[1].flags = RT_I2C_RD; /* Read flag */
    msgs[1].buf = data; /* Read data pointer */
    msgs[1].len = 2; /* Number of bytes read */

    if (rt_i2c_transfer((struct rt_i2c_bus_device *) bus, msgs, 2) == 2)
    {
        res = RT_EOK;
    }
    else
    {
        res = -RT_ERROR;
    }
}
void vcnl4040_init(const char *name)
{
    /* 查找I2C总线设备,获取I2C总线设备句柄 */
    i2c_bus = (struct rt_i2c_bus_device *) rt_device_find(name);

    if (i2c_bus == RT_NULL)
    {
        rt_kprintf("can't find %s device!\n", name);
    }
    else
    {
        rt_uint8_t cmd[2];
        cmd[0] = 0x00;
        cmd[1] = 0x00;
        vcnl4040_write(i2c_bus, HW_ADR, 0x00, cmd);
        rt_kprintf("vncl4040 init sussess at %s", name);
        rt_thread_mdelay(500);
    }
}
void test_vcnl4040()
{
    rt_uint8_t data[2];
    data[0] = 0x00;
    data[1] = 0x00;
    rt_uint8_t data1[2];
    data1[0] = 0x00;
    data1[1] = 0x00;
    rt_uint8_t als_l;
    rt_uint8_t als_h;
    read_regs(i2c_bus, 0x09, data1);
    l = data[0];
    h = data[1];
    als_l = data1[0];
    als_h = data1[1];
    rt_uint16_t als_data;
    als_data = als_h;
    als_data <<= 8;
    als_data += als_l;
    Illuminance_als = als_data / 10;
    LOG_I("Illuminance_als=%d\n",Illuminance_als);
}

在application文件夹中,创建一个cloud_send.c文件,在其中,调用cjson软件包,并处理传感器数据为JSON格式:

    char *thingsboard_sensor_send;
    cJSON *csensor = cJSON_CreateObject();
    cJSON *cbaro = cJSON_CreateNumber(baro);
    cJSON *cco2concentration = cJSON_CreateNumber(co2concentration);
    cJSON *ctvocconcentration = cJSON_CreateNumber(tvocconcentration);
    cJSON *chumidity = cJSON_CreateNumber(humi1);
    cJSON *ctemperature = cJSON_CreateNumber(temp1);
    cJSON *cIlluminance_als = cJSON_CreateNumber(Illuminance_als);
    cJSON_AddItemToObject(csensor, "Illuminance_als", cIlluminance_als);
    cJSON_AddItemToObject(csensor, "baro", cbaro);
    cJSON_AddItemToObject(csensor, "co2concentration", cco2concentration);
    cJSON_AddItemToObject(csensor, "tvocconcentration", ctvocconcentration);
    cJSON_AddItemToObject(csensor, "humidity", chumidity);
    cJSON_AddItemToObject(csensor, "temperature", ctemperature);
    thingsboard_sensor_send = cJSON_Print(csensor);

处理好传感器数据后,调用webclient软件包,发送传感器数据到指定地址:

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-05-05     11618       the first version
 */
/*
 * Copyright (c) 2006-2022, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-08-03    chenyong      the first version
 */

#include <string.h>

#include <rtthread.h>
#include <webclient.h>
#include <cJson.h>
#define POST_RESP_BUFSZ                10240
#define POST_HEADER_BUFSZ              10240
#define POST_LOCAL_URI                 "http://124.220.198.111:8080/api/v1/QLYe1sufLVvb2e2K3lFb/telemetry"
extern double temp1;
extern double humi1;
extern double baro;
extern int32_t co2concentration;
extern int32_t tvocconcentration;
extern rt_uint32_t Illuminance_als;
/* send HTTP POST request by common request interface, it used to receive longer data */
static int webclient_post_comm(const char *uri, const void *post_data, size_t data_len)
{
    struct webclient_session* session = RT_NULL;
    unsigned char *buffer = RT_NULL;
    int index, ret = 0;
    int bytes_read, resp_status;

    buffer = (unsigned char *) web_malloc(POST_RESP_BUFSZ);
    if (buffer == RT_NULL)
    {
        rt_kprintf("no memory for receive response buffer.\n");
        ret = -RT_ENOMEM;
        goto __exit;
    }

    /* create webclient session and set header response size */
    session = webclient_session_create(POST_HEADER_BUFSZ);
    if (session == RT_NULL)
    {
        ret = -RT_ENOMEM;
        goto __exit;
    }

    /* build header for upload */
    webclient_header_fields_add(session, "Content-Length: %d\r\n", strlen(post_data));
    webclient_header_fields_add(session, "Content-Type: application/octet-stream\r\n");

    /* send POST request by default header */
    if ((resp_status = webclient_post(session, uri, post_data, data_len)) != 200)
    {
        rt_kprintf("webclient POST request failed, response(%d) error.\n", resp_status);
        ret = -RT_ERROR;
        session == RT_NULL;
        goto __exit;
    }
    __exit: if (session)
    {
        webclient_close(session);
        session == RT_NULL;
    }

    if (buffer)
    {
        web_free(buffer);
    }
    session == RT_NULL;
    return ret;
}

/* send HTTP POST request by simplify request interface, it used to received shorter data */
static int webclient_post_smpl(const char *uri, const char *post_data, size_t data_len)
{
    char *response = RT_NULL;
    char *header = RT_NULL;
    size_t resp_len = 0;
    int index = 0;

    webclient_request_header_add(&header, "Content-Length: %d\r\n", strlen(post_data));
    webclient_request_header_add(&header, "Content-Type: application/octet-stream\r\n");

    if (webclient_request(uri, header, post_data, data_len, (void **) &response, &resp_len) < 0)
    {
        rt_kprintf("webclient send post request failed.");
        web_free(header);
        return -RT_ERROR;
    }

    rt_kprintf("webclient send post request by simplify request interface.\n");

    if (header)
    {
        web_free(header);
    }

    if (response)
    {
        web_free(response);
    }

    return 0;
}

void thingsboard_post_test()
{
    char *uri = RT_NULL;
    char *thingsboard_sensor_send;
    cJSON *csensor = cJSON_CreateObject();
    cJSON *cbaro = cJSON_CreateNumber(baro);
    cJSON *cco2concentration = cJSON_CreateNumber(co2concentration);
    cJSON *ctvocconcentration = cJSON_CreateNumber(tvocconcentration);
    cJSON *chumidity = cJSON_CreateNumber(humi1);
    cJSON *ctemperature = cJSON_CreateNumber(temp1);
    cJSON *cIlluminance_als = cJSON_CreateNumber(Illuminance_als);
    cJSON_AddItemToObject(csensor, "Illuminance_als", cIlluminance_als);
    cJSON_AddItemToObject(csensor, "baro", cbaro);
    cJSON_AddItemToObject(csensor, "co2concentration", cco2concentration);
    cJSON_AddItemToObject(csensor, "tvocconcentration", ctvocconcentration);
    cJSON_AddItemToObject(csensor, "humidity", chumidity);
    cJSON_AddItemToObject(csensor, "temperature", ctemperature);
    thingsboard_sensor_send = cJSON_Print(csensor);

        uri = web_strdup(POST_LOCAL_URI);
        if (uri == RT_NULL)
        {
            rt_kprintf("no memory for create post request uri buffer.\n");

        }

        webclient_post_comm(uri, (void *) thingsboard_sensor_send, rt_strlen(thingsboard_sensor_send));









    if (uri)
    {
        web_free(uri);
    }
    cJSON_Delete(csensor);
    thingsboard_sensor_send=RT_NULL;
    rt_free(thingsboard_sensor_send);
    rt_thread_mdelay(1000);
}

#ifdef FINSH_USING_MSH
#include <finsh.h>
//MSH_CMD_EXPORT_ALIAS(thingsboard_post_test, thingsboard_post_test, webclient post request test.);
#endif /* FINSH_USING_MSH */

###七、连接硬件并再次下载程序
将传感器扩展板与NK-980IOT开发板,使用杜邦线连接,并插上网线,使用USB数据线,连接电脑并下载程序,下载程序步骤可以参考上文,不再赘述。
下载完成后,采集端开发告一段落。
…

NUC980的libmodbus库移植(基于485的通讯) 注意这里--host为编译对应系统工具链,安装交叉编译环境的时候对应的编译工具链,--prefix为输出目录,存放libmodbus编译完成后生成的文件。1,modbus_rtu_set_serial_mode为485模式时,打印返回值会发现一直为-1,网上查了很久也没用答案。2,下载完成后,我在Ubuntu中新建了libmodbus目录,拷贝到libmodbus中解压,解压后如图。4,编译完成后,会在LIBMODBUS中生成对应的文件,头文件在include,库在lib中。5,设置完成后连接。 阅读详情

相关推荐

华大北斗TAU1201双频亚米级高精度GNSS定位模块深度解析

TAU1201是华大北斗(HDSC)推出的双频段(L1+L5)亚米级高精度GNSS定位模块,突破传统单频模块的精度限制,实现0.5-1米定位精度,同时支持GPS/BDS/GLONASS/Galileo/QZSS五大卫星系统,适用于对定位精度要求严苛的场景。

ssx83948880的博客 1435

bme280 环境传感器开发板_盘一盘那些年我们常用的物联网开发板!

来源:华为云社区,作者:星辰27,直接来源:华为开发者社区众所周知开发板是物联网架构中的感知层智能设备,这类设备通常有芯片、通信模组、以及操作系统组成。当然不同的开发版在功能以及使用上可能存在着一定的差别,下面为大家介绍几款常用的物联网开发板。Arduino开发板Arduino开发板本着让用户简单使用而且开源的设计理念,具有灵活便捷、入手门槛低、同时具有丰富接口、多功能、易扩展等优点,因...

weixin_39678163的博客 279

这应该是关于GPS定位写得最详实清晰的文章之一

本文咱们就说说和物联网关系密切的卫星定位那些事儿。 介绍篇 过去,如果你的女友是个路痴,大概会有这样的对话…… ——你在哪儿呢? ——啊?我在马路上啊。 ——有什么特征? ——头顶有个月亮。 ——你旁边有什么啊? ——有个路灯。 ——有没有路牌啊?路牌上写的什么? ——我看看啊。还真的有,上边写着“禁止停车 违者罚款”。 ——姑奶奶,我真是服了你了…… ——哼,你是不是不爱我了,你肯定是不爱我了,你是不是喜欢上了新来的那个前台? ——。。。 ——我跟你说那个前台绝对是个伪.

LETFLY'S LAB 1万+

新唐NUC980使用记录(5.10.y内核):访问以太网(LAN8720A) & 启用SSH

这篇文章主要测试新唐NUC980(5.10.y内核)访问以太网(PHY为LAN8720A)以及启用SSH。

Naisu的各种笔记 2088

当R语言遇见MaxENT:参数优化的艺术与自动化调参实践

本文探讨了R语言与MaxENT在生态位建模中的结合应用,重点介绍了参数优化与自动化调参的实践方法。通过caret与ENMeval工具链,研究人员可以高效处理多物种、多环境变量的大规模分析任务,提升模型性能与工作效率。文章还涵盖了从数据准备到结果可视化的全流程,为生态学家提供了实用的技术指导。

corn8的博客 455

Unity UGUI深度优化

Unity UGUI优化相关

不定时分享所学所得,包括游戏开发和其他收获! 2717

新唐Nuc980学习笔记1 - 工程创建和下载

一、新唐nuc980新唐nuc980 iot开发板是Linux 工业物联网开发平台,新唐科技提供工业物联网开发平台采用 NUC980DK 微处理器,此为一套完整的工业用物联网开平台,包含了完整的硬件设计与软件参考设计。包含了新唐执行速度 300 MHz 的 ARM9 MPU 内建最高 128 MB DDR 内存、单一 10/ 100 以太网口、2 个高速 USB 主机、1 Gb SPI NAND...

weixin_46158019的博客 2148

STM32 伺服电机 指令脉冲+方向位置控制模式 主从定时器 实现PWM脉冲数精确控制

实验室有个项目涉及到多个步进电机以及伺服电机的控制,需要电机得到一个触发信号后精确移动一段距离。 下面以单个伺服电机控制为例,利用伺服电机的指令脉冲加方向位置控制模式实现jing'que ...

phcdd的博客 2万+

新唐NUC980使用记录:基础说明与资料索引

文章目录前言基础说明上电设置电路设计供电复位时钟源启动设置与启动源USB接口以太网接口资料索引 前言 最初知道 新唐(nuvoton) 是因为别人推荐的国产单片机厂家,不过国产单片机厂家可选择的太多了,也就一直没有用过它们加的单片机。后来在寻找适合入门学习嵌入式Linux的时候发现了新唐的微处理器。目前它家的微处理器最新的是NUC980系列。 新唐的微处理器在入门学习嵌入式Linux方面有点优势: 数据手册、参考手册、硬件参考设计、BSP包、开发板资料等完全开放; 这是选择一颗芯片最核心的需求,没有这个就

Naisu的各种笔记 1万+

安装 miniconda linux

安装 miniconda linux

jacke121的专栏 1万+

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 778

CHAPTER 11 Nanometer Design Studies

这一章介绍深亚米40nm工艺模拟电路设计, 供电1V. 我们首先学习深亚米工艺下器件的非理想性, 和设计步骤 以运放设计, 仿真, 优化为例. 最后设计高速, 高精度的运放, 同时功耗要小.

2304_76736886的博客 1199

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 683

bme280 环境传感器开发板_STM32 F072RBT6 开发板的学习

课程简介:STM32 Nucleo系列开发板具有 mbed功能,支持Arduino接口,同时还提供ST Morpho扩展排针,可连接微控制器的所有周边外设。作为一个具有mbed功能的电路板,STM32 Nucleo开发板让开发人员能够利用mbed开源软件平台、在线工具和mbed.org的合作基础设施开发创新应用。这块板子的Arduino排针兼容Arduino巨大生态系统的各种Shield...

weixin_39764603的博客 367

9.27华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

9.26华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

算法大师! 481

Claude Code 100个真实案例 - 用AI搭建LangChain多工具Agent(自主搜索+查询)

本案例展示如何使用 Claude Code 搭建一个 LangChain 多工具 Agent 系统。Agent 能够自主决定调用搜索引擎、数据库查询、天气查询、计算器等工具,像人类助手一样拆解问题并逐步解决。

yueyeguzhuo的专栏 557

香!好用图源!ArcGIS、QGIS、奥维、图新...都能免费调用的高清亚米级图源

香!好用图源!ArcGIS、QGIS、奥维、图新...都能免费调用的高清亚米级图源

qq_43173805的博客 8814

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NUC980开源项目1-项目准备

上面是我创建的群聊,欢迎新朋友的加入。 最近准备做一个开源项目,嵌入式linux方面的。 1.芯片选择 The NUC980DK61YC series with the ARM926EJ-S core can operate at up to 300 MHz . It offers 128-pin LQFP packages stacked with 64 MB DDR-II Mem...

Jun626的博客 5871

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《嵌入式系统 – NUC980 IoT应用开发实战指南(基于RT-Thread系统)》第4章 NUC980 IoT 使用WiFi联网

开发环境: IDE:RT-Thread Studio 开发板:NUC980 IoT WiFi:ESP8266 4.1 ESP8266简介 ESP8266 是乐鑫推出的 WIFI SOC,市场上可以找到很多基于 ESP8266 的 wifi 模块,价钱也很便宜,使用起来也很方便,可以 通过 UART 使用 AT 命令来使用,也可以通过乐鑫提供的 SDK 进行开发。笔者这里使用的是ESP8266-01S模块。 ESP8266 WiFi模组常用AT指令:  AT+RST 复位模组  AT+GMR 查询版本

不问归期的博客 3427

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Nuvoton NK-980IOT开发板 u-boot 编译

Nuvoton NK-980IOT开发板 u-boot 编译

坚韧与专注 1186

NUC980开源项目2-开源计划

上面是我创建的群聊,欢迎新朋友的加入。 1.参考硬件 淘宝搜到一个板子 看起来没什么电路,就选这个了,主要是我也不打算在这个项目上花太多的钱。 2.开源地址 一个人的能量始终是有限的。欢迎大家提交资源。 github:https://github.com/Jun1172/nuc980-open-source-project.git 国内github好像有点慢,我把项目同步...

Jun626的博客 2835

基于Springboot+vue前后端分离商城项目基本开发手册【一】

开发环境准备 项目目录结构 权限管理 通用分页表格 Swagger文档 undertow容器 对xss攻击的防御 分布式锁 统一的系统日志 统一验证 统一异常处理 文件上传下载 一对多、多对多分页 开发环境准备 mall的商业版,最基本的开发环境与开源版本一致,方便用户迁移,我们认为,购买商业版,并且需要进行代码编写的人员,都是具有一定技术基础的开发人员。 1.开...

huaishitou的专栏 2398

小智音箱获取GY-NEO6MV2 GPS位置

本文介绍小智音箱与GY-NEO6MV2 GPS模块的集成技术,涵盖硬件连接、NMEA数据解析、定位可视化及系统优化,适用于智能出行、物流追踪等场景。

weixin_42497762的博客 1235

小智音箱结合Quectel_L70实现AGPS快速定位

本文深入解析AGPS定位技术在小智音箱中的应用,涵盖Quectel_L70模组的架构、协议、配置及实测优化,展示其在儿童防走失、老人监护等场景的落地实践与未来扩展方向。

weixin_31459297的博客 1214

华测服务器进不去系统,华测rtk单点到固定怎么操作步骤

1、首先设置基准站网络模式,打开手簿中的Hcconfig软件,点击主界面上的“连接”,点击“搜索设备”,选择基准站,然后点击下方的“连接”。2、蓝牙连接成功后,退回主界面,选择“RTK”,接收机模式设置为“自启动基准站”,然后点击右下方的“设置”。3、退回主界面,点击“电台与网络”,基准站工作模式设置为“网络”,通信协议设置为“APIS”,输入“服务器”、“IP地址”、“端口”后,点击右下角的“设...

weixin_39927378的博客 4404

智能网联汽车高精地图白皮书 (2020)

在以汽车电动化、智能化、联网化、共享化为特征的汽车产业进化趋势下,自动驾驶汽车成为全球的重要研究热点和汽车产业发展战略方向,并带动智能交通、智慧城市等产业建设。高精地图作为自动驾驶重要的共性基础技术,具备不可替代的作用,高精地图能够为汽车构建“长周期记忆”、实现汽车超视感知,并有效提高算法效率和安全冗余。随着自动驾驶技术日趋成熟,高精地图成为巨头征战的新战场。根据高盛对全球高精地图市场的预判,2020年将达21亿美元;到 2025 年,市场规模会扩大到 94 亿美元。

人无远虑,必有近忧 1万+
上一篇: 使用 xmake 工具编译 rt-thread 工程
下一篇: NUC980开发板DIY项目大挑战:车间数据采集方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值