c++ - 如果我的按钮是 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);
}
}
这是电路的虚拟环境
解决方案
我建议使用中断,它在 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);
}
推荐阅读
- javascript - 当子弹击中时,牛仔应该倒下并显示一条消息
- java - JOOQ 不生成
- java - 解析http multipart/form-data接收到的JSON文件+交出值(Java Springboot)
- math - 用数学锁定父子关系中子对象的位置
- multithreading - 多线程性能(使用 Rust)
- css - 为什么我的移动导航菜单抽屉在打开时会将站点视图向下推?
- python - 如何在 Instagram 上的“喜欢”弹出窗口中向下滚动?
- c# - 如何在 MainPage 中异步显示 ContentPage?
- node.js - 无法使用 vue CLI 3
- firebase - 未处理的异常:类型“布尔”不是“字符串”类型的子类型