Код для 2 ультразвуковых датчиков
Это мой код:
int trigPin=13; // Контакт запуска датчика подключен к контакту 13 Arduino
int echoPin=11; // Контакт датчика Echo подключен к контакту 11 Arduino
float pingTime; //время прохождения пинга от датчика до цели и обратно
float targetDistance; //Расстояние до цели в дюймах
float speedOfSound=776.5; //Скорость звука в милях в час при температуре 77 градусов.
int trigPin1=2;
int echoPin1=3;
float pingTime1; //время прохождения пинга от датчика до цели и возврата 1
float targetDistance1; //Расстояние до цели в дюймах 1
void setup() {
// поместите сюда код установки для однократного запуска:
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
digitalWrite(trigPin, LOW); //Установить низкий уровень триггерного контакта
delayMicroseconds(2000); //Позволяем сигналу установиться
digitalWrite(trigPin, HIGH); //Установить тригПин высоким
delayMicroseconds(15); // Задержка в высоком состоянии
digitalWrite(trigPin, LOW); //пинг отправлен
delayMicroseconds(10); // Задержка в низком состоянии
digitalWrite(trigPin1, LOW); //Установить низкий уровень триггерного контакта
delayMicroseconds(2000); //Позволяем сигналу установиться
digitalWrite(trigPin1, HIGH); //Установить тригПин высоким
delayMicroseconds(15); // Задержка в высоком состоянии
digitalWrite(trigPin1, LOW); //пинг отправлен
delayMicroseconds(10); // Задержка в низком состоянии
pingTime1 = pulseIn(echoPin1, HIGH); //время пинга представлено в микросекундах
pingTime1=pingTime1/1000000; //конвертируем pingTime в секунды, разделив на 1000000 (микросекунды в секунду)
pingTime1=pingTime1/3600; //конвертируем время пинга в часы, разделив на 3600 (секунды в часе)
targetDistance1= speedOfSound * pingTime; //Это будет в милях, так как скорость звука была в милях в час
targetDistance1=targetDistance1/2; //Помните, что пинг проходит к цели и обратно от цели, поэтому вы должны разделить на 2 фактическое расстояние до цели.
targetDistance1= targetDistance*63360; // Преобразование миль в дюймы путем умножения на 63360 (дюймы на милю)
pingTime = pulseIn(echoPin, HIGH); //время пинга представлено в микросекундах
pingTime=pingTime/1000000; //конвертируем pingTime в секунды, разделив на 1000000 (микросекунды в секунду)
pingTime=pingTime/3600; //конвертируем время пинга в часы, разделив на 3600 (секунды в часе)
targetDistance= speedOfSound * pingTime; //Это будет в милях, так как скорость звука была в милях в час
targetDistance=targetDistance/2; //Помните, что пинг проходит к цели и обратно от цели, поэтому вы должны разделить на 2 фактическое расстояние до цели.
targetDistance= targetDistance*63360; // Преобразование миль в дюймы путем умножения на 63360 (дюймы на милю)
Serial.println(targetDistance);
Serial.println(targetDistance1);
delay(100); // задержка на десятую долю секунды, чтобы немного замедлить работу.
}
Код Python:
import serial #Import Serial Library
arduinoSerialData = serial.Serial('com3',9600) #Создать объект последовательного порта с именем arduinoSerialData
while (1==1):
if (arduinoSerialData.inWaiting()>0):
myData = arduinoSerialData.readline()
myData=str(myData)
myData= myData.replace("b'",'')
myData=myData.replace("\\r\\n'",'')
if myData<"3":
print( myData)
Когда я компилирую скетч, он не показывает ошибок. Но когда я запускаю файл в python, вывод = 0. Однако, когда они запускаются по отдельности, python дает мне действительный ввод. Так что этот код правильный? Кроме того, есть ли способ вызвать точный файл c++ в python?Спасибо за помощь!
@python man, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы пытаетесь выполнить измерение с помощью двух ультразвуковых датчиков одновременно. Вы не можете сделать это так легко. Вам необходимо измерять последовательно по двум причинам:
- Ультразвуковые датчики могут быть сбиты с толку другими сигналами.
- Вы пропустите пульс одного датчика, пока будете считывать пульс другого с помощью
pulseIn()
.
Итак, порядок действий такой:
- Датчик запуска 1.
- Чтение датчика 1 с помощью
pulseIn()
- Датчик запуска 2.
- Чтение датчика 2 с помощью
pulseIn()
Большое спасибо! Работает отлично!, @python man
Есть ли способ, которым я могу различать 2 входа?, @python man
Перед ним можно напечатать идентификатор, например 1:100
для значения 100 первого датчика. Затем вы можете разделить строку в python на двоеточие, чтобы получить номер датчика и значение по отдельности., @chrisl
а ок понял спасибо!!, @python man
Можно ли добавить, например, «a» и «b», чтобы различать 2 значения?, @python man
Конечно, просто Serial.print их перед каждым соответствующим значением, @chrisl
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Как повторить кусок кода
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Последовательная связь Arduino с Python: отправка массива
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
1. Какой файл вы используете в python? Вы не показали свой скетч питона. 2. Как вы различаете данные с первого датчика и со второго датчика? Или это для вас не имеет значения?, @chrisl
Изменить: выходы различаются targetDistance1 и targetDistance (одна переменная имеет «1», а другая — нет), @python man
Я имел в виду вашу программу на Python. Но поскольку вы просто печатаете каждую строку, это не совсем применимо здесь. Вы проверили, что последовательный вывод вашего скетча Arduino соответствует вашим ожиданиям? Вы можете проверить это просто в последовательном мониторе. И почему вы делаете
if myDATA<"3"
в своей программе на Python? Почему вы хотите отображать только строки, которые лексически находятся в более низком порядке, чем «3»?, @chrislЯ проверял, сработает ли моя идея. Потому что программа, которую я создаю, запускает серию действий, если расстояние меньше 3, @python man
Вы не проверяете расстояние меньше 3. Сначала вам нужно преобразовать данные в число, прежде чем вы сможете сравнить их таким образом. В настоящее время вы лексически сравниваете две строки, а не 3 числа., @chrisl
Пожалуйста, подтвердите, что последовательный вывод соответствует вашим ожиданиям. В этом случае это чисто проблема python. Я думаю, вам следует сделать несколько базовых руководств по python и немного почитать о типах переменных в python. Это даст вам достаточно знаний, чтобы правильно написать свой скрипт на Python., @chrisl
Хорошо, я посмотрю на это с точки зрения Python, спасибо!, @python man
Я просто проверяю свой код на Python, он просто печатает данные, выведенные кодом С++...... так верен ли код С++? редактировать: последовательный вывод не совсем такой, как ожидалось. Когда я запускаю код для каждого ультразвукового датчика, он дает правильный вывод, но когда я объединяю их (для формирования кода выше), я получаю вывод 0,00. Итак, есть ошибка, когда я комбинирую 2 кода. (Под отдельным кодом я подразумеваю приведенный выше код без echoPin1, triggerPin1, pingTime1 и т. Д.), @python man