LiquidCrystal & Wire

temyxxa
Offline
Зарегистрирован: 18.04.2020

Всем привет, я пришёл к тупику.

Упростил свою проблему до кода из примера. 

Пример из LiquidCrystal-->Hello World.

Удалил для удобства комментарии и добавил "проблемный" код на строках 0 и 5 (объявление "#include <Wire.h>" и подключение к шине I2C в качестве ведомого устройства "Wire.begin(0x27);" )

#include <Wire.h>
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
    Wire.begin(0x27);
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}
void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);
}

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

Сама ардрунка работает, проверял на мигающем светодиоде, не выводится именно текст.

Тестировал на версиях Arduino IDE 1.6.5 и 1.8.12



Идея в том, чтобы одна ардуинка могла показывать некие буквы на экране получая их от ведущей. Мною был выбран протокол I2C как самый малозатратный по проводам и пониманию.

Буду рад любым идеям =)

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

А без строки №6 выводит нормально?

И, кстати, добавьте задержку в луп хоть на полсекунды, чего над экраном издеваться-то?

temyxxa
Offline
Зарегистрирован: 18.04.2020

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

А без строки №6 выводит нормально?

И, кстати, добавьте задержку в луп хоть на полсекунды, чего над экраном издеваться-то?

Да, без "Wire.begin(0x27)" выводит нормально.

Этот код это модифицированный пример(для воспроизведения ошибки), из стандартной библиотеки примеров arduino.

loop в принципе избыточен для воспроизведения данной ошибки, но я его оставил чтобы код всё ещё был похож на пример =)

sadman41
Offline
Зарегистрирован: 19.10.2016

А Wire умеет работать и мастером и слейвом одновременно?

temyxxa
Offline
Зарегистрирован: 18.04.2020

sadman41 пишет:

А Wire умеет работать и мастером и слейвом одновременно?

Да, чтобы запустить его в режиме мастера нужно вызвать "Wire.begin();"(без аргументов), чтобы вызвать его в качестве ведомого нужно вызвать "Wire.begin(0х##);"(указав адрес в аргументах)

Если только Вы не имели в виду "одновременно" как на одной плате.

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

temyxxa пишет:

Этот код это модифицированный пример(для воспроизведения ошибки)

Тем не менее, добавьте таки задержку в луп хоть на полсекунды. Не трудно же?

temyxxa
Offline
Зарегистрирован: 18.04.2020

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

Тем не менее, добавьте таки задержку в луп хоть на полсекунды. Не трудно же?

 

Я добавлял 1 секунду, это не меняет ситуации.
Даже такой код может воспроизвести мою ситуацию:

#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
  Wire.begin(0x27); 
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}
void loop(){}

Комментирую 5-ю строку "Wire.begin(0x27);" и экранчик уже приветствует меня. Иначе вижу только контрастную полосу.

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

temyxxa пишет:
это не меняет ситуации.
Оно и не должно менять, я просил Вас вставить не для того, чтобы что-то поменялось.

Давайте лучше с этим коротким кодом работать, а луп пусть будет пустой.

А вот теперь скажите, он у Вас выходит из пятой строки? Или в ней зацикливается? ну-ка поставьте печать чего-нибудь в сериал после неё, посмотрим.

temyxxa
Offline
Зарегистрирован: 18.04.2020

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

А вот теперь скажите, он у Вас выходит из пятой строки? Или в ней зацикливается? ну-ка поставьте печать чего-нибудь в сериал после неё, посмотрим.

Сделал чуть по своему, но суть думаю не меняется, лампочка загорается.

void setup() {
  pinMode(13,OUTPUT);
    Wire.begin(0x27);
  lcd.begin(16, 2);
  lcd.print("hello, world!");
    digitalWrite(13,HIGH);
}

UPD: И даже мигает если в луп блинк добавить

void loop(){
  digitalWrite(13,HIGH);
  delay(1000);
   digitalWrite(13,LOW);
  delay(1000);
  }

 

temyxxa
Offline
Зарегистрирован: 18.04.2020

Бросил на 10-ть минут с блинком, появилось что-то непонятное

Прошу прощения за отсутствие спойлера, не могу я его найти тут.