简单地说,如果数字读取仅在第一次获得切换值时,我想制作一个计数器来执行子程序。但结果显示" a功能"执行不止一次(重复)。
代码:
int lastState = 1;
void setup() {
Serial.begin(115200);
}
void loop() {
int currentState = digitalRead(D5);
if (currentState == 1) {
if (currentState = !lastState) {
aFunction();
}
lastState = !lastState;
}
Serial.println("Still running loop");
delay(2000);
}
void aFunction() {
Serial.println("in a function");
}
答案 0 :(得分:0)
你需要一个变量来表示它已被运行一次:
int lastState = 1;
int runOnce = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
int currentState = digitalRead(D5);
if (currentState == 1) {
if (currentState = !lastState) {
if (runOnce == 0)
aFunction();
}
lastState = !lastState;
}
Serial.println("Still running loop");
delay(2000);
}
void aFunction() {
Serial.println("in a function");
runOnce = 1;
}
现在,您的aFunction()
将runOnce
标记设置为1,并且由于if
内的loop()
语句重置设备,它将不再运行。
答案 1 :(得分:0)
通过跟踪功能的执行情况并将其与currentState
变量一起检查,可以帮助您实现目标。
此更改的代码如下所示:
bool executed = false;
void setup() {
Serial.begin(115200);
}
void loop() {
int currentState = digitalRead(D5);
if (currentState == 1 && executed == false) {
executed = true;
aFunction();
}
Serial.println("Still running loop");
delay(2000);
}
void aFunction() {
Serial.println("in a function");
}
答案 2 :(得分:0)
这是最终结果:
bool executed = false;
void setup()
{
Serial.begin(115200);
}
void loop()
{
int currentState = digitalRead(D5);
if (currentState == 1 && executed == false)
{
aFunction();
executed = true;
}
if (currentState == 0 && executed == true)
{
aFunction();
executed = false;
}
Serial.println("Still running loop");
delay(2000);
}
void aFunction()
{
Serial.println("in a function");
}
答案 3 :(得分:0)
您的问题就在这里:
if (currentState == 1) {
if (currentState = !lastState) {
aFunction();
}
lastState = !lastState;
}
这将无限期运行,直到currentState / =1。您遇到了问题,因为您不完全了解代码在运行时的运行方式。计算机反复读取此内容,如果currentState == 1则读取其内容以执行括号。
下一个问题是您的嵌套if语句,它没有使用比较运算符。您有一个=号,但应该有一个==运算符将currentstate与laststate进行比较。
本质上,如果您希望它运行一次,则需要确保该函数将变量currentState更改为非1的值,然后,如果您希望此函数在运行时在其他时间再次执行,请将currentState改回1为了使该函数再次运行,它将再次将currentState更改为1之外的其他值。
我建议不要为currentState使用整数来使用布尔值true或false。如果为true,请执行,最后将其更改为false-由于将其更改为false,因此将不会再次运行,直到再次为true。