OLED дисплей

Здравствуйте. В этом скетче переменная Vol не всегда прорисовывается. Остальные данные без проблем. Подтяжка 5,1Ком на кнопках и дисплее есть.

Прошу прощения, не получается нормально вставить. Условий нет. Пробую оформить как полагается.


#include <Tiny4kOLED.h>
#include <GyverButton.h>
//
#define BUTTON_PIN_1 2
#define BUTTON_PIN_2 3
//
GButton btn1(BUTTON_PIN_1);
GButton btn2(BUTTON_PIN_2);
//
float Frequency = 9890;
uint8_t Vol = 5;
uint32_t timesleepdisplay;
//
void setup() {
pinMode(BUTTON_PIN_1, INPUT_PULLUP);
pinMode(BUTTON_PIN_2, INPUT_PULLUP);


oled.begin(128, 32, sizeof(tiny4koled_init_128x32br), tiny4koled_init_128x32br);
oled.on();
oled.clear();
oled.setContrast(2);
oled.switchRenderFrame();


}

void loop() {
btn1.tick();
btn2.tick();
if(btn1.isStep()) {
Frequency=Frequency+10;
if(Frequency>=10800) {
Frequency = 8700; }
DispUpdate();
}
if(btn2.isStep()) {
Frequency=Frequency-10;
if(Frequency<=8700) {
Frequency = 10800; }
DispUpdate();
}
if(btn1.isClick()) {
Vol++;
if(Vol>=15) {
Vol=15; }
DispUpdate();
}
if(btn2.isClick()) {
Vol--;
if(Vol<1) {
Vol=0; }
DispUpdate();
}
if(millis()-timesleepdisplay>=20000ul) {
oled.clear();
oled.switchFrame();
}
} // end loop
void DispUpdate() {
timesleepdisplay = millis();
oled.clear();
oled.setFont(FONT6X8);
oled.setCursor(116,7);
oled.print(Vol);
oled.setFontX2(FONT6X8P);
oled.setCursor(6,2);
oled.print(Frequency/100.0);
oled.setCursor(82,2);
oled.print(F(“FM”));
oled.switchFrame();
}

В каком?

И?
У Вас, видимо, был какой-то вопрос или просьба, но Вы забыли его задать (её озвучить).

P.S.
Поскольку Вы умеете правильно вставлять скетч, но не сделали этого, считаю, что Вы умышленно решили плюнуть в сообщество.

Что написано в строке №50? Видимо, пропущен ещё один минус?

В строках №№51-52 явно напутано с логикой. Если постоянно уменьшать, то она (Vol) у Вас после значения 0 улетит в 255. Вы же не этого хотели? Почитайте эти строки перепишите так, как Вы хотели написать.

Это редактировал так через тормоза, Да, там Vol–. Исправлю. Но значение переменной на отображение не влияет. Проблема сразу при включении наблюдается.

Ну, и с логикой разбирайтесь.

Возможно он исправился, но обычно это и есть проблема. И, кстати, 51 строчка, как и сказал Евгений, с проблемой.

Надеялся, что дисплей неправильно использую- другие-то данные не пропадают, а Vol после клика/удержания то остается видимой, то нет. Буду разбираться. Кнопка вроде обычная, на millis(). Перепишу.

Причём тут кнопка, если Вы с арифметикой напутали? Я же Вам сказал, что в строках №№51-52 написан бред и даже написал к чему он приводит. И кнопка тут совсем не при делах.

Евгений, ну ладно. В 51 написан бред, а 52 - только следствие от бреда.

Перепишу. Но проблема и при Vol == 5 тоже есть.

Кроме выше сказанного, после стр.55
сохраните значение миллис в переменной timesleepdisplay.
Хотя правильней будет, на каждый таймер(событие) завести свою переменную

Сделаю. Так было вначале, убрал, сочтя переполнение невозможным.

Ну 51 строчку исправьте сначала, а уж потом…

Да. Спасибо всем ответившим! Еще хочу попробовать не вдаваясь в детали библиотек, тормознуть обновление дисплея через delay(); мало ли, вдруг все же кнопка. Напишу результаты, как доберусь до компа.

а попутно проверьте код, мало ли поможет …

#include <Tiny4kOLED.h>
#include <GyverButton.h>

#define BUTTON_PIN_1 2
#define BUTTON_PIN_2 3

GButton btn1(BUTTON_PIN_1);
GButton btn2(BUTTON_PIN_2);

float Frequency = 9890;
uint8_t Vol = 5;
uint32_t timesleepdisplay;
bool displayOn = true;

void setup() {
pinMode(BUTTON_PIN_1, INPUT_PULLUP);
pinMode(BUTTON_PIN_2, INPUT_PULLUP);

oled.begin(128, 32, sizeof(tiny4koled_init_128x32br), tiny4koled_init_128x32br);
oled.on();
oled.clear();
oled.setContrast(2);
oled.switchRenderFrame();

DispUpdate();
}

void loop() {
btn1.tick();
btn2.tick();

if(btn1.isStep()) {
Frequency += 10;
if(Frequency >= 10800) Frequency = 8700;
DispUpdate();
}

if(btn2.isStep()) {
Frequency -= 10;
if(Frequency <= 8700) Frequency = 10800;
DispUpdate();
}

if(btn1.isClick()) {
Vol = min(Vol + 1, 15);
DispUpdate();
}

if(btn2.isClick()) {
Vol = max(Vol - 1, 0);
DispUpdate();
}

if(displayOn && millis() - timesleepdisplay >= 20000ul) {
oled.clear();
oled.off();
displayOn = false;
}

if(!displayOn && (btn1.isClick() || btn2.isClick() || btn1.isStep() || btn2.isStep())) {
oled.on();
displayOn = true;
DispUpdate();
}
}

void DispUpdate() {
timesleepdisplay = millis();

if(!displayOn) return;

oled.clear();

oled.setFont(FONT6X8);
oled.setCursor(100, 0);
oled.print("V:");
oled.print(Vol);

oled.setFontX2(FONT6X8P);
oled.setCursor(6, 2);
oled.print(Frequency/100.0, 1);

oled.setCursor(82, 2);
oled.print(F("FM"));

oled.switchFrame();
}

Херня какая то

зато быстро, за минуту)))

Возможно, дело в неправильном использовании/переключении банков памяти.
Попробуйте закомментировать стр.57 и стр71 oled.switchFrame(); из #1 сообщ

P.S. Возможно позиции курсора придётся подкорректировать и стр23 тоже закомментировать

По мне, бредом они являются только вместе. Каждая по отдельности имеет право на существование :slight_smile:

Ошибки в программах имеют привычку пересекаться и давать “метастазы” в совершенно неожиданных местах. Поэтому, выявив одну, надо её исправить, а потом уж смотреть на другие (остались ли они, кстати).

Он это делает в функции DispUpdate() :slight_smile:

Просто для проверки попробуйте задать координату чуть дальше от края, например 108,7. Я думаю у вас строчка просто не влазит