Почему мой код 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;
}

, 👍0


2 ответа


3

Похоже, что ЖК-дисплей подключен к контактам 0 и 1. Это контакты Serial Rx и Tx. Когда вы также используете Serial в своем скетче, это создает конфликт. Переместите эти две линии с ЖК-дисплея на разные контакты и обновите скетч.

,

это были контакты Tx и Rx Спасибо!, @zachlikestech

Спасибо. Пожалуйста, отметьте как решение, если это исправило проблему., @Delta_G


0

С помощью следующего кода я запустил 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