#c #arduino-uno #arduino-ultra-sonic #serial-monitor
Вопрос:
Я использую ультразвуковой датчик HC-SR04, который отображает расстояние, есть два оператора if, если оно ниже 0, оно отображается как 0 (эта часть работает по назначению), если оно превышает 4 метра (переменная расстояния-сантиметр), оно должно говорить «Вне зоны действия», и это та часть, с которой у меня проблема. Вот полный код
const int TrigPin = 2;
const int EchoPin = 3;
float distance;
void setup() {
Serial.begin(9600);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
}
void loop () {
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
distance = pulseIn(EchoPin,HIGH)/58.0; // divided by 58 to change into cm
if(distance < 0) {
distance = 0;
}
if(distance > 400) {
distance = "Out of range";
}
Serial.println(distance );
}
Это возвращает ошибку, в которой говорится: «не удается преобразовать ‘const char [13]’ в ‘float’ при назначении» (строка 26), есть ли способ преобразовать переменную расстояния без использования новой переменной? (Для переменной расстояния уже есть другой оператор if). Я довольно рано начинаю в этом, так что решение может быть чрезвычайно простым, и я просто этого не знаю.
Комментарии:
1. На какой строке диагностируется эта ошибка? Если вы укажете полную ошибку, это будет включено.
Ответ №1:
distance
является поплавком, вы не можете установить поплавок в символ *.
есть ли какой-либо способ преобразовать переменную расстояния без использования новой переменной?
Ну, вы не можете преобразовать переменную в другой тип данных после того, как вы объявили ее int. Что вы можете сделать, так это объявить его символом * (строка), а затем, когда вы захотите установить для него значение, например 0, преобразовать число в строку. Это если вы действительно хотите иметь одну переменную для обоих.
Ответ №2:
«есть ли какой-либо способ преобразовать переменную расстояния без использования новой переменной?» Вам не нужно преобразовывать ее или использовать другую переменную. Не меняйте distance
и вместо этого отправьте строку:
void loop () {
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
distance = pulseIn(EchoPin,HIGH)/58.0; // divided by 58 to change into cm
// You don't need this check. pulseIn returns an unsigned long. It's always >= 0
/*if(distance < 0) {
distance = 0;
} */
if(distance > 400) {
Serial.println("Out of range");
return;
}
Serial.println(distance );
}
Не имеет отношения к вашей проблеме. Вам не нужно проверять, является ли distance
это отрицательным. Пульсейн возвращает an unsigned long
. Это всегда неотрицательно.