产品的软件部分基于TencentOS Tiny开源物联网操作系统平台和使用腾讯云物联网开发平台Iot Explorer和腾讯连连小程序。硬件部分是基于沁恒自研RISC-V架构微处理器青稞V4系列的TencentOS Tiny CH32V_EVB RISC-V开发套件来实现。
实现的功能是使用腾讯连连APP,远程控制TencentOS Tiny CH32V_EVB RISC-V开发套件,协议解析后,通过CAN通信方式,将控制命令发送给电机控制终端,收到启停命令后,来控制的电机的启停,同时实时将电机的运行状态、电压和电流信息反馈到开发板,开发板解析后发送到云端,在腾讯连连APP上显示。
通过外扩交流接触器可以实现大功率电机的控制。
产品的硬件有以下几部分组成,CH32V_EVB开发板、E53接口CAN通信模块和电机控制板。
CH32V_EVB是腾讯物联网操作系统TencentOS tiny 团队联合沁恒微电子设计的一款物联网评估板,用于TencentOS tiny 基础内核、RISC-V IP核架构和IoT组件功能体验和评估。 开发板实物如下图:
• 内置TencentOS Tiny开源物联网操作系统
• 开发板采用沁恒RISC-V MCU CH32V307VCT6芯片,CH32V305/7系列是基于沁恒自研RISC-V架构微处理器青稞V4系列设计的32位工业级互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,定时器到10组,其中4组高级定时器。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。
• 64KB SRAM,256KB Flash
• 板载Type-C接口WCH-LINK仿真器
• 板载esp8266 WiFi模组,支持腾讯云固件
• 板载以太网接口
• 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组
• 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器以及音频模块;
• 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头;
• 板载1.54寸 IPS高清显示屏,支持240*240分辨率;
• 预留SD卡、用户按键、SPI Flash,
• 扩展IO口,方便开发者扩展硬件模块
CAN通信模式是使用MCP2515芯片,按照E53接口的定义来设计的转接板。模块电路图如下:
电机控制板是执行电机控制的中间转接板,通过中间继电器扩展交流接触器,可以控制大功率电机设备。以CAN通信的方式与开发板连接通信,接收开发板的控制命令和上传电机运行的状态和参数。
创建两个信号量和4个任务。
void application_entry(void *arg)
{
tos_sem_create(&canrx, 0);
tos_sem_create(&cjson_hdl, 0);
tos_task_create(&lcddisp, "lcddisp", lcddisp_entry, NULL, 7, lcddisp_stk, LCDDISP_STK_SIZE, 0); // Create task1
tos_task_create(&can_tx, "can_tx", cantx_entry, NULL, 4, can_tx_stk, CAN_TX_STK_SIZE, 0);// Create task2
tos_task_create(&can_rx, "can_rx", canrx_entry, NULL, 5, can_rx_stk, CAN_RX_STK_SIZE, 0);// Create task3
tos_task_create(&mqtt_task, "mqtt_task", mqtt_task_entry, NULL, 6, mqtt_task_stk, MQTT_TASK_STK_SIZE, 0);// Create task4
}
void default_message_handler(mqtt_message_t* msg) //\\\"brightness\\\":%d\\,
{
cJSON *root;
cJSON *params;
// cJSON *token;
cJSON *method;
cJSON *power_switch;
// cJSON *brightness_level;
printf("callback:\r\n");
printf("---------------------------------------------------------\r\n");
printf("\ttopic:%s\r\n", msg->topic);
printf("\tpayload:%s\r\n", msg->payload);
printf("---------------------------------------------------------\r\n");
// 1. 解析从云端收到的控制信息,示例控制信息为
//payload:"{"method":"control","clientToken":"clientToken-4902Qhq74","params":{"switch_1":1}}"
root = cJSON_Parse(msg->payload +1);
if (!root){
printf("Invalid json root\r\n");
return;
}
// 2. 解析出method
method = cJSON_GetObjectItem(root, "method");
if (!method){
printf("Invalid json method\r\n");
cJSON_Delete(root);
return;
}
// 3. 仅处理云端下发的 control 数据,report_reply暂不处理
if (0 != strncmp(method->valuestring, "control", sizeof("control") - 1)){
cJSON_Delete(root);
return;
}
// 4. 解析出params
params = cJSON_GetObjectItem(root, "params");
if (!params){
printf("Invalid json params\r\n");
cJSON_Delete(root);
return;
}
// 1. 解析出 power_switch
power_switch = cJSON_GetObjectItem(params, "switch_1");
// 2. 根据 power_switch 控制实际硬件开关
if (power_switch){
iot_explorer_handle_power_switch(power_switch->valueint);
}
cJSON_Delete(root);
}
char payload[256] = {0};
static char report_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
static char report_reply_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
void mqtt_demo_task(void)
{
int ret = 0;
int size = 0;
//int lightness = 0;
//int color=0;
//float voltage = 0.0;
mqtt_state_t state;
char *product_id = PRODUCT_ID;
char *device_name = DEVICE_NAME;
char *key = DEVICE_KEY;
device_info_t dev_info;
memset(&dev_info, 0, sizeof(device_info_t));
/**
* Please Choose your AT Port first, default is HAL_UART_2(USART2)
*/
ret = esp8266_tencent_firmware_sal_init(HAL_UART_PORT_2);
if (ret < 0) {
printf("esp8266 tencent firmware sal init fail, ret is %d\r\n", ret);
}
//esp8266_tencent_firmware_join_ap("TP-LINK_0F58", "hhyf1bhhyf1b");
esp8266_tencent_firmware_join_ap("CU_VSVC", "iya8j5tt");
strncpy(dev_info.product_id, product_id, PRODUCT_ID_MAX_SIZE);
strncpy(dev_info.device_name, device_name, DEVICE_NAME_MAX_SIZE);
strncpy(dev_info.device_serc, key, DEVICE_SERC_MAX_SIZE);
tos_tf_module_info_set(&dev_info, TLS_MODE_PSK);
mqtt_param_t init_params = DEFAULT_MQTT_PARAMS;
if (tos_tf_module_mqtt_conn(init_params) != 0) {
printf("module mqtt conn fail\n");
} else {
printf("module mqtt conn success\n");
}
if (tos_tf_module_mqtt_state_get(&state) != -1) {
printf("MQTT: %s\n", state == MQTT_STATE_CONNECTED ? "CONNECTED" : "DISCONNECTED");
}
size = snprintf(report_reply_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/down/property/%s/%s", product_id, device_name);
if (size < 0 || size > sizeof(report_reply_topic_name) - 1) {
printf("sub topic content length not enough! content size:%d buf size:%d", size, (int)sizeof(report_reply_topic_name));
}
if (tos_tf_module_mqtt_sub(report_reply_topic_name, QOS0, default_message_handler) != 0) {
printf("module mqtt sub fail\n");
} else {
printf("module mqtt sub success\n");
}
memset(report_topic_name, 0, sizeof(report_topic_name));
size = snprintf(report_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/up/property/%s/%s", product_id, device_name);
if (size < 0 || size > sizeof(report_topic_name) - 1) {
printf("pub topic content length not enough! content size:%d buf size:%d", size, (int)sizeof(report_topic_name));
}
}
使用标准类型 面板
https://cloud.tencent.com/developer/video/32285?sharedUid=4136378
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。