极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12104|回复: 9

arduino小程序求助!!

[复制链接]
发表于 2012-9-26 16:41:10 | 显示全部楼层 |阅读模式
本帖最后由 金色驼铃 于 2012-9-27 12:21 编辑

本程序的目的是通过判断引脚2为高电平的持继时间,当超过2S时,给引脚8一个高电平。


void loop() {
  
  if (digitalRead(2) == HIGH)//
     {
     delay(50); //去除杂波

      time1 = millis();

    Serial.print("Button-time-1: ");
    Serial.println(time1);

    while ((millis() - time1) >2000)  //当高电平时间超过2S时
    {
     Serial.print("timeout:");
     Serial.println(millis()-time1);
     digitalWrite(8,HIGH);
     delay(500);
     digitalWrite(8,LOW);
     delay(500);
     }

问题是当2引脚为高电平时,程序根本不执行while语句,不知道为什么????
回复

使用道具 举报

发表于 2012-9-26 16:54:31 | 显示全部楼层
你直接在loop()函数里写就好了,就是你利用延时delay();等待延时到2s就执行相应的动作!
回复 支持 反对

使用道具 举报

发表于 2012-9-26 17:01:49 | 显示全部楼层
因为time1 = millis();这一句在时间差不到2秒前一直在不断的初始化,所以millis() - time1) >2000永远不能被执行!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-26 17:10:47 | 显示全部楼层
飞翔的红猪 发表于 2012-9-26 17:01
因为time1 = millis();这一句在时间差不到2秒前一直在不断的初始化,所以millis() - time1) >2000永远不能被 ...

time1 =millis(),这句我的理解是,当2为高位时,time1取当前时间啊,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-26 17:11:27 | 显示全部楼层
Randy 发表于 2012-9-26 16:54
你直接在loop()函数里写就好了,就是你利用延时delay();等待延时到2s就执行相应的动作!

这个思路正好,我没想到,不过与原来的思路不一样了
回复 支持 反对

使用道具 举报

发表于 2012-9-26 17:27:37 | 显示全部楼层
        if(digitalRead(2)==HIGH)
        {
                delay(50);
                if(digitalRead(2)==HIGH)
                {
                        if(flag==0)//如果原来按键是未按下的
                        {
                                time1=millis();
                                flag=1;//置位标志,防止语句重复运行
                                Serial.print("Button-time-1: ");
                                Serial.println(time1);
                        }
                }
        }
        else flag=0;//如果按键抬起,标志复位
       
        while ((millis() - time1) >2000&&flag==1)  //当高电平时间超过2S时
        {
               Serial.print("timeout:");
               Serial.println(millis()-time1);
               digitalWrite(8,HIGH);
               delay(500);
              digitalWrite(8,LOW);
              delay(500);
            }
看看这样是不是符合你的本意?
回复 支持 反对

使用道具 举报

发表于 2012-9-26 18:54:48 | 显示全部楼层
你的timer1每循环一次都要刷新一次,while的条件永远也没法成立。
回复 支持 反对

使用道具 举报

发表于 2012-9-26 19:47:47 | 显示全部楼层
pulseIn 函数不就可以了吗?
pulseIn用于测量将一个指定的引脚设置为高或低的持续时间。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-27 12:20:33 | 显示全部楼层
飞翔的红猪 发表于 2012-9-26 17:27
if(digitalRead(2)==HIGH)
        {
                delay(50);

谢谢飞翔的红猪,你的修改正合我意,再次感谢
回复 支持 反对

使用道具 举报

发表于 2012-9-28 14:26:39 | 显示全部楼层
看来论坛好人多~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-3 12:45 , Processed in 0.039397 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表