我和我正在尝试为一个项目创建一个智能的Arduino动力瓶,它会提醒用户定期喝水。
我要做的是检查超声波传感器和水位之间的距离。如果距离保持相同超过一小时,则串行监视器显示“坏”字样。否则它会返回“好”这个词。但是,当我运行此代码时,即使距离保持不变超过5000毫秒,它也会输出“good”一词。
注意:在代码中,我为间隔变量分配了5000毫秒而不是一小时,以便快速获得结果。
注2:这只是一个测试代码,远未完成。为了继续前进,我需要做好这项工作。
// defines pins numbers
const int trigPin = 8;
const int echoPin = 7;
// defines variables
int maxrange = 20;
int minrange = 0;
long duration, distance;
long previousmillis = 0;
long interval = 5000; //1 hour = 3600000ms;
unsigned long currentmillis = millis();
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
//Converting the distance to cm
distance = duration / 29 / 2;
if (currentmillis > interval) {
if (distance == distance) {
Serial.println("Bad");
Serial.println(distance);
}
} else {
Serial.println("Good");
Serial.println(distance);
}
}
这段代码有什么问题?请告诉我。
答案 0 :(得分:0)
试试这个。我没有测试它。
// defines pin numbers
const int trigPin = 8;
const int echoPin = 7;
// defines variables
int maxrange = 20;
int minrange = 0;
long duration, distance;
long previousmillis = 0;
long interval = 5000; //1 hour = 3600000ms;
unsigned long currentmillis = millis();
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
int temp = 0;
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
//Converting the distance to cm
distance = duration / 29 / 2;
if (currentmillis > interval) {
temp = duration / 29 / 2;
Serial.print("Temp:");
Serial.println(temp);
if (temp == distance) {
temp = 0 ;
Serial.println("Bad");
Serial.println(temp);
}
} else {
Serial.print("Good:");
Serial.println(distance);
}
}
答案 1 :(得分:0)
概念:例如,如果物体距离传感器10厘米,并且声速为340米/秒或0.034厘米/微秒,则声波将需要行进约294微秒。但是你从Echo引脚得到的数字将是这个数字的两倍,因为声波需要前进并向后反弹。因此,为了获得以cm为单位的距离,我们需要将接收到的回波引脚的行程时间值乘以0.034并将其除以2.
首先,您必须定义Trig和Echo引脚。在这种情况下,它们是Arduino Board上的9号和10号引脚,它们被命名为trigPin和echoPin。然后你需要一个Long变量,名为“duration”表示从传感器获得的旅行时间和一个整数变量的距离。
在设置中,您必须将trigPin定义为输出,将echoPin定义为输入,并启动串行通信以在串行监视器上显示结果。
首先在循环中你必须确保trigPin是清零的,所以你必须将该引脚设置为低状态仅2μs。现在要生成Ultra声波,我们必须将trigPin设置为HIGH状态10μs。使用pulseIn()函数,您必须读取行程时间并将该值放入变量“duration”。此功能有2个参数,第一个是echo引脚的名称,第二个参数可以写入HIGH或LOW。在这种情况下,HIGH意味着pulsIn()函数将等待引脚由反弹声波引起的HIGH并且它将开始计时,然后当声波结束时它将等待引脚变为低电平停止计时。最后,该函数将以微秒为单位返回脉冲的长度。为了获得距离,我们将持续时间乘以0.034并除以2.最后,我们将在串行监视器上打印距离值。
// defines pins numbers
int desired_time_limit=5000;
const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
float distance(void)
{
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;
return distance;
}
void loop() {
float a;
a=distance();
if(millis()>desired_time_limit)&&(a!=distance())
printf("Bad");
else
printf("Good");
}
答案 2 :(得分:0)
currentmillis
永远不会在循环中设置或重置。因为它在开始时初始化,所以currentmillis
的值将非常低。因此,if (currentmillis > interval)
将始终为假,从而导致“好”。分支。
一种方法是在每次循环迭代开始时设置currentmillis = millis()
。将currentmillis - previousmillis
与interval
进行比较。当'坏''分支已激活,重置previousmillis=currentmillis
。