重复一个函数,直到指定的操作(Aruino IDE)



在我的程序中,我正在通过蓝牙在OLED上显示时间,该应用程序来自我在MIT应用程序发明器上创建的应用程序。当我显示时间字符串时,我正在使用一个函数从"Sparkfun APDS9660手势传感器"中搜索"向上"手势。一旦我做了一个"向上"手势,我想清除显示屏并显示字符串"相机"。我希望它在完成任务时保持在"相机"功能(在代码中(,直到我做一个向下的手势以返回到显示"时间"功能。

void handleGesture() {
if ( apds.isGestureAvailable() )
{
if(DIR_UP)
{
Serial.println("UP");
Serial.println("Camera");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,20);
display.println("Camera");
display.display();
Q = 0;
while(Q == 0)
{
if (DIR_RIGHT)
{
digitalWrite(13, HIGH); 
delay(1000);             
digitalWrite(13, LOW);   
delay(1000);
}
if (DIR_LEFT)
{
digitalWrite(12, HIGH); 
delay(1000);             
digitalWrite(12, LOW);   
delay(1000);
}
if (DIR_DOWN)
{
break;
}
}   
}  
}
}

我正在尝试使用"while循环"来重复代码,然后使用"break"退出代码。如果有人知道更好的解决方案,请发表评论。

感谢所有回复

我没有使用过这个特定的传感器,所以我无法评论你是否正确阅读了手势。

我假设您是,并且handleGesture()充当传感器引发的中断的事件处理程序。比处理程序中的whilebreak更好的解决方案是让程序处于几个显式状态之一(例如"相机模式"和"时间模式"(。

手势处理程序只会在它们之间切换,实际逻辑将进入loop(或特定于模式的函数,如预期的那样(。

这基本上使程序成为状态机。例如:

enum mode {
camera,
time
};
mode currentMode;
void loopCamera() {
// 'Camera mode' code goes here
}
void loopTime() {
// 'Time mode' code goes here
}
void setup() {
// Set initial mode
currentMode = time;
// Other setup follows...
}
void loop() {
switch (currentMode) {
case camera:
loopCamera();
break;
case time:
loopTime();
break;
}
}
void handleGesture() {
if (apds.isGestureAvailable()) {
if (DIR_UP) {
// Insert one-time code for switching to camera mode here
currentMode = camera;
} else if (DIR_DOWN) {
// Insert one-time code for switching to time mode here
currentMode = time;
}
}
}

这比将所有程序逻辑放在处理程序中更可取,因为它清楚地区分了不同函数正在执行的操作(处理程序处理手势、交换程序的模式(,并且将来更容易添加功能(模式等(。

相关内容

  • 没有找到相关文章

最新更新