我正在为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);
}
此外,它根本不打印任何东西。我不确定它是不是通过循环还是什么。
答案 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() - 比方形的平方根更紧凑。