Mega и дисплей от Siemens S65
- Войдите на сайт для отправки комментариев
Ср, 09/11/2011 - 19:52
Подключил дисплейчик от Siemens S65 lph88 к Arduino Mega. Библиотека отсюда: http://www.watterott.net/projects/s65-shield? Текст выводится замечательно, правда жаль, что нет русского.
Как выводить на дисплей значение переменной?
Мне надо вывести значение переменной, считанное с аналового входа. Как это сделать с этой библиотекой? Или может у кого есть другая для этого дисплея.
текст - массив чаров.
как-то так. в нужное место вкливаешь в массив чаров свой чар.
Спасибо за помощь с выводом на дисплей значения переменной.
Теперь пытаюсь вывести на дисплей русские буквы с помощью этой библиотеки:
http://www.watterott.net/projects/s65-shield?
Дело в том, что в ней идет вывод символов с адреса 0х020 по 0x7F, пробовал изменить FONT_END7F на FONT_ENDFF в файле /libraries/S65Display/fonts.h., как написано в файле docu.htm из этой библиотеки. Ничего не вышло.
Удается вывести русские буквы только таким способом:
for example "Test \x84 \x94 \x81 \x8E \x99 \x9A" to display "Test д ц ь Д Ц Ь"
Может кто знает, как сделать поддержку русского ?
можно завести массив строк с соответсвием нужных букв.
потом написать фун-цию, которая будет юзер-френдли выводить эти значения.
могу помочь, но для начала для 33 букв напишите все коды)
то есть как. вда массива одного размера.
один содержит русские буквы и их номера, другой - их коды, соответствующие их номерам в первом массиве.
процедура такова: ищем номер в первом, берем код по номеру из второго. два цикла, для результата можно еще один массив-строку, и сразу в вывод на экран ее пихать.
Это простая перекодировка, работает в том случае, если в контроллере дисплея есть растры для генерации символов кириллицы. А это далеко не факт - соответствующие места вполне могут быть заняты, например, иероглифами.
Выход в таком случае - использование (обычно имеющейся) функции генерации собственных символов.
Кстати, существуют три разных типа этих дисплеев от различных производителей и они полностью совместимы только по распиновке, отличаясь в деталях управления. Скачанные вами библиотеки поддерживают все три типа?
не актуально - удалено
Не актуально - удалено
Подключённый дисплей от S65 к меге2560. На сайте скачал приложение, которое с компа выводит на этот экран изображение file:///E:/Users/FOX/YandexDisk/Arduino/Libraries/S65_pict/Дисплей%20Epson%20LCD%20L2F50%20от%20Siemens%20S65.htm
Но это приложение не видит мегу и как сказал автор Нужна Arduino с мостом FTDI.
Есь у кого опыть с мостом FTDI?
Русский шрифт 12х15 для LCD от siemens S65.
Выглядит примерно так:
Если используется стандартная библиотека Shild нужно:
удалить из массива первые 7 байт
Изминить тип массива на соответствующий этой библиотеке
Занести "продефайнить" шрифт в папке fonts
Можно так-же изменить расширение на "с"
Добавил 8х8 тоже с русскими символами
Выглядит так:
Инструкция та же
А с помощью какой программы вы создавали эти шрифты?
LCD image converter
https://yadi.sk/d/4jJrWHEchTEcZ
Спасибо! То что нужно для моего s65 ;)
Кто запускал этот экран не на дуине? К примеру на Atmega328.
Что то не инициализируется.
Библиотека с шилда.
P.S. Всё, разобрался.
При объявлении пинов не для дуин нужно так же продефайнить SPI
# define S65_SOFTWARE_SPI
hugoboss317
Не могли бы вы для примера скинуть скейч с библиотекой ????
Да легко. Только я библиотеку перекроил под себя, не пугайтесь, порядок в основной папке не навёл.
https://yadi.sk/d/KXMMLWyupsHA2
шрифты и примеры в папке.
не забываем раскоментировать и закоментировать нужный и ненужные контроллеры
hugoboss317
Большое спасибо!!!
Буду разбираться.
hugoboss317
А смена шрифта
#include "font_8x8.h"
lcd.setFont(font_8x8); не работает.
Или нужно где то что то еще указать. Постоянно выбивает ошибку .
Нет, больше нигде указывать не надо, у меня всё компелирует. Какая именно ошибка и что именно компелируете?
Arduino IDE версии 1.0.6
Пример Demo1
На любую строчку об смене формата lcd.setFont(font_font_12x16); пишет C:\Users\Admin\Documents\Arduino\libraries\S_65/font_12x16.h:9: warning: only initialized variables can be placed into program memory area
И ненравится lcd.FillCircle(88, 16, 10, RGB(255,0, 0)); lcd.FillRect(105, 5, 25, 30, RGB(255,255, 0)); lcd.FillCircleHelper(140, 10, 3, 2, 20, RGB( 0,255,255)); lcd.FillRoundRect(60, 48, 41, 21, 5, RGB( 0,255,255));
Ошибки пишет типа таких Demo1:23: error: 'class S65Display' has no member named 'FillCircle'
Скомпелированый demo1 под atmega 328 в 1.0.5 "Размер скетча в двоичном коде: 11 136 байт (из 28 672 байт максимум)"
Arduino перезапускали после размещения библиотеки?
Спасибо.
1.0.5 компелирует, а 1.0.6 куча ошибок.
Есть вопрос. Как развернуть дисплей? выводит текст по горизонту, ткни пожалуйста где указывается это?
Контроллер lph88
в S65Display.h
Да, верно. Я видел эти закомментированые строки. Работает только зеркало, поворот че-то как-то по барабану. Раскомментировать пробовал и вместе и поотдельности. Еще посмотрел содержимое ls020.cpp и lph88.cpp, так вот в ls020.cpp есть конкретные команды поворота
А в lph88.cpp только команды на поворот
Ну Вы сказали:
ткни пожалуйста где указывается это?
Я ткнул. Не помню какой именно но когда перекраивал библиотеку, крутил во все стороны (у меня их все три было). По моему как раз ls020 крутил.
Когда писал что то под lph88, что то ещё не так пошло, и как справился тоже не помню.
Может кому ещё понадобится. Воевал с выводом на этот экран кириллицы. Перед каждым символом был мусор. Что-то связано с кодированием символов в UTF. Исправил немного библиотеку и стали выводится нормально русские символы.
Очень вероятно, что мои костыли совсем неправильные, но пашет...
Спасибо Vladikas
У меня такой мусор на экране L2F50. Попробую на выходных ваш вариант отпишусь.
Я выводил в порт значения переменной "с"
Когда выводишь на экранчик текст: 1234567890
То в порту
31
32
33
34
35
36
37
38
39
30
А когда выводишь: ПРИВЕТ
FFFFFFD0
FFFFFF9F
FFFFFFD0
FFFFFFA0
FFFFFFD0
FFFFFF98
FFFFFFD0
FFFFFF92
FFFFFFD0
FFFFFF95
FFFFFFD0
FFFFFFA2
Этим костылём я отрезал все эти лишние FF и так как букв массиве не больше 190, то от 0xD0 (280 в десятиричной) тоже можно избавиться.
1. Если выводить переменную "с" на экран, такое вряд ли может получиться.
2. 0хD0 в десятичной 208, а не 280.
1
2. Конечно же 208, опечатка...
Опечатка...
Vladikas, соственно, оба моих замечания из сообщения №29 говорят о том, что Вы очень невнимательны. Программирование этого не прощает.
Ну и по поводу Serial.println(c, HEX);
- Какого типа переменная с?
- К какому типу Вы ее приводите обращением к функции?
- И как это преобразование осуществляется?
Я ошибся в сообщении, признал это. Опечатка, невнимательность, специально ввёл в заблуждение - решайте сами.
- Объявляется как char (видно на скрине). Когда выводим на экран латиницу, то она char, а когда кириллицу, то без понятия (на скрине видно, что в порт она попадает 32-разрядной).
- Я её не привожу ни к какому типу. Все мои костыли на том скрине. Отбрасываю "лишние" FF кастуя переменную "с" как 8-битную. И проверяю на "зашкаливание".
- Его нет.
Ну как же "не приводите"? А откуда тогда берется 32-разрядная?
И никакие "лишние FF" Вы не отбрасываете. И дело не в 8-разрядности.
Судя по тому, что выводится на экран, функция println, допускающая параметр HEX, ожидает на входе long. Соответственно, любая величина, передаваемая в функцию, риводится перед передачей именно к этому типу. Но приведение к более длинному типу различается для знаковых и беззнаковых величин. При этом в старшие разряды положительных величин дописываются нули, а в старшие разряды отрицательных - единицы. Все беззнековые - положительные по определению, соответственно, всегда дописываются нули. А вот у знаковых старший бит рассматривается как знаковый и если он установлен, число расширяется путем дописывания к нему единиц. Т.е. когда Вы приводите к (uint8_t) дело не в том, что в нем 8 битов, а в том, что оно беззнаковое.
К сожелению, стандарт Си не говорит о том, как следует трактовать переменную типа char. И при неумелом применении это приводит к ошибкам. Особенно в Ардуино, где для 8-разрядных процессоров компилятор считает тип char знаковым, а для 32-разрядных - беззнаковым.
Чтобы заведомо избавиться от всех проблем, я бы в данном случае изначально описал тип переменно с как беззнаковый.
Что нитак с кирилицей уже обговаривали не раз. Дело не в библиатеках а в кодировке. Если подпиливаете библиотеку решение в целом верное просто не выводить всё что имеет значение больше 191.
Я, при инициализации шрифта, не вывожу символ, значение которого выше последнего символа в массиве.
Умываю руки.
Что нитак с кирилицей уже обговаривали не раз. Дело не в библиатеках а в кодировке. Если подпиливаете библиотеку решение в целом верное просто не выводить всё что имеет значение больше 191.
1. Для 8-разрядных контроллеров тип char в принципе не может принимать значения больше 127, не говоря уже о 191. Так что проверка здесь совершенно излишня.
2. Иногда хочется, чтобы значения выше 127 не просто выводились, а выводились правильно, поэтому простое отбрасывание старшего байта многобайтового кода вряд ли можно считать универсальным решением.
Как-то для u8g писал шрифты, для себя табличку составил кирилици. Больше 127 может и не может, но кодируется двумя байтами, вот и получается.
Не подскажите правильную распиновку поключения к ардуино нано 3.0 к экрану- LS020 вот такую нашел в сети на работоспособность её не проверялhttp://compcar.ru/forum/showthread.php?t=7237.
Как-то для u8g писал шрифты, для себя табличку составил кирилици.
Можно, конечно, и табличку. Но только эта табличка непоная. А полная - очень длинная. Так что вместо составленных на коленке табличек гораздо лучше пользоваться стандартами https://ru.wikipedia.org/wiki/UTF-8
Больше 127 может и не может, но кодируется двумя байтами, вот и получается.
Вот от таких "упрощений" потом и возникают проблемы. В одних частных случаях - один байт, в других - два, в третьих - три. И так делее... До 6 байт на символ. Об этом забывать не следует. И, соответственно, всегда помнить о том, что в С/С++ отсутствуют стандартные средства для работы с utf-8.
Ну и по поводу больше оно 127 или меньше. Этот вопрос неразрешим, потому что:
1. Числам "-1" и "255" в однобайтовой записи соответствует одно и то же двоичное представление (0xff). Но при этом -1 меньше как 1, так и 127, а 255 - больше и того, и другого. Соответственно, однозначного ответа на вопрос об отношении 0xff к 0 и 127 зависит исключительно от трактовки. В самом представлении ответа на этот вопрос не содержится.
2. Тип char в С/С++ никак проясняет ситуацию. Согласно стандарту, он может трактоваться как знаковый, так и беззнаковый. И это важно учитывать при написании программ. Т.е. программы должны работать вне зависимости от того, считает компилятор тип char знаковым или беззнаковым. А потому сравнение переменных этого типа как с 0 (на больше/меньше), так и с 127 недопустимо, т.к. может приводить к ошибкам.
В общем, если прохудился бензобак, можно устранять течь, а можно - почаще доливать бензин. Но второй способ мало того, что неэкономичен, так еще и чреват большим пожаром. Поэтому, когда появляются проблемы, нужно искать не первое средство, которое создаст видимость решения (доливать в бак почаще), а доподлинно выяснить причину (течь в баке) и именно с не и бороться (заделать дырку).
Не подскажите правильную распиновку поключения к ардуино нано 3.0 к экрану- LS020?
Не подскажите правильную распиновку поключения к ардуино нано 3.0 к экрану- LS020?