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

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

之前分别记录了工厂方法模式和桥接模式,现在需要结合起来使用

例 需要多个DS8B20温度传感器和多个MAX31855芯片获取热电偶温度

sensor.h

c 复制代码
#ifndef __DRV_SENSOR_H
#define __DRV_SENSOR_H

#include <stdint.h>

/* 传感器类型枚举 */
typedef enum {
  SENSOR_DS18B20,
  SENSOR_DHT22,
  SENSOR_MAX31855,
  SENSOR_PT100,
  SENSOR_PT1000,
  SENSOR_NTC,
  SENSOR_TYPE_MAX
} SensorType_t;

/* 传感器对象结构体(类似于抽象类) */
typedef struct {
    void     (*Init)(void *pPrivate);          // 初始化函数
    float    (*Read)(void *pPrivate);           // 读取数据函数
    void     *pPrivate;                          // 私有数据(具体传感器需要的硬件信息)
    const    char *name;                            // 传感器名称
} Sensor_t;

/* 工厂函数:创建传感器对象(返回常量指针,避免外部修改) */
//const Sensor_t* Sensor_Create(SensorType_t type);
const Sensor_t* Sensor_Create(SensorType_t type, uint8_t instance);

#endif

sensor.c

c 复制代码
#include "drv_sensor.h"

#include "drv_DHT22.h"
#include "drv_DS18B20.h"
#include "drv_MAX31855.h"

#include "bsp_spi.h"
#include "bsp_timer.h"


/* 支持的最大DS18B20实例数 */
#define DS18B20_MAX_INSTANCE  5
#define MAX31855_MAX_INSTANCE  5

/* 静态私有数据实例(假设使用固定的引脚:例如 GPIOA, GPIO_PIN_0) */
static DS18B20_Private_t ds18b20_priv0 = {
    .port = GPIOA,
    .pin  = GPIO_PIN_0
};

static DS18B20_Private_t ds18b20_priv1 = {
    .port = GPIOA,
    .pin  = GPIO_PIN_1
};


static const Sensor_t ds18b20_sensor[DS18B20_MAX_INSTANCE] = {
    {
        .Init     = DS18B20_Init,
        .Read     = DS18B20_Read,
        .pPrivate = &ds18b20_priv0,
        .name     = "DS18B20_0"
    },
    {
        .Init     = DS18B20_Init,
        .Read     = DS18B20_Read,
        .pPrivate = &ds18b20_priv1,
        .name     = "DS18B20_1"
    }
};



/* DHT22 私有数据 */
static DHT22_Private_t dht22_priv = 
{
    .port = GPIOB,
    .pin  = GPIO_PIN_1
};
static const Sensor_t dht22_sensor = 
{
    .Init     = DHT22_Init,
    .Read     = DHT22_Read,
    .pPrivate = &dht22_priv,
    .name     = "DHT22"
};



// 声明SPI句柄
SoftSPI_HandleTypeDef hspi2 = 
{
	.name = "hspi2",
	    // 配置SPI1引脚(模拟)
    .SCK_Port = GPIOF,
    .SCK_Pin = GPIO_PIN_7,
    .MOSI_Port = GPIOF,
    .MOSI_Pin = GPIO_PIN_9,
    .MISO_Port = GPIOF,
    .MISO_Pin = GPIO_PIN_8,
    .NSS_Port = GPIOF,
    .NSS_Pin = GPIO_PIN_6,
    
    // 配置参数
    .mode = SPI_MODE0,                // 模式0
    .firstBit = SPI_FIRSTBIT_MSB,      // MSB先行
    .baudRatePrescaler = SPI_BAUDRATE_DIV256, // ~2.6MHz
    
    // 使用默认软件定时器延时
    .useHardwareDelay = 0,
	
	 /* 函数指针 */
    .ChipSelect = SoftSPI_ChipSelect,
	.Init = SoftSPI_Init,
	.TransferBytes = SoftSPI_TransferBytes,
	.WriteByte = SoftSPI_WriteBytes,
	.ReadByte = SoftSPI_ReadBytes,
	.delay_ns = NULL,
	.delay_us = HAL_Delay_us,
	.delay_ms = HAL_Delay
};

// 声明SPI句柄
SoftSPI_HandleTypeDef hspi3 = 
{
	.name = "hspi3",
	    // 配置SPI1引脚(模拟)
    .SCK_Port = GPIOF,
    .SCK_Pin = GPIO_PIN_7,
    .MOSI_Port = GPIOF,
    .MOSI_Pin = GPIO_PIN_9,
    .MISO_Port = GPIOF,
    .MISO_Pin = GPIO_PIN_8,
    .NSS_Port = GPIOF,
    .NSS_Pin = GPIO_PIN_10,
    
    // 配置参数
    .mode = SPI_MODE0,                // 模式0
    .firstBit = SPI_FIRSTBIT_MSB,      // MSB先行
    .baudRatePrescaler = SPI_BAUDRATE_DIV256, // ~2.6MHz
    
    // 使用默认软件定时器延时
    .useHardwareDelay = 0,
	
	 /* 函数指针 */
    .ChipSelect = SoftSPI_ChipSelect,
	.Init = SoftSPI_Init,
	.TransferBytes = SoftSPI_TransferBytes,
	.WriteByte = SoftSPI_WriteBytes,
	.ReadByte = SoftSPI_ReadBytes,
	.delay_ns = NULL,
	.delay_us = HAL_Delay_us,
	.delay_ms = HAL_Delay
};







MAX31855_Private_t MAX31855_priv[] =
{
	{
		.hspi = &hspi2
	},
	{
		.hspi = &hspi3
	}
};
static const Sensor_t MAX31855_sensor[MAX31855_MAX_INSTANCE] = 
{
	{
	.Init     = MAX31855_Init,
    .Read     = MAX31855_Read,
    .pPrivate = &MAX31855_priv[0],
    .name     = "MAX31855_0"
	},
	{
	.Init     = MAX31855_Init,
    .Read     = MAX31855_Read,
    .pPrivate = &MAX31855_priv[1],
    .name     = "MAX31855_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;
//    }
//}

/* 获取指定实例 */
const Sensor_t* DS18B20_GetInstance(uint8_t instance) 
{
    if (instance < DS18B20_MAX_INSTANCE) {
        return &ds18b20_sensor[instance];
    }
    return NULL;
}

/* 获取指定实例 */
const Sensor_t* MAX31855_GetInstance(uint8_t instance) 
{
    if (instance < MAX31855_MAX_INSTANCE) {
        return &MAX31855_sensor[instance];
    }
    return NULL;
}


const Sensor_t* Sensor_Create(SensorType_t type, uint8_t instance) 
{
    switch (type) {
        case SENSOR_DS18B20:
            return DS18B20_GetInstance(instance);   // 支持多个实例
        case SENSOR_DHT22:
            // DHT22若只有一个实例,instance参数可忽略或检查
            if (instance == 0) return &dht22_sensor;
            else return NULL;
					case SENSOR_MAX31855:
            return MAX31855_GetInstance(instance); 
        default:
            return NULL;
    }
}

MAX31855.h

c 复制代码
#ifndef __DRV_MAX31855_H
#define __DRV_MAX31855_H

#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "stm32f4xx_hal.h"
//#include "drv_sensor.h"
#include "bsp_spi.h"

typedef struct 
{
	SoftSPI_HandleTypeDef  *hspi;

}MAX31855_Private_t;


static uint8_t MAX31855_ReadData(void *pPrivate, float *temp);
void MAX31855_Init(void *pPrivate);
float MAX31855_Read(void *pPrivate);





#endif

原先的DS18B20和DHT22的文件则无需改变

MAX31855.c

c 复制代码
#include "drv_MAX31855.h"



static uint8_t MAX31855_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);
}
void MAX31855_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");
}
float MAX31855_Read(void *pPrivate)
{
	//    float temp;
//    if (MAX31855_ReadData(pPrivate, &temp,) 
//		{
//        // 返回温度值(保留一位小数)
//        return temp / 10.0f;
//    }
//    return -999.0f;  // 错误标志
	
	
	return 25;  // 
}

测试

c 复制代码
int main(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 */
	
// 创建温度传感器(DS18B20)
    const Sensor_t *temp_sensor0 = Sensor_Create(SENSOR_DS18B20,0);
    if (temp_sensor0) 
		{
        temp_sensor0->Init(temp_sensor0->pPrivate);
        printf("Sensor is  %s\n", temp_sensor0->name);
    }
		
		const Sensor_t *temp_sensor1 = Sensor_Create(SENSOR_DS18B20,1);
    if (temp_sensor1) 
		{
        temp_sensor1->Init(temp_sensor1->pPrivate);
        printf("Sensor is  %s\n", temp_sensor1->name);
    }

    // 创建湿度传感器(DHT22)
    const Sensor_t *humi_sensor = Sensor_Create(SENSOR_DHT22,0);
    if (humi_sensor) {
        humi_sensor->Init(humi_sensor->pPrivate);
        printf("Sensor is  %s\n", humi_sensor->name);
    }
		
		 // 使用MAX31855来测量热电偶
    const Sensor_t *temp_sensor2 = Sensor_Create(SENSOR_MAX31855,0);
    if (temp_sensor2) 
		{
        temp_sensor2->Init(temp_sensor2->pPrivate);
        printf("Sensor is  %s\n",temp_sensor2->name);
    }
	  const Sensor_t *temp_sensor3 = Sensor_Create(SENSOR_MAX31855,1);
    if (temp_sensor3) 
		{
        temp_sensor3->Init(temp_sensor3->pPrivate);
        printf("Sensor is  %s\n",temp_sensor3->name);
    }
		
		
		
		/* 读取各个温度传感器温度 */
	  if (temp_sensor0) 
		{
				float t = temp_sensor0->Read(temp_sensor0->pPrivate);
			  printf("Sensor is  %s,Temperature: %.2f°C\n", temp_sensor0->name,t);
		}
		if (temp_sensor1) 
		{
				float t = temp_sensor1->Read(temp_sensor1->pPrivate);
			  printf("Sensor is  %s,Temperature: %.2f°C\n", temp_sensor1->name,t);
		}
		
		if (temp_sensor2) 
		{
				float t = temp_sensor2->Read(temp_sensor2->pPrivate);
			  printf("Sensor is  %s,Temperature: %.2f°C\n", temp_sensor2->name,t);
		}
		
		if (temp_sensor3) 
		{
				float t = temp_sensor3->Read(temp_sensor3->pPrivate);
				 printf("Sensor is  %s,Temperature: %.2f°C\n", temp_sensor3->name,t);
		}
		
	 if (humi_sensor) 
	 {
			float h = humi_sensor->Read(humi_sensor->pPrivate);
			printf("Humidity: %.2f%%\n", h);
	 }
	 

    while (1) {
        
        HAL_Delay(2000);
    }

可以看到创建了多个不同的传感器,并且正确显示温度

相关推荐
Suifqwu8 小时前
rk3576(6)之设备树下GPIO驱动
单片机·嵌入式硬件
三佛科技-187366133979 小时前
国产替代新选择|替代STM32/APM32型号推荐(32位MCU)
stm32·单片机·嵌入式硬件
要不枉此行10 小时前
BLE 性能调优全攻略:MTU 配置、DLE 开启与干扰优化
单片机
llilian_1610 小时前
信号失真度测试仪 自动失真测试仪 低失真度自动测量仪为各行业精准赋能 自动失真仪
网络·功能测试·单片机·测试工具
zmj32032411 小时前
KW45芯片的安全启动
单片机·嵌入式开发·安全启动
DA022111 小时前
系统移植-STM32MP1_BusyBox移植
stm32·单片机·系统移植
殷忆枫11 小时前
基于STM32F103C8T6的R60AFD1毫米波雷达模块驱动设计
stm32·单片机·嵌入式硬件
somi712 小时前
ARM-12-I.MX6U LCD
arm开发·单片机·嵌入式硬件·自用
bubiyoushang88813 小时前
基于STM32的心电采集系统设计
stm32·单片机·嵌入式硬件
youcans_13 小时前
【STM32-MBD】(18)Clarke / Park 坐标变换链路
stm32·单片机·嵌入式硬件·matlab·代码生成