проблема с библиотекой и кодом

krokodi1
Offline
Зарегистрирован: 06.10.2019

плата - ардуино нано

дисплей олед 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_txt.h>    // Подключаем библиотеку iarduino_OLED.
iarduino_OLED myOLED_txt (0x3C);   // адрес для работы с дисплеем по I2c
 
после чего компиляция происходит удачно , но ничего просто не отображается , при работе с примерами из этой библиотеки все нормально, документация на библиотеки и дисплей - https://wiki.iarduino.ru/page/OLED_trema/ 
 
 
ссылка на видео с багом из 1 вопроса -  https://youtu.be/oy6vuGqgLj8
(при повороте в лево курсор должен подняться , а когда дисплей обновляется ,но ничего не меняется- я крутил в лево, еще раз напомню что условие при котором отнимется от позиции 1 срабатывает)
 
 
спасибо кто сможет помочь и объяснит спокойно что не так, бьюсь уже неделю и насчет библиотеки на их форуме не ответили!
#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() ;
}

 

 

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

144 строка убила. Сижу и плАчу. 

krokodi1
Offline
Зарегистрирован: 06.10.2019

я возможно туплю , но по крайней мере в пайтоне когда кончилась бы эта функция - программа бы завершилась, а что сделает arduinо IDE я не знаю и рисковать не хочу, буду благодарен за пояснение

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

#include <iarduino_OLED.h>    // Подключаем библиотеку iarduino_OLED.
...
#include "GyverEncoder.h" //энкодер

Именно этих библиотек не видел, но видел другие от этих авторов, после чего тщательно обхожу стороной всё, что связано с iarduino и gyver, что и Вам советую.

Первый шаг по исправлению ситуации - "бросить каку" и переписать код без этих библиотек.

krokodi1
Offline
Зарегистрирован: 06.10.2019

тогда может посоветуете библиотеку под этот дисплей?спасибо за ответ.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

 по крайней мере в пайтоне когда кончилась бы эта функция - программа бы завершилась

Это Вы сами придумали? Или сказал кто? Если кто-то сказал, плюньте ему в рожу. Ни в питоне, ни в прологе, ни в чём бы то ни было ещё, после завершения этой функции программа не завершается.

krokodi1 пишет:
буду благодарен за пояснение

RTFM!!! http://arduino.ru/Reference/Loop

krokodi1 пишет:

я возможно туплю 

https://www.youtube.com/watch?v=RVSWXIquUPA

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

тогда может посоветуете библиотеку под этот дисплей?спасибо за ответ.

Не посоветую - их миллион, сами нагуглите. А какая лучше - какая хуже я не знаю, т.к. использую их только чтобы глянуть работает ли дисплей, когда с почты принесу. В проектах жя я пишу конкретную работу с дисплеем для конкретной задачи руками - так быстрее и неизмеримо лучше по ресурсам.

krokodi1
Offline
Зарегистрирован: 06.10.2019

спасибо, но все же что насчет вопроса номер 1 ?

b707
Онлайн
Зарегистрирован: 26.05.2017

krokodi1 пишет:

спасибо, но все же что насчет вопроса номер 1 ?

пока вы не уберете рекурсию из кода (это когда из loop() вызывается menu(). а из menu() - loop()., обсуждать работу этого кода не имеет смысла. Тут может происходить что угодно.

b707
Онлайн
Зарегистрирован: 26.05.2017

Посмотрел внимательнее - да весь этот код можно смело выкинуть в помойку. В дополнение к вызову loop() вы еще и menu() многокртно вызываете саму из себя  (строка 110, 119, 127)...

Странно. что оно у вас хоть как-то работает. этот код должен виснуть после пары нажатий кнопок. Искать ошибки тут бессмысленно, тут надо все перепписывать заново.

Советую начать с изучения учебника, чтобы не писать "как в пайтоне", а писать как в С++

krokodi1
Offline
Зарегистрирован: 06.10.2019

это сделано для начала работы цикла с нуля, разве есть другой способ?

krokodi1
Offline
Зарегистрирован: 06.10.2019

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

b707
Онлайн
Зарегистрирован: 26.05.2017

krokodi1 пишет:

у меня при повороте срабатывает условие и для отрисовки меню по новым данным мне нужно вызвать его

ну так вызывайте. Отработали поворот, потом СНАЧАЛА вышли из menu()  в loop(), и ждете следующего поворота.

А у вас сейчас в коде нагорожена полная чушь - вы входите в menu(), обрабатываете поворот энкодера - а потом начинаете зачем-то прямо в процедуре снова опрашивать энкодер и бросаться тут же его обрабатывать.  Это прямой путь к зависанию программы.

 

 

krokodi1
Offline
Зарегистрирован: 06.10.2019

у меня в menu () и выводится все и обрабатывается энкодер для того что бы не отвлекать на этоloop () и другие циклы, мне не хочется что бы если я поверну энкодер в лупе у меня открылось меню и заводить для этих целей переменные нету места

b707
Онлайн
Зарегистрирован: 26.05.2017

krokodi1 пишет:

у меня в menu () и выводится все и обрабатывается энкодер для того что бы не отвлекать на этоloop () и другие циклы, мне не хочется что бы если я поверну энкодер в лупе у меня открылось меню и заводить для этих целей переменные нету места

ну так у вас наверно это все замечательно работает? - непонятно, почему тогда вы какие-то вопросы задаете

krokodi1
Offline
Зарегистрирован: 06.10.2019

тогда как мне это реализовать? неужели нету способа вызвать функцию из функции типо return только в себя?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

В себя есть goto.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

спасибо, но все же что насчет вопроса номер 1 ?

Так был же ответ №1

ЕвгенийП пишет:

Первый шаг по исправлению ситуации - "бросить каку" и переписать код без этих библиотек.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

тогда как мне это реализовать? неужели нету способа вызвать функцию из функции типо return только в себя?

Вопрос не "как", а "зачем" Вам вызывать, например, тот же loop.

Вы прочитали, что Вам сказали прочитать?

ЕвгенийП пишет:

RTFM!!! http://arduino.ru/Reference/Loop

sadman41
Offline
Зарегистрирован: 19.10.2016

Скажите, неужто питон так ломает психику человека?

krokodi1
Offline
Зарегистрирован: 06.10.2019

в данной статье написано лишь что loop () зациклен и больше ничего , как мне вызвать loop () без  строки Loop () , я конечно понимаю что чего-то не понимаю об этом и хочу это понять.

krokodi1
Offline
Зарегистрирован: 06.10.2019

питон отличный язык и гораздо проще с++ и перестроится с него на с++ который я и без того знаю на уровне ребенка сложно)

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Ты питон тоже по форумам изучал? Или книшку какую прочел, всеже?

sadman41
Offline
Зарегистрирован: 19.10.2016

Не надо никак вызывать loop(), он сам по себе бесконечный цикл. Как while(true) {...}, к примеру.

krokodi1
Offline
Зарегистрирован: 06.10.2019

sadman41 пишет:
Не надо никак вызывать loop(), он сам по себе бесконечный цикл. Как while(true) {...}, к примеру.
да , но если я вне loop ()  это как вне цикла, значит программа не зациклена 

krokodi1
Offline
Зарегистрирован: 06.10.2019

DetSimen пишет:

Ты питон тоже по форумам изучал? Или книшку какую прочел, всеже?

https://pythonworld.ru/samouchitel-python

+ видеоуроки на ютубчике , я этим занят не серьезно , а по книгам долго и нудно , мне же не для работы

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

krokodi1 пишет:
а по книгам долго и нудно

Ну ведь точно же сказано, а? Это же кредо поколения ЕГЭ! Я бы хотел бы - не сумел бы точнее сказать!

В мемориз, адназначна!

sadman41
Offline
Зарегистрирован: 19.10.2016

krokodi1 пишет:

sadman41 пишет:
Не надо никак вызывать loop(), он сам по себе бесконечный цикл. Как while(true) {...}, к примеру.
да , но если я вне loop ()  это как вне цикла, значит программа не зациклена 


Тоись в вашем питоне если функцию вызвал в одном файле, то, по ее завершению, выпадешь обратно уже в вино-водочный. Сочувствую.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

sadman41 пишет:
krokodi1 пишет:

sadman41 пишет:
Не надо никак вызывать loop(), он сам по себе бесконечный цикл. Как while(true) {...}, к примеру.
да , но если я вне loop ()  это как вне цикла, значит программа не зациклена 

Тоись в вашем питоне если функцию вызвал в одном файле, то, по ее завершению, выпадешь обратно уже в вино-водочный. Сочувствую.

Садман41! Клиент кретина из себя строит. В графических интерфейсах бесконечный цикл на Питоне хорошо знаком с первых уроков:

from tkinter import *


window = Tk()
window.title("Добро пожаловать!")
window.mainloop()

 

krokodi1
Offline
Зарегистрирован: 06.10.2019

я вообще уже не понимаю о чем вы , в питоне ты обьявил функцию - def func :

и когда ты ее вызвал она выполнилась и ты вернулся туда , откуда вызывал

krokodi1
Offline
Зарегистрирован: 06.10.2019

я питон еще хуже чем с++ знаю

условно 2 дня чтения книги и все , я просто баловался с ним и все .вообще причем тут питон?

krokodi1
Offline
Зарегистрирован: 06.10.2019

sadman41 пишет:
krokodi1 пишет:

sadman41 пишет:
Не надо никак вызывать loop(), он сам по себе бесконечный цикл. Как while(true) {...}, к примеру.
да , но если я вне loop ()  это как вне цикла, значит программа не зациклена 

Тоись в вашем питоне если функцию вызвал в одном файле, то, по ее завершению, выпадешь обратно уже в вино-водочный. Сочувствую.

я не знаю как именно это работает, я даже не знаю как 1 программу разделить между 2 файлами

krokodi1
Offline
Зарегистрирован: 06.10.2019

опишите тогда или скиньте ссылку на статью для новичков , потому что этот форум не для меня , тут в разделе для новичков такой пиздец, что я просто выпал..

Клапауций 12345
Offline
Зарегистрирован: 17.05.2020

sadman41 пишет:

Скажите, неужто питон так ломает психику человека?


Umputun мерзко хихикал, когда рассказывал, что его начальник отдела местами знаком с пайтон.

Клапауций 12345
Offline
Зарегистрирован: 17.05.2020

krokodi1 пишет:

питон отличный язык и гораздо проще с++ и перестроится с него на с++ который я и без того знаю на уровне ребенка сложно)


вот эта фраза сейчас на каком изыге написана?
я нихера нипонил...

Клапауций 12345
Offline
Зарегистрирован: 17.05.2020

krokodi1 пишет:

опишите тогда или скиньте ссылку на статью для новичков , потому что этот форум не для меня , тут в разделе для новичков такой пиздец, что я просто выпал..


мальчик заблудился - покажите мальчику дорогу на йух.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

в данной статье написано лишь что loop () зациклен и больше ничего , как мне вызвать loop () без  строки Loop () , я конечно понимаю что чего-то не понимаю об этом и хочу это понять.

Он вызывается САМ постоянно! Как только закончится - он вызывается снова! Неужели Вы этого не поняли? Нафига Вам ещё его вызывать?Вот просто, нафига?

Клапауций 12345
Offline
Зарегистрирован: 17.05.2020

вот, кстати, да - порекомендуйте учебник по питону 18+

krokodi1
Offline
Зарегистрирован: 06.10.2019

спасибо, вопрос решен, до меня дошло

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

krokodi1 пишет:

вообще причем тут питон?

Вот и я удивляюсь, зачем Вы нам про него в посте #2 втирать начали.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Питон не знаю, но после PHP Си++ не подпускает к себе сильно близко уже какой год... ((((

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Клапауций 12345 пишет:
вот, кстати, да - порекомендуйте учебник по питону 18+

Просто лимит ставишь на "питона", шоп не больше 13 см. И можно без ограничений "18+" работать.

IUNWIM (Иф ю ноу вот ай мин). ;)))))))))))))))))))))))))))))))))))))))))

Клапауций 12345
Offline
Зарегистрирован: 17.05.2020

wdrakula пишет:

IUNWIM (Иф ю ноу вот ай мин). ;)))))))))))))))))))))))))))))))))))))))))


\о\о\о

b707
Онлайн
Зарегистрирован: 26.05.2017

krokodi1 пишет:

опишите тогда или скиньте ссылку на статью для новичков , потому что этот форум не для меня , тут в разделе для новичков такой пиздец, что я просто выпал..

это в голове у тебя пипец, мальчик... а не на форуме

Нет и не может быть никакой "статьи для новичков". Любой нормальный учебник по С++ - это минимум 500 страниц.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Не, не осилит.  Мультиков на ютубчике нет. 

Green
Offline
Зарегистрирован: 01.10.2015

Да полнО.  С нуля... За час...)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Не, не осилит.  Мультиков на ютубчике нет. 

да и вообще зачем их читать, если писать в ардуино ИДЕ, здесь же всё логично, сначала отработала функция setup(), а затем работает loop(), чего тут может быть непонятного???