2017-08-31 65 views
0

我想弄清楚如何使用数据记录Arduino屏蔽上的可选LED。我写了一个简单的if语句来打开LED,但是当我想要时它不会关闭。任何人都可以帮我理解为什么?Arduino数据记录器选择。 LED

我使用的是土壤湿度传感器,当水分超过300时,我想让LED关闭。代码使用内置LED工作,但我想了解可选LED如何工作。

int led2 = 1; 

void setup() { 
    Serial.begin(9600); 
    // open serial port, set the baud rate as 9600 bps 
    pinMode(led2, OUTPUT); 
} 

void loop() { 
    // Read data and store 
    int val; 
    val = analogRead(0); //connect sensor to Analog 0 
    Serial.println(val); //print the value to serial port 
    if(val < 301) { 
    // If soil moisture is less than 301 (0-300 is dry) 
    digitalWrite(led2, HIGH); 
    } else { 
    digitalWrite(led2, LOW); 
    } 
    delay(1000); 
} 
+1

您的串口终端是否显示值为301和_stays_高于300? – Mepix

+0

为什么可选LED连接到引脚1或TX引脚?你确定它是用户可控制的,而不仅仅是一个LED指示串行活动? –

+0

@gre_gor在这个Arduino屏蔽上,有两个“可选”LED可以连接到任何可用的引脚。直到用户选择一个引脚,它们才会与任何东西连接。在这种情况下,OP选择使用引脚1(TX)......这可能是这里的问题。 – Mepix

回答

1

传感器测得的数据可能固有噪声。仅仅因为你超过了价值并不意味着所有的数据点都会继续高于这个价值。 LED可能已关闭,但随后传感器值降至低于该阈值时再次打开。

尝试在您的代码中加入一个布尔值来查看您是否达到该值。布尔应该是全局的,或者在循环中用作静态的。

int led2 = 10; //**DO NOT USE PINS 0 or 1!** 

void setup() { 
    Serial.begin(9600); 
    // open serial port, set the baud rate as 9600 bps 
    pinMode(led2, OUTPUT); 
} 

bool hitThreshold = false; 

void loop() { 
    // Read data and store 
    int val; 
    val = analogRead(0); //connect sensor to Analog 0 
    Serial.println(val); //print the value to serial port 
    if(val <= 300 && !hitThreshold) { 
     // If soil moisture is less than 301 (0-300 is dry) 
     digitalWrite(led2, HIGH); 
    } else { 
     hitThreshold = true; 
     digitalWrite(led2, LOW); 
    } 
     delay(1000); 
} 

如果您希望LED在一段时间后再次打开,您可以在代码中加入计时器。然后,您可以检查是否已经过了足够的时间,而不是简单的阈值布尔值。

您还可以实施运行平均过滤器以降低信号噪音,如discussed in this Arduino forum。玩弄它,看看什么适合你。

编辑: 待办事项使用数字管脚0和1的数字,但用串行端口。 Pins 0 and 1 correspond to TX/RX。你会遇到problems!选择另一个引脚来控制可选LED。