WedX - журнал о программировании и компьютерных науках

Использование одной кнопки для отображения разных изображений на oled-дисплее

Я использую oled-дисплей с библиотеками Adafruit_GFX и Adafruit_SSD1306.

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

Это мой код, я не включал коды для своих изображений, так как он слишком большой.

#include <Adafruit_SSD1306.h>
#include <splash.h>

#define bitmap_height   128
#define bitmap_width    64

#include <Wire.h>
#include <Adafruit_GFX.h>

#define YELLOW 0xFFE0
#define OLED_RESET -1

Adafruit_SSD1306 display(OLED_RESET);

int buttonState1 = 0;
const int BUTTON_PIN1 = 2;
int toggle = 0;

const unsigned char s1 [] PROGMEM = {
    //image code
};

const unsigned char s2 [] PROGMEM = {
    //second image code
};

void setup() {
    pinMode(BUTTON_PIN1, INPUT_PULLUP);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay(); 
}
 
void loop() 
{
    buttonState1 = digitalRead(BUTTON_PIN1);
    
    if (buttonState1 == LOW) {
        if (toggle ==0) {
            display.clearDisplay();
            display.drawBitmap(0, 0, s1, bitmap_height, bitmap_width, WHITE);
            display.display();
            toggle = 1;
        } else {
            display.clearDisplay();
            display.drawBitmap(0, 0, s2, bitmap_height, bitmap_width, WHITE);
            display.display();
            toggle = 0;
        }
    }
}

  • Это мой код: 21.08.2020

Ответы:


1

Вы можете сделать что-то вроде этого (не проверено):

#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Wire.h>
#include <Adafruit_GFX.h>

#define bitmap_height   128
#define bitmap_width    64

#define YELLOW 0xFFE0
#define OLED_RESET -1

Adafruit_SSD1306 display(OLED_RESET);
int buttonState1 = HIGH;
int lastState    = HIGH;
int currentImage = 0;
const int BUTTON_PIN1 = 2;

const unsigned char s1 [] PROGMEM = {
    //image code
};
const unsigned char s2 [] PROGMEM = {
    //second image code
};
const unsigned char s3 [] PROGMEM = {
    //third image code
};

const unsigned char *images[] = {s1, s2, s3};

void setup()
{
    pinMode(BUTTON_PIN1, INPUT_PULLUP);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
}

void loop()
{
    buttonState1 = digitalRead(BUTTON_PIN1);

    // you may want to add some button debounce code here

    if ((buttonState1 == LOW) && (buttonState1 != lastState)) {

        if (++currentImage > 2) {
            currentImage = 0;
        }

        display.clearDisplay(); // Not sure if you need this (could cause flicker)
        display.drawBitmap(0, 0, images[currentImage], bitmap_height, bitmap_width, WHITE);
        display.display();

        lastState = buttonState1;
    }
}
21.08.2020
  • Я пробовал это и, к сожалению, не работал. Большое спасибо за помощь, хотя я ценю это. 21.08.2020

  • 2

    Вам нужно будет поместить screed data в массив. Затем вы можете получить доступ к каждому экрану, используя его индекс.

    как это

    #define MAX_SCREENS 3
    
    const unsigned char s1[] = { /* image 1 data*/ };
    const unsigned char s2[] = { /* image 2 data*/ };
    const unsigned char s3[] = { /* image 3 data*/ };
    
    const unsigned char *screen[MAX_SCREEN] =
    {
        s1,
        s2,
        s3
    }; 
    

    И вам нужно использовать обнаружение изменения состояния, чтобы определить, когда кнопка нажата, а затем увеличить переменную currentScreen, если она меньше, чем MAX_SCREEN, иначе установите ее на 0.

    Используйте это для справки

    void loop ()
    {
        bool state = digitalRead(buttonPIN);
        static bool previousState = false;
        static int currentScreen = 0;
        
        if(state != previousState && state) {
            
            if(currentScreen == MAX_SCREENS)
                currentScreen = 0;
            else
                currentScreen++;
                
            // code for displaying the screen
          
        }
    
        previousState = state;
    
    }
    

    И затем вы можете отобразить изображение (экран), используя screen[currentScreen].

    Если вы не знаете, как работает обнаружение изменения состояния, вы можете найти его в примерах в Arduino ide

    21.08.2020
  • Я изменил свой код, я не знаю, как загрузить его сюда. Используя ваш код, я продолжаю получать объявление состояния выхода ошибки 1 «экрана», поскольку многомерный массив должен иметь границы для всех измерений, кроме первого. Есть ли способ исправить это? 21.08.2020
  • Плохо, объявление массива должно быть const unsigned char *screen[MAX_SCREENS]. Я изменю это в ответе. 21.08.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]