本帖最后由 电子星辰 于 2018-7-29 22:09 编辑
首先感谢ROHM社区组织举办此次活动,为我们提供了学习的资源和平台。调试了十来天,又从中学到了新东西。 本次开发是希望模拟出智能社区里物联网系统的部分光控功能,以STM32f103cbT6核心板作为中央控制,以BH1750传感器模块作为光照采集终端,根据当前光照强度数据,用PWM控制核心板的LED亮度来当做路灯,并以0.96寸OLED显示屏当做社区显示板显示光照强度和路灯亮度。 原理介绍: (1)硬件组成与介绍: 1、通过ST-Link给核心板下载程序并供给5V电压; 2、BH1750FVI传感器模块,VCC-5V,SCL-PB2,SDA-PB3,ADD-GND(地址0x46); 3、0.96寸OLED模块,VCC-3.3V,SCL-PB0,SDA-PB1。 (2)此DIY方案中BH1750的功能:作为采集光照强度数据的传感器采集终端。 (3)软件流程介绍 1、GPIO、定时器、串口、BH1750和OLED初始化 2、通过定时器判断是否1秒? 3、每1秒钟执行一次以下代码; 4、通过软件模拟I2C获取光照强度数据; 5、根据光照强度调整PWM占空比,在0~100Lux之间,光照越弱LED越亮,光照强度大于100Lux后,LED熄灭; 6、通过软件模拟I2C控制OLED显示。 实物与演示: (1)实物图片与说明 整体硬件图
整体硬件
LED灯图
LED灯
OLED显示特写
OLED特写
(2)Cube设置 pinout设置
时钟设置
GPIO模拟I2C设置
定时器设置,预分频71,period19999,pulse19999,开启中断
最终定时器频率计算为: 72MHz/(TIMx_PRESCALER+1/(TIMx_REPETITIONCOUNTER+1)/TIMx_PERIOD
比如需要产生20ms周期定时,可以设置为:72MHz/(71+1)/(0+1)/20000=50Hz,即20ms周期
时钟设置,开启全局中断
(3)代码说明 主函数 - int main(void)
- {
- /* USER CODE BEGIN 1 */
- uint16_t iLux;//光照强度值
- /* 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 */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_TIM4_Init();
- MX_USART1_UART_Init();
- /* USER CODE BEGIN 2 */
- HAL_TIM_Base_Start_IT(&htim4);//启动定时器
- HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);//启动通道PWM输出
- if(I2C_InitCheckDevice(BH1750_SLAVE_ADDRESS) != 0) printf("BH1750FVI Err (0x%02X)\r\n",BH1750_SLAVE_ADDRESS);
- bsp_InitBH1750();//初始化BH1750:Power On并设置为连续高分测量模式2
- OLED_Init();//初始化OLED
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- OLED_Clear();//清屏
- OLED_ShowCHinese(0,0,18);//模
- OLED_ShowCHinese(18,0,19);//拟
- OLED_ShowCHinese(36,0,20);//光
- OLED_ShowCHinese(54,0,21);//控
- OLED_ShowCHinese(72,0,22);//子
- OLED_ShowCHinese(90,0,23);//系
- OLED_ShowCHinese(108,0,24);//统
- while (1)
- {
- if(TX_OutTime > USART_TIMES)//大概1s打印1次
- {
- TX_OutTime = 0;
- iLux = (uint16_t)BH1750_GetLux();//获取光照强度
- PWM_SetValue(iLux * Light_propor);//设置PWM占空比
- OLED_Clear();
- OLED_ShowCHinese(0,0,18);//模
- OLED_ShowCHinese(18,0,19);//拟
- OLED_ShowCHinese(36,0,20);//光
- OLED_ShowCHinese(54,0,21);//控
- OLED_ShowCHinese(72,0,22);//子
- OLED_ShowCHinese(90,0,23);//系
- OLED_ShowCHinese(108,0,24);//统
- OLED_ShowString(0,3,"Light:",16);
- OLED_ItoC_Show(54,3,iLux,16);//显示光照强度
- OLED_ShowString(100,3,"Lux",16);
- OLED_ShowString(16,6,"LED:",16);
- OLED_ItoP_Show(62,6,(100 - iLux*Light_propor*100 / 20000),16);//显示LED灯的PWM百分比
- OLED_ShowString(108,6,"%",16);
- }
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码
|