проблема с библиотекой и кодом
- Войдите на сайт для отправки комментариев
плата - ардуино нано
дисплей олед 128 х 64 0.96 дюма
привет, проблема такова - пишу код интерфейса программы который управляется энкодером, при повороте против часовой стрелки срабатывает функция isLeft ()и дает 1 (см. строку 113) , я проверял что она работает и по идее (113-129 стр.) при значении nowP не равном нулю (121-124) от переменной nowP должна отняться единица и условие проходит но переменная не изменяется абсолютно никак , поясню на всякий случай что у меня на дисплей выводится 3 строки и я их должен листать и переменная nowP определяет положение "курсора" (0- верхняя , а 2 - нижняя) а переменная listP отображает выбранную позицию в массиве menu_list , то есть если nowP=1 & listP=4 то в средней строчке выделенной отобразится 4 позиция массива. собственно при повороте в лево когда выбрана верхня 0 позиция массива , то условие (стр. 116-120 ) проходит успешно , но если нет- ничего не происходит, а только баги которые без перезапуска скетча не исправить, видео выложу по ссылке, а так же возможно косяк библиотеки , но если долго вертеться в меню то этот баг может опять появится.
вторая проблема в том что у данного дисплея имеется 2 библиотеки ( текстовая и графическая) и поскольку я использовал только символы которые являются по описанию частью текстовой библиотеки , для экономии ОЗУ я решил сменить графическую на текстовую, для этого меняется 1 и 2 строчка на
#include <iarduino_OLED.h> // Подключаем библиотеку iarduino_OLED. iarduino_OLED myOLED(0x3C); // адрес для работы с дисплеем по I2c #define CLK 4 //пин энкодера #define DT 5//пин энкодера #define SW 6//пин энкодера #include "GyverEncoder.h" //энкодер Encoder enc(CLK, DT, SW);//подключаем энкодер String menu_list []= {"добавить канал","удалить канал","удалить все каналы","инф. канала","punkt 1","nepridumal 2"}; byte oldP=1; byte nowP=0; byte listP=0; extern uint8_t SmallFontRus[]; void setup() { // put your setup code here, to run once: myOLED.begin(); // инициализация работы с дисплеем Serial.begin(9600); myOLED.setFont(SmallFontRus); myOLED.setCoding(TXT_UTF8); } void loop() { // put your main code here, to run repeatedly: myOLED.print("loop", OLED_C, 28); while (1){ enc.tick(); Serial.println ("in_while"); if (enc.isHolded()){ Serial.println ("go_to_menu"); listP=0; nowP=0; menu (); } } } void menu () { myOLED.clrScr(); if (nowP==0){ myOLED.invText(); myOLED.print(menu_list [listP], OLED_C, 24); myOLED.invText(false); } else { myOLED.print(menu_list [listP-nowP], OLED_C, 24); } // 2 строчка if (nowP==1){ myOLED.invText(); myOLED.print(menu_list [listP], OLED_C, 36); myOLED.invText(false); } else if (nowP==0) { myOLED.print(menu_list [listP+1], OLED_C, 36); } else{ myOLED.print(menu_list [listP-nowP+1], OLED_C, 36); } // 3 строчка if (nowP==2){ myOLED.invText(); myOLED.print(menu_list [listP], OLED_C, 48); myOLED.invText(false); } else if (nowP==3) { myOLED.print(menu_list [listP-1], OLED_C, 48); } else{ myOLED.print(menu_list [listP+2-nowP], OLED_C, 48); } // 4 строчка if (nowP==3){ myOLED.invText(); myOLED.print(menu_list [listP], OLED_C, 60); myOLED.invText(false); } else{ myOLED.print(menu_list [listP+3-nowP], OLED_C, 60); } for (int i=0 ;i<2550;i++){ enc.tick(); delay (6); if (enc.isRight()){ oldP=nowP; if (nowP<3){ nowP++; } listP++; if (listP>5){ nowP=0; listP=0; } menu(); } if (enc.isLeft()){ Serial.println (" 1"); if (listP==0){ nowP=3; listP=5; menu(); } else if (nowP!=0){ nowP-1; Serial.println (" nowP=0 "); } Serial.println (" listP- "); listP-1; menu(); } if (enc.isHolded()){ myOLED.clrScr(); oldP=1; nowP=0; listP=0; loop() ; } } myOLED.clrScr(); oldP=1; nowP=0; loop() ; }
144 строка убила. Сижу и плАчу.
я возможно туплю , но по крайней мере в пайтоне когда кончилась бы эта функция - программа бы завершилась, а что сделает arduinо IDE я не знаю и рисковать не хочу, буду благодарен за пояснение
Именно этих библиотек не видел, но видел другие от этих авторов, после чего тщательно обхожу стороной всё, что связано с iarduino и gyver, что и Вам советую.
Первый шаг по исправлению ситуации - "бросить каку" и переписать код без этих библиотек.
тогда может посоветуете библиотеку под этот дисплей?спасибо за ответ.
по крайней мере в пайтоне когда кончилась бы эта функция - программа бы завершилась
Это Вы сами придумали? Или сказал кто? Если кто-то сказал, плюньте ему в рожу. Ни в питоне, ни в прологе, ни в чём бы то ни было ещё, после завершения этой функции программа не завершается.
RTFM!!! http://arduino.ru/Reference/Loop
я возможно туплю
https://www.youtube.com/watch?v=RVSWXIquUPA
тогда может посоветуете библиотеку под этот дисплей?спасибо за ответ.
Не посоветую - их миллион, сами нагуглите. А какая лучше - какая хуже я не знаю, т.к. использую их только чтобы глянуть работает ли дисплей, когда с почты принесу. В проектах жя я пишу конкретную работу с дисплеем для конкретной задачи руками - так быстрее и неизмеримо лучше по ресурсам.
спасибо, но все же что насчет вопроса номер 1 ?
спасибо, но все же что насчет вопроса номер 1 ?
пока вы не уберете рекурсию из кода (это когда из loop() вызывается menu(). а из menu() - loop()., обсуждать работу этого кода не имеет смысла. Тут может происходить что угодно.
Посмотрел внимательнее - да весь этот код можно смело выкинуть в помойку. В дополнение к вызову loop() вы еще и menu() многокртно вызываете саму из себя (строка 110, 119, 127)...
Странно. что оно у вас хоть как-то работает. этот код должен виснуть после пары нажатий кнопок. Искать ошибки тут бессмысленно, тут надо все перепписывать заново.
Советую начать с изучения учебника, чтобы не писать "как в пайтоне", а писать как в С++
это сделано для начала работы цикла с нуля, разве есть другой способ?
у меня при повороте срабатывает условие и для отрисовки меню по новым данным мне нужно вызвать его , иначе без задержек не обойтись и дисплей будет условно каждую секунду мигать
у меня при повороте срабатывает условие и для отрисовки меню по новым данным мне нужно вызвать его
ну так вызывайте. Отработали поворот, потом СНАЧАЛА вышли из menu() в loop(), и ждете следующего поворота.
А у вас сейчас в коде нагорожена полная чушь - вы входите в menu(), обрабатываете поворот энкодера - а потом начинаете зачем-то прямо в процедуре снова опрашивать энкодер и бросаться тут же его обрабатывать. Это прямой путь к зависанию программы.
у меня в menu () и выводится все и обрабатывается энкодер для того что бы не отвлекать на этоloop () и другие циклы, мне не хочется что бы если я поверну энкодер в лупе у меня открылось меню и заводить для этих целей переменные нету места
у меня в menu () и выводится все и обрабатывается энкодер для того что бы не отвлекать на этоloop () и другие циклы, мне не хочется что бы если я поверну энкодер в лупе у меня открылось меню и заводить для этих целей переменные нету места
ну так у вас наверно это все замечательно работает? - непонятно, почему тогда вы какие-то вопросы задаете
тогда как мне это реализовать? неужели нету способа вызвать функцию из функции типо return только в себя?
В себя есть goto.
спасибо, но все же что насчет вопроса номер 1 ?
Так был же ответ №1
Первый шаг по исправлению ситуации - "бросить каку" и переписать код без этих библиотек.
тогда как мне это реализовать? неужели нету способа вызвать функцию из функции типо return только в себя?
Вопрос не "как", а "зачем" Вам вызывать, например, тот же loop.
Вы прочитали, что Вам сказали прочитать?
RTFM!!! http://arduino.ru/Reference/Loop
Скажите, неужто питон так ломает психику человека?
в данной статье написано лишь что loop () зациклен и больше ничего , как мне вызвать loop () без строки Loop () , я конечно понимаю что чего-то не понимаю об этом и хочу это понять.
питон отличный язык и гораздо проще с++ и перестроится с него на с++ который я и без того знаю на уровне ребенка сложно)
Ты питон тоже по форумам изучал? Или книшку какую прочел, всеже?
Не надо никак вызывать loop(), он сам по себе бесконечный цикл. Как while(true) {...}, к примеру.
Ты питон тоже по форумам изучал? Или книшку какую прочел, всеже?
https://pythonworld.ru/samouchitel-python
+ видеоуроки на ютубчике , я этим занят не серьезно , а по книгам долго и нудно , мне же не для работы
Ну ведь точно же сказано, а? Это же кредо поколения ЕГЭ! Я бы хотел бы - не сумел бы точнее сказать!
В мемориз, адназначна!
Тоись в вашем питоне если функцию вызвал в одном файле, то, по ее завершению, выпадешь обратно уже в вино-водочный. Сочувствую.
Садман41! Клиент кретина из себя строит. В графических интерфейсах бесконечный цикл на Питоне хорошо знаком с первых уроков:
я вообще уже не понимаю о чем вы , в питоне ты обьявил функцию - def func :
и когда ты ее вызвал она выполнилась и ты вернулся туда , откуда вызывал
я питон еще хуже чем с++ знаю
условно 2 дня чтения книги и все , я просто баловался с ним и все .вообще причем тут питон?
я не знаю как именно это работает, я даже не знаю как 1 программу разделить между 2 файлами
опишите тогда или скиньте ссылку на статью для новичков , потому что этот форум не для меня , тут в разделе для новичков такой пиздец, что я просто выпал..
Скажите, неужто питон так ломает психику человека?
Umputun мерзко хихикал, когда рассказывал, что его начальник отдела местами знаком с пайтон.
питон отличный язык и гораздо проще с++ и перестроится с него на с++ который я и без того знаю на уровне ребенка сложно)
вот эта фраза сейчас на каком изыге написана?
я нихера нипонил...
опишите тогда или скиньте ссылку на статью для новичков , потому что этот форум не для меня , тут в разделе для новичков такой пиздец, что я просто выпал..
мальчик заблудился - покажите мальчику дорогу на йух.
в данной статье написано лишь что loop () зациклен и больше ничего , как мне вызвать loop () без строки Loop () , я конечно понимаю что чего-то не понимаю об этом и хочу это понять.
Он вызывается САМ постоянно! Как только закончится - он вызывается снова! Неужели Вы этого не поняли? Нафига Вам ещё его вызывать?Вот просто, нафига?
вот, кстати, да - порекомендуйте учебник по питону 18+
спасибо, вопрос решен, до меня дошло
вообще причем тут питон?
Вот и я удивляюсь, зачем Вы нам про него в посте #2 втирать начали.
Питон не знаю, но после PHP Си++ не подпускает к себе сильно близко уже какой год... ((((
Просто лимит ставишь на "питона", шоп не больше 13 см. И можно без ограничений "18+" работать.
IUNWIM (Иф ю ноу вот ай мин). ;)))))))))))))))))))))))))))))))))))))))))
IUNWIM (Иф ю ноу вот ай мин). ;)))))))))))))))))))))))))))))))))))))))))
\о\о\о
опишите тогда или скиньте ссылку на статью для новичков , потому что этот форум не для меня , тут в разделе для новичков такой пиздец, что я просто выпал..
это в голове у тебя пипец, мальчик... а не на форуме
Нет и не может быть никакой "статьи для новичков". Любой нормальный учебник по С++ - это минимум 500 страниц.
Не, не осилит. Мультиков на ютубчике нет.
Да полнО. С нуля... За час...)
Не, не осилит. Мультиков на ютубчике нет.
да и вообще зачем их читать, если писать в ардуино ИДЕ, здесь же всё логично, сначала отработала функция setup(), а затем работает loop(), чего тут может быть непонятного???