0

我正在为 ardunio 编写一个脚本,以便它可以打印出某物有多远,并且我正在尝试使它等于默认长度(当脚本首次启动时)它不起作用,如果两个数字之间的距离大于 3 英寸重新打印。不知道为什么它不起作用。起初我试图让它不打印,如果它与上次打印的长度相同,那么如果有人能弄清楚这一点,那就太棒了。另外,对不起,如果我听起来很紧张,我已经在这个可能超级简单的脚本上工作了至少 3 个小时。

#include <Ping.h>
Ping ping = Ping(13,0,0);
int defaultlength = 0;
int length = 0;
int afterlength = 0;
void setup(){
  Serial.begin(9600);
  ping.fire();
  defaultlength = ping.inches();
}

void loop(){
  ping.fire();
  length = ping.inches();
  delay(100);
  afterlength = length - defaultlength;
  sqrt(afterlength^2);
  if (afterlength >= 3) {
    Serial.print(afterlength);
    ping.fire();
    Serial.print("Inches: ");
    Serial.print(ping.inches());
    Serial.print(" | Centimeters: ");
    Serial.print(ping.centimeters());
    Serial.print(" | Light: ");
    if (analogRead(A0) >= 1000) {
      Serial.print("ON");
      Serial.println();
    }
    else {
      Serial.print("OFF");
      Serial.println();
    }

  }

  delay(1000);

}

此外,它根本没有打印任何东西。我不确定它是否没有通过循环或什么。

4

1 回答 1

2

你的线sqrt(afterlength^2);没有做任何有用的事情。你的意思是通过写来取绝对值吗

afterlength = sqrt(afterlength*afterlength);

^ 运算符是按位异或- 根本不是您想要做的。

这会让它变得更好吗?

至于你的另一个问题:“起初我试图让它不会打印,如果它与最后打印的长度相同,那么如果有人能弄清楚这一点,那就太棒了。” - 这是你可以做的:

1) 在脚本的头部定义另一个变量 - 调用它lastlength并将其初始化为 defaultlength (在你第一次 ping 之后setup())

2)在循环中,将if语句更改为

if ((afterlength >= 3) && (abs(length - lastlength) > 0.1)) {

3) 最后,在 if{} 语句的末尾,添加:

lastlength = length;

将其放入if{}块中的原因是确保仅在事情发生充分变化时才对其进行更新 - 否则,您将保持相同的“不要再告诉我,直到它与您之前告诉我的数字不同”的价值。当然,该> 0.1值可以替换为您想要的任何容差。还要注意 abs() 的使用——比平方的平方根更紧凑一点。

于 2013-01-26T20:52:38.360 回答