楼主: Jane

Arduino教程 Lesson 4 -- 互动交通信号灯

  [复制链接]

henry312  学徒

发表于 2015-3-22 13:39:20

求解释,millis()-changetime)>5000 是如何判断时间大于5秒的啊,在最后有一句changetime=millis(), 我始终没有明白和个时间怎么能得出大于5秒。我是初学者,有点分不清楚
回复

使用道具 举报

henry312  学徒

发表于 2015-3-22 13:43:31

Mr.why 发表于 2015-2-1 11:28
Q1:“(millis()-changeTime)”这句判断连续按两次按钮时间必须大于5秒的解释不准确,而是信号灯重新变绿后 ...


求解释,millis()-changetime)>5000 是如何判断时间大于5秒的啊,在最后有一句changetime=millis(), 我始终没有明白和个时间怎么能得出大于5秒。我是初学者,有点分不清楚
回复

使用道具 举报

uugooo  见习技师

发表于 2015-4-9 01:29:57

非常通俗易懂
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2015-4-9 10:31:28

henry312 发表于 2015-3-22 13:43
求解释,millis()-changetime)>5000 是如何判断时间大于5秒的啊,在最后有一句changetime=millis(), 我 ...

不好意思,前一阵较忙,没回复你的疑问。millis()就如教程写的,它像个时钟,实时在记录程序跑的时间,会不断变化的。changetime()定义的这个变量是记录上一次的时间的,单位为ms,所以不断的让它们进行差值运算,就能计算出等待时间,一旦差值大于5000,就是大于5000ms,也就是5s了,执行内部程序。不知道你是否明白了
回复

使用道具 举报

1115332213  见习技师

发表于 2015-7-5 22:59:04

本帖最后由 1115332213 于 2015-7-12 23:24 编辑


回复

使用道具 举报

1115332213  见习技师

发表于 2015-7-12 23:19:56

我想问下楼主,为什么我的这段代码不能实现间隔5秒才可改变红灯的颜色啊。因为只要机动车的灯一亮红,我立刻按开关,机动车的车灯立马改变。不支持坚持五秒。我想问一下原因是什么。我把我和楼主不同的代码用注释表明了。感觉我的代码逻辑是正确的啊。

  1. int pedestrainGreen = 7;
  2. int pedestrainRed = 8;

  3. int readSwitch = 9;

  4. int carGreen = 10;
  5. int carYellow = 11;
  6. int carRed = 12;
  7. int changeTime = 5000;
  8. unsigned long currentT = millis();

  9. bool flag = LOW;
  10. void setup() {
  11.   pinMode(pedestrainGreen, OUTPUT);
  12.   pinMode(pedestrainRed, OUTPUT);
  13.   
  14.   pinMode(readSwitch, INPUT);

  15.   pinMode(carGreen, OUTPUT);
  16.   pinMode(carYellow, OUTPUT);
  17.   pinMode(carRed, OUTPUT);
  18.   // put your setup code here, to run once:
  19.   flag = LOW;
  20.   digitalWrite(carGreen, HIGH);
  21.   digitalWrite(pedestrainRed, HIGH);
  22. }

  23. void loop() {
  24.   // put your main code here, to run repeatedly:
  25.   //和楼主不一样的代码在这里,我是先进行的判断
  26.   flag = digitalRead(readSwitch);

  27.   if(HIGH==flag && ((millis()-currentT) > 5000)){
  28.       flag = LOW;  
  29.   }
  30.   if(flag == LOW){
  31.     changeState();  
  32.   }
  33. }
  34. void changeState(){
  35.   digitalWrite(carGreen, LOW);
  36.   delay(250);
  37.   digitalWrite(carYellow, HIGH);
  38.   delay(1000);

  39.   digitalWrite(carYellow, LOW);
  40.   delay(250);
  41.   digitalWrite(carRed, HIGH);
  42.   delay(500);

  43.   digitalWrite(pedestrainRed, LOW);
  44.   digitalWrite(pedestrainGreen, HIGH);
  45.   delay(changeTime);

  46.   for(int i = 0; i < 8; i++){
  47.     digitalWrite(pedestrainGreen, LOW);
  48.     delay(250);
  49.     digitalWrite(pedestrainGreen, HIGH);
  50.     delay(250);  
  51.   }
  52.   digitalWrite(pedestrainGreen, LOW);
  53.   digitalWrite(pedestrainRed, HIGH);
  54.   delay(1000);

  55.   digitalWrite(carRed, LOW);
  56.   delay(250);
  57.   digitalWrite(carYellow, HIGH);
  58.   delay(400);
  59.   
  60.   digitalWrite(carYellow, LOW);
  61.   delay(250);
  62.   digitalWrite(carGreen, HIGH);
  63.   currentT = millis();
  64. }
  65. /*
  66. //项目三 -- 互动交通信号灯
  67. int carRed = 12; //设置汽车灯
  68. int carYellow = 11;
  69. int carGreen = 10;
  70. int button = 9; //按钮引脚
  71. int pedRed = 8; //设置行人灯
  72. int pedGreen = 7;
  73. int crossTime = 5000;//允许行人通过的时间
  74. unsigned long changeTime;//按钮按下后的时间

  75. void setup() {
  76.      //所有LED设置为输出模式
  77.       pinMode(carRed, OUTPUT);
  78.       pinMode(carYellow, OUTPUT);
  79.       pinMode(carGreen, OUTPUT);
  80.       pinMode(pedRed, OUTPUT);
  81.       pinMode(pedGreen, OUTPUT);
  82.       pinMode(button, INPUT); //按钮设置为输入模式
  83.       digitalWrite(carGreen, HIGH); //开始时,汽车灯绿灯
  84.       digitalWrite(pedRed, HIGH);  //行人灯为红灯
  85. }

  86. void loop() {
  87.      int state = digitalRead(button);
  88.      //检测按钮是否被按下,并且是否距上次按下后有5秒的等待时间
  89.      if(state == HIGH && (millis() - changeTime)> 5000){
  90.                 //调用变灯函数
  91.                changeLights();
  92.        }
  93. }

  94. void changeLights() {
  95.        digitalWrite(carGreen, LOW); //汽车绿灯灭
  96.        digitalWrite(carYellow, HIGH); //汽车黄灯亮
  97.        delay(2000); //等待2秒
  98.                
  99.        digitalWrite(carYellow, LOW); //汽车黄灯灭
  100.        digitalWrite(carRed, HIGH); //汽车红灯亮
  101.        delay(1000); //为安全考虑等待1秒
  102.                
  103.        digitalWrite(pedRed, LOW); //行人红灯灭
  104.        digitalWrite(pedGreen, HIGH); //行人绿灯亮

  105.        delay(crossTime); //等待一个通过时间
  106.                
  107.        //闪烁行人灯绿灯,提示可过马路时间快到
  108.        for (int x=0; x<10; x++) {
  109.                digitalWrite(pedGreen, HIGH);
  110.                delay(250);
  111.                digitalWrite(pedGreen, LOW);
  112.                delay(250);
  113.         }                        
  114.         digitalWrite(pedRed, HIGH);//行人红灯亮
  115.         delay(500);

  116.         digitalWrite(carRed, LOW); //汽车红灯灭
  117.         digitalWrite(carYellow, HIGH); //汽车黄灯亮        
  118.         delay(1000);
  119.         digitalWrite(carYellow, LOW); //汽车黄灯灭
  120.         digitalWrite(carGreen, HIGH); //汽车绿灯亮

  121.         changeTime = millis(); //记录自上一次灯变化的时间
  122.         //返回到主函数循环中
  123. }*/
复制代码


回复

使用道具 举报

1115332213  见习技师

发表于 2015-7-12 23:20:01

我想问下楼主,为什么我的这段代码不能实现间隔5秒才可改变红灯的颜色啊。因为只要机动车的灯一亮红,我立刻按开关,机动车的车灯立马改变。不支持坚持五秒。我想问一下原因是什么。我把我和楼主不同的代码用注释表明了。感觉我的代码逻辑是正确的啊。

  1. int pedestrainGreen = 7;
  2. int pedestrainRed = 8;

  3. int readSwitch = 9;

  4. int carGreen = 10;
  5. int carYellow = 11;
  6. int carRed = 12;
  7. int changeTime = 5000;
  8. unsigned long currentT = millis();

  9. bool flag = LOW;
  10. void setup() {
  11.   pinMode(pedestrainGreen, OUTPUT);
  12.   pinMode(pedestrainRed, OUTPUT);
  13.   
  14.   pinMode(readSwitch, INPUT);

  15.   pinMode(carGreen, OUTPUT);
  16.   pinMode(carYellow, OUTPUT);
  17.   pinMode(carRed, OUTPUT);
  18.   // put your setup code here, to run once:
  19.   flag = LOW;
  20.   digitalWrite(carGreen, HIGH);
  21.   digitalWrite(pedestrainRed, HIGH);
  22. }

  23. void loop() {
  24.   // put your main code here, to run repeatedly:
  25.   //和楼主不一样的代码在这里,我是先进行的判断
  26.   flag = digitalRead(readSwitch);

  27.   if(HIGH==flag && ((millis()-currentT) > 5000)){
  28.       flag = LOW;  
  29.   }
  30.   if(flag == LOW){
  31.     changeState();  
  32.   }
  33. }
  34. void changeState(){
  35.   digitalWrite(carGreen, LOW);
  36.   delay(250);
  37.   digitalWrite(carYellow, HIGH);
  38.   delay(1000);

  39.   digitalWrite(carYellow, LOW);
  40.   delay(250);
  41.   digitalWrite(carRed, HIGH);
  42.   delay(500);

  43.   digitalWrite(pedestrainRed, LOW);
  44.   digitalWrite(pedestrainGreen, HIGH);
  45.   delay(changeTime);

  46.   for(int i = 0; i < 8; i++){
  47.     digitalWrite(pedestrainGreen, LOW);
  48.     delay(250);
  49.     digitalWrite(pedestrainGreen, HIGH);
  50.     delay(250);  
  51.   }
  52.   digitalWrite(pedestrainGreen, LOW);
  53.   digitalWrite(pedestrainRed, HIGH);
  54.   delay(1000);

  55.   digitalWrite(carRed, LOW);
  56.   delay(250);
  57.   digitalWrite(carYellow, HIGH);
  58.   delay(400);
  59.   
  60.   digitalWrite(carYellow, LOW);
  61.   delay(250);
  62.   digitalWrite(carGreen, HIGH);
  63.   currentT = millis();
  64. }
  65. /*
  66. //项目三 -- 互动交通信号灯
  67. int carRed = 12; //设置汽车灯
  68. int carYellow = 11;
  69. int carGreen = 10;
  70. int button = 9; //按钮引脚
  71. int pedRed = 8; //设置行人灯
  72. int pedGreen = 7;
  73. int crossTime = 5000;//允许行人通过的时间
  74. unsigned long changeTime;//按钮按下后的时间

  75. void setup() {
  76.      //所有LED设置为输出模式
  77.       pinMode(carRed, OUTPUT);
  78.       pinMode(carYellow, OUTPUT);
  79.       pinMode(carGreen, OUTPUT);
  80.       pinMode(pedRed, OUTPUT);
  81.       pinMode(pedGreen, OUTPUT);
  82.       pinMode(button, INPUT); //按钮设置为输入模式
  83.       digitalWrite(carGreen, HIGH); //开始时,汽车灯绿灯
  84.       digitalWrite(pedRed, HIGH);  //行人灯为红灯
  85. }

  86. void loop() {
  87.      int state = digitalRead(button);
  88.      //检测按钮是否被按下,并且是否距上次按下后有5秒的等待时间
  89.      if(state == HIGH && (millis() - changeTime)> 5000){
  90.                 //调用变灯函数
  91.                changeLights();
  92.        }
  93. }

  94. void changeLights() {
  95.        digitalWrite(carGreen, LOW); //汽车绿灯灭
  96.        digitalWrite(carYellow, HIGH); //汽车黄灯亮
  97.        delay(2000); //等待2秒
  98.                
  99.        digitalWrite(carYellow, LOW); //汽车黄灯灭
  100.        digitalWrite(carRed, HIGH); //汽车红灯亮
  101.        delay(1000); //为安全考虑等待1秒
  102.                
  103.        digitalWrite(pedRed, LOW); //行人红灯灭
  104.        digitalWrite(pedGreen, HIGH); //行人绿灯亮

  105.        delay(crossTime); //等待一个通过时间
  106.                
  107.        //闪烁行人灯绿灯,提示可过马路时间快到
  108.        for (int x=0; x<10; x++) {
  109.                digitalWrite(pedGreen, HIGH);
  110.                delay(250);
  111.                digitalWrite(pedGreen, LOW);
  112.                delay(250);
  113.         }                        
  114.         digitalWrite(pedRed, HIGH);//行人红灯亮
  115.         delay(500);

  116.         digitalWrite(carRed, LOW); //汽车红灯灭
  117.         digitalWrite(carYellow, HIGH); //汽车黄灯亮        
  118.         delay(1000);
  119.         digitalWrite(carYellow, LOW); //汽车黄灯灭
  120.         digitalWrite(carGreen, HIGH); //汽车绿灯亮

  121.         changeTime = millis(); //记录自上一次灯变化的时间
  122.         //返回到主函数循环中
  123. }*/
复制代码


回复

使用道具 举报

1115332213  见习技师

发表于 2015-7-12 23:22:23

还有一开始定义changeTime的时候难道不需要初始化。那么它第一次运行到millis()-changTime后怎么办啊?
回复

使用道具 举报

1115332213  见习技师

发表于 2015-7-12 23:27:39

Jane 发表于 2015-4-9 10:31
不好意思,前一阵较忙,没回复你的疑问。millis()就如教程写的,它像个时钟,实时在记录程序跑的时间,会 ...

这个我知道,但是你一开始的时候changeTime没有赋值啊,难道是系统默认给他附零值,然后millis()这个函数也是从零开始计数的吗? 这样你就可以不用对changeTIme初始化了吧。你看我这样的理解对吗?  还是有就是我写了一个类似的代码,就是不能执行红绿灯改变之后5秒内再按按钮无效的效果。 您能看看吗?  实在抱歉我是第一次用这个blog, 留下了好多相同的回复,没看到这个回复还有第二页。。。。实在是抱歉
回复

使用道具 举报

avanyway  学徒

发表于 2015-10-3 16:12:15

“(millis()-changeTime)”   亲   changeTime是怎么检测出啊来的呢?
回复

使用道具 举报

ikuing  中级技师

发表于 2015-12-23 20:54:10

本帖最后由 ikuing 于 2015-12-23 20:55 编辑
翻滚的魔方 发表于 2014-8-29 21:46
为什么按键开关要接地

你可以了解 下拉电阻的原理:
下拉电阻&&上拉电阻
在电路中让电压尽可能的接近于期望的数字(5V或者0V)是很重要的。
如果不能确保状态接近所需要的电压,这部分电路就可以认为是浮动的
(既不是高电平也不是低电平)
这种浮动叫做电子噪声
噪声在数字电路中可能会被随机的解释为1或者0
上拉电阻和下拉电阻用来保证状态确定为高或者低
所以上拉或下来电阻用来强制电路指向一个希望的状态


所以首先让它接地 保持低电平   也就是0  当按键按下时,和右边5V电源接通,在下拉电阻的作用下
会由浮动状态指向高电平 ,然后9号数字引脚判断开关已被按下,则执行大括号内的函数。
回复

使用道具 举报

ikuing  中级技师

发表于 2015-12-23 20:58:06

avanyway 发表于 2015-10-3 16:12
“(millis()-changeTime)”   亲   changeTime是怎么检测出啊来的呢?

我的理解是  首先在第一次按键被按下时changeTime为0 (还没有被赋值) ,在第二次按下的时候  changeTime 已经被赋值为第一次按下的时候的时间millis()  所以用这两次按键的时间间隔判断  有没有在于其的范围之内..是 则执行下一步...
回复

使用道具 举报

qingxilove  学徒

发表于 2016-1-20 22:38:37

我按照教程的步骤做好了,但是行人绿灯的亮度极低。刚开始我还以为没有输出呢。后来换了红色led亮度高了一点,但是还是和正常的亮度有差距。我猜测是电阻过大了,结果我把led的限流电阻去了,亮度没有任何变化。
有哪位高人知道是什么原因吗?
回复

使用道具 举报

qingxilove  学徒

发表于 2016-1-20 22:52:20

电路不变的情况下,只设置行人绿灯输出,亮度又是正常的。搞不懂啊。。。。
回复

使用道具 举报

z1033969032  见习技师

发表于 2016-5-22 14:42:20

感谢分享,已经做出来了。
回复

使用道具 举报

qq943  学徒

发表于 2016-6-19 10:55:22

1115332213 发表于 2015-7-12 23:20
我想问下楼主,为什么我的这段代码不能实现间隔5秒才可改变红灯的颜色啊。因为只要机动车的灯一亮红,我立 ...

我也是初学者刚接触这个东西,感觉你第十行代码就定义changetime=millis(),所以第73行的代码就没有意义了,所以就没有了间隔5000毫秒了。不知道对不对。
回复

使用道具 举报

IanFreeman  见习技师

发表于 2016-6-30 14:08:55

楼主求问~~  只要一插5V输出那个口就显示上传出错,设备管理器也找不到COM口了,是自动断开了吗??该怎么解决?? 谢谢楼主啊。
回复

使用道具 举报

nick19860328  学徒

发表于 2016-10-6 01:59:28

ikuing 发表于 2015-12-23 20:58
我的理解是  首先在第一次按键被按下时changeTime为0 (还没有被赋值) ,在第二次按下的时候  changeTime  ...

仔细研究了millis()函数,Returns the number of milliseconds since the Arduino board began running the current program. 从运行当前程序时开始计时,我的理解是从代码上载到板子里面开始跑程序或者在断电的情况下接通电源那一刻开始计时。unsigned long开始没有赋值的话默认是0,这个楼主已经在教程里说了,所以第一次按按键的时候changeTime=0,程序开始执行,到最后changeTime = millis(),这个时候changeTime记录赋予了一个值,假设这个值是30秒,所以第二次按键假设在33秒,这个时候程序是没有反应的,假设再过3秒钟去按键,程序才会执行第二次。所以我的猜想是,如果断电,然后再插上电源,5秒钟内去按按键,应该也是没有反应的。不知道对不对,因为模型已经被我拆掉了,我没有亲自证实。但是我认为楼主的代码逻辑应该是没问题的。
回复

使用道具 举报

鸽子的小翅膀  见习技师

发表于 2016-12-22 23:53:49

nick19860328 发表于 2016-10-6 01:59
仔细研究了millis()函数,Returns the number of milliseconds since the Arduino board began running t ...

没错,关于断电重开的设想是对的
回复

使用道具 举报

ajCloud2016  学徒

发表于 2016-12-24 14:02:32

鸽子的小翅膀 发表于 2016-12-22 23:53
没错,关于断电重开的设想是对的

9# button的设计相当于行人过马路时的控制按钮
回复

使用道具 举报

zuoyan  见习技师

发表于 2017-3-1 20:25:45

谢谢分享
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail