首页 > 解决方案 > 如果我的按钮是 A) 刚刚按下、B) 被按住和 C) 刚刚释放,我如何调用三个不同的函数?

问题描述

我正在编写一个 Arduino 程序来控制一个迷你枪,用于朋友的角色扮演。我需要编写一个程序,当按下按钮时,电机从 0 上升到给定值(现在让我们说“analogWrite(output_pin,200);”)然后以该 RPM 循环,直到释放按钮,此时点它需要减速回零。

当我尝试将斜坡放入循环时,它并没有完成代码。我

我在 Arduino 按钮的 c++ 代码中需要这样的东西。(我使用“延迟”功能尝试过类似的事情,但无济于事)

motorspeed = 0 
if buttonpress == True:
    buttonheld = True
    for i in range (0,10):
        delay(1)
        motorspeed =+ 20
if buttonpress == False:
    motorspeed = 0

if buttonheld == True:
    motorspeed = 200 
    if buttonpress == False: 
        for i in range(0,10):
            delay(1)
            motorspeed =- 20
else:
    #shut off motor 
    #Play error sound

这是当前代码,仅在按住按钮时以一种速度运行电机。

const int button1 =4;
int BUTTONstate1 = 0;

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(button1, INPUT);
}

void loop()
{
  //set button to read
  BUTTONstate1 = digitalRead(button1);
  //if button is pressed
  if (BUTTONstate1 == HIGH)
  {
    //run current through motor
    digitalWrite(2, LOW); 
    digitalWrite(3, HIGH);
    //set speed
    //Rampup 
    analogWrite(9,200);
  }
  else 
  {
    digitalWrite(2, LOW); 
    digitalWrite(3, LOW);
  }
}

这是电路的虚拟环境

https://www.tinkercad.com/things/cLOBc9JJuTz-copy-of-dayloncircuitrefinecode/editel?sharecode=b6cqTLlNqUCCN09-mQ_zykp5sMnXx6KLt_KNqlXJmcs

标签: c++arduino

解决方案


我建议使用中断,它在 Arduino 参考中有很好的记录:

Arduino 参考 - 中断

最有用的是“参数”和“示例代码”部分。我认为您应该准备两种方法并将中断附加到您的输入(按钮)引脚上的 RISING 和 FALLING 触发器。

确保按钮引脚可用于中断(在 Arduino UNO / NANO 上仅引脚 2 和 3)。

我认为它应该看起来像这样(我没有测试过):

#define buttonPin 2; // pin usable for interrupt
#define outputPin 9;
#define powerPinA 3;
#define powerPinB 4;  
bool running = false;
int currentSpeed = 0;

void buttonUp()
{
  digitalWrite(powerPinA, LOW); 
  digitalWrite(powerPinB, LOW);
  running = false;
}

void buttonDown()
{
  digitalWrite(powerPinA, LOW); 
  digitalWrite(powerPinB, HIGH);
  running = true;
}

void setup()
{
  pinMode(outputPin, OUTPUT);
  pinMode(powerPinA, OUTPUT);
  pinMode(powerPinB, OUTPUT);
  pinMode(buttonPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), buttonUp, RAISING);
  attachInterrupt(digitalPinToInterrupt(interruptPin), buttonDown, FALLING);
}

void loop()
{
  delay(1);
  if (running && currentSpeed < 200)
    currentSpeed += 20;
  else if (!running && currentSpeed > 0)
    currentSpeed -= 20;

  analogWrite(outputPin, currentSpeed);
}

推荐阅读