使用开关通过按钮选择案例-切换

时间:2019-01-01 21:15:52

标签: arduino switch-statement toggle increment gpio

我正在使用开关盒进行拨动。不知道我是否做对了。通过我的代码示例,我的意图应该很明显。

我想使用x ++函数和我保存的一些切换代码来增加带按钮的计数器,这些代码应该可以在switch(case)语句中使用,以通过在特定情况下切换输出引脚来在特定情况下产生期望的结果如果大小写不再有效,则选择并关闭。每个案例都有自己的输出引脚,带有一个特定的案例循环,以在该案例变为有效时执行。一旦切换模式开始工作,就可以编写输出循环。代码中缺少一些内容。我没有正式的编码经验,只在这里和那里教过一点。我从基本邮票家庭作业板开始,然后从BS2切换到Arduino。我的目标是编译基本项目所需的代码并保存。然后,我实际上可以使用基本编码完成,并专注于连接硬件和对hardware:software进行微调。

不太清楚如何使用此开关功能。想知道是否需要在其中某处添加FOR语句来增加计数器。当时我想我可以在toggle1值每次翻转或达到某种效果时递增计数器。但是,另一种方法是通过以模数形式使用switch(case),通过按特定次数的按钮来切换case值。 1次是案例1,2次是案例– 2,3次是案例3,等等。案例0可以是5次按压,这是使用++ x操作符的最后一个循环。使用按钮和++切换大小写应该是非常非常简单的事情。我几乎没有编程经验。想一些指导。我希望我的主旨全在代码中。谢谢。

const int btn = 22;
const int led = 3;
int selector1 = i;
int btnValue = digitalRead(btn);
int i = 0;


bool isPressed = false;


if (btnValue == LOW && isPressed == false){
    i = i++;

    if (i > 3){
        i = 0;
    }
}

{
    switch(case){

        case 1:

        selector1 == 0;
        do digitalWrite(led, HIGH);
        Serial.println(digitalRead(23));
        break;

        case 2:

        selector1 == 1;
        do digitalWrite(13, HIGH);
        Serial.println(digitalRead(13));
        break;

        case 3:

        selector1 == 2; 

        do digitalWrite(4, HIGH);
        Serial.println(digitalRead(4));
        break;

        case 4:

        selector1 == 3

        do digitalWrite(5, HIGH);
        Serial.println("You've reached the last selection.");
        Serial.println(digitalRead(5));
    }
}

1 个答案:

答案 0 :(得分:0)

您到底要问什么?简明扼要;)另外,您尝试过Google吗? This是使用“ Arduino开关”的第一个匹配项。甚至在arduino IDE中内置了示例(one two)。搜索和尝试将比询问更好。真的,尝试一下-很多。当您遇到新的事物(如开关状态)时,将一个非常简单的草图上载到arduino并进行测试。

话虽如此,这里的主要问题似乎是您的代码非常不完整。这是指测试代码,还是您只是复制了一些东西来传达您的想法?因为此代码使得以明确和特定的方式帮助您非常困难。您还从previous question(仍处于打开状态)中重新引入了按钮下推问题。

为您的启发,我将列出几个问题,并在下面提供更正的代码

def GetPositionOfCommand(CommandList, Command): Position = Count = 0 while Count <= len(CommandList) - len(Command): if CommandList[Count:Count + len(Command)] == Command: return Position elif CommandList[Count] == ",": Position += 1 Count += 1 return Position Position = GetPositionOfCommand(Items[IndexOfItem].Commands, "get") 足以增加i++;

i应该是switch(case)

switch(i)删除'do'

do digitalWrite()不执行任何操作。

没有主循环

selector1 == 1;,这是使用尚未存在的变量来初始化变量。这是按值传递的,而不是对i的引用,因此在您当前的代码选择器1中将永远不会更改。

int selector1 = i;同样,这是一次分配,它永远不会改变

int btnValue = digitalRead(btn);这很奇怪,尽管令我惊讶的并非没有。您想在这里做什么?因为这对我来说毫无意义。

更正的代码:

digitalWrite(13, HIGH);
 Serial.println(digitalRead(13));

每按一次按钮,将首先执行const int btn = 22; const int led = 3; int selector = 0; boolean isPressed = false; void setup() { Serial.begin(9600); pinMode(btn, INPUT_PULLUP); pinMode(led, OUTPUT); pinMode(13, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); } void loop () { if (digitalRead(btn) == LOW && isPressed == false ) //button is pressed AND this is the first digitalRead() that the button is pressed { isPressed = true; //set to true, so this code will not run again until button released doSwitchStatement(); // a call to a separate function that performs the switch statement and subsequent evoked code selector++; // this is done after the doSwitchStatement(), so case 0 will be executed on the first button press if (selector > 3) { selector = 0; } // selector = (selector+1) % 4; // does the same, without if-statement } else if (digitalRead(btn) == HIGH) { isPressed = false; //button is released, variable reset } } void doSwitchStatement() { switch(selector) { case 0: digitalWrite(led, HIGH); Serial.println("Case 0"); // add a call to doExtraStuff() if you like break; case 1: digitalWrite(13, HIGH); Serial.println("Case 1"); break; case 2: digitalWrite(4, HIGH); Serial.println("Case 2"); break; case 3: do digitalWrite(5, HIGH); Serial.println("You've reached the last selection."); Serial.println("Case 3"); } } ,它将高输出引脚设置并打印一条消息。之后doSwitchStatement()递增,如果达到4,则设置为0。