目录
一、前言
二、项目简介
1.功能详解
2.主要器件
三、原理图设计
四、PCB硬件设计
1.PCB图
2.PCB板打样焊接图
五、程序设计
六、实验效果
七、资料内容
项目分享
一、前言
项目成品图片:
哔哩哔哩视频链接:
https://www.bilibili.com/video/BV19B421B7x2/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能小区充电桩系统。功能如下:
- 车辆进出数量记录:光电传感器采集记录车辆出入个数
- LED指示灯:车辆出入时闪烁提醒
- 环境温湿度采集:SHT-30采集环境温湿度
- 危险气体报警:MQ-7判断危险气体是否超标
- OLED显示:显示进出车辆个数、温湿度信息和一氧化碳浓度
- 蜂鸣器报警:温湿度、危险气体超过阈值范围报警
- 机智云APP:手机端app远程监视数据、节阈值与控制报警模式开关
2.主要器件
- STM32F103C8T6最小系统板
- OLED显示屏(4针I2C协议)
- SHT-30温湿度传感器
- 光电红外传感器
- MQ-7一氧化碳传感器
- 蜂鸣器
三、原理图设计
四、PCB硬件设计
1.PCB图
2.PCB板打样焊接图
五、程序设计
int main(void)
{
/* USER CODE BEGIN 1 */
char car_str[32];
char car_exit_str[32];
char gas_str[32];
char temp_str[32];
char humi_str[32];
/* 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_TIM2_Init();
MX_USART2_UART_Init();
MX_ADC1_Init();
MX_I2C1_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
/* Initialize interrupts */
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
timerInit();
uartInit();
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, "Charging Safety", 16);
OLED_ShowString(38, 2, "System", 16);
OLED_ShowString(0, 4, "Gas:", 16);
OLED_ShowString(45, 4, "0", 16);
OLED_ShowString(0, 6, "T:", 16);
OLED_ShowString(20, 6, "0.0", 16);
OLED_ShowString(65, 6, "H:", 16);
OLED_ShowString(85, 6, "0.0", 16);
userInit();
gizwitsInit();
SHT30_reset();
if(SHT30_Init() != HAL_OK) {
printf("sht30 init fail.\n");
}
timer_init(&timer1, timer1_callback, 1000, 1000); //1s loop
timer_start(&timer1);
GIZWITS_LOG("MCU Init Success , SoftVersion = %s\r\n",SOFTWARE_VERSION);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
key1LongPress();
//key1ShortPress();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint);
timer_loop();
uint32_t car_num = get_current_enter_car();
memset(car_str, 0, 32);
snprintf(car_str, 32, "%-5d", car_num);
//OLED_ShowString(85, 0, car_str, 16);
uint32_t car_exit_num = get_current_exit_car();
memset(car_exit_str, 0, 32);
snprintf(car_exit_str, 32, "%-5d", car_exit_num);
//OLED_ShowString(85, 2, car_exit_str, 16);
uint16_t gas = mq2_get_gas();
memset(gas_str, 0, 32);
snprintf(gas_str, 32, "%-5d", gas);
OLED_ShowString(45, 4, gas_str, 16);
//显示温度和湿度
float temp = sht3x_get_temp();
memset(temp_str, 0, 32);
snprintf(temp_str, 32, "%.1f", temp);
OLED_ShowString(20, 6, temp_str, 16);
float humi = sht3x_get_humi();
memset(humi_str, 0, 32);
snprintf(humi_str, 32, "%.1f", humi);
OLED_ShowString(85, 6, humi_str, 16);
//阈值检测
if (global_mode == 0) {
continue;
}
//温湿度阈值超标告警
if (humi > max_humi && max_humi != 0.0) {
beep_on();
} else if (temp > max_temp && max_temp != 0.0) {
beep_on();
} else if (humi < min_humi && min_humi != 0.0) {
beep_on();
} else if (temp < min_temp && min_temp != 0.0) {
beep_on();
} else if (smoke_value > max_gas && max_gas != 0.0){
beep_on();
} else {
beep_off();
}
}
/* USER CODE END 3 */
}
六、实验效果
七、资料内容