求大神看一下为什么这里的delay不起作用-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7660|回复: 16

[未解决] 求大神看一下为什么这里的delay不起作用

[复制链接]
发表于 2019-6-30 23:23 | 显示全部楼层 |阅读模式
int ASignal = A0;
  int x=6;
  int y;
void setup() {  
  pinMode(ASignal, INPUT);
  Serial.begin(9600);
  pinMode(x,OUTPUT);
  digitalWrite(x,HIGH);

}  

void loop() {

  y=analogRead(ASignal);

if (y>700) // Loop 2000 times  
     {  
        digitalWrite(x,LOW);
       delay(1000);
     }
else if (y<=700)
  {digitalWrite(x,HIGH); // Output high  

    }   

发表于 2019-7-5 13:23 | 显示全部楼层
本帖最后由 上海老王 于 2019-7-5 13:28 编辑

你的程序里y>700的条件只要不消失,你的x置LOW就一直会执行,试着改了一下你的程序,红字是我加的,看看这样运行效果如何,以下是程序:


int ASignal = A0;
int x=6;
int y;
int oldy=0;  //前一次y值
void setup() {  
//  pinMode(ASignal, INPUT);   //模拟输入不需要配置
//  Serial.begin(9600);  //未用串口输出,不必放这句
  pinMode(x,OUTPUT);
  digitalWrite(x,HIGH);
}  

void loop() {
  y=analogRead(ASignal);
if (y>700 && oldy<=700) // Loop 2000 times  //这个注释没看懂
     {  
        digitalWrite(x,LOW);
       delay(1000);
      digitalWrite(x,HIGH);   //恢复x为高
     }

     oldy=y;  //将本次变量值赋给历史变量,这句是关键,可以使下一次if条件不成立
// else if (y<=700)            //改变上面的判断条件后,这两句可以不用了
//  {digitalWrite(x,HIGH); // Output high //改变上面的判断条件后,这两句可以不用了
    }



发表于 2019-7-1 12:59 | 显示全部楼层

回帖奖励 +2 金币

a976764010 发表于 2019-6-30 23:24
我只想让x低电平持续一段时间而不是一直低电平,现在是y>700的时候一直是低电平,delay没起作用我不太明白 ...

你的程序没错,符合你的描述(一直低电平),而如果你需要低电平1秒后恢复,等下次条件再翻转时再执行低电平一秒,那就要研究一下你的语句咯
发表于 2019-7-1 09:14 | 显示全部楼层

回帖奖励 +2 金币

if (y>700) // Loop 2000 times  
     {  
        digitalWrite(x,LOW);
       delay(1000);
     }
else if (y<=700)
  {digitalWrite(x,HIGH); // Output high  

    }   
翻译一下你的代码就是:如果y>700,x电平拉低,然后等待1秒,如果y<=700,x电平拉高。
如果你的y一直不<=700,那你的电平肯定一直低啊...
除非你上半段代码delay(1000)后再拉高电平
 楼主| 发表于 2019-6-30 23:24 | 显示全部楼层
我只想让x低电平持续一段时间而不是一直低电平,现在是y>700的时候一直是低电平,delay没起作用我不太明白是为什么
发表于 2019-7-1 09:13 | 显示全部楼层

回帖奖励 +2 金币

最后少了个大括号吧,还有如果就2种情况就if else 呗,新手勿喷
 楼主| 发表于 2019-7-4 21:21 | 显示全部楼层
上海老王 发表于 2019-7-1 12:59
你的程序没错,符合你的描述(一直低电平),而如果你需要低电平1秒后恢复,等下次条件再翻转时再执行低 ...

现在是大于700时,会输出低电平,但是没有1秒的延迟,就一直是低电平,直到y<=700变为高电平
 楼主| 发表于 2019-7-4 21:22 | 显示全部楼层
jpolo 发表于 2019-7-1 09:14
if (y>700) // Loop 2000 times  
     {  
        digitalWrite(x,LOW);

关键是现在没有出现等待1s即使延迟时间增长也不会出现,就感觉是delay没起作用,但我感觉程序没问题呀,不明白为啥没起作用
发表于 2019-7-5 22:26 | 显示全部楼层

回帖奖励 +2 金币

试试这样写,我没验证、[mw_shl_code=arduino,true]#define HIGH_state  1
#define LOW_long         2
#define LOW_state   3

int ASignal = A0;
int x=6;
int state = HIGH_state;
boolean flag =false;
void setup()
{  
        pinMode(ASignal, INPUT);
        Serial.begin(9600);
        pinMode(x,OUTPUT);
        digitalWrite(x,HIGH);
}  

void loop()
{
        if(analogRead(ASignal)>700)
        {
                flag=false;
        }
        else
        {
                flag=true;
        }

        switch(state)
        {
                case HIGH_state:
                        if(flag==false)
                        {
                                digitalWrite(x,LOW);
                                state==LOW_state;
                        }
                        break;
                case LOW_long:
                        if(flag==true)
                        {
                                digitalWrite(x,HIGH);
                                state==HIGH_state;
                        }
                        break;
                case LOW_state:
                        delay(1000);       
                        digitalWrite(x,HIGH);       
                        state==LOW_long;
                default :break;
        }
} [/mw_shl_code]

发表于 2019-7-8 16:43 | 显示全部楼层

回帖奖励 +2 金币

a976764010 发表于 2019-6-30 23:24
我只想让x低电平持续一段时间而不是一直低电平,现在是y>700的时候一直是低电平,delay没起作用我不太明白 ...

你的程序是在y>700的时候x马上被赋值为低电平,然后程序延时1秒,x不变。然后下一次循环判断,如果下一次y<=700,x马上被赋值为高电平,你程序里的delay本来就没起到对x延时的用处,delay写那儿就是没用的。你要是想让y发生变化的时候,x延时1秒变化,就应该在if里判断y是否发生变化,然后延时输出x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 01:39 , Processed in 0.079510 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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