Автор Тема: Помощь с Ардуино для крафта  (Прочитано 6026 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн trengtor

  • Ветеран форума
  • ******
  • Сообщений: 4915
  • Репутация: +4541/-13
  • Диванный блюз-блендер
    • Ремонт [комбо]усилителей и педалей эффектов, в т.ч. бутиковых
Re: Помощь с Ардуино для крафта
« Ответ #15 : Февраля 26, 2019, 13:14:49 »
sadky, что за дисплей? Если надо с русскими – покупай МЭЛТ.

Оффлайн sadky

  • Эксперт
  • *****
  • Сообщений: 2001
  • Репутация: +273/-0
Re: Помощь с Ардуино для крафта
« Ответ #16 : Февраля 26, 2019, 13:56:20 »
LCD Keypad shield

Оффлайн Dying Fetus Автор темы

  • Moderator
  • *****
  • Сообщений: 10261
  • Репутация: +1318/-24
  • DIYng Fetus
    • http://cathar.ru
Re: Помощь с Ардуино для крафта
« Ответ #17 : Февраля 26, 2019, 14:03:37 »
sadky, примеры из пака от библиотеки с гитхаба не пробовал запускать?

Оффлайн trengtor

  • Ветеран форума
  • ******
  • Сообщений: 4915
  • Репутация: +4541/-13
  • Диванный блюз-блендер
    • Ремонт [комбо]усилителей и педалей эффектов, в т.ч. бутиковых
Re: Помощь с Ардуино для крафта
« Ответ #18 : Февраля 26, 2019, 14:04:08 »
LCD Keypad shield

Забудь про русский, пиши транслитом.

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3731
  • Репутация: +475/-0
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #19 : Февраля 26, 2019, 14:13:50 »
1. Экран с кнопками.

Имеется шилд с  LCD 1602 и шестью кнопками.
Такой?

2312960-0

При пользовании английской библиотекой в адресации пинов шилда указаны 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;
 }
}
}

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

« Последнее редактирование: Февраля 26, 2019, 14:19:48 от Tander »

Оффлайн trengtor

  • Ветеран форума
  • ******
  • Сообщений: 4915
  • Репутация: +4541/-13
  • Диванный блюз-блендер
    • Ремонт [комбо]усилителей и педалей эффектов, в т.ч. бутиковых
Re: Помощь с Ардуино для крафта
« Ответ #20 : Февраля 26, 2019, 14:17:19 »
Tander, загрузить 8 символов можно, да. Но проще или использовать транслит, или снять этот китайский дисплей с шилда и поставить, например, совместимый по цоколевке Winstar с русскими шрифтами (у МЭЛТа отличается расположение контактной гребенки). А эти 8 загружаемых символов использовать под что-то более полезное.

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3731
  • Репутация: +475/-0
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #21 : Февраля 26, 2019, 14:22:41 »
Можно. Но это подразумевает выколупывание диспеля, и вколупывание другого, которого кстати может и не быть у владельца дисплея. А работа с символами - позволяет без использования паяльника и какой-то матери - получить эти символы. тем более что можно в любой момент перезаписать эти 8 слотов на другие символы прям в моменте использования. Т.е. создаем символы из переменных букв - выводим их на экран, после чего - надписываем уже существующие слоты новыми буквами - выводим новые буквы. Да, громоздко слегка. )) но - работает.

Оффлайн Dying Fetus Автор темы

  • Moderator
  • *****
  • Сообщений: 10261
  • Репутация: +1318/-24
  • DIYng Fetus
    • http://cathar.ru
Re: Помощь с Ардуино для крафта
« Ответ #22 : Февраля 26, 2019, 14:32:26 »
А если подходить к тому, что мы тут вроде про код, то никто не мешает писать методы, которые будут выводить нужные слова с нужного символа и потом дописывать необходимое число)

Оффлайн trengtor

  • Ветеран форума
  • ******
  • Сообщений: 4915
  • Репутация: +4541/-13
  • Диванный блюз-блендер
    • Ремонт [комбо]усилителей и педалей эффектов, в т.ч. бутиковых
Re: Помощь с Ардуино для крафта
« Ответ #23 : Февраля 26, 2019, 14:38:33 »
Tander, нужных дисплеев в Москве хватает.

https://www.chipdip.ru/catalog-show/character-lcd-modules

Dying Fetus, всё не столь беспечно, на самом деле, с этими дисплеями. Да и память контроллера (а ее часть уже занята ардуиновским рантаймом) такой «пустопорожний» код жрет только в путь.

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3731
  • Репутация: +475/-0
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #24 : Февраля 26, 2019, 14:44:38 »
но главные проблемы возникнут когда придет время делать аварийное сохранение - приблуда должна будет успеть засечь что питание пропала и сохранить данные пока не закончилось остаточное питание

не нужно. достаточно просто записывать новую величину в EEPROM. Каждая ячейка гарантирует 100 000 циклов записи/cтирания. ячейка может хранить от 0 до 255. Т.е. мы может использовать всего 2 ячейки для записи числа 255255 - что более чем достаточно для намотки. Так же можно написать простой алгоритм, который каждые 100-200 значений - меняет адрес. И использовать не функцию write(), а использовать функцию update() - которая меняет значение только если оно изменилось - тем самым ячейки будут обновлятся реже.
Если уж очень хочется следить наличие-отсутсвие питания - то перерабатываем питание ардуины, где она питается от некой большой емкости, работая от которой сам контроллер может около 2-3 секунд, а остальная механика питается до этой емкости, отделенная каким-то реле или резистором. И там же у нас следящая нога ардуины подцеплена - и пока она HI - то все ок. А когда она становится LOW (пропало питание) - то запускаетсся запись в еепром - которая занимает около 3-4мС на одну ячейку - и контроллер едет еще на том конденсаторе.




думаю запилить еще отображение скорости намотки в витках в минуту, но не могу сформулировать логику.
либо измерять время между витками (и возможно усреднять несколько последних измерений).
либо просто засекать равные промежутки времени и измерять количество витков за промежуток.
оба способа имеют серьезные недостатки

да не вопрос. измерять через равные промежутки времени (например раз в 10 секунд) количество оборотов (витков), после - вычислить среднее арифметическое за 4 таких прохода например (т.к. может быть 10, 11, 9, 10) - и полученый результат умножить на 6 (если интервал проверки - 10 секунд). тем самым получится среднее значение витков в минуту.

... и добавил:

trengtor, я согласен с Dying Fetus, - тут вроде как стараемся искать программные решения, и я сторонник работать с тем что уже есть в наличии. И сколько времени займет ожидание купленного дисплея? сколько времени займет беганье по рынку или магазинам в поисках нужного дисплея? сколько времени займет перепаковка готового шильда на новый дисплей? да и точно ли случайно не оторвется какая-то пятка или еще что? может лучше забить на то, что пустопорожний код выжрет 64байта оперативки? (8 симоволов по 8 байт каждый).
« Последнее редактирование: Февраля 26, 2019, 14:54:09 от Tander »

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • Репутация: +2265/-69
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #25 : Февраля 26, 2019, 14:55:38 »

не нужно. достаточно просто записывать новую величину в EEPROM.
это моветон >:( 100000 циклов это не так много на самом деле. через пару лет активной работы можно убить яичячейку. и даже ротация ячеек не панацея, к тому же дополнительная сложность.


Оффлайн sadky

  • Эксперт
  • *****
  • Сообщений: 2001
  • Репутация: +273/-0
Re: Помощь с Ардуино для крафта
« Ответ #26 : Февраля 26, 2019, 15:04:40 »
Я вообще-то за кириллицу спросил, просто чтобы знать - это возможно в принципе с этим дисплеем или нет. Нет - и не очень-то и хотелось, я прекрасно читаю на латинице :hitrez:
Tander,  дисплей да, такой. Я заливал скетч про кнопки, всё работает, функции кнопок индицируются на экране.

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • Репутация: +2265/-69
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #27 : Февраля 26, 2019, 15:07:58 »
тройная запись чтобы отсеять ошибку и сохранение только при выключении и только если цифра поменялась в процессе работы. надо только надежность схемы аварийного питания протестировать

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3731
  • Репутация: +475/-0
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #28 : Февраля 26, 2019, 15:11:53 »
Я вообще-то за кириллицу спросил, просто чтобы знать - это возможно в принципе с этим дисплеем или нет. Нет - и не очень-то и хотелось, я прекрасно читаю на латинице :hitrez:
Tander,  дисплей да, такой. Я заливал скетч про кнопки, всё работает, функции кнопок индицируются на экране.
возможно. но нужно немного повозиться. )) я написал как.

Оффлайн trengtor

  • Ветеран форума
  • ******
  • Сообщений: 4915
  • Репутация: +4541/-13
  • Диванный блюз-блендер
    • Ремонт [комбо]усилителей и педалей эффектов, в т.ч. бутиковых
Re: Помощь с Ардуино для крафта
« Ответ #29 : Февраля 26, 2019, 15:15:38 »
это моветон >:( 100000 циклов это не так много на самом деле. через пару лет активной работы можно убить яичячейку. и даже ротация ячеек не панацея, к тому же дополнительная сложность.

Проще добавить внешний EEPROM