Я пытаюсь создать светодиод с дистанционным управлением, который выключается на определенном расстоянии. Я использую Arduino Leonardo и датчик расстояния. В тот момент, когда я подключаю свою плату, светодиод остается постоянно включенным и не выключается при уменьшении расстояния. Подскажите, пожалуйста, что нужно изменить, чтобы это работало?
const int TrigPin = 2;
const int EchoPin = 3;
float cm;
int ledPin = 12; //define ledPin12 is the output port of led’s level.
int val = 0; //define original of val.
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(ledPin, OUTPUT); //set ledPin output
}
void loop()
{
digitalWrite(TrigPin, LOW); //Low-high-low level sent a short time pulse to TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; //Echo time converted into cm
cm = (int(cm * 100.0)) / 100.0; // retain two decimal places
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
val = analogRead(EchoPin); //get the value from sensor
if(val<=1)
{
//512=2.5V, if want the sensor be more sensitive, increase the number, or lese low the number.
digitalWrite(ledPin, HIGH); //when the value of val is less than 512(2.5V), light up led lamp
}
else
{
digitalWrite(ledPin, LOW);
}
}
Я предполагаю, что датчик похож на SRF005. Вы должны включить эту деталь в свой вопрос.
Спусковой крючок выглядит хорошо, но нет ничего плохого в том, чтобы пульсировать немного дольше, скажем, 20 с нами, чтобы убедиться. Захват эхо выглядит правильно, за исключением того, что в той таблице, которую я нашел, написано, что нужно делить на 5,8, а не на 58,0, а возвращаемое значение — беззнаковое длинное, а не плавающее.
Но вы не должны использовать analogRead()
на эхо-контакт. Это будет 0 в этой точке. Скорее у вас уже есть расстояние в cm
переменная.
(Существуют датчики, которые используют напряжение на контактах, чтобы указать расстояние, но у них нет триггера и эхо-сигналов. Какой тип вы на самом деле используете?)
void loop()
{
int cm = 0;
digitalWrite(TrigPin, LOW); //Low-high-low level sent a short time pulse to TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10); // <<<<<<<<<<<<<<<<<<<<<<<< Change to 20
digitalWrite(TrigPin, LOW);
cm = (int)(pulseIn(EchoPin, HIGH) * 10 / 58); //Echo time converted into cm <<<<<<<<< 5.8 ????
Serial.print(cm);
Serial.print("cm");
Serial.println();if(cm < 50)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
delay(1000);
}