Arduino:想要制作只打印一次的东西

时间:2013-01-26 20:47:42

标签: arduino

我正在为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);

}

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

1 个答案:

答案 0 :(得分:2)

您的第sqrt(afterlength^2);行没有做任何有用的事情。你的意思是通过写

来取绝对值
afterlength = sqrt(afterlength*afterlength);

^运算符是bitwise XOR - 根本不是你想要做的。

这会让它更好吗?

至于你的另一个问题: “起初我试图制作它以便它不会打印,如果它与最后一个打印长度相同,那么如果有人能想到这一点,那将是惊人的。” - 这是你能做的:

1)在脚本的头部定义另一个变量 - 将其命名为lastlength并将其初始化为defaultlength(在setup()中第一次ping之后立即执行)

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

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

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

lastlength = length;

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