Задать смещение оси координат на OLED дисплее.

Елисей
Offline
Зарегистрирован: 09.04.2021

Железо: OLED 128*64 i2c, arduino nano, энкодер с нажатием.

Библиотеки:GyverEncoder, GyverOLED.

Задача: Смеcтить ось по команде.

Проблема: Смещение оси изменением stepY не происходит(строка 45).

// пример с простым шахматным меню
// пины энкодера
#define CLK 15
#define DT 16
#define SW 17

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой

#include <GyverOLED.h>
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;

// переменные
int val0 = 10, val1 = 20, val2 = 30, val3 = 40, val4 = 50, val5 = 60, val6 = 70, val7 = 80, arrowPos = 90;

int  stepX = 8;
int  val0x = stepX, val1x = stepX, val2x = stepX, val3x = stepX, val4x = stepX, val5x = stepX, val6x = stepX, val7x = stepX;

int  stepY = 2; 
int  val0y = 0, val1y = val0y + stepY, val2y = val1y + stepY , val3y = val2y + stepY, val4y = val3y + stepY, val5y = val4y + stepY, val6y = val5y + stepY, val7y = val6y + stepY;

int  arrowstepX = 0;
int  arrowval0x = arrowstepX, arrowval1x = arrowstepX, arrowval2x = arrowstepX, arrowval3x = arrowstepX, arrowval4x = arrowstepX, arrowval5x = arrowstepX, arrowval6x = arrowstepX, arrowval7x = arrowstepX;
int  arrowval0y = val0y, arrowval1y = val1y, arrowval2y = val2y, arrowval3y = val3y, arrowval4y = val4y, arrowval5y = val5y,  arrowval6y = val6y, arrowval7y = val7y;

byte x = constrain(x,0,250);
  
void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE2);

  oled.init();
  oled.clear();
//  printGUI();   // выводим интерфейс
}

void loop() {

  enc1.tick();
    if (enc1.isTurn()) {  // при любом повороте
    oled.clear();        // очищаем дисплей
    if (enc1.isRight()) {
      arrowPos++;
      if (arrowPos > 7) arrowPos = 0;  // ограничиваем позицию курсора
      if (arrowPos > 2) val0x =- 100, stepY =+ 2; // убирает первый пункт за пределы экрана смещение по оси х, почему-то не смещает ось У для всех пунктов...
    }
    if (enc1.isLeft()) {
      arrowPos--;
      if (arrowPos < 0) arrowPos = 7;  // ограничиваем позицию курсора
      if (arrowPos < 3) val0x  = stepX; // вовзвратщает первый пункт на своё место

    }

    // при нажатом повороте меняем переменные ++
    if (enc1.isRightH()) {
      switch (arrowPos) {
        case 0: x=x+50; break;
        case 1: val1++; break;
        case 2: val2++; break;
        case 3: val3++; break;
        case 4: val4++; break;
        case 5: val5++; break;
        case 6: val6++; break;
        case 7: val7++; break;
      }
    }

    // при нажатом повороте меняем переменные --
    if (enc1.isLeftH()) {
      switch (arrowPos) {
        case 0: x=x-50 ; break;
        case 1: val1--; break;
        case 2: val2--; break;
        case 3: val3--; break;
        case 4: val4--; break;
        case 5: val5--; break;
        case 6: val6--; break;
        case 7: val7--; break;
      }
    }
  
  oled.setCursor(val0x, val0y); oled.print("Contrast:"); oled.print(x);
  oled.setCursor(val1x, val1y); oled.print("val1:"); oled.print(val1);
  oled.setCursor(val2x, val2y); oled.print("val2:"); oled.print(val2);
  oled.setCursor(val3x, val3y); oled.print("val3:"); oled.print(val3);
  oled.setCursor(val4x, val4y); oled.print("val4:"); oled.print(val4);
  oled.setCursor(val5x, val5y); oled.print("val5:"); oled.print(val5);
  oled.setCursor(val6x, val6y); oled.print("val6:"); oled.print(val6);
  oled.setCursor(val7x, val7y); oled.print("val7:"); oled.print(val7);
  
  // выводим стрелку
  switch (arrowPos) {
    case 0: oled.setCursor(arrowval0x, arrowval0y); break;
    case 1: oled.setCursor(arrowval1x, arrowval1y); break;
    case 2: oled.setCursor(arrowval2x, arrowval2y); break;
    case 3: oled.setCursor(arrowval3x, arrowval3y); break;
    case 4: oled.setCursor(arrowval4x, arrowval4y); break;
    case 5: oled.setCursor(arrowval5x, arrowval5y); break;
    case 6: oled.setCursor(arrowval6x, arrowval6y); break;
    case 7: oled.setCursor(arrowval7x, arrowval7y); break;
  }
  oled.write(62);   // вывести стрелку
  
  oled.setContrast(x);
  oled.update();
  }
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А почему оно должно работать так как вы хотите ?
Где кроме строки 45 используется переменная stepY ?

Елисей
Offline
Зарегистрирован: 09.04.2021

stepY является элементом координаты Y кажджой строки

int  stepY = 2;
int  val0y = 0, val1y = val0y + stepY, val2y = val1y + stepY , val3y = val2y + stepY, val4y = val3y + stepY, val5y = val4y + stepY, val6y = val5y + stepY, val7y = val6y + stepY;

 

b707
Offline
Зарегистрирован: 26.05.2017

Елисей пишет:

stepY является элементом координаты Y кажджой строки

int  stepY = 2;
int  val0y = 0, val1y = val0y + stepY, val2y = val1y + stepY , val3y = val2y + stepY, val4y = val3y + stepY, val5y = val4y + stepY, val6y = val5y + stepY, val7y = val6y + stepY;

Прелестно :)

Вы правда думаете, что один раз в начале кода написав

val2y = val1y + stepY

у вас при любом изменении stepY значение val2y будет пересчитываться автоматически???

Елисей
Offline
Зарегистрирован: 09.04.2021

Почему нет, оно же в loop'e?

b707
Offline
Зарегистрирован: 26.05.2017

Елисей пишет:

Почему нет, оно же в loop'e?

где оно в ЛУПе? - укажите номер строки

Елисей
Offline
Зарегистрирован: 09.04.2021

Та же 45я изменяет его при каждом проходе, нет?

b707
Offline
Зарегистрирован: 26.05.2017

Елисей пишет:

Та же 45я изменяет его при каждом проходе, нет?

45-ая меняет только stepY, на val0y и прочие - не влияет никак

Слушайте. у вас все невероятно запущено. вы логику работы программы не понимаете вовсе. я вижу

Елисей
Offline
Зарегистрирован: 09.04.2021

Поэтому тему я создал в разделе новичков.

b707
Offline
Зарегистрирован: 26.05.2017

да и сейчас дичь какая-то

Зачем нужно по 7 переменных, если они все одинаковые?

b707
Offline
Зарегистрирован: 26.05.2017

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

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

Вот это опасный приём, кстати:

if (arrowPos > 2) val0x =- 100, stepY =+ 2;

 

Елисей
Offline
Зарегистрирован: 09.04.2021

Значения не одинаковые, каждое следующее больше предыдущего на величину предыдущего + шаг (stepY).

Это я и наблюдаю на своём дисплее.

Елисей
Offline
Зарегистрирован: 09.04.2021

В чём опасность?

b707
Offline
Зарегистрирован: 26.05.2017

Елисей пишет:

Значения не одинаковые, каждое следующее больше предыдущего на величину предыдущего + шаг (stepY).

зачем для этого семь отдельных переменных??

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

Опасность в том, что по забывчивости можно вместо запятой воткнуть точку с запятой. Эффект будет непредсказуем.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Опасность в том, что по забывчивости можно вместо запятой воткнуть точку с запятой. Эффект будет непредсказуем.

да и вообще, писать кучу операторов через запятую на одной строке - это гавнокод

Елисей
Offline
Зарегистрирован: 09.04.2021

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

rkit
Offline
Зарегистрирован: 23.11.2016

Раздел для новичков, а не для ленивцев. Открой учебник и читай. Никто его не будет перепечатывать сюда специально для твоей царской особы.

Елисей
Offline
Зарегистрирован: 09.04.2021

rkit, название учебника, название статьи?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Керниган и Ритчи, "Язык программирования Си"

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

Елисей пишет:
генерируете вопросы.
Вас подталкивают в нужном направлении. Думайте над этими вопросами и Вы сами решите проблему, что гораздо полезнее, чем если бы её решили за Вас.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Елисей пишет:

 не даёте ответов

Ответ - пост №3 и №5

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

Елисей пишет:

Та же 45я изменяет его при каждом проходе, нет?

Нет.

b707
Offline
Зарегистрирован: 26.05.2017

да какой-то крайне странный товарищ... пишет сообщения, тут же удаляет...

Он уже один раз написал, что все исправил, перенеся вычисления смещения в ЛУП. И даже код выложил... через 2 минуты удалил и снова задает те же вопросы...

Чего ему надо - я не пониманию. Подозреваю. что он и сам не особо еще понял.

Елисей
Offline
Зарегистрирован: 09.04.2021

Там было неверное решение, не цепляйтесь к мелочам. 

b707
Offline
Зарегистрирован: 26.05.2017

Елисей пишет:

Там было неверное решение, не цепляйтесь к мелочам. 

ну предложите верное тогда. Подсказок вам тут накидали изрядно.

Делайте что-то, предлагайте варианты. это ж ваш проект, а не наш. готовый ответ с кодом вам тут никто не предложит, не рассчитывайте

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Меня лично смущают строки

#include "GyverEncoder.h"
#include <GyverOLED.h>

И вопрос к ТС - А чего к Гайверу не обратились?

Morroc
Offline
Зарегистрирован: 24.10.2016

Дичь какая то. Зачем все эти повторы по 8 раз ? Нафига тут ошибку искать если она везде ? Надо тяпнуть, удалить нахрен скетч, лечь спать и утром написать заново.

if (enc1.isTurn()) {  // при любом повороте
oled.clear();        // очищаем дисплей

Для теста сойдет, но вообще так делать не стоит - очищайте там где надо, а то потом подключите цветной дисплей и с таким подходом очень расстроитесь.