基于stm32f103c8t6和yolov5的半固定时间红绿灯调控算法(嵌入式部分)
在第一次判断中最多车辆且不为零的道路亮灯,此时对该道路进行标记,该道路不参与下一轮亮灯。第二次判断仍对四个道路排序,检查最多车辆的道路是否为上一次亮灯道路,如果是,跳过,检查下一个道路。:接收到电脑端传来道路编号1,2,3,4,上的车辆数,单片机对于接收到的数据进行处理,由大到小排序。为实现每条有车的道路都可以通行,一轮当中最多有四次不同道路亮绿灯。在亮灯持续接收电脑发送的数据,检查当前亮灯道路车
·
视觉部分使用yolov5训练大模型识别车辆。通过小电脑传输信号给开发板,通过开发板实现调控,智能分配时间片。
目录
1.调控算法
逻辑:接收到电脑端传来道路编号1,2,3,4,上的车辆数,单片机对于接收到的数据进行处理,由大到小排序。为实现每条有车的道路都可以通行,一轮当中最多有四次不同道路亮绿灯。
在第一次判断中最多车辆且不为零的道路亮灯,此时对该道路进行标记,该道路不参与下一轮亮灯。第二次判断仍对四个道路排序,检查最多车辆的道路是否为上一次亮灯道路,如果是,跳过,检查下一个道路。剩下两个道路重复如此操作,若判断四个灯都亮过一次则结束该轮进入下一轮。
若在某一次检测到当次应亮绿灯道路车辆数为零则标记位清零提前进入下一轮。
在亮灯持续接收电脑发送的数据,检查当前亮灯道路车辆是否为零,为零则标记位重置,结束绿灯状态提前进入下一次。
代码:主要逻辑在串口中断中实现。
代码下设以下全局变量
接收到四个道路上的车辆数后开始执行
下面是代码主要逻辑部分
if (rx_index >= 4) { // 接收到4个车辆数后进行处理
rx_index = 0;
if(times == 4){ //判断一轮是否结束
a = 0, b = 0, c = 0, d = 0, times = 0;
}
if (flag == 1 ) { // 如果已亮绿灯道路没车
if(vehicle_counts[flag1-1] == 0){
reset_green_lights();
Order = 1;
flag = 0;
flag1 = 0;
}
}
else if(flag == 0) { //如果此时没有绿灯亮
USART1_printf("start");//测试
for (int i = 0; i < 4; i++) {
uint8_t current_lane = lane_numbers[i];
uint8_t current_count = vehicle_counts[i];
int j = i;
while (j > 0 && vehicle_counts[j - 1] < current_count) {
vehicle_counts[j] = vehicle_counts[j - 1]; //排序
sorted_lanes[j] = sorted_lanes[j - 1];
j--;
}
vehicle_counts[j] = current_count;
sorted_lanes[j] = current_lane;
}
// for(uint8_t i = 0;i < 4;i++){
// USART1_SendByte(sorted_lanes[i]);
// }//测试
// 处理排序后的道路编号和车辆数
for (int i = 0; i < 4; i++) {
uint8_t lane_number = sorted_lanes[i];
uint8_t vehicle_count = vehicle_counts[sorted_lanes[i]];
if (lane_number != a && lane_number != b && lane_number != c && lane_number != d) {// 如果当前道路在该轮没亮且车辆数不为零
USART1_SendByte(vehicle_count);//测试
if (vehicle_count == 0){// 检查该次应亮绿灯道路上车辆数为0
USART1_printf("stop");//测试
a = b = c = d = 0;
times = 0;
break;
}
flag1 = lane_number;
reset_green_lights();
if (a == 0) a = lane_number;
else if (b == 0) b = lane_number;
else if (c == 0) c = lane_number;
else if (d == 0) d = lane_number;
times = times + 1;
USART1_SendByte(times);
// 根据道路编号,点亮相应的LED灯
if (flag1 == 1) {
flag = 1;
USART1_printf("a");
reset_green_lights();
LED_Turn(GPIOB, GPIO_Pin_0);
LED_Turn(GPIOA, GPIO_Pin_0);
break;
}else if (flag1 == 2) {
flag = 1;
USART1_printf("b");
reset_green_lights();
LED_Turn(GPIOB, GPIO_Pin_1);
LED_Turn(GPIOA, GPIO_Pin_1);
break;
}else if (flag1 == 3) {
flag = 1;
USART1_printf("c");
reset_green_lights();
LED_Turn(GPIOB, GPIO_Pin_2);
LED_Turn(GPIOA, GPIO_Pin_2);
break;
}else if (flag1 == 4) {
flag = 1;
USART1_printf("d");
reset_green_lights();
LED_Turn(GPIOB, GPIO_Pin_3);
LED_Turn(GPIOA, GPIO_Pin_3);
break;
}
}
}
}
}
2.逻辑草稿
3.不足处(欢迎补充)
在处理时没有根据高峰和平峰时车流量分配时间片,只实现了在分配时间片时检测没有车的车道提前跳过绿灯。
更多推荐
所有评论(0)