Светодиод не включается с ультразвуковым датчиком
Я пытаюсь создать встроенную систему для моего университетского курса, и концепция, которую я придумал, используя предоставленные компоненты, — это настраиваемый датчик расстояния, используемый для точных измерений. Он использует ультразвуковой датчик для определения расстояния, потенциометр для определения желаемого расстояния и 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
@Morgan Reid, 👍0
Обсуждение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)
, что вполне может быть не тем, что вам нужно.
- RGB LED с помощью потенциометра и кнопки
- Управлять яркостью светодиода с помощью потенциометра без кода, а также считывать значение потенциометра?
- Затемнение нескольких светодиодов с помощью потенциометра
- ШИМ-управление, как остановить мерцание светодиода?
- Как регулировать светодиод на плате?
- Компонент с управляемым сопротивлением от Arduino?
- Проблема с потенциометром
- Питание светодиодной ленты - Сколько ампер?
<<
и>>
являются операторами сдвига битов... они не являются операторами сравнения величин, @jsotolaя просто изменил его на > и < и светодиоды все равно не загораются,, @Morgan Reid
пожалуйста, добавьте содержимое последовательного монитора в свой пост ... используйте копирование и вставку, @jsotola
только что добавил его туда, теперь нижний номер не помечен, но это расстояние, рассчитанное от датчика, @Morgan Reid
a<b<c
нельзя использовать в операторе if.a<b
разрешается в логическое значение, а затем вы сравниваете это логическое значение с меньшим, чем c. Возможно, вам следует попробоватьif ((sensorValueTransformed-1 < DistanceCm) && (distanceCm < sensorValueTransformed+1))
., @Peter Paul Kiefer