Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 如何在void循环中只执行一次函数?_Arduino_Esp8266 - Fatal编程技术网

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

Arduino 如何在void循环中只执行一次函数?,arduino,esp8266,Arduino,Esp8266,简单地说,如果digital read第一次得到一个切换值,我想制作一个计数器来执行一个子例程。但结果表明,该函数多次重复执行 代码: int lastState=1; 无效设置{ 从15200年开始; } 空穴环{ int currentState=digitalReadD5; 如果currentState==1{ 如果currentState=!lastState{ 功能; } lastState=!lastState; } Serial.println仍在运行循环; 2000年; } 无效

简单地说,如果digital read第一次得到一个切换值,我想制作一个计数器来执行一个子例程。但结果表明,该函数多次重复执行

代码:

int lastState=1; 无效设置{ 从15200年开始; } 空穴环{ int currentState=digitalReadD5; 如果currentState==1{ 如果currentState=!lastState{ 功能; } lastState=!lastState; } Serial.println仍在运行循环; 2000年; } 无效函数{ 函数中的Serial.println; }
您需要一个变量来表示它已经运行过一次:

int lastState=1; 内部跳动=0; 无效设置{ 从15200年开始; } 空穴环{ int currentState=digitalReadD5; 如果currentState==1{ 如果currentState=!lastState{ 如果runOnce==0 功能; } lastState=!lastState; } Serial.println仍在运行循环; 2000年; } 无效函数{ 函数中的Serial.println; 跳动=1; }
因此,现在您的函数将runOnce标志设置为1,并且在设备由于循环内的if语句而重置之前,它将不会再次运行。

通过跟踪函数的执行并将其与currentState变量一起检查,将帮助您实现目标

进行此更改的代码如下所示:

bool executed=false; 无效设置{ 从15200年开始; } 空穴环{ int currentState=digitalReadD5; 如果currentState==1&&executed==false{ 已执行=真; 功能; } Serial.println仍在运行循环; 2000年; } 无效函数{ 函数中的Serial.println; }
这是最终结果:

bool executed=false; 无效设置 { 从15200年开始; } 空穴环 { int currentState=digitalReadD5; 如果currentState==1&&executed==false { 功能; 已执行=真; } 如果currentState==0&&executed==true { 功能; 已执行=错误; } Serial.println仍在运行循环; 2000年; } 无效函数 { 函数中的Serial.println; }
你的问题就在这里:

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之前不会再次运行。

在您的问题中,您到底想实现什么?您的循环不会循环,我不知道它将如何执行多次,除非它被多次调用。@arduino ide中的GradyPlayer,开发人员已经添加了循环函数自己一次又一次执行的方法。@Sma:谢谢您的回复。是的,我只想执行一次subrutine,就在第一次toogle。你能帮忙吗?结果显示重复执行..@JakaSatria,在这种情况下。保留该子程序执行的全局实例。如果该函数已执行,则将其设置为1,并在If条件中继续查找该变量。做得好,这是有效的。谢谢你的算法,非常感谢:@JakaSatria不客气!如果我的回答对您有所帮助,那么接受并向上投票将帮助将来面临类似问题的其他人,谢谢。这将在D5发生变化时执行该功能,我不认为这是原始问题的内容。