Светодиод не включается с ультразвуковым датчиком

Я пытаюсь создать встроенную систему для моего университетского курса, и концепция, которую я придумал, используя предоставленные компоненты, — это настраиваемый датчик расстояния, используемый для точных измерений. Он использует ультразвуковой датчик для определения расстояния, потенциометр для определения желаемого расстояния и 3 светодиода, чтобы показать, находится ли датчик слишком близко, слишком далеко или на правильном расстоянии. Код использует систему прерывания и кнопку для активации системы. Кажется, что система работает правильно, и последовательный монитор показывает, что и потенциометр, и ультразвуковой датчик работают правильно, однако правильный светодиод не включается, когда соотношение между расстоянием и требуемым расстоянием верно.

Любая помощь приветствуется :] * РЕДАКТИРОВАТЬ. Я переместил кое-что, и теперь средний светодиод на контакте 7 остается включенным, когда кнопка нажата, и, похоже, он не работает должным образом

это код

int LEDPin1= 8;
int LEDPin2= 7;
int LEDPin3= 5;
int pinAnalogIn = A4; 
int interruptPin = 2;
volatile byte state = 0;
int triggerPin =9;
int echoPin = 6;
long int timeOfFlight = 0;
float speedOfSound = 343.0;
int inputCurrent;
long int myMap(long int x, long int xLow, long int xHigh, long int yLow, long int yHigh);

long int myMap(long int x, long int xLow, long int xHigh, long int yLow, long int yHigh){
  long int a = 0;
  long int y = 0;
  if (x!=xLow){
    a=(xHigh-x)/(x-xLow);
    y=(yHigh+a^yLow)/(a+1);
  }
  else {y=yLow;}
  return y;
}


void switchInt(){
  state=!state;
}

void FunctionMain(){
  int sensorValue=analogRead(A4);
  int distanceCm = 0.0;
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(5);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  timeOfFlight = pulseIn(echoPin, HIGH);
   
  distanceCm = speedOfSound*timeOfFlight/(2*10000);

  delay(10);

  int sensorValueTransformed = 0.0;
  sensorValueTransformed= myMap(sensorValue, 0, 1023, 0, 30);

  Serial.println("Sensor Value =");
  Serial.println(sensorValue);
  Serial.println("New Sensor Value =");
  Serial.println(sensorValueTransformed);
  Serial.println(distanceCm);
  Serial.println("\n");

  if (sensorValueTransformed-1<<distanceCm<<sensorValueTransformed+1){
    digitalWrite(LEDPin2, HIGH);
    digitalWrite(LEDPin1, LOW);
    digitalWrite(LEDPin3, LOW);
  }
  else{
  if (sensorValueTransformed<<distanceCm){
    digitalWrite(LEDPin3, HIGH);
    digitalWrite(LEDPin1, LOW);
    digitalWrite(LEDPin2, LOW);
    
  }
    if (sensorValueTransformed>>distanceCm){
    digitalWrite(LEDPin1, HIGH);
    digitalWrite(LEDPin3, LOW);
    digitalWrite(LEDPin2, LOW);
    
  }}
  delay(1000);

}




void setup(){
  Serial.begin(9600);
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LEDPin1, OUTPUT);
  pinMode(LEDPin2, OUTPUT);
  pinMode(LEDPin3, OUTPUT);
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), switchInt, RISING);
}

void loop(){
  
  if (state == 1){
    FunctionMain();
  }
Sensor Value =
184
New Sensor Value =
6
37


Sensor Value =
186
New Sensor Value =
6
36


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
34


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
24


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
30


Sensor Value =
186
New Sensor Value =
6
37


Sensor Value =
186
New Sensor Value =
6
25


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
187
New Sensor Value =
6
36


Sensor Value =
187
New Sensor Value =
6
43


Sensor Value =
186
New Sensor Value =
6
34


Sensor Value =
186
New Sensor Value =
6
34


Sensor Value =
186
New Sensor Value =
6
35


Sensor Value =
186
New Sensor Value =
6
37


Sensor Value =
187
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
30


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
33


Sensor Value =
186
New Sensor Value =
6
30


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
30


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
30


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
187
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
25


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
25


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
187
New Sensor Value =
6
793


Sensor Value =
186
New Sensor Value =
6
23


Sensor Value =
186
New Sensor Value =
6
35


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
185
New Sensor Value =
6
26


Sensor Value =
187
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
27


Sensor Value =
186
New Sensor Value =
6
28


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
24


Sensor Value =
186
New Sensor Value =
6
31


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
22


Sensor Value =
186
New Sensor Value =
6
793


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
29


Sensor Value =
186
New Sensor Value =
6
31


Sensor Value =
186
New Sensor Value =
6
24


Sensor Value =
186
New Sensor Value =
6
25


Sensor Value =
186
New Sensor Value =
6
26


Sensor Value =
186
New Sensor Value =
6
30


Sensor Value =
186
New Sensor Value =
6
36

, 👍0

Обсуждение

<< и >> являются операторами сдвига битов... они не являются операторами сравнения величин, @jsotola

я просто изменил его на > и < и светодиоды все равно не загораются,, @Morgan Reid

пожалуйста, добавьте содержимое последовательного монитора в свой пост ... используйте копирование и вставку, @jsotola

только что добавил его туда, теперь нижний номер не помечен, но это расстояние, рассчитанное от датчика, @Morgan Reid

a<b<c нельзя использовать в операторе if. a<b разрешается в логическое значение, а затем вы сравниваете это логическое значение с меньшим, чем c. Возможно, вам следует попробовать if ((sensorValueTransformed-1 < DistanceCm) && (distanceCm < sensorValueTransformed+1))., @Peter Paul Kiefer


1 ответ


1

Я упомяну о некоторых незначительных проблемах, прежде чем наметить лучшее расположение ваших операторов if.

• В общем случае при объявлении константы поместите const где-нибудь в ее объявлении. Например, вместо int LEDPin1= 8; скажите const int LEDPin1= 8;. (gcc может сам сделать вывод, что константы являются константами, но если это не так, информирование его о константах может сэкономить несколько байтов памяти. Кроме того, посмотрите оператор enum.)

• В операторе y=(yHigh+a^yLow)/(a+1); вы используете ^ для вычисления XOR yLow, что может быть разумным, если вы собираетесь выполнять битовые операции, а не арифметические, но в остальном подозрительно. (В этом случае, когда yLow равен 0, a XOR yLow равно a, поэтому ошибка не имеет большого значения.)

• Как отмечено в комментариях, << не является оператором сравнения. В таком контексте, отличном от ввода-вывода, это оператор сдвига влево, и, вероятно, должны были быть сообщения об ошибках смещения-счетчика вне диапазона. (В контексте ввода-вывода это оператор вывода.) Кроме того, в отношении множественных сравнений см. рекомендуемое расположение операторов if ниже. (Такие языки, как Python и Julia, могут анализировать a<b<c по желанию, но в C, как уже упоминалось, он сравнивает логический результат одного из сравнений с другим числом.)

• Я ожидаю, что int DistanceCm = 0.0; получит ошибку компиляции или предупреждение о неправильном значении инициализации. Возможно, вы имели в виду int DistanceCm = 0; или float DistanceCm = 0.0;.

• Объявление функции long int myMap(...); перед определением функции long int myMap(...){...} является избыточным, и не требуется, если только определение функции не находится в другой единице компиляции, чем вызов функции.

• Вы говорите изменяемое состояние байта = 0; ... state=!state; ... if (state == 1){ FunctionMain( ); и не имеют других ссылок на state. Я предлагаю вам изменить последнее на if (state){ state=0; ФункцияОсновная(); }, чтобы обрабатывать все нарастающие фронты, а не все остальные нарастающие фронты (если только это не то, что вы имели в виду). Кроме того, if (state) более грамотен, чем if (state == 1), а также короче на пять символов.

• Вместо Serial.println("Sensor Value ="); и Serial.println("New Sensor Value ="); укажите Serial.print("Значение датчика = "); и Serial.print("Новое значение датчика = ");, если вы хотите, чтобы выводились метки и значения в той же строке.

• Чтобы избавиться от неуклюжих трехстрочных групп вызовов digitalWrite, определите функцию turnOn следующим образом:

void turnOn(pin) {   
    digitalWrite(LEDPin1, LOW);
    digitalWrite(LEDPin2, LOW);
    digitalWrite(LEDPin3, LOW);
    digitalWrite(pin, HIGH);
}

а затем используйте такие вызовы, как turnOn(LEDPin1); или turnOn(LEDPin2); или turnOn(LEDPin3);, чтобы включить выбранный светодиоды.

Теперь, что касается расположения операторов if: сначала проверив два случая выхода за пределы диапазона, вы можете избежать необходимости в коде с четырьмя сравнениями, который вы пытались использовать. Например:

if (sensorValueTransformed =< distanceCm-1)
   turnOn(LEDPin3);
else
   if (sensorValueTransformed >= distanceCm+1)
     turnOn(LEDPin1);
   else turnOn(LEDPin2);

Сначала может показаться, что эффект от этого кода отличается от того, что вы пытались сделать, из-за сравнения с distanceCm-1 и distanceCm+1, а не с distanceCm, но обратите внимание, что ваши сравнения с distanceCm будут происходить только в том случае, если sensorValueTransformed - DistanceCm равно 1 или больше.

Обратите внимание: возможно, не имеет смысла использовать sensorValueTransformed и distanceCm целые числа, а не числа с плавающей запятой. Если это числа с плавающей запятой, мы можем разумно написать < и > вместо =< и >= в моем фрагменте кода выше. Если это целые числа, логические тестовые значения (sensorValueTransformed =< DistanceCm-1) и (sensorValueTransformed >= DistanceCm+1) имеют те же значения, что и (sensorValueTransformed < DistanceCm) и (sensorValueTransformed > DistanceCm), что вполне может быть не тем, что вам нужно.

,