试图美化这个 Arduino 代码 [这里是初学者]
Trying to Beautify this Arduino Code [Beginner here]
完全是新手,我想知道是否可以简化这段代码,将其精简或缩短。
你可以很容易地看出,这个东西使一个 LED 在另一个 LED 关闭时打开,反之亦然,在一个循环中。
void setup()
{
pinMode(3, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
if (digitalRead(13) == HIGH)
digitalWrite(3, LOW);
delay(1000); // Wait for 1000 millisecond(s)
digitalWrite(13, LOW);
if (digitalRead(13) == LOW)
digitalWrite(3, HIGH);
delay(1000); // Wait for 1000 millisecond(s)
}
digitalWrite(13, HIGH);
if (digitalRead(13) == HIGH)
digitalWrite(3, LOW);
将pin 13设置为高电平后,无需读取其值。
digitalWrite(13, HIGH);
digitalWrite(3, LOW);
足够了。
除此之外,初学者不需要编写漂亮的代码。专注于了解正在发生的事情以及如何实现目标。美好的东西往往是师傅创造的,不是徒弟。
这是我看到的:
- 使用常量表达式(
constexpr
)将3和13的引脚号设置为常量8位变量,而不是到处写3
和13
,因为这很难维护并且很难知道这些数字的含义。
- 由于 LED 状态是相反的,因此将它们的状态放在一个变量中,
led_state
,您可以切换。无需写状态,再读状态。在这种情况下,这没有任何意义。
- 删除有两个延迟调用的重复。您可以将其简化为一个。
- 最后,不要使用
delay()
来处理这个问题,这是一个浪费的调用,它实际上使用 100% 的 CPU 只是为了延迟。但是,让我们改天再做更改,因为现在已经足够吸收了。要了解如何在没有 blocking/wasteful delay()
的情况下执行此操作,请研究以下代码:
- (初学者友好):https://www.arduino.cc/en/tutorial/BlinkWithoutDelay
- 然后是这段代码(更高级——基于时间戳的协作多任务处理):
这是我修改后的代码(尽管仍在使用 delay()
):
constexpr uint8_t PIN_LED1 = 3;
constexpr uint8_t PIN_LED2 = 13;
void setup()
{
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
}
void loop()
{
static bool led_state = LOW;
digitalWrite(PIN_LED1, led_state);
digitalWrite(PIN_LED2, !led_state);
led_state = !led_state; // toggle the state
delay(1000);
}
其他参考资料:
constexpr
: https://en.cppreference.com/w/cpp/language/constexpr
uint8_t
表示 "unsigned 8-bit type"。无符号表示"only positive values",所以它可以存储0到255的数字。看这里:http://www.cplusplus.com/reference/cstdint/. It comes from the stdint.h header file. byte
in Arduino speak is an alias to this. https://www.arduino.cc/reference/en/language/variables/data-types/byte/
static
是一个有很多含义的关键字,但在这里我在简单的 C 意义上使用它,这意味着它会使用我将其设置为 ONCE 的值进行初始化——只有第一次,并且然后在每个新的循环周期中保留其最后已知的值,而不是重置。在这里阅读:What does "static" mean in C?
完全是新手,我想知道是否可以简化这段代码,将其精简或缩短。
你可以很容易地看出,这个东西使一个 LED 在另一个 LED 关闭时打开,反之亦然,在一个循环中。
void setup()
{
pinMode(3, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
if (digitalRead(13) == HIGH)
digitalWrite(3, LOW);
delay(1000); // Wait for 1000 millisecond(s)
digitalWrite(13, LOW);
if (digitalRead(13) == LOW)
digitalWrite(3, HIGH);
delay(1000); // Wait for 1000 millisecond(s)
}
digitalWrite(13, HIGH);
if (digitalRead(13) == HIGH)
digitalWrite(3, LOW);
将pin 13设置为高电平后,无需读取其值。
digitalWrite(13, HIGH);
digitalWrite(3, LOW);
足够了。
除此之外,初学者不需要编写漂亮的代码。专注于了解正在发生的事情以及如何实现目标。美好的东西往往是师傅创造的,不是徒弟。
这是我看到的:
- 使用常量表达式(
constexpr
)将3和13的引脚号设置为常量8位变量,而不是到处写3
和13
,因为这很难维护并且很难知道这些数字的含义。 - 由于 LED 状态是相反的,因此将它们的状态放在一个变量中,
led_state
,您可以切换。无需写状态,再读状态。在这种情况下,这没有任何意义。 - 删除有两个延迟调用的重复。您可以将其简化为一个。
- 最后,不要使用
delay()
来处理这个问题,这是一个浪费的调用,它实际上使用 100% 的 CPU 只是为了延迟。但是,让我们改天再做更改,因为现在已经足够吸收了。要了解如何在没有 blocking/wastefuldelay()
的情况下执行此操作,请研究以下代码:- (初学者友好):https://www.arduino.cc/en/tutorial/BlinkWithoutDelay
- 然后是这段代码(更高级——基于时间戳的协作多任务处理):
这是我修改后的代码(尽管仍在使用 delay()
):
constexpr uint8_t PIN_LED1 = 3;
constexpr uint8_t PIN_LED2 = 13;
void setup()
{
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
}
void loop()
{
static bool led_state = LOW;
digitalWrite(PIN_LED1, led_state);
digitalWrite(PIN_LED2, !led_state);
led_state = !led_state; // toggle the state
delay(1000);
}
其他参考资料:
constexpr
: https://en.cppreference.com/w/cpp/language/constexpruint8_t
表示 "unsigned 8-bit type"。无符号表示"only positive values",所以它可以存储0到255的数字。看这里:http://www.cplusplus.com/reference/cstdint/. It comes from the stdint.h header file.byte
in Arduino speak is an alias to this. https://www.arduino.cc/reference/en/language/variables/data-types/byte/static
是一个有很多含义的关键字,但在这里我在简单的 C 意义上使用它,这意味着它会使用我将其设置为 ONCE 的值进行初始化——只有第一次,并且然后在每个新的循环周期中保留其最后已知的值,而不是重置。在这里阅读:What does "static" mean in C?