C ++ / C Arduino秒表代码检查

时间:2016-04-27 12:43:22

标签: arduino

我正在制作带有振动电机和简单按钮作为接口的arduino的秒表。

我要抓住这个项目因为它不起作用,我一直在我的uno上测试它到目前为止没有成功,我想知道是否有人可以给我一个快速的小破坏并看看他们是否能发现我忽略的任何重大问题。

代码中没有错误,我认为这可能是代表我的逻辑错误,甚至可能是我的主板上的错误,但我对此表示怀疑!

void setup() {
  Serial.begin(9600);
}
int lengthOf(int i)
{
    if (i < 0){i = -i;}
    if (i < 10){ return 1;}
    if (i < 100){ return 2;}
    if (i < 1000){ return 3;}
    if (i < 10000){ return 4;}
    if (i < 100000){ return 5;}
    if (i < 1000000){ return 6;}
    if (i < 10000000){ return 7;}
    if (i < 100000000){ return 8;}
    if (i < 1000000000){ return 9;}
    return 10;
}
void loop() {

    int ButtonSwitch = 4;
    pinMode(4, INPUT);
    int motor = 5;
    int timerA = 0;   int timed; 
    bool checker = false; //checker acts to see if the current state is timing/counting
    bool shown; //Shown acts as a check to show if the time has already been shown

    if (analogRead(ButtonSwitch) == HIGH && checker == false)//When the button is pressed and the state is false then 
    {
        checker = true;//sets checker to true, meaning the timing should begin
        shown = false;//sets the shown variable to false so as to 
        timerA = 0;//reset timer to a 0 value
    }

    while (checker == true)//while the timer is active then do the following
    {
        timerA++;//Increment the timer 
        if (digitalRead(ButtonSwitch) == HIGH)
        {
            checker = false;
            break;
        }
        delay(1000);//No needfor the simpleTimer library as I don't need to run any code inbetween each second
    }

    //Sets the timed to the real value of
    timed = lengthOf(timerA);//Grabs the length of timerA (1223 would be 4)
    int recTime[timed - 1]; //creates an array of the same length as the timer


    //append int to chars and by extent an array
    char str[timed];
    sprintf(str, "%d", timerA);

    int numbers;

    for (int i = 0;  i < timed; i++)
    {
        recTime[i] = str[i] - '0';//This grabs STR which is an empty array of the length of the time then sets recTime to be the same
    }

    while ((analogRead(ButtonSwitch) == LOW) && (checker == false) && (shown == false))//Loop checks that the button is not pressed, the checker is false, and that the time has not been shown,
    {
        for (int i = 0; i < timed; i++)//
        {
            for (int o = 0; o < recTime[i]; o++)
            {
                digitalWrite(motor, HIGH);//Motor set to vibrate
                delay(500);//1/2 second delay
                digitalWrite(motor, LOW);//motor off
                delay(300);//3/10 second delay
            }
            delay(3000);//3 second delay
        }
        shown = true;
    }
}

如果我能提供更多信息,请告诉我,

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

在C中,当timed是写入数字的十进制数字所需的字符数时,则应为终止'\0'再分配一个字符。

char str[timed+1];

然后,我想知道你在使用recTime值做了什么。实际上,只要值为123,str就会包含"123",即['1','2','3'],则retTime将包含[1,2,3]

答案 1 :(得分:0)

我已阅读您的代码并提出一些建议。首先,让我们保持一致,并使用digitalRead而不是循环例程顶部和底部附近的analogRead。让我们在安装例程之前移动所有变量声明。 (你仍然需要初始化timerA,checker并显示在循环的顶部)另外,你只需要为按钮设置一次pinMode,所以我们将该行移动到设置例程,当我们在它,让我们在pinMode命令中使用变量ButtonSwitch。 e.g。

int ButtonSwitch = 4;
int motor = 5;
int timerA = 0;
int timed; 
bool checker = false;
bool shown;

void setup() {
    Serial.begin(9600);
    pinMode(ButtonSwitch, INPUT);
}

但我认为真正的问题可能在于程序的逻辑流程。假设循环开始,检查器为假并且未按下按钮。按下按钮时,检查器设置为true。紧接着,在几个时钟滴答之后,输入下一个块(因为检查器为真)并且它将检查器设置为假并且如果按钮仍被按下则退出块。您释放第一个块和第二个块之间的按钮的几率几乎为零。所以你的程序只是将timerA设置为0,然后将它递增1并继续前进。永远不会达到延迟(1000)且timerA永远不会超过1,recTime数组将始终定义为recTime [0],并且str数组将始终定义为str [1]。

在第二个块中,while循环,我想你想改变 if(digitalRead(ButtonSwitch)== HIGH)到if(digitalRead(ButtonSwitch)== LOW)。

我认为如果你纠正这些问题,你将会有很长的路要走git工作!