在我的程序中,我通过蓝牙从我在麻省理工学院应用程序发明人上创建的应用程序上显示OLED时间。当我显示时间串时,我正在使用一个函数从'Sparkfun APDS9660手势传感器'中搜索'Up'手势。一旦我做了'向上'手势,我想清除显示并显示字符串“相机”。我希望在完成任务时保持“相机”功能(在代码中),直到我做一个向下的手势返回显示“时间”功能。
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'来退出代码。如果有人知道任何更好的解决方案,请发表评论。
感谢所有回复
答案 0 :(得分:0)
我还没有使用过这个特殊的传感器,所以我无法评论你是否正确地阅读了手势。
我假设你是,并且handleGesture()
充当传感器引发的中断的事件处理程序。比处理程序中的while
和break
更好的解决方案是让您的程序处于少数显式状态之一(例如'相机模式'和'时间模式&# 39)。
手势处理程序只会在它们之间切换,实际逻辑将进入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;
}
}
}
这比将所有程序逻辑放在处理程序中更好,因为它清楚地区分了不同函数正在做什么(处理程序处理手势,交换程序的模式)并使添加功能更容易(模式)等等。未来。