找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5373|回复: 7
打印 上一主题 下一主题
收起左侧

求教!关于arduino 时间控制问题

[复制链接]
跳转到指定楼层
楼主
求教:用人体热释制作感应灯实验(程序为网上下载用于学习,自己添加了时间控制函数),
为何设定了无动作时的等待时间如1分钟后灯无法自动熄灭,小白一枚请高手帮忙指点谢谢!程序代码如下:


#define LED 7      //定义LED引脚为7
#define BUTTON 2   //定义按钮开关引脚2
uint32_t duration=60000;//设定时间1分钟(60000毫秒)
uint32_t time;
uint32_t nowtime;
int val=0;         //变量用来储存按钮状态      
int old_val=0;    //暂存val变量的上一个时间单位
int state=0;       //0表示LED关闭,1表示打开
void setup()
{
  pinMode(LED,OUTPUT);      //设定LED引脚为输出状态
  pinMode(BUTTON,INPUT);    //设定按钮引脚为输入状态
}
void loop()
{
  val=digitalRead(BUTTON);    //读取按钮状态并储存
  if((val==HIGH)&&(old_val==LOW))    //检查按钮的变化情况
  {
    state=1-state;
    delay(40);   //延时简单抗抖动
  }
  old_val=val;   //VAL下载已经是旧的,让我们暂存一下
  if(state==1)
  {    digitalWrite(LED,HIGH); //开启LED

   nowtime=millis();

      if(millis()-nowtime>duration)
      {

        digitalWrite(LED,LOW);
      }
  }
  else
  {
    digitalWrite(LED,LOW); //关闭LED
  }

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330198 发表于 2018-6-13 15:13 | 只看该作者

你这句目的是先做减法在比较,但是比较的优先级大于减号的优先级,所以芯片会先做比较再做减法,要想达到目的加个括号就可以了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:351227 发表于 2018-6-13 17:01 | 只看该作者
原來如此
回复

使用道具 举报

地板
ID:348109 发表于 2018-6-13 17:07 | 只看该作者
已经加了挂号,还是无法自动熄灭,再次求教!谢谢!
nowtime=millis();

      if((millis()-nowtime)>duration)
      {

        digitalWrite(LED,LOW);
      }
回复

使用道具 举报

5#
ID:348109 发表于 2018-6-13 17:12 | 只看该作者
zhanghyg 发表于 2018-6-13 15:13
你这句目的是先做减法在比较,但是比较的优先级大于减号的优先级,所以芯片会先做比较再做减法,要想达到 ...

连接图
回复

使用道具 举报

6#
ID:348109 发表于 2018-6-13 17:14 | 只看该作者
zhanghyg 发表于 2018-6-13 15:13
你这句目的是先做减法在比较,但是比较的优先级大于减号的优先级,所以芯片会先做比较再做减法,要想达到 ...

接线图如下
回复

使用道具 举报

7#
ID:330198 发表于 2018-6-14 08:47 | 只看该作者

这句应该放到最上面赋值,只能执行一次,不然你每次循环到这里都会重新赋值,一样的数值相减永远等于零。
回复

使用道具 举报

8#
ID:348109 发表于 2018-6-14 19:46 | 只看该作者
zhanghyg 发表于 2018-6-13 15:13
你这句目的是先做减法在比较,但是比较的优先级大于减号的优先级,所以芯片会先做比较再做减法,要想达到 ...

改了,把nowtime=millis(); 放置在void setup(){}内仍然不行。见笑了因为是纯小白一个,还是要谢谢高手的指点!!以下是最新的程序代码:


//人体热释模块实验,当人经过时灯亮,再经过时灯灭。
//在灯亮情况下没有人移动时根据设定好的时间灯自动熄灭。(本程序定义30秒钟)
#define LED 7      //定义LED引脚为7
#define BUTTON 2   //定义按钮开关引脚2
const long duration=30000;//设定时间30秒
unsigned long millis();
unsigned long nowtime=0;
int val=0;         //变量用来储存按钮状态      
int old_val=0;    //暂存val变量的上一个时间单位
int state=0;       //0表示LED关闭,1表示打开
void setup()
{
  pinMode(LED,OUTPUT);      //设定LED引脚为输出状态
  pinMode(BUTTON,INPUT);    //设定按钮引脚为输入状态

}
void loop()
{
  val=digitalRead(BUTTON);    //读取按钮状态并储存
  if((val==HIGH)&&(old_val==LOW))    //检查按钮的变化情况
  {
    state=1-state;
    delay(40);   //延时简单抗抖动
  }
  old_val=val;   //VAL下载已经是旧的,让我们暂存一下
  if(state==1)
  {    digitalWrite(LED,HIGH); //开启LED
     if((millis()-nowtime)>duration&&(LED==HIGH))
      {
         nowtime=millis();
        digitalWrite(LED,LOW);
      }
   }
  else
  {
    digitalWrite(LED,LOW); //关闭LED
  }

}

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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