试图美化这个 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);

足够了。

除此之外,初学者不需要编写漂亮的代码。专注于了解正在发生的事情以及如何实现目标。美好的东西往往是师傅创造的,不是徒弟。

这是我看到的:

  1. 使用常量表达式(constexpr)将3和13的引脚号设置为常量8位变量,而不是到处写313,因为这很难维护并且很难知道这些数字的含义。
  2. 由于 LED 状态是相反的,因此将它们的状态放在一个变量中,led_state,您可以切换。无需写状态,再读状态。在这种情况下,这没有任何意义。
  3. 删除有两个延迟调用的重复。您可以将其简化为一个。
  4. 最后,不要使用 delay() 来处理这个问题,这是一个浪费的调用,它实际上使用 100% 的 CPU 只是为了延迟。但是,让我们改天再做更改,因为现在已经足够吸收了。要了解如何在没有 blocking/wasteful 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 表示 "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/
  3. static 是一个有很多含义的关键字,但在这里我在简单的 C 意义上使用它,这意味着它会使用我将其设置为 ONCE 的值进行初始化——只有第一次,并且然后在每个新的循环周期中保留其最后已知的值,而不是重置。在这里阅读:What does "static" mean in C?