关于多个灯颜色配置代码的优化

为什么要写这篇

温故而知新。
  相比于最初的版本,下面这个程序代码已经将硬件层分离开来了,但是还有改进优化的地方,代码重复性太强,这个可能可读性稍微强一些,但是每增加一个RGB灯就会增添将近三十行重复性代码,一个源文件里有一半是重复性代码估计阅读体验也不会好吧。

/**
 * led_1_set_color
 * @brief 设置对应编号RGB灯颜色,七色可选,也可熄灭
 * @param[in] color: 0,灭; 1,红; 2,黄 ;3,绿 ; 4,青; 5,蓝; 6,紫; 7,白
 * @return void
 */
static void
led_1_set_color(uint8_t color)
{
   switch (color)
   {
    case RED:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    case GREEN:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    case BLUE:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case YELLOW:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    case PURPLE:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case CHING:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case WHITE:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case NO_COLOR:
    	set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    default:
        break;
   }
}
/**
 * led_2_set_color
 * @brief 设置对应编号RGB灯颜色,七色可选,也可熄灭
 * @param[in] color: 0,灭; 1,红; 2,黄 ;3,绿 ; 4,青; 5,蓝; 6,紫; 7,白
 * @return void
 */
static void
led_2_set_color(uint8_t color)
{
   switch (color)
   {
    case RED:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    case GREEN:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    case BLUE:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case YELLOW:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    case PURPLE:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case CHING:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case WHITE:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
        break;
    case NO_COLOR:
    	set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
    	set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
        break;
    default:
        break;
   }
}

头文件相关设置

#define RED_1_PIN      GPIO_PC2
#define GREEN_1_PIN    GPIO_PC3
#define BLUE_1_PIN     GPIO_PC4

#define RED_2_PIN      GPIO_PB5
#define GREEN_2_PIN    GPIO_PD2
#define BLUE_2_PIN     GPIO_PB4

enum rgb_color
{
    NO_COLOR = 0,
    RED,
    YELLOW,
    GREEN,
    CHING,
    BLUE,
    PURPLE,
    WHITE,
};

代码优化

  当初自己能力不够,想改动来着,结果选错了方法,使用的##操作符,而如何使用又一知半解,最后没有成功。经过这一段时间不断提升,各种常用的数据结构已经达到信手拈来的程度了,对代码和注释也基本形成自己的风格了(注释由中文变成了英文,因为已经实在受不了辛辛苦苦写的注释都变成乱码的那种感觉了),之后要继续提升更重要的是认准方向,认知升级,优化和架构,通过自己的思考来一点点接触和了解操作系统。

优化后头文件相关设置

/* RGB pin define */
#define RED_1_PIN      GPIO_PC2
#define GREEN_1_PIN    GPIO_PC3
#define BLUE_1_PIN     GPIO_PC4

#define RED_2_PIN      GPIO_PB5
#define GREEN_2_PIN    GPIO_PD2
#define BLUE_2_PIN     GPIO_PB4

/* choose RGB */
typedef enum
{
	RGB1 = 0,
	RGB2,
}Rgb_Id;

/* set R G B pin */
typedef struct rgb_pin
{
	Gpio_Pin red_pin;
	Gpio_Pin green_pin;
	Gpio_Pin blue_pin;
}Rgb_Pin;

static Rgb_Pin array_rgb_pin[2] =
{
	{RED_1_PIN, GREEN_1_PIN, BLUE_1_PIN},
	{RED_2_PIN, GREEN_2_PIN, BLUE_2_PIN},
};


/* set color */
typedef struct color_set
{
	uint8_t color;
	uint8_t set_color;
}COLOR_SET;

typedef enum rgb_color
{
    NO_COLOR = 0,
    RED,
    YELLOW,
    GREEN,
    CHING,
    BLUE,
    PURPLE,
    WHITE,
}RGB_COLOR;

可复用的模块函数

void rgb_set_color(Rgb_Id id, RGB_COLOR color)
{
	switch (color)
   {
	case RED:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
		break;
	case GREEN:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
		break;
	case BLUE:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
		break;
	case YELLOW:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
		break;
	case PURPLE:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
		break;
	case CHING:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
		break;
	case WHITE:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
		break;
	case NO_COLOR:
		set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
		set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
		break;
	default:
		break;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个基于OpenCV的红绿智能小的简单示例代码: ```python import2 import numpy as np import RPi.GPIO GPIO import time # 设置红颜色的范围 lower_red =.array([0, 100, ]) upper_red = np.array([10, 255, 255]) lower_green = np.array([50, 100, 100]) upper_green = np.array([70, 255, 255]) # 设置GPIO引脚 GPIO.setmode(GPIO.BOARD) GPIO.setup(11, GPIO.OUT) # 红引脚 GPIO.setup(13, GPIO.OUT) # 绿引脚 # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取图像帧 ret, frame = cap.read() if not ret: break # 转换颜色空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 创建红绿掩膜 mask_red = cv2.inRange(hsv, lower_red, upper_red) mask_green = cv2.inRange(hsv, lower_green, upper_green) # 对掩膜进行形态学处理以去除噪声 kernel = np.ones((5, 5), np.uint8) mask_red = cv2.morphologyEx(mask_red, cv2.MORPH_OPEN, kernel) mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel) # 检测红绿区域 contours_red, _ = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours_green, _ = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 判断红状态 if len(contours_red) > 0: GPIO.output(11, GPIO.HIGH) # 点亮红 GPIO.output(13, GPIO.LOW) # 熄灭绿 else: GPIO.output(11, GPIO.LOW) # 熄灭红 GPIO.output(13, GPIO.HIGH) # 点亮绿 # 显示结果图像 cv2.imshow('Traffic Light Detection', frame) # 按下'q'键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 清理GPIO引脚和释放摄像头 GPIO.cleanup() cap.release() cv2.destroyAllWindows() ``` 请注意,上述代码是在树莓派上使用GPIO控制红绿的示例。你需要根据你的硬件配置和引脚连接进行适当的调整。此外,还可能需要根据实际情况进行更多的图像处理和算法优化来提高红绿检测的准确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值