Вывод данных из RS485 на LCD дисплей

legkiy
Offline
Зарегистрирован: 16.03.2022

Как можнно вывести строку которую отпровляю с одной ардуино на другую?

Подключаю две ардуины по rs485 моодулю. С передающей отпровляю в сериал строку. На принимающей нужно вывести эту строку на дисплей, но т.к. в сериал передаётся и принимается посимвольно и из-за этого на дисплей выводится без конца и тем самым заполняет весь дисплей, а не обновляет символы с установленного курсора.

 

Передающая ардуино:

#define rs 10

void setup() {
  pinMode(rs,OUTPUT);
  digitalWrite(rs,HIGH);
  
  Serial.begin(9600);

}

void loop() {
  digitalWrite(rs,HIGH);
  Serial.print("its work");
  delay(1000);
}

Принимающая ардуино:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define rs 10

LiquidCrystal_I2C lcd(0x27,16,2);
String inputData = "";
void setup() {
  pinMode(rs,OUTPUT);
  digitalWrite(rs,LOW);

  Serial.begin(9600);
  
  lcd.init();
  lcd.backlight();     
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("RS= ");

}

void loop() {
  if(Serial.available()){
    char rsGet = (char)Serial.read(); #принимаем данные и переводим в символы
    inputData +=rsGet; #суммируем символы что бы получилось вся фраза, если так не делать то просто будет выводится каждый символ на установленном курсоре а не вся фраза
    Serial.print(inputData);
    lcd.setCursor(4,0);
    lcd.print(inputData);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

legkiy пишет:

но т.к. в сериал передаётся и принимается посимвольно и из-за этого на дисплей выводится без конца и тем самым заполняет весь дисплей, а не обновляет символы с установленного курсора.

нет, сериал тут не виноват, он работает как должен. Виноват программист, который в цикле без конца выводит одну и ту же фразу.

Вот этот коммент - бред полный. именно в этом ошибка логики.

inputData +=rsGet; #суммируем символы что бы получилось вся фраза, если так не делать то просто будет выводится каждый символ на установленном курсоре а не вся фраза

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А можно вопрос про приведённый скетч передатчика? Я вот вижу там два "digitalWrite(rs,HIGH);" и ни одного "digitalWrite(rs,LOW);". Так и задумано?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

самое страшное, что на lsd и выводить-то ничего не надо, она тебе сама всё что угодно выведет, прямо на мосх.

legkiy
Offline
Зарегистрирован: 16.03.2022

Эта фраза тут чисто как пример для тестирования. Если конкретно для какой задачи - есть устройство с выводом rs485 которое выдаёт числовое значение,нужно это значение выводить на дисплей и записывать на сд карту. С сд картой я знаю как сделать, а вот с дисплеем сталкнулся с проблеммой каторую не знаю как решить

legkiy
Offline
Зарегистрирован: 16.03.2022

Нечаянно на передатчике два раза написал digitalWrite(rs,HIGH); за место одного, в приёмнике есть digitalWrite(rs,LOW);

 

b707
Offline
Зарегистрирован: 26.05.2017

legkiy пишет:

Нечаянно на передатчике два раза написал digitalWrite(rs,HIGH); за место одного, в приёмнике есть digitalWrite(rs,LOW);

СИЛЬНО!

ты правда думаешь, что можно включить пин на передатчике, а выключить на приемнике?:))) а ничего что эти пины на разных ардуинах????

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707, не ломайте картину мира и не оскорбляйте чувства верующих!

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

b707, не оскорбляйте чувства верующих!

поправил :)

 -Вася, сходи выключи свет в подвале.
 -Маня, далеко идти, лучше я в комнате выключу...

legkiy
Offline
Зарегистрирован: 16.03.2022

Это пин который переводит rs модуль на приём и передачу

HIGH - передаёт

LOW - принимает

Я не пытаюсь переключать его, я пытаюсь вывести текст на экарн, в данном случае это фраза "its work" которая бы говорила мне о там что всё работает, но способ который я использую передаёт этот текст посимвольно и эти символы запоняют весь жк дисплей

b707
Offline
Зарегистрирован: 26.05.2017

legkiy пишет:

способ который я использую передаёт этот текст посимвольно и эти символы запоняют весь жк дисплей

что за ерунду вы пишете? Какой такой "способ, что вы используете" ? - способ у вас самый обычный, последовательный. Сериал всегда передает сообщения символ за символом, он по другому не умеет. Потому он и называется ПОСЛЕДОВАТЕЛЬНЫЙ порт.

А проблема тут вовсе не в посимвольной передаче, а в абсолютном отсуствии логики в вашем коде. Я вас уже спрашивал - нафига вы при каждом приеме символа выводите всю строку целиком?

На примере слова "Привет" проследим, как работает ваш код:

- в строке 24 приняли символ 'П', прибавили к inputData, в строке 28 напечатали на экране "П"
- далее пришел новый символ 'р', снова прибавили к inputData, и напечатали на экране "Пр"

... упрощенно...

 - приняли 'и', прибавили к inputData, напечатали  "При"
 - приняли 'в', прибавили к inputData, напечатали  "Прив"
 - приняли 'е', прибавили к inputData, напечатали  "Приве"
 - приняли 'т', прибавили к inputData, напечатали  "Привет"

Вот и получается, что вы непрерывно печатаете все новые и новые буквы, дублируя старое.

Вам надо либо печатать только одну последнюю пришедшую букву, либо подождать, пока не придет вся строка - а потом напечать строчку целиком ОДИН РАЗ.

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вообще в коде написано каждый раз, когда приходит что то в сериал - сначала переместить курсор на 4 позицию первой строки, а потом произвести вывод на дисплей (напечатать строку). Собственно говоря - логика не очень, но работать должна (хоть как-то), а ТС пишет, что у него вся строка заполняется. Непонятно почему. 

ТС - приложи фото как именно заполняется дисплей.

ЗЫ: может  ТС имеет ввиду, что при меньшей длине переданного ранее слова не удаляются символы от предыдущего слова? Тогда просто забей их пробелами.

legkiy
Offline
Зарегистрирован: 16.03.2022

Логически он правильно делает, я просто не знаю как сделать остановку вывода на дисплей и заново начать с указанного курсора. Может можно сделать на приёмнике перенос строки на сериал порте и выводить на дисплей то что пришло на новую строку, но я не знаю как это программно написать

То что на порте:

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

legkiy пишет:

<изменил>

В передатчике в конце строки добавьте символ разделитель например ";".

А лучше ещё и стартовый в начале строки.

А в приёмнике отслеживайте эти символы.

Как то так.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ТС похоже над форумчанами прикалывается.  Для решения этой задачи надо изобрести свой html или приспособить тот что уже есть. Потом уже в процессе модернизации развивать приемную ардуину и дисплей , поддерживающую более "сложные версии html"