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.
Поскольку Вы умеете правильно вставлять скетч, но не сделали этого, считаю, что Вы умышленно решили плюнуть в сообщество.

1 лайк

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

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

1 лайк

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

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

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

1 лайк

Надеялся, что дисплей неправильно использую- другие-то данные не пропадают, а 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();
}
1 лайк

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

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

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

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

1 лайк

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

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

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

1 лайк

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

1 лайк