Светодиод не включается с ультразвуковым датчиком
Я пытаюсь создать встроенную систему для моего университетского курса, и концепция, которую я придумал, используя предоставленные компоненты, — это настраиваемый датчик расстояния, используемый для точных измерений. Он использует ультразвуковой датчик для определения расстояния, потенциометр для определения желаемого расстояния и 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