Chuck Noland Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 Состав: Arduino nano + Oled 128-64 + энкодер. Задача стоит вывозить вот такое число 3.657.350 по I2c на Oled 128-64. Число - это будет частота генератора. Для этого создаю переменную bfo = 3657350 Далее делю это число с остатком, получается число из отдельных цифр: millions = int(bfo/1000000); hundredthousands = ((bfo/100000)%10); tenthousands = ((bfo/10000)%10); thousands = ((bfo/1000)%10); hundreds = ((bfo/100)%10); tens = ((bfo/10)%10); ones = ((bfo/1)%10); Далее вывожу каждую цифру отдельно на дисплей: myOLED.setFont(MediumFontRus); myOLED.setCursor(15,20); myOLED.print(millions); myOLED.print("."); myOLED.print(hundredthousands); myOLED.print(tenthousands); myOLED.print(thousands); myOLED.print("."); myOLED.print(hundreds); myOLED.print(tens); myOLED.print(ones); При повороте энкодера к bfo прибавляется число к примеру 1000. Далее вызывается весь этот код, bfo делится на отдельные числа и вывод на экран. И это все что происходит в void loop. Больше ничем ардуино не занято. Вопрос в том что ардуинка видимо не успевает считать (делить) число. При 5-ти поворотах энкодера срабатывает только 4 раза. Ардуинка явно отстаёт. Этот же код работает на I2c но с 1602 дисплеем как пуля. В чем может быть причина? 0 Падающая со стола деталь способна искривлять пространство и время..... Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость_Григорий_Т. Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 Единственная мысль, готовность OLED по шине приходит с большой задержкой. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Chuck Noland Опубликовано 3 мая, 2022 Автор Поделиться Опубликовано 3 мая, 2022 У многих с этим нет проблем. Есть подобные схемы что я собираю но с быстрой реакцией. Скетчи этих схем достать не могу. Проблема 100% в коде 0 Падающая со стола деталь способна искривлять пространство и время..... Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Гость_Григорий_Т. Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 22 минуты назад, Chuck Noland сказал: Этот же код Так у вас тот же код или нет? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 (изменено) 31 минуту назад, Chuck Noland сказал: Далее вывожу каждую цифру отдельно на дисплей: Какой в этом смысл? Это же криво-костыльно до жути. Будут же огромные накладные расходы. Что мешает собрать число в массив char и вывести за один раз? Это же в несколько раз быстрее будет. 13 минут назад, Chuck Noland сказал: Проблема 100% в коде Проблема в непонимании процессов, происходящих в коде. 31 минуту назад, Chuck Noland сказал: И это все что происходит в void loop. Неправильно. Работа с энкодером должна выполняться в прерывании, а вывод данных на дисплей в loop. 31 минуту назад, Chuck Noland сказал: В чем может быть причина? В том, что накладные расходы на отправку данных для OLED выше, чем в 1602 дисплее. Порядков так на несколько. Ибо в 1602 есть знакогенератор и для него символ - один байт данных, а графические дисплеи - тупое поле для вывода и в них символ - квадрат W*H пикселей, где W и H размеры символа. Но ардуинщики не умеют читать документацию и думать... 31 минуту назад, Chuck Noland сказал: ones = ((bfo/1)%10); А это просто верх гениальности даже с математической точки зрения... Изменено 3 мая, 2022 пользователем BARS_ 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Chuck Noland Опубликовано 3 мая, 2022 Автор Поделиться Опубликовано 3 мая, 2022 (изменено) 2 часа назад, BARS_ сказал: Работа с энкодером должна выполняться в прерывании Есть у кого нибудь примеры...? Изменено 3 мая, 2022 пользователем Chuck Noland 0 Падающая со стола деталь способна искривлять пространство и время..... Ссылка на комментарий Поделиться на другие сайты Поделиться
El-Shang Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 Вы бы код для начала приложили в нормальном виде (файлом). И схему подключения (вдруг I2C программно эмулируется). И имя/версию библиотеки, с которой работаете, а там можно будет и поговорить. :-) Но самое простое и очевидное — сконвертируйте ваше число в строку и выведите её одним махом. Наверняка там есть такая операция. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Chuck Noland Опубликовано 3 мая, 2022 Автор Поделиться Опубликовано 3 мая, 2022 Вот сам код и схема. Сейчас подключены только дисплей OLED и энкодер Test-test.ino 0 Падающая со стола деталь способна искривлять пространство и время..... Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 Это поможет, но не сильно. Пропуски в опросе энкодера будут до тех пор, пока он не опрашивается по прерыванию. Но что-то я сильно сомневаюсь, что ардуйня так вообще умеет... Скорость I2C тут максимум 400 КГц, что дает 44,4 Кб/с. без учета накладных расходов в виде управляющих команд. Размер шрифта, судя по фото, в районе 20х12 px, что дает 240 байт на один символ. В строке 9 символов, а это 2160 байт. А значит вывести строку чаще, чем 20 раз в секунду не получится никак. Добавляем сюда время на отправку управляющих команд + время формирования буфера вывода + время отработки ардуйня функций + время на расчеты и вряд ли получаем больше 10 кадров в секунду. Т.е. опрос энкодера никак не произойдет чаще, чем раз в 100 мс. А это мало, 100% будут пропуски. 1 час назад, Chuck Noland сказал: у кого нибудь примеры У Яндекса и других поисковиков 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Chuck Noland Опубликовано 3 мая, 2022 Автор Поделиться Опубликовано 3 мая, 2022 (изменено) Нашел заграничный код который работает как "пуля" на моем дислее. Пропусков нет, скорость норм. Применяется массив char. Буду выдирать лишнее и разбираться с кодом. Test-51.ino Изменено 3 мая, 2022 пользователем Chuck Noland 0 Падающая со стола деталь способна искривлять пространство и время..... Ссылка на комментарий Поделиться на другие сайты Поделиться
El-Shang Опубликовано 3 мая, 2022 Поделиться Опубликовано 3 мая, 2022 (изменено) Ну и замечательно. :-) У Вас очень много ненужных операций деления и взятия остатка над 4-х байтной переменной. Для ардуино (точнее её микроконтроллера) это весьма дорого, поскольку сам он 8-ми битный. Единократное преобразование в строку будет быстрее. Равно как и разовый её вывод. Если же использовать Ваш изначальный подход, то его можно было бы упростить вот таким образом: millions = bfo / 1000000; bfo %= 1000000; hundredsThousands = bfo / 1000; bfo %= 1000; hundreds = bfo; Итого 2 деления и 2 остатка вместо ваших изначальных 7 делений и 6 остатков. Но пришлось бы добавить условий, чтобы сохранить формат "x.yyy.zzz". Так что лучше всё-таки сразу в строку. :-) Изменено 3 мая, 2022 пользователем El-Shang 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 4 мая, 2022 Поделиться Опубликовано 4 мая, 2022 8 часов назад, El-Shang сказал: Для ардуино (точнее её микроконтроллера) это весьма дорого, поскольку сам он 8-ми битный. Единократное преобразование в строку будет быстрее. Равно как и разовый её вывод. Ардуйняйщикам бесполезно об этом говорить. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
El-Shang Опубликовано 4 мая, 2022 Поделиться Опубликовано 4 мая, 2022 Бросьте сотню зерён и хотя бы одно, но прорастет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.