【问题标题】:Trying to Beautify this Arduino Code [Beginner here] [closed]试图美化这个 Arduino 代码 [这里是初学者] [关闭]
【发布时间】:2020-08-31 15:20:48
【问题描述】:

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

您可以很容易地看出,当另一个 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)

} 

【问题讨论】:

  • 需要格式化。就是这样。它是阻塞的,可以通过使用“无延迟闪烁”示例作为指南将其设为非阻塞。你真的不需要 if 语句,因为你知道你刚刚写了什么。但它们不会引起任何问题,优化器可能还是会将它们取出来。
  • 非常感谢您的评论。不幸的是,我的知识有限,很难理解您的评论
  • 是的,但肯定有很多很棒的词可以通过 Google 搜索和了解。试一试。
  • 或者你可以问一些特定的问题。在不知道你认为什么是坏的或你不明白什么的情况下,我不知道要解释什么。我无法在网络论坛的 cmets 部分为您提供完整的编程课程。这是不可能的。
  • 代码审查在这里是题外话。也许试试Code Review SE

标签: c++ arduino embedded simplify


【解决方案1】:

这是我看到的:

  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. 然后是这段代码(更高级——基于时间戳的协作多任务):Best way to read from a sensors that doesn't have interrupt pin and require some time before the measure is ready

这是我的更改代码(尽管仍在使用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 speak 是这个的别名。 https://www.arduino.cc/reference/en/language/variables/data-types/byte/
  3. static 是一个有很多含义的关键字,但在这里我在简单的 C 意义上使用它,这意味着它会使用我将其设置为 ONCE 的值进行初始化——仅在第一次时,然后保持其最后一个已知值每个新的循环周期,而不是重置。在这里阅读:What does "static" mean in C?

【讨论】:

    【解决方案2】:
    digitalWrite(13, HIGH);
    
      if (digitalRead(13) == HIGH)
        digitalWrite(3, LOW);
    

    13脚置高后,无需读取其值。

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

    足够了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2019-11-02
      相关资源
      最近更新 更多