【问题标题】:Why is the red light not lighting up?为什么红灯不亮?
【发布时间】:2021-03-06 08:02:02
【问题描述】:

所以我对这个 IOT 的东西非常陌生,我在这里尝试创建的内容有点像交通违规,我的想法是当红灯亮起并且 PIR 传感器检测到蜂鸣器/LED 变高的那一刻。

图片如下:

代码如下所示

int pir = 2;
int rojo = 12; 
int amarillo = 11;
int verde = 10;
int led = 7;

void setup()
{
  pinMode(pir, INPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
  pinMode(verde, OUTPUT); //It declares the green pin as output 
  pinMode(amarillo, OUTPUT);//It declares the yellow pin as output 
  pinMode(rojo, OUTPUT);
}
    
void loop()
{
  digitalWrite(verde, HIGH); //It turns on the green led 
  delay(15000); //wait 15 seconds 
  digitalWrite(verde, LOW); //It turns off the green led 
  delay(250); //wait 0.25 seconds
  
  digitalWrite(amarillo, HIGH); //It turns on the yellow led 
  delay(3000); //wait 3 seconds 
  digitalWrite(amarillo, LOW); //It turns off the yellow led 
  delay(250); //wait 0.25 seconds
  int val = digitalRead(pir);
  Serial.println(val);
    
  digitalWrite(rojo, HIGH); //It turns on the red led 
  delay(15000); //wait 15 seconds 
  digitalWrite(rojo, LOW);
  if (rojo == HIGH) {
    if (val == HIGH) {
      digitalWrite(led, HIGH);
    } else {
      digitalWrite(led, LOW); 
    }
    delay(10);
  }
}

【问题讨论】:

  • 请将图片嵌入到您的帖子中(会生成一个stackoverflow imgur链接,即使您还没有足够的声誉,社区也可以为您嵌入)stackoverflow.com/posts/64971238/edit
  • rojo 是输出引脚 (12) 的 数字,但您将其与 HIGH1 我推测)进行比较,就好像它是一些输入一样信号。这显然总是错误的。
  • @EugeneSh。是对的;处理这个问题的最好方法是更清楚地命名变量,例如将rojo 更改为rojoPinNumber
  • @Anonymous 286 你需要做的是创建一个包含 rojo 语句的变量,你永远不会打开 rojo,因为你在 if 之前关闭它,你需要做就像我在上面发布的一样!
  • @ti7 sry 我不知道,会记住的

标签: c++ arduino led circuit


【解决方案1】:

问题出在这里:

  digitalWrite(rojo, HIGH); //It turns on the red led 
  delay(15000); //wait 15 seconds 
  digitalWrite(rojo, LOW);
  if (rojo == HIGH) {
    if (val == HIGH) {
      digitalWrite(led, HIGH);
    } else {
      digitalWrite(led, LOW); 
    }
    delay(10);
  }

首先,rojo 是一个 pin 号,而不是您要在此比较中使用的值。

其次,在您的延迟delay(15000) 期间,代码停止运行,因此在此期间未检测到移动。

在 15 秒延迟期间检测的唯一方法是使用 millis() 作为您的时间和延迟(或使用中断)。

你可以尝试这样的事情(未经测试):

digitalWrite(rojo, HIGH); //It turns on the red led 
unsigned long int redStartTime = millis();
while (millis() - redStartTime <= 15000) {
  delay(100);
  int val = digitalRead(pir);
  if (val == HIGH) {
    digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW); 
  }
}
digitalWrite(rojo, LOW);

我没有对此进行测试,但我希望你能明白。

请注意,我不知道运动检测器在某物移动时返回HIGH 还是LOW;您可能需要更改那里的代码。

【讨论】:

  • 非常感谢老兄这工作......再次感谢
  • 只是想问一件事,当我用压电蜂鸣器替换它时它仍然可以打开但没有声音,为什么?
  • 蜂鸣器有有源和无源之分;有源蜂鸣器只需要电压即可发出声音,无源蜂鸣器需要信号或音调来驱动它们,就像扬声器一样。也许你有一个被动蜂鸣器?
  • 有什么办法可以查到吗?如果它是被动的,我需要改变什么我尝试在 if 语句中使用tone(led, 440,200) 但似乎不起作用
  • 我不知道你有什么蜂鸣器。如果能接5V,接5V和地即可;如果它只是“滴答”它是被动的,如果你听到一个音调它是主动的。
【解决方案2】:

你需要改变你的 if 的位置

int pir=2;
int rojo=12; 
int amarillo=11;
int verde=10;
int led=7;

void setup()
{
    pinMode(pir,INPUT);
    pinMode(led,OUTPUT);
    Serial.begin(9600);
    pinMode(verde,OUTPUT); //It declares the green pin as output 
    pinMode(amarillo,OUTPUT);//It declares the yellow pin as output 
    pinMode(rojo,OUTPUT);
}
    
void loop()
{
    digitalWrite(verde,HIGH); //It turns on the green led 
    delay(15000); //wait 15 seconds 
    digitalWrite(verde,LOW); //It turns off the green led 
    delay(250); //wait 0.25 seconds
    
    digitalWrite(amarillo,HIGH); //It turns on the yellow led 
    delay(3000); //wait 3 seconds 
    digitalWrite(amarillo,LOW); //It turns off the yellow led 
    delay(250); //wait 0.25 seconds
    int val = digitalRead(pir);
    Serial.println(val);
    
    digitalWrite(rojo,HIGH); //It turns the red led 
    if(val==HIGH){             //---> //I dont know if this value can be compared with HIGH, on my programm whe costum use numbers!
        digitalWrite(led,HIGH);
    }
    else{
        digitalWrite(led,LOW); 
    }
    delay(15000); //wait 15 seconds 
    digitalWrite(rojo,LOW);
    delay(10);
}

【讨论】:

  • 行不通;想法是,如果在 15 秒内的任何时间检测到红色 LED 处于移动状态,则点亮 LED;不只是在红色 LED 亮起时。
  • @ocrdu 是的,这正是我想要做的,你能帮我解决这个问题吗?
  • @Anonymous-286:见答案。它可能需要一些工作,尚未测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多