我对arduino很陌生,我一直试图用按钮来控制pwm。我的任务是,当按下不同的按钮(按钮1: 25%、按钮2: 50%、按钮3 : 75%和没有按下按钮时)时,将pin 3的PWM值更改为不同的值,并打印出pin 3中的高值长度。但当我不按任何按钮时,它仍然会打印出一些奇怪的数字(我希望它会打印出0),当我按下任何按钮时,值不会改变(大约1595-1605)。知道怎么修吗?当我尝试运行它的时候,视频,https://drive.google.com/file/d/16lE8LDmHdlz0SbHj0AGGMQ8nNEcT8rIT/view?usp=sharing
//
int button1 = 8;
int LED1 = 2;
int button2 = 11;
int LED2 = 4;
int button3 = 12;
int LED3 = 7;
int pwm3 = 3;
int pwm3V;
unsigned long duration;
void setup()
{
pinMode(2, OUTPUT);
pinMode(8, INPUT);
pinMode(4, OUTPUT);
pinMode(11, INPUT);
pinMode(7, OUTPUT);
pinMode(12, INPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(button1)== HIGH)//Press Button 1
{
digitalWrite(LED1, HIGH);
pwm3V = 64;//pwm value 25%
}
if (digitalRead(button1)== LOW)// Unpress Button 1
{
digitalWrite(LED1, LOW);
pwm3V = 0;//pwm value
}
if (digitalRead(button2)== HIGH)//Press Button 2
{
digitalWrite(LED2, HIGH);
pwm3V = 64*2;//pwm value 50%
}
if (digitalRead(button2)== LOW)// Unpress Button 2
{
digitalWrite(LED2, LOW);
pwm3V = 0;//pwm value
}
if (digitalRead(button3)== HIGH)// Press Button 3
{
digitalWrite(LED3, HIGH);
pwm3V = 64*3;//pwm value 75%
}
if (digitalRead(button3)== LOW)// Unpress Button 3
{
digitalWrite(LED3, LOW);
pwm3V = 0;//pwm value
}
analogWrite(pwm3, pwm3V); //set pwm value
duration = pulseIn(pwm3, HIGH);
Serial.print(duration); //print lenght of HIGH
} ``` 发布于 2022-01-20 15:50:35
变量pwm3V的值将始终是0,除非在正确的时间按下button3;问题在于控制结构。由于在按钮的电路图中使用了拉出电阻,当按下按钮时,在Arduino板上读取一个低信号。
在下面开发的解决方案中,我以您的源代码为基础,但是我做了大量的编辑。通过将按钮和引脚定义为一个系列,我使事情变得更简单。我检查了引脚是否低级别,以检查按钮按下状态。我使用loopControl变量设计了一种控制机制,这样在按下按钮后,在迭代中就不会清除输出。
int buttonPins[] = {8, 11, 12}, ledPins[] = {2, 4, 7}, pwmPin = 3;
size_t size = sizeof(buttonPins)/sizeof(buttonPins[0]);
int pwmOutputValue;
unsigned long duration, loopControl;
void setup(){
for(size_t i = 0 ; i < size ; ++i){
pinMode(buttonPins[i], INPUT);
pinMode(ledPins[i], OUTPUT);
}
pinMode(pwmPin, OUTPUT);
Serial.begin(9600);
}
int readButtons(){
for(size_t index = 0 ; index < size ; ++index)
if(digitalRead(buttonPins[index]) == LOW)
return index;
return -1;
}
void updatePWMValue(){
analogWrite(pwmOutputValue, pwmPin);
duration = pulseIn(pwmOutputValue, HIGH);
Serial.print(duration);
}
void loop(){
int result = readButtons();
if(result != -1){
digitalWrite(result, HIGH);
pwmOutputValue = 64 * result;
}
else {
if(++loopControl > 100000){ // If this line is cancelled, the whole state is updated in the first cycle after the button is pressed.
for(size_t i = 0 ; i < size ; ++i)
digitalWrite(ledPins[i], LOW);
pwmOutputValue = 0;
loopControl = 0;
}
}
updatePWMValue();
}https://stackoverflow.com/questions/70768209
复制相似问题