Почему мой код Arduino показывает странные символы?
Когда я запускал код только на ЖК-дисплее, он работал отлично, но когда я добавил HC-SR04 без изменения текста, он показал странные символы. Все, что мне нужно было сделать с кодом HC-SR04, — это распечатать его на последовательном мониторе.
// включаем код библиотеки:
#include <LiquidCrystal.h>
// инициализируем библиотеку, связывая любой необходимый вывод интерфейса ЖК-дисплея
// с номером контакта Arduino, к которому он подключен
const int rs = 5, e = 4, d4 = 3, d5 = 2, d6 = 1, d7 = 0;
const int trigPin = A0;
const int echoPin = A1;
LiquidCrystal lcd(rs, e, d4, d5, d6, d7);
void setup() {
// устанавливаем количество столбцов и строк ЖК-дисплея:
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print("zach is cool");
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
}
void loop() {
// устанавливаем курсор в столбец 0, строку 1
// (примечание: строка 1 — это вторая строка, поскольку отсчет начинается с 0):
long duration, inches, cm;
lcd.setCursor(0, 1);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
}
long microsecondsToInches(long microseconds) {
// Согласно таблице данных Parallax для PING))) их 73.746
// микросекунды на дюйм (т.е. звук распространяется со скоростью 1130 футов в секунду).
// Это дает расстояние, пройденное пингом, исходящее и обратное,
// поэтому мы делим на 2, чтобы получить расстояние до препятствия.
// См.: https://www.parallax.com/package/ping-ultrasonic-distance-sensor-downloads/
return microseconds / 74 / 2;
}
long microsecondsToCentimeters(long microseconds) {
// Скорость звука 340 м/с или 29 микросекунд на сантиметр.
// Пинг перемещается туда и обратно, поэтому, чтобы найти расстояние до объекта, мы
// возьмем половину пройденного расстояния.
return microseconds / 29 / 2;
}
@zachlikestech, 👍0
2 ответа
Похоже, что ЖК-дисплей подключен к контактам 0 и 1. Это контакты Serial Rx и Tx. Когда вы также используете Serial в своем скетче, это создает конфликт. Переместите эти две линии с ЖК-дисплея на разные контакты и обновите скетч.
С помощью следующего кода я запустил HCSR04 и ЖК-дисплей 16x2 с Arduino UNO. Оно прошло успешно.
#define trigPin 8
#define echoPin 9
#define pinIR 7
// Определить переменные:
float duration=0.00;
float distance=0.00;
int visitor,sum,threshold,temp;
// объявление переменных для хранения нового и старого состояний IR
boolean oldIRState = LOW;
boolean newIRState = LOW;
#include <LiquidCrystal.h>
// инициализируем библиотеку, связывая любой необходимый вывод интерфейса ЖК-дисплея
// с номером контакта Arduino, к которому он подключен
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// Определить входы и выходы:
pinMode(pinIR, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.begin(16, 2);
// Выводим сообщение на ЖК-дисплей.
lcd.print("Visitor=");
lcd.print(visitor);
//Начинаем последовательную связь со скоростью 9600 бод:
Serial.begin(9600);
}
void loop() {
// Очистим trigPin, установив для него НИЗКИЙ уровень:
newIRState = digitalRead(pinIR);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Запускаем датчик, устанавливая высокий уровень trigPin на 10 микросекунд:
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Читаем echoPin,pulseIn() возвращает длительность (длину импульса) в микросекундах:
duration = pulseIn(echoPin, HIGH);
// Вычисляем расстояние:
distance = duration /58.82 ;
// Распечатываем расстояние на последовательном мониторе (Ctrl+Shift+M):
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");
delay(1000);
if(distance<=10 && abs(temp)>=70)
{
visitor++;
lcd.clear();
lcd.print("Visitor=");
lcd.print(visitor);
for(int i=0;i<500;i++)
{
sum +=distance;
delay(5);
}
threshold = sum/500;
}
temp=threshold-distance;
if ( newIRState != oldIRState )
{
if ( newIRState == LOW && visitor>0 )
{
visitor--;
lcd.clear();
lcd.print("Visitor=");
lcd.print(visitor);
}
}
oldIRState = newIRState;
}
Вы можете следовать этому коду и расположению цепей. Я также предлагаю вам проверить HCSR04 и ЖК-дисплей отдельно с помощью Arduino. Вы также можете ознакомиться с этим руководством по настройке распиновки Arduino UNO. Это будет полезно для любого проекта Arduino UNO. вы работаете.
Спасибо, я попробую это. Я попытался упростить код до ЖК-дисплея, но это тоже не сработало, так что, вероятно, проблема в этом., @zachlikestech
Можете ли вы объяснить мне IRstate и Is и дополнительные вещи, которые вы добавили? Я новичок в этом и не понимаю новый код., @zachlikestech
На самом деле, в моей установке было два датчика. Один был HCSR04, другой был ИК-датчиком препятствий. Я делал счетчик посетителей. HCSR04 подсчитывал людей, входящих в комнату. ИК-датчик подсчитывал людей, выходящих из комнаты. Когда вы работаете с HCSR04, вам не нужны переменные, связанные с ИК-датчиком. Вы можете получить упрощенный пример здесь: https://www.theengineeringprojects.com/2017/08/ultrasonic-sensor-arduino-interfacing.html В этом есть только Arduino UNO и HCSR04., @liaifat85
- Печать string and integer LCD
- Отправка значения с одного Arduino на другой
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Запрограммируйте Arduino Uno как цифровые часы
- ЖК-дисплей странные символы
- 16*2 1602A LCD дисплей не отображает никаких символов или контрастности, несмотря на правильное подключение
- Считыватель таймкода SMPTE с ЖК-дисплеем, вопрос кодирования
это были контакты Tx и Rx Спасибо!, @zachlikestech
Спасибо. Пожалуйста, отметьте как решение, если это исправило проблему., @Delta_G