若语句只工作一次



这是我的代码:

#include <FastLED.h>
#define LED_PIN     7
#define NUM_LEDS    20
CRGB leds[NUM_LEDS];
void setup() {
pinMode(A0, INPUT_PULLUP);
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
if (digitalRead(A0) == HIGH) {
TEST ();
}
}
void TEST() {
leds[0] = CRGB(255, 0, 0);
FastLED.show();
delay(500);
leds[1] = CRGB(0, 255, 0);
FastLED.show();
delay(500);
leds[2] = CRGB(0, 0, 255);
FastLED.show();
delay(500);
leds[3] = CRGB(150, 0, 255);
FastLED.show();
delay(500);
leds[4] = CRGB(255, 200, 20);
FastLED.show();
delay(500);
leds[5] = CRGB(85, 60, 180);
FastLED.show();
delay(500);
leds[6] = CRGB(50, 255, 20);
FastLED.show();
}

以下是我一直坚持的内容:该代码应该检测A0引脚上的电压,并触发我的测试功能,使LED依次发光。我目前的问题是它有效,但只有一次。如果我移除电压并重试,则该功能不会执行。我真的不确定我做错了什么。我的最终目标是为我的汽车创建顺序尾灯的代码,这只是概念的证明。基本上,我想让Arduino检测汽车信号中的电压,并创建一个连续的动画。我知道要做到这一点,我不能使用延迟功能,但我会想出如何制作一个可以重置为零的计时器。因此,在这个问题上提供任何帮助也将不胜感激。很抱歉,如果这是一个措辞拙劣或简单的解决方案,我是arduino的新手。

根据编写代码的规则,被调用函数的描述应该高于其调用的位置。我的意思是TEST()函数应该在setup()loop()之间

您需要在LED打开后关闭它们,这可以通过FastLED库中的特定功能实现,或者如下所示:

void loop() {
for(size_t i = 0; i != 7; ++i) {
leds[i] = CRGB(0, 0, 0);
}    
// your code
}

不需要将数字结果与HIGH信号值进行比较。如果传感器的值为HIGH,则会自动转换为1,这在编程语言中是正确的,并且满足条件。如果信号是LOW,则0为假,并且不满足条件。

你可以简单地这样写:

if (digitalRead(A0)) {
TEST ();
}

此外,还要确定传感器产生的信号。

我看到在pinMode(pin, mode)功能中,您已将传感器连接到具有一系列值的analog引脚​​from 0 to 1023,但在读取具有值的digital信号的条件下​​CCD_ 12。

你在pinMode((中使用INPUT_PULLUP模式中的工作模式,它的工作方式相反。例如,如果按下按钮,则它会发出LOW信号,如果未按下,则发出HIGH信号。如果您需要普通逻辑,那么您应该使用INPUT模式。但这一切都取决于你的联系,你不能为此而烦恼。

希望将数字传感器连接到数字引脚,并将模拟传感器连接到模拟引脚。此外,如果你有一个模拟传感器,那么你不需要写一个pinMode((。

因此,如果您的模拟信号输出值为0,则数字信号和所有其他值将为LOW​​被转换为CCD_ 18信号。使用analogRead()功能读取模拟信号将更正确。

无电压模拟信号可以产生某种信号,因此值得在程序中考虑这一点。有必要测量一个特定的阈值,在这个阈值之后你的功能应该工作,例如,如果在平静状态下信号不高于20-30,那么你可以写下条件如下:

if (analogRead(A0) > 50) {
TEST ();
}

还要注意的是,函数中有delays,在此期间电压可能会下降,下次这种情况将不起作用。

您可以使用boolean variable来捕获电压并将值转换为true或false。或者您可以使用counter

代码:

#include <FastLED.h>
#define LED_PIN     7
#define NUM_LEDS    20
CRGB leds[NUM_LEDS];
void setup() {
// if you have an analog sensor, then you do NOT need to write a pinMode()
pinMode(A0, INPUT_PULLUP);    // maybe INPUT_PULLUP -> INPUT 
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void TEST() {
leds[0] = CRGB(255, 0, 0);
FastLED.show();
delay(500);
leds[1] = CRGB(0, 255, 0);
FastLED.show();
delay(500);
leds[2] = CRGB(0, 0, 255);
FastLED.show();
delay(500);
leds[3] = CRGB(150, 0, 255);
FastLED.show();
delay(500);
leds[4] = CRGB(255, 200, 20);
FastLED.show();
delay(500);
leds[5] = CRGB(85, 60, 180);
FastLED.show();
delay(500);
leds[6] = CRGB(50, 255, 20);
FastLED.show();
}
void loop() {
// turn off the LEDs
for(size_t i = 0; i != 7; ++i) {
leds[i] = CRGB(0, 0, 0);
}  
// make sure what signal the sensor produces
if (analogRead(A0)) {
TEST ();
}
}

最新更新