一、总述
将按钮单独通过一个引脚作为信号输入到stm32单片机,用来控制灯泡的颜色变化,电位器也通过一个引脚作为变量信号输入到单片机中,用这两个变量控制RGB灯的颜色及亮度,输出要用到单片机中的PWM引脚(脉冲宽度调制,将数字电压信号输出为模拟电压信号状态),按钮引脚要接上拉电阻,此处采用的是单片机中自带的上拉电阻(稳定信号和防止浮动),电位器要用到ADC引脚(模数转换器)
二、原理电路图
三、代码部分
使用Arduion软件进行上传:
const int redPin = 3; // PWM支持的引脚
const int greenPin = 4; // PWM支持的引脚
const int bluePin = 5; // PWM支持的引脚
const int button= 2; // 按钮上拉电阻引脚
const int potPin = 1; // 选择一个支持ADC的引脚
int button_count = 1;//按钮按动次数
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(button, INPUT_PULLUP); //初始化按键引脚为输入,并启用内部上拉电阻
pinMode(potPin, INPUT); // 初始化电位器引脚为模拟输入
Serial.begin(9600);//串口频率
}
void loop() {
int value=map(analogRead(1),0,4095,0,255);//获取1号引脚输入的数据,0~4095为12位模数转换器的范围,map()为映射函数,将0~4095等比例归为0~255,0~255为输出的PWM的占空比
Serial.println(value); //串口显示
delay(100);
if(digitalRead(button)==LOW) //按键扫描
{
delay(20);//消抖,防止程序误以为短时间按了多次
if(digitalRead(button)==LOW);
{
button_count=button_count+1;
while(digitalRead(button)==LOW);
}
}
if(button_count==1)
{
analogWrite(redPin,value);
analogWrite(greenPin, 0);
analogWrite(bluePin,0 );
delay(200);
}
if(button_count==2)
{
analogWrite(redPin, 0);
analogWrite(greenPin, value);
analogWrite(bluePin, 0);
delay(200);
}
if(button_count==3)
{
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, value);
delay(200);
}
if(button_count>3)
{
button_count=1;
}
}