单片机的工厂方法模式和桥接模式结合使用
记录下单片机使用工厂方法模式和桥接模式结合使用之前分别记录了工厂方法模式和桥接模式现在需要结合起来使用例 需要多个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);}可以看到创建了多个不同的传感器并且正确显示温度
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410516.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!