试图美化这个Arduino代码[初学者在这里]

Trying to Beautify this Arduino Code [Beginner here]

本文关键字:代码 初学者 在这里 Arduino      更新时间:2023-10-16

完整的初学者在这里,我想知道是否可以简化此代码,将其精简或缩短。

正如您很容易知道的那样,当另一个 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)
} 

这是我看到的:

  1. 使用常量表达式 (constexpr( 将 3 和 13 的引脚号设置为常量 8 位变量,而不是到处写313,因为这很难维护,也很难知道这些数字的含义。
  2. 由于 LED 状态相反,因此将它们的状态包含在单个变量中,led_state,您可以切换该变量。无需写入状态,然后读取状态。在这种情况下,这没有任何意义。
  3. 删除具有两个延迟调用的重复项。您可以将其简化为一个。
  4. 最后,不要使用delay()来处理这个问题,这是一个浪费的调用,实际上使用100%的CPU只是为了延迟。但是,让我们将这种变化留到另一天,因为这足以暂时吸收。要了解如何在没有阻塞/浪费delay()的情况下执行此操作,请研究以下代码:
    1. (初学者友好(:https://www.arduino.cc/en/tutorial/BlinkWithoutDelay
    2. 然后是这段代码(更高级的基于时间戳的协作多任务处理(: 从没有中断引脚的传感器读取的最佳方法,并且在测量准备就绪之前需要一些时间

这是我更改的代码(尽管仍在使用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);
} 

其他参考资料:

  1. constexpr: https://en.cppreference.com/w/cpp/language/constexpr
  2. uint8_t表示"无符号 8 位类型"。无符号表示"只有正值",因此可以在其中存储数字 0 到 255。看这里:http://www.cplusplus.com/reference/cstdint/。它来自 stdint.h 头文件。byte在Arduino中说话是这个的别名。https://www.arduino.cc/reference/en/language/variables/data-types/byte/
  3. static是一个有很多含义的关键字,但在这里我在简单的 C 意义上使用它,这意味着它被初始化为我设置为 ONCE——只有第一次,然后在每个新的循环周期保持其最后一个已知值,而不是重置。在这里阅读:C中的"静态"是什么意思?
digitalWrite(13, HIGH);
if (digitalRead(13) == HIGH)
digitalWrite(3, LOW);

将引脚 13 设置为高电平后,无需读取其值。

digitalWrite(13, HIGH);
digitalWrite(3, LOW);

就足够了。

除此之外,您不需要作为初学者编写漂亮的代码。专注于了解正在发生的事情以及如何实现什么。美丽的事物通常是由师傅创造的,而不是学徒。