当前位置: 首页 > article >正文

单片机的工厂方法模式和桥接模式结合使用

记录下单片机使用工厂方法模式和桥接模式结合使用之前分别记录了工厂方法模式和桥接模式现在需要结合起来使用例 需要多个DS8B20温度传感器和多个MAX31855芯片获取热电偶温度sensor.h#ifndef__DRV_SENSOR_H#define__DRV_SENSOR_H#includestdint.h/* 传感器类型枚举 */typedefenum{SENSOR_DS18B20,SENSOR_DHT22,SENSOR_MAX31855,SENSOR_PT100,SENSOR_PT1000,SENSOR_NTC,SENSOR_TYPE_MAX}SensorType_t;/* 传感器对象结构体类似于抽象类 */typedefstruct{void(*Init)(void*pPrivate);// 初始化函数float(*Read)(void*pPrivate);// 读取数据函数void*pPrivate;// 私有数据具体传感器需要的硬件信息constchar*name;// 传感器名称}Sensor_t;/* 工厂函数创建传感器对象返回常量指针避免外部修改 *///const Sensor_t* Sensor_Create(SensorType_t type);constSensor_t*Sensor_Create(SensorType_t type,uint8_tinstance);#endifsensor.c#includedrv_sensor.h#includedrv_DHT22.h#includedrv_DS18B20.h#includedrv_MAX31855.h#includebsp_spi.h#includebsp_timer.h/* 支持的最大DS18B20实例数 */#defineDS18B20_MAX_INSTANCE5#defineMAX31855_MAX_INSTANCE5/* 静态私有数据实例假设使用固定的引脚例如 GPIOA, GPIO_PIN_0 */staticDS18B20_Private_t ds18b20_priv0{.portGPIOA,.pinGPIO_PIN_0};staticDS18B20_Private_t ds18b20_priv1{.portGPIOA,.pinGPIO_PIN_1};staticconstSensor_t ds18b20_sensor[DS18B20_MAX_INSTANCE]{{.InitDS18B20_Init,.ReadDS18B20_Read,.pPrivateds18b20_priv0,.nameDS18B20_0},{.InitDS18B20_Init,.ReadDS18B20_Read,.pPrivateds18b20_priv1,.nameDS18B20_1}};/* DHT22 私有数据 */staticDHT22_Private_t dht22_priv{.portGPIOB,.pinGPIO_PIN_1};staticconstSensor_t dht22_sensor{.InitDHT22_Init,.ReadDHT22_Read,.pPrivatedht22_priv,.nameDHT22};// 声明SPI句柄SoftSPI_HandleTypeDef hspi2{.namehspi2,// 配置SPI1引脚模拟.SCK_PortGPIOF,.SCK_PinGPIO_PIN_7,.MOSI_PortGPIOF,.MOSI_PinGPIO_PIN_9,.MISO_PortGPIOF,.MISO_PinGPIO_PIN_8,.NSS_PortGPIOF,.NSS_PinGPIO_PIN_6,// 配置参数.modeSPI_MODE0,// 模式0.firstBitSPI_FIRSTBIT_MSB,// MSB先行.baudRatePrescalerSPI_BAUDRATE_DIV256,// ~2.6MHz// 使用默认软件定时器延时.useHardwareDelay0,/* 函数指针 */.ChipSelectSoftSPI_ChipSelect,.InitSoftSPI_Init,.TransferBytesSoftSPI_TransferBytes,.WriteByteSoftSPI_WriteBytes,.ReadByteSoftSPI_ReadBytes,.delay_nsNULL,.delay_usHAL_Delay_us,.delay_msHAL_Delay};// 声明SPI句柄SoftSPI_HandleTypeDef hspi3{.namehspi3,// 配置SPI1引脚模拟.SCK_PortGPIOF,.SCK_PinGPIO_PIN_7,.MOSI_PortGPIOF,.MOSI_PinGPIO_PIN_9,.MISO_PortGPIOF,.MISO_PinGPIO_PIN_8,.NSS_PortGPIOF,.NSS_PinGPIO_PIN_10,// 配置参数.modeSPI_MODE0,// 模式0.firstBitSPI_FIRSTBIT_MSB,// MSB先行.baudRatePrescalerSPI_BAUDRATE_DIV256,// ~2.6MHz// 使用默认软件定时器延时.useHardwareDelay0,/* 函数指针 */.ChipSelectSoftSPI_ChipSelect,.InitSoftSPI_Init,.TransferBytesSoftSPI_TransferBytes,.WriteByteSoftSPI_WriteBytes,.ReadByteSoftSPI_ReadBytes,.delay_nsNULL,.delay_usHAL_Delay_us,.delay_msHAL_Delay};MAX31855_Private_t MAX31855_priv[]{{.hspihspi2},{.hspihspi3}};staticconstSensor_t MAX31855_sensor[MAX31855_MAX_INSTANCE]{{.InitMAX31855_Init,.ReadMAX31855_Read,.pPrivateMAX31855_priv[0],.nameMAX31855_0},{.InitMAX31855_Init,.ReadMAX31855_Read,.pPrivateMAX31855_priv[1],.nameMAX31855_1},};///* 工厂函数根据类型返回对应的传感器对象 *///const Sensor_t* Sensor_Create(SensorType_t type)//{// switch (type) {// case SENSOR_DS18B20:// return ds18b20_sensor;// case SENSOR_DHT22:// return dht22_sensor;// case SENSOR_MAX31855:// return MAX31855_sensor;// default:// return NULL;// }//}/* 获取指定实例 */constSensor_t*DS18B20_GetInstance(uint8_tinstance){if(instanceDS18B20_MAX_INSTANCE){returnds18b20_sensor[instance];}returnNULL;}/* 获取指定实例 */constSensor_t*MAX31855_GetInstance(uint8_tinstance){if(instanceMAX31855_MAX_INSTANCE){returnMAX31855_sensor[instance];}returnNULL;}constSensor_t*Sensor_Create(SensorType_t type,uint8_tinstance){switch(type){caseSENSOR_DS18B20:returnDS18B20_GetInstance(instance);// 支持多个实例caseSENSOR_DHT22:// DHT22若只有一个实例instance参数可忽略或检查if(instance0)returndht22_sensor;elsereturnNULL;caseSENSOR_MAX31855:returnMAX31855_GetInstance(instance);default:returnNULL;}}MAX31855.h#ifndef__DRV_MAX31855_H#define__DRV_MAX31855_H#includestdlib.h#includestring.h#includestdint.h#includestdio.h#includestdlib.h#includestring.h#includestm32f4xx_hal.h//#include drv_sensor.h#includebsp_spi.htypedefstruct{SoftSPI_HandleTypeDef*hspi;}MAX31855_Private_t;staticuint8_tMAX31855_ReadData(void*pPrivate,float*temp);voidMAX31855_Init(void*pPrivate);floatMAX31855_Read(void*pPrivate);#endif原先的DS18B20和DHT22的文件则无需改变MAX31855.c#includedrv_MAX31855.hstaticuint8_tMAX31855_ReadData(void*pPrivate,float*temp){MAX31855_Private_t*priv(MAX31855_Private_t*)pPrivate;/* 相关SPI的操作 */// priv-hspi-ChipSelect(priv-hspi, 0);// priv-hspi-delay_ms(20);////// priv-hspi-ChipSelect(priv-hspi, 1);// priv-hspi-delay_ms(20);}voidMAX31855_Init(void*pPrivate){MAX31855_Private_t*priv(MAX31855_Private_t*)pPrivate;printf(MAX31855 SPI is %s\n,priv-hspi-name);printf(MAX31855 Init is OK \n);}floatMAX31855_Read(void*pPrivate){// float temp;// if (MAX31855_ReadData(pPrivate, temp,)// {// // 返回温度值保留一位小数// return temp / 10.0f;// }// return -999.0f; // 错误标志return25;//}测试intmain(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit */EventRecorderInitialize(EventRecordAll,1U);EventRecorderStart();/* USER CODE END SysInit */DWT_Init();/* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */// 创建温度传感器DS18B20constSensor_t*temp_sensor0Sensor_Create(SENSOR_DS18B20,0);if(temp_sensor0){temp_sensor0-Init(temp_sensor0-pPrivate);printf(Sensor is %s\n,temp_sensor0-name);}constSensor_t*temp_sensor1Sensor_Create(SENSOR_DS18B20,1);if(temp_sensor1){temp_sensor1-Init(temp_sensor1-pPrivate);printf(Sensor is %s\n,temp_sensor1-name);}// 创建湿度传感器DHT22constSensor_t*humi_sensorSensor_Create(SENSOR_DHT22,0);if(humi_sensor){humi_sensor-Init(humi_sensor-pPrivate);printf(Sensor is %s\n,humi_sensor-name);}// 使用MAX31855来测量热电偶constSensor_t*temp_sensor2Sensor_Create(SENSOR_MAX31855,0);if(temp_sensor2){temp_sensor2-Init(temp_sensor2-pPrivate);printf(Sensor is %s\n,temp_sensor2-name);}constSensor_t*temp_sensor3Sensor_Create(SENSOR_MAX31855,1);if(temp_sensor3){temp_sensor3-Init(temp_sensor3-pPrivate);printf(Sensor is %s\n,temp_sensor3-name);}/* 读取各个温度传感器温度 */if(temp_sensor0){floatttemp_sensor0-Read(temp_sensor0-pPrivate);printf(Sensor is %s,Temperature: %.2f°C\n,temp_sensor0-name,t);}if(temp_sensor1){floatttemp_sensor1-Read(temp_sensor1-pPrivate);printf(Sensor is %s,Temperature: %.2f°C\n,temp_sensor1-name,t);}if(temp_sensor2){floatttemp_sensor2-Read(temp_sensor2-pPrivate);printf(Sensor is %s,Temperature: %.2f°C\n,temp_sensor2-name,t);}if(temp_sensor3){floatttemp_sensor3-Read(temp_sensor3-pPrivate);printf(Sensor is %s,Temperature: %.2f°C\n,temp_sensor3-name,t);}if(humi_sensor){floathhumi_sensor-Read(humi_sensor-pPrivate);printf(Humidity: %.2f%%\n,h);}while(1){HAL_Delay(2000);}可以看到创建了多个不同的传感器并且正确显示温度

相关文章:

单片机的工厂方法模式和桥接模式结合使用

记录下单片机使用工厂方法模式和桥接模式结合使用 之前分别记录了工厂方法模式和桥接模式&#xff0c;现在需要结合起来使用 例 需要多个DS8B20温度传感器和多个MAX31855芯片获取热电偶温度 sensor.h #ifndef __DRV_SENSOR_H #define __DRV_SENSOR_H#include <stdint.h>…...

在 PHP 中写真正的异步代码 TrueAsync 0.6.0 已支持数据库链接池

在 PHP 中写真正的异步代码 TrueAsync 0.6.0 已支持数据库链接池 现代软件的构建最终仍然要回到实践。再复杂的产品&#xff0c;也必须经过真实用户的检验。只有最终用户&#xff0c;才能真正区分哪些设计是有效的、哪些方向值得继续推进。再优雅的架构&#xff0c;如果没有落…...

电子高科技行业:机械与电子如何协同?

我在制造业这潭浑水里摸爬滚打了二十年。见过太多企业倒在“最后一公里”。倒不是没单子饿死的&#xff0c;也不是技术不行憋死的&#xff0c;大多都是死在“数据精神分裂”上。前两天去一家做智能穿戴的电子大厂调研。还没进车间&#xff0c;会议室里那股火药味就呛鼻子。结构…...

热键侦探:Windows系统热键冲突的全方位解决方案

热键侦探&#xff1a;Windows系统热键冲突的全方位解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 一、热键冲突&#xff1a;被忽视的系…...

OpenClaw是什么?OpenClaw能干什么?2026年OpenClaw详细介绍及几个保姆级部署图文教程

OpenClaw&#xff08;前身为Clawdbot/Moltbot&#xff09;作为开源、本地优先的AI助理框架&#xff0c;凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力&#xff0c;成为个人办公与轻量团队协作的首选工具。与传统聊天机器人不同&#xff0c;OpenClaw不仅能实现自…...

3维突破:DamaiHelper自动化工具的技术原理与场景实践

3维突破&#xff1a;DamaiHelper自动化工具的技术原理与场景实践 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 行业痛点诊断 在数字化服务快速发展的今天&#xff0c;在线资源抢订领域面临着三…...

OpenClaw,什么是SOUL.md、USER.md文件?怎么编辑它们?

在项目里看到 SOUL.md 和 USER.md 这样的文件&#xff0c;很多人第一反应可能是文档&#xff0c;但打开一看&#xff0c;内容又不太像传统的技术说明。其实这两个文件在开源社区和一些技术团队中&#xff0c;正逐渐成为一种约定俗成的沟通方式。它们不是代码&#xff0c;却和代…...

NCMDump:开源工具实现NCM格式自由的深度解析

NCMDump&#xff1a;开源工具实现NCM格式自由的深度解析 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 用户痛点&#xff1a;数字音乐时代的格式枷锁 在流媒体音乐普及的今天&#xff0c;音乐爱好者们面临着一个普遍困境&#xff…...

3个步骤解决家庭网络卡顿问题,让带宽利用率提升300%

3个步骤解决家庭网络卡顿问题&#xff0c;让带宽利用率提升300% 【免费下载链接】luci-app-broadbandacc OpenWrt-宽带提速插件&#xff0c;支持宽带无间隔提速。&#xff08;提速服务由speedtest.cn&#xff08;测速网&#xff09;提供&#xff09; 项目地址: https://gitco…...

如何安全解锁Switch高级功能?零基础玩家的大气层系统定制指南

如何安全解锁Switch高级功能&#xff1f;零基础玩家的大气层系统定制指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想让你的Switch拥有自定义主题、金手指和存档管理等高级功能&…...

5个革新性技巧:用Florence2视觉语言模型解锁ComfyUI图像理解新维度

5个革新性技巧&#xff1a;用Florence2视觉语言模型解锁ComfyUI图像理解新维度 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 副标题&#xff1a;从文档解析到创意设计——微软…...

三电平NPC并网逆变器:中点电位平衡的SVPWM调制闭环控制仿真模型——基于60度坐标系的时间...

三电平NPC并网逆变器闭环控制仿真模型 带中点电位平衡&#xff0c;60度坐标系&#xff0c;采用SVPWM调制 生成时间调制信号&#xff0c;与载波进行比较&#xff0c;产生驱动 调制PWM波&#xff0c; 采用C 程序编写&#xff0c;可以作为产品开发的预研参考。半夜两点半的实验室里…...

TranslucentTB启动故障全方位攻克:Microsoft.UI.Xaml依赖问题深度解决方案

TranslucentTB启动故障全方位攻克&#xff1a;Microsoft.UI.Xaml依赖问题深度解决方案 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB TranslucentTB作为广受欢迎的Windows任务栏美化工具&#xff0c;常因Microsoft.UI.X…...

开源硬件调试工具SMUDebugTool:故障诊断与性能优化实战指南

开源硬件调试工具SMUDebugTool&#xff1a;故障诊断与性能优化实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https…...

ComfyUI视频合成进阶指南:VHS_VideoCombine节点全功能解析

ComfyUI视频合成进阶指南&#xff1a;VHS_VideoCombine节点全功能解析 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在数字内容创作领域&#xff0c;视频合成技…...

3步解决Windows运行库缺失难题,让系统兼容性提升90%

3步解决Windows运行库缺失难题&#xff0c;让系统兼容性提升90% 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否也曾遇到过"找不到MSVCR120.dll"…...

企业级软件授权解决方案:Beyond Compare 5工具激活与管理指南

企业级软件授权解决方案&#xff1a;Beyond Compare 5工具激活与管理指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 在现代软件开发与数据管理工作流中&#xff0c;软件授权与工具激活是保…...

Android Studio中文界面配置指南:提升开发效率的完整方案

Android Studio中文界面配置指南&#xff1a;提升开发效率的完整方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 一、问题诊断…...

对工作分工的一点简介记录

今天谈需求的时候&#xff0c;主管兼功能需求顾问&#xff09;的一句话&#xff08;XXX业务主管有个需求报表&#xff0c;我已经让他出了表样且让他在系统中截图字段&#xff0c;我一会转发给你开发一下&#xff09;让我打开了话匣子&#xff0c;我们就交流了一下信息化业务关键…...

Databricks收购Quotient AI:AI智能体领域的战略布局

Databricks收购Quotient AI&#xff0c;剑指AI智能体可靠性难题Databricks收购了AI智能体评估与训练软件提供商Quotient AI&#xff0c;虽未公布具体交易金额&#xff0c;但此次收购旨在帮助企业更可靠地在生产环境中扩展AI智能体。Databricks在声明中表示&#xff0c;Quotient…...

Splunk RCE漏洞允许攻击者执行任意Shell命令

漏洞概述Splunk发布紧急安全公告&#xff0c;警告用户其Enterprise和Cloud平台存在一个高危漏洞&#xff08;CVE-2026-20163&#xff09;&#xff0c;CVSS评分为8.0。该漏洞允许攻击者在目标系统上执行远程命令&#xff08;RCE&#xff09;。漏洞成因漏洞源于系统在索引上传文件…...

从3小时到18分钟:抖音批量下载工具如何重构内容获取效率

从3小时到18分钟&#xff1a;抖音批量下载工具如何重构内容获取效率 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代&#xff0c;高效获取和管理抖音内容已成为内容创作者、研究者和营销…...

3分钟实现本地图片秒搜:ImageSearch从入门到精通

3分钟实现本地图片秒搜&#xff1a;ImageSearch从入门到精通 【免费下载链接】ImageSearch 基于.NET8的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 副标题&#xff1a;献给摄影爱好者与…...

Sunshine游戏串流服务器实践指南:从技术原理到优化部署

Sunshine游戏串流服务器实践指南&#xff1a;从技术原理到优化部署 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunsh…...

channel.read(dest, channelPosition) 的读取大小限制

1.FileChannel.read(ByteBuffer, long) 一次**不一定**读完。 2.channel.read(dest, channelPosition) 并不是从 dest 的起始位置&#xff08;索引 0&#xff09;开始写入&#xff0c;而是从 dest 当前的 position() 开始写入&#xff0c;并随着写入自动推进 position。 ## 核…...

目前需要做的事情

我的app看起来感觉就是个人开发者做出来的&#xff1a;感觉不专业现在最重要的就是去掉这种廉价感。不管是不是最重要的&#xff0c;这种廉价感是一定要改变的。...

ISTA2A跌落测试及跌落高度多少,内部验证ISTA2A标准

先给大家科普一个物流圈的“包装体检标准”——ISTA 2A&#xff01;它是国际安全运输协会&#xff08;ISTA&#xff09;打造的“2系列明星标准”&#xff0c;专门针对单包装、重量≤150磅&#xff08;68千克&#xff09;的运输包装产品&#xff0c;相当于给包装做“抗造能力测试…...

AI写代码三个月后,我的一些真实感受

用 AI 写代码三个月了,从一开始的"这也太神了吧"到后来的"怎么又开始胡说八道了",心情像坐过山车。今天想聊聊真实的体验,不是吹捧也不是踩,就是实际使用后的感受。 先说结论 AI 写代码有用,但没有宣传的那么神。 它能帮你写 CRUD、生成样板代码、解…...

在 vue2 或 vue3中实现excel单元格选择、复制粘贴功能的方式

vue如何实现excel单元格选择、复制粘贴功能&#xff0c;在 vue2 或 vue3 表格中可以使用功能强大的vxe-table来实现&#xff0c;通过 mouse-config.area 启用单元格选择功能和 keyboard-config.isClip 启用复制粘贴功能 查看官网&#xff1a;https://vxetable.cn 如果需要支持…...

3步攻克HEIF格式难题:Windows平台苹果图像完美解决方案

3步攻克HEIF格式难题&#xff1a;Windows平台苹果图像完美解决方案 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility HEIF Utility是一款专为Windows系统设计的开源…...