首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用按钮控制pwm

用按钮控制pwm
EN

Stack Overflow用户
提问于 2022-01-19 09:33:54
回答 1查看 341关注 0票数 0

我对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

代码语言:javascript
复制
//
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
       
} ``` 
EN

回答 1

Stack Overflow用户

发布于 2022-01-20 15:50:35

变量pwm3V的值将始终是0,除非在正确的时间按下button3;问题在于控制结构。由于在按钮的电路图中使用了拉出电阻,当按下按钮时,在Arduino板上读取一个低信号。

在下面开发的解决方案中,我以您的源代码为基础,但是我做了大量的编辑。通过将按钮和引脚定义为一个系列,我使事情变得更简单。我检查了引脚是否低级别,以检查按钮按下状态。我使用loopControl变量设计了一种控制机制,这样在按下按钮后,在迭代中就不会清除输出。

代码语言:javascript
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70768209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档