MM32与DeepSeek的融合:一场MCU与AI的奇妙碰撞!

原创 嵌入式ARM 2025-02-18 12:01
一、DeepSeek基本介绍

2025春节期间,DeepSeek火得一塌糊涂,以至于不少业内人士都在蹭它的热度。

DeepSeek是由杭州深度求索人工智能基础技术研究有限公司开发的大型语言模型,不仅性能超过ChatGPT,其运行的成本还远低于它。目前,DeepSeek提供了两种使用方式:一是通过网页在线或是APP软件进行免费对话;二是通过API开放平台与DeepSeek服务器进行对接交互。

  • DeepSeek网页版:只需打开DeepSeek官网(https://www.deepseek.com),点击开始对话,就能跳转到DeepSeek网页版(https://chat.deepseek.com)与DeepSeek进行交流了。这个是免费使用的,当前使用的人比较多,经常会出现服务器忙的提示。

  • DeepSeek API开放平台:通过DeepSeek的API开放平台,可将DeepSeek应用到我们的应用程序中,通过接口调用与DeepSeek之间完成交互;在DeepSeek在线接口文档(https://api-docs.deepseek.com/zh-cn)中阐述了当前支持的开发方式,有CURL、PYTHON、GO、NODEJS、RUBY、CSHARP、PHP、JAVA、POWERSHELL等。
    在使用DeepSeek API开发平台之前,我们需要先注册一个DeepSeek账号,然后在API开放平台中创建一个API key,这个API key就是我们通过其它开发软件连接到DeepSeek的凭证。
    通过API开放平台使用DeepSeek是收费的,收费标准是根据每百万输出tokens来计费的;对于我们想体验一下通过API开放平台来操作DeepSeek的开发人员,DeepSeep赠送了10块钱的体验优惠,前期足够我们来熟悉了掌握DeepSeek的API开放平台开发了。

下面,我们以灵动MM32为例,将其与DeepSeek融合,为你带来前所未有的交互体验!

二、MM32与DeepSeek

想要MM32 MCU与DeepSeek之间实现交互,在接口层面,我们可以使用CURL方式,通过HTTP协议与DeepSeek的API开放平台完成;在硬件层面,我们需要扩展网络模块与MM32进行连接,达到联网的功能。

这里我们使用Air724这个4G模组,与MM32之间通过串口通讯,基于AT指令来进行联网、HTTP等功能的操作。

三、硬件连接

硬件连接如下图所示,将Air724接口的RXD与Mini-F5333开发板上Arduino接口的TXD进行连接,将Air724接口的TXD与Mini-F5333开发板上Arduino接口的RXD进行连接,将Air724接口的GND与Mini-F5333开发板上Arduino接口的GND进行连接,将Air724接口的RST与Mini-F5333开发板上Arduino接口的INT进行连接;同时,给Air724模块供12V电源,给Mini-F5333开发板供5V电源。


四、功能实现

首先是基于Mini-F5333开发板创建基础工程,实现板载LED灯和KEY按键检测,通过移植MultiButton开源软件实现按键处理操作;通过AT指令操作来实现Air724模组的初始化配置,在按下按键后,实现HTTP与DeepSeek的交互;在接收到DeepSeek反馈的数据后,通过cJSON来进行解析;处理过程和解析的结果通过SWD接口打印到电脑监视软件上(这边是通过移植SEGGER_RTT来实现打印的)。

具体的代码模块如下所示:


1、基础工程配置

#include "platform.h"#include "SEGGER_RTT.h"
volatile uint32_t PLATFORM_DelayTick = 0;
void PLATFORM_InitSysTick(void){ RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks);
if (SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000)) { while (1) { } }
NVIC_SetPriority(SysTick_IRQn, 0x0);}
void PLATFORM_ConfigDelay(void){ NVIC_InitTypeDef NVIC_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct); TIM_TimeBaseStruct.TIM_Prescaler = (TIM_GetTIMxClock(TIM6) / 100000 - 1); TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStruct.TIM_Period = (100 - 1); TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_Div1; TIM_TimeBaseStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStruct);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM6, ENABLE);}
void PLATFORM_DelayMs(uint32_t Tick){ PLATFORM_DelayTick = Tick;
while (PLATFORM_DelayTick) { }}
void PLATFORM_InitConsole(void){ SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);}
int fputc(int ch, FILE *f){ SEGGER_RTT_PutCharSkip(0, (char)ch);
return (ch);}
void PLATFORM_PrintClocks(void){ printf("\r\nBOARD : Mini-F5333"); printf("\r\nMCU : MM32F5333D7P"); printf("\r\n");
switch (RCC->CFGR & RCC_CFGR_SWS_Msk) { case 0x00: printf("\r\nHSI used as system clock source"); break;
case 0x04: printf("\r\nHSE used as system clock source"); break;
case 0x08: if (RCC->PLL1CFGR & RCC_PLL1CFGR_PLL1SRC_Msk) { printf("\r\nPLL1 (clocked by HSE) used as system clock source"); } else { printf("\r\nPLL1 (clocked by HSI) used as system clock source"); }
break;
case 0x0C: printf("\r\nLSI used as system clock source"); break;
default: break; }
RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks);
printf("\r\n"); printf("\r\nSYSCLK Frequency : %7.3f MHz", (double)RCC_Clocks.SYSCLK_Frequency / (double)1000000.0); printf("\r\nHCLK Frequency : %7.3f MHz", (double)RCC_Clocks.HCLK_Frequency / (double)1000000.0); printf("\r\nPCLK1 Frequency : %7.3f MHz", (double)RCC_Clocks.PCLK1_Frequency / (double)1000000.0); printf("\r\nPCLK2 Frequency : %7.3f MHz", (double)RCC_Clocks.PCLK2_Frequency / (double)1000000.0); printf("\r\n");}
void PLATFORM_Init(void){ PLATFORM_InitSysTick();
PLATFORM_ConfigDelay();
PLATFORM_InitConsole();
PLATFORM_PrintClocks();}
void TIM6_IRQHandler(void){ if (RESET != TIM_GetITStatus(TIM6, TIM_IT_Update)) { if (PLATFORM_DelayTick) { PLATFORM_DelayTick--; }
TIM_ClearITPendingBit(TIM6, TIM_IT_Update); }}


2、LED驱动

#include "bsp_led.h"
void bsp_LedInit(void){ GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_10 ; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_SET); GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);}
void bsp_LedToggle(uint8_t Index){ switch (Index) { case 1: if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11) == Bit_RESET) { GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); } else { GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_RESET); } break;
case 2: if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_10) == Bit_RESET) { GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_SET); } else { GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_RESET); } break;
case 3: if (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7) == Bit_RESET) { GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); } else { GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET); } break;
case 4: if (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET) { GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET); } else { GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET); } break;
default: break; }}


3、KEY驱动

#include "bsp_key.h"
void bsp_KeyInit(void){ GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStruct);}
uint8_t bsp_KeyReadPinLevel(uint8_t Index){ uint8_t PinLevel = 0;
switch (Index) { case 1: PinLevel = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4); break;
case 2: PinLevel = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5); break;
case 3: PinLevel = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1); break;
case 4: PinLevel = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2); break;
default: break; }
return (PinLevel);}


4、按键应用

#include "key.h"#include "bsp_key.h"#include "multi_button.h"
struct Button K1;struct Button K2;struct Button K3;struct Button K4;
volatile uint8_t KeyRegisterFlag = 0;volatile uint8_t KeyHttpPostFlag = 0;
void KEY_PressUpHandler(void *btn){ struct Button *handle = (struct Button *)btn;
switch (handle->button_id) { case 1: printf("\r\nK1"); break;
case 2: printf("\r\nK2"); break;
case 3: printf("\r\nK3"); break;
case 4: printf("\r\nK4"); KeyHttpPostFlag = 1; break;
default: break; }}
void KEY_Init(void){ button_init(&K1, bsp_KeyReadPinLevel, Bit_SET, 1); button_init(&K2, bsp_KeyReadPinLevel, Bit_RESET, 2); button_init(&K3, bsp_KeyReadPinLevel, Bit_RESET, 3); button_init(&K4, bsp_KeyReadPinLevel, Bit_RESET, 4);
button_attach(&K1, PRESS_UP, KEY_PressUpHandler); button_attach(&K2, PRESS_UP, KEY_PressUpHandler); button_attach(&K3, PRESS_UP, KEY_PressUpHandler); button_attach(&K4, PRESS_UP, KEY_PressUpHandler);
button_start(&K1); button_start(&K2); button_start(&K3); button_start(&K4);
KeyRegisterFlag = 1;}
void SysTick_Handler(void){ if (KeyRegisterFlag) { button_ticks(); }}


5、Air724驱动

#include "bsp_air724.h"#include "platform.h"
uint8_t Air724_RxBuffer[2048];uint16_t Air724_RxLength = 0;char deepseek_Buffer[2048];
void bsp_Air724InitUART(void){ GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; UART_InitTypeDef UART_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
UART_StructInit(&UART_InitStruct); UART_InitStruct.BaudRate = 115200; UART_InitStruct.WordLength = UART_WordLength_8b; UART_InitStruct.StopBits = UART_StopBits_1; UART_InitStruct.Parity = UART_Parity_No; UART_InitStruct.HWFlowControl = UART_HWFlowControl_None; UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx; UART_Init(UART4, &UART_InitStruct);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource0, GPIO_AF_8); GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_8);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStruct);
UART_ITConfig(UART4, UART_IT_RX, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = UART4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
UART_Cmd(UART4, ENABLE);}
void bsp_Air724RxIrqHandler(uint8_t Data){ printf("%c", Data);
Air724_RxBuffer[Air724_RxLength] = Data;
Air724_RxLength += 1; Air724_RxLength %= 2048;}
void bsp_Air724InitGPIO(void){ GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOI, ENABLE);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_WriteBit(GPIOI, GPIO_Pin_0, Bit_SET);}
void bsp_Air724Reset(void){ GPIO_WriteBit(GPIOI, GPIO_Pin_0, Bit_SET); PLATFORM_DelayMs(100);
GPIO_WriteBit(GPIOI, GPIO_Pin_0, Bit_RESET); PLATFORM_DelayMs(100);}
void bsp_Air724ClearRxBuffer(void){ Air724_RxLength = 0;
for (uint16_t i = 0; i < 2048; i++) { Air724_RxBuffer[i] = 0; }}
void bsp_Air724Init(void){ bsp_Air724InitUART();
bsp_Air724InitGPIO();
bsp_Air724ClearRxBuffer();}
void bsp_Air724SendData(uint8_t Data){ UART_SendData(UART4, Data);
while (RESET == UART_GetFlagStatus(UART4, UART_FLAG_TXC)) { }}
uint32_t bsp_Air724SendCommandBlocking(char *Command, char *Response, uint32_t Timeout){ if (Command != NULL) { while (*Command != '\0') { bsp_Air724SendData(*Command++); }
bsp_Air724SendData(0x0D); bsp_Air724SendData(0x0A); }
if (Timeout != 0) { bsp_Air724ClearRxBuffer();
while (Timeout--) { if (strstr((char *)Air724_RxBuffer, Response) != NULL) { return (Timeout); }
PLATFORM_DelayMs(1); } }
return (0);}
void bsp_Air724InputDataNonBlocking(char *Data){ if (Data != NULL) { while (*Data != '\0') { bsp_Air724SendData(*Data++); }
bsp_Air724SendData(0x1A); }}


6、HTTP初始化

void HTTP_Init(void){    bsp_Air724Reset();
bsp_Air724SendCommandBlocking(NULL, "RDY", 10000); bsp_Air724SendCommandBlocking(NULL, "+NITZ", 10000);
PLATFORM_DelayMs(500);
bsp_Air724SendCommandBlocking("AT", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CPIN?", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CGATT?", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=3,1,\"APN\",\"\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=1,1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=2,1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CGNSPWR=1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CSQ", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CGNSAID=31,1,1,1", "OK", 10000);}


7、HTTP与DeepSeek交互

char POST_DATA[] = "{\    \"model\": \"deepseek-chat\",\    \"messages\": [{\"role\": \"user\", \"content\": \"who are you?\"}],\    \"stream\": false\}";
void HTTP_Post(void){ char Command[200];
bsp_Air724SendCommandBlocking("AT+HTTPINIT", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPSSL=1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"CID\",1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"URL\",\"https://api.deepseek.com/chat/completions\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"CONTENT\",\"application/json\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"USERDATA\",\"Authorization:Bearer API key\"", "OK", 10000);
memset(Command, 0, sizeof(Command)); sprintf(Command, "AT+HTTPDATA=%d,10000", strlen(POST_DATA));
bsp_Air724SendCommandBlocking(Command, "DOWNLOAD", 30000);
printf("\r\n%s", POST_DATA);
bsp_Air724InputDataNonBlocking(POST_DATA);
bsp_Air724SendCommandBlocking("AT+HTTPACTION=1", "OK", 30000);
bsp_Air724SendCommandBlocking(NULL, "+HTTPACTION: 1,200,", 30000);
bsp_Air724SendCommandBlocking("AT+HTTPREAD", "OK", 30000);
bsp_Air724RxHandler();
bsp_Air724SendCommandBlocking("AT+HTTPTERM", "OK", 10000);}


8、DeepSeek数据处理

#include "cJSON.h"
void bsp_Air724RxHandler(void){ uint16_t Count = 0; uint16_t Group = 0;
memset(deepseek_Buffer, 0, sizeof(deepseek_Buffer));
for (uint16_t i = 0; i < Air724_RxLength; i++) { if (Air724_RxBuffer[i] == '{') { Group++; }
if (Group) { deepseek_Buffer[Count++] = Air724_RxBuffer[i]; }
if (Air724_RxBuffer[i] == '}') { if(Group) Group--; } }
printf("\r\n--------------------------------------------------------------------------------");
cJSON *cjson = cJSON_Parse(deepseek_Buffer);
char *json_data = cJSON_Print(cjson);
if (cjson == NULL) { printf("\r\ncjson error!!!"); } else { printf("\r\n%s", json_data); }
printf("\r\n--------------------------------------------------------------------------------");
printf("\r\n");}


五、运行结果

MCU向DeepSeek发送了“who are you?”的提问,如下图所示,DeepSeek进行了回答“I’m an AI language model created by OpenAI……”


六、附件


好了,以上就是今天分享的所有内容了,如果有需要下载原图、代码,以及更多内容的小伙伴,请点击底部“阅读原文”进行查看

END

本文系21ic论坛网友xld0932原创,如需转载,请注明出处。


推荐阅读
盘点我常用的嵌入式开发工具
有人用DeepSeek写了一个串口助手,然后...
传稚辉君开设分公司,高薪招聘嵌入式开发!

→点关注,不迷路←

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论 (0)
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 59浏览
  • 硅二极管温度传感器是一种基于硅半导体材料特性的测温装置,其核心原理是利用硅二极管的电学参数(如正向压降或电阻)随温度变化的特性实现温度检测。以下是其工作原理、技术特点及典型应用:一、工作原理1、‌PN结温度特性‌硅二极管由PN结构成,当温度变化时,其正向电压 VF与温度呈线性负相关关系。例如,温度每升高1℃,VF约下降2 mV。2、‌电压—温度关系‌通过jing确测量正向电压的微小变化,可推算出环境温度值。部分型号(如SI410)在宽温域内(如1.4 K至475 K)仍能保持高线性度。
    锦正茂科技 2025-05-09 13:52 341浏览
  • Matter协议是一个由Amazon Alexa、Apple HomeKit、Google Home和Samsung SmartThings等全球科技巨头与CSA联盟共同制定的开放性标准,它就像一份“共生契约”,能让原本相互独立的家居生态在应用层上握手共存,同时它并非另起炉灶,而是以IP(互联网协议)为基础框架,将不同通信协议下的家居设备统一到同一套“语义规则”之下。作为应用层上的互通标准,Matter协议正在重新定义智能家居行业的运行逻辑,它不仅能向下屏蔽家居设备制造商的生态和系统,让设备、平
    华普微HOPERF 2025-05-08 11:40 464浏览
  • 在过去的很长一段时间里,外卖市场呈现出美团和饿了么双寡头垄断的局面。美团凭借先发优势、强大的地推团队以及精细化的运营策略,在市场份额上长期占据领先地位。数据显示,截至2024年上半年,美团外卖以68.2%的市场份额领跑外卖行业,成为当之无愧的行业老大。其业务广泛覆盖,从一线城市的繁华商圈到二三线城市的大街小巷,几乎无处不在,为无数消费者提供便捷的外卖服务。饿了么作为阿里本地生活服务的重要一环,依托阿里强大的资金和技术支持,也在市场中站稳脚跟,以25.4%的份额位居第二。尽管市场份额上与美团有一定
    用户1742991715177 2025-05-06 19:43 134浏览
  • 后摄像头是长这个样子,如下图。5孔(D-,D+,5V,12V,GND),说的是连接线的个数,如下图。4LED,+12V驱动4颗LED灯珠,给摄像头补光用的,如下图。打开后盖,发现里面有透明白胶(防水)和白色硬胶(固定),用合适的工具,清理其中的胶状物。BOT层,AN3860,Panasonic Semiconductor (松下电器)制造的,Cylinder Motor Driver IC for Video Camera,如下图。TOP层,感光芯片和广角聚焦镜头组合,如下图。感光芯片,看着是玻
    liweicheng 2025-05-07 23:55 581浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 242浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 691浏览
  • 这款无线入耳式蓝牙耳机是长这个样子的,如下图。侧面特写,如下图。充电接口来个特写,用的是卡座卡在PCB板子上的,上下夹紧PCB的正负极,如下图。撬开耳机喇叭盖子,如下图。精致的喇叭(HY),如下图。喇叭是由电学产生声学的,具体结构如下图。电池包(AFS 451012  21 12),用黄色耐高温胶带进行包裹(安规需求),加强隔离绝缘的,如下图。451012是电池包的型号,聚合物锂电池+3.7V 35mAh,详细如下图。电路板是怎么拿出来的呢,剪断喇叭和电池包的连接线,底部抽出PCB板子
    liweicheng 2025-05-06 22:58 716浏览
  • 温度传感器的工作原理依据其类型可分为以下几种主要形式:一、热电阻温度传感器利用金属或半导体材料的电阻值随温度变化的特性实现测温:l ‌金属热电阻‌(如铂电阻 Pt100、Pt1000):高温下电阻值呈线性增长,稳定性高,适用于工业精密测温。l ‌热敏电阻‌(NTC/PTC):NTC 热敏电阻阻值随温度升高而下降,PTC 则相反;灵敏度高但线性范围较窄,常用于电子设备温控。二、热电偶传感器基于‌塞贝克效应‌(Seebeck effect):两种不同
    锦正茂科技 2025-05-09 13:31 317浏览
  • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
    华尔街科技眼 2025-05-07 19:25 520浏览
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 475浏览
  • 飞凌嵌入式作为龙芯合作伙伴,隆重推出FET-2K0300i-S全国产自主可控工业级核心板!FET-2K0300i-S核心板基于龙芯2K0300i工业级处理器开发设计,集成1个64位LA264处理器,主频1GHz,提供高效的计算能力;支持硬件ECC;2K0300i还具备丰富的连接接口USB、SDIO、UART、SPI、CAN-FD、Ethernet、ADC等一应俱全,龙芯2K0300i支持四路CAN-FD接口,具备良好的可靠性、实时性和灵活性,可满足用户多路CAN需求。除性价比超高的国产处理器外,
    飞凌嵌入式 2025-05-07 11:54 118浏览
  • 文/Leon编辑/cc孙聪颖‍《中国家族企业传承研究报告》显示,超四成“企二代” 明确表达接班意愿,展现出对家族企业延续发展的主动担当。中国研究数据服务平台(CNRDS)提供的精准数据进一步佐证:截至 2022 年,已有至少 280 家上市家族企业完成权杖交接,其中八成新任掌门人为创始人之子,凸显家族企业代际传承中 “子承父业” 的主流模式。然而,对于“企二代” 而言,接棒掌舵绝非易事。在瞬息万变的商业环境中,他们既要在白热化的市场竞争中开拓创新、引领企业突破发展瓶颈,又需应对来自父辈管理层的经
    华尔街科技眼 2025-05-06 18:17 64浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 414浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦