1. Экран с кнопками.
Имеется шилд с LCD 1602 и шестью кнопками.
Такой?
При пользовании английской библиотекой в адресации пинов шилда указаны 8, 9, 4, 5, 6, 7.
Я попытался загрузить вчера русскую библиотеку и вывести пример на экран, но увидел только буквы, которые в английском алфавите соответствуют русским по написанию(например, К, О и т.д.), а вместо остальных - иероглифы.
Вопрос: там не нужно в верхней строке, часом, прописывать новые пины или это просто библиотека криво встала?
В примере указаны другие пины, но я не знаю, для какого индикатора - голого 1602 или шилда, как у меня.
Да, есть библиотека LiquidCristalRus (
https://github.com/ssilver2007/LiquidCrystal_1602_RUS) - которая вроде как будет работать с кириллическими символами. Но - очень не рекомендую при программировании и вообще где либо работая с контроллерами - использовать кириллицу либо другие спец-символы. Но если уж хотите - то можно попробовать примеры с этой библиотеки, которая будет уметь отображать эти символы. Если же не работает, или не хочется заморачиватся с непонятной библиотекой, особенно в случае с китайскими дисплеями - можно воспользоваться двоичным кодом для создания нужных символов прям в коде скетча ардуины, по точкам, на моменте инициализации переменных.
Ниже представлены почти все русские символы в верхнем регистре
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
uint8_t tochki[8] = {B0, B00000, B0, B0, B0, B0, B10101};
uint8_t bukva_P[8] = {0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
uint8_t bukva_Ya[8] = {B01111, B10001, B10001, B01111, B00101, B01001, B10001};
uint8_t bukva_L[8] = {0x3, 0x7, 0x5, 0x5, 0xD, 0x9, 0x19};
uint8_t bukva_Lm[8] = {0, 0, B01111, B00101, B00101, B10101, B01001};
uint8_t bukva_Mz[8] = {0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E};
uint8_t bukva_I[8] = {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11};
uint8_t bukva_D[8] = {B01111, B00101, B00101, B01001, B10001, B11111, 0x11};
uint8_t bukva_G[8] = {B11111, B10001, B10000, B10000, B10000, B10000, B10000};
uint8_t bukva_IY[8] = {B01110, B00000, B10001, B10011, B10101, B11001, B10001};
uint8_t bukva_Z[8] = {B01110, B10001, B00001, B00010, B00001, B10001, B01110};
uint8_t bukva_ZH[8] = {B10101, B10101, B10101, B11111, B10101, B10101, B10101};
uint8_t bukva_Y[8] = {B10001, B10001, B10001, B01010, B00100, B01000, B10000};
uint8_t bukva_B[8] = {B11110, B10000, B10000, B11110, B10001, B10001, B11110};
uint8_t bukva_CH[8] = {B10001, B10001, B10001, B01111, B00001, B00001, B00001};
uint8_t bukva_IYI[8] = {B10001, B10001, B10001, B11001, B10101, B10101, B11001};
uint8_t bukva_TS[8] = {B10010, B10010, B10010, B10010, B10010, B10010, B11111, B00001};
void setup()
{
lcd.begin(16, 2);
}
void loop() {
lcd.clear(); //очищаем экран
lcd.setCursor(0, 1); //устанавливаем курсор в начало строки
lcd.createChar(0, bukva_I); // создаем символы и записываем их в память LCD. максимум 8 символов за раз. при выводе новых символов - нужно переписать ячейки в createChar
lcd.createChar(1, bukva_D);
lcd.createChar(2, bukva_Mz);
lcd.createChar(3, bukva_G);
lcd.createChar(4, bukva_Lm);
lcd.write(0); lcd.write(1); lcd.write(2); lcd.write(3); lcd.write(4); lcd.print(" RU ") //выводим нужные символы по индексу из созданной таблицы плюс принтим в стандартный способ английские символы.
}
Будьте внимательны - подключая экран к ардуине - если в конфигурации экрана прописано - LiquidCrystal lcd(8, 9, 4, 5, 6, 7); - то значит именно так и нужно подключать. Для кнопок там используется другой пин - который нужно подключить к аналоговому входу ардуины - и указать это при инициализации.
И в окошке IDE пишется ошибка - уже не помню точно, но что-то про заглавные буквы в библиотеке, что ли...короче, ругается на библиотеку... Ставил с GitHub, LiquidCrystalRus 1.6.- скачал архив и добавил его в список библиотек. Кстати, не понял юмора, но папка из распакованного архива вообще не хотела ставиться - только архивом
Какая конкретно ошибка? если что-то вроде error: converting to execution character set: Illegal byte sequence - то это означает что библиотека содержит ошибку при инициализации символа - такого символа либо нет в таблице символов экрана, либо в самой последовательности точек - допущена ошибка.
Папку из распакованного архива нужно уложить в папку с библиотеками ардуины. Не архивом. После чего перезапустить IDE - и в Examples станут доступны примеры для этой библиотеки.
Кнопки в данном шилде - подключены как массив резисторов. подключаются к одному аналоговому входу, и для работы с ними пишется отдельная функция. Можно воспользоватся обычными условиями if:
#include <LiquidCrystal.h> // импортируем библиотеку экрана
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //инициализируем экран
// определим какие переменные будут отвечать за кейсы наших кнопок. (будет понятно дальше)
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
int read_LCD_buttons() // функция, которая читает состояние кнопок
{
adc_key_in = analogRead(0); //подключаем вывод клавиш (А0 обычно на шилде) к аналоговому входу ардуины 0.
// при нажатии клавиш на аналоговый вход приходят такие значения обычно: 0, 144, 329, 504, 741 Они могут отличатся - в зависимости от точности резисторов, используемых в массиве.
// добавим примерно 50 на такую погрешность (разрядность входа 1024).
if (adc_key_in > 1000) return btnNONE; // Мы делаем это 1-й вариант по соображениям скорости, так как он будет наиболее вероятным результатом при отсутствии нажатия клавиш.
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // когда никаких значений не приходит - тоже возвращаем btnNONE.
}
void setup()
{
lcd.begin(16, 2); // стартуем экран
lcd.setCursor(0,0);
lcd.print("Push the buttons"); // предлагаем пользователю нажать клавиши.
}
void loop()
{
lcd.setCursor(9,1); // Переместим курсор на строку номер 1 на позицию 9.
lcd.print(millis()/1000); // нарисуем - сколько секунд прошло с момента включения.
lcd.setCursor(0,1); // переместим курсор на той же строке на позицию 0
lcd_key = read_LCD_buttons(); // приготовимся считывать кнопки
switch (lcd_key)
// свитчер, который в зависимости от нажатой кнопки стартует тот или иной кейс - кейсы обозначаются цифрами обычно,
//но в начале скетча - я прописал переменные, к которым привязал эти числа - так что теперь мне проще понять какой мессадж писать,
//т.к. вместо номера кейса - я подставляю имя переменной, которая соответсвует этому номеру:
{
case btnRIGHT:
{
lcd.print("RIGHT ");
break;
}
case btnLEFT:
{
lcd.print("LEFT ");
break;
}
case btnUP:
{
lcd.print("UP ");
break;
}
case btnDOWN:
{
lcd.print("DOWN ");
break;
}
case btnSELECT:
{
lcd.print("SELECT");
break;
}
case btnNONE:
{
lcd.print("NONE ");
break;
}
}
}
при нажатии на кнопки - экран будет писать - на какие кнопки вы нажали. Возможно придется подкорректировать значения для каждой кнопки, но в целом - должно работать.