如何在void循环中执行一次函数?

时间:2017-06-30 15:31:56

标签: arduino esp8266

简单地说,如果数字读取仅在第一次获得切换值时,我想制作一个计数器来执行子程序。但结果显示" 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");
}

4 个答案:

答案 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。