Нажатие на кнопку внутри условия этой ж кнопки

Здравствуйте, нужна помощь. Необходимо чтобы при нажатии на кнопку произошел вход в подменю. А потом при следующем нажатии на кнопку в подменю произошел вход в еще одно подменю. Сейчас получается что в первом подменю я не могу переходить между “Pad 1…Pad 4”. И сразу перехожу в “Pad 1”. как не переходить автоматически в “Pad 1” и переключаться между ними?

#include <Arduino.h>
#include <U8g2lib.h>
#include <EEPROM.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1309_128X64_NONAME0_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

#include <HX711.h>                 // Подключаем библиотеку HX711
HX711 scale;                       // Создаём объект scale 
 
#define DT  2                      // Указываем номер вывода, к которому подключен вывод DT  датчика HX711
#define SCK 3                      // Указываем номер вывода, к которому подключен вывод SCK датчика HX711
 
float calibration_factor1 = 1;  // Вводим калибровочный коэффициент
float calibration_factor2 = 1;  // Вводим калибровочный коэффициент
float calibration_factor3 = 1;  // Вводим калибровочный коэффициент
float calibration_factor4 = 1;  // Вводим калибровочный коэффициент
float units;                       // Задаём переменную для измерений в граммах
float ounces;                      // Задаём переменную для измерений в унциях

// задаем константы
const int buttonPin1 = 4;     // номер входа, подключенный к кнопке
const int buttonPin2 = 5;     // номер входа, подключенный к кнопке
// переменные
int buttonState1 = 0;         // переменная для хранения состояния кнопки
int buttonState2 = 0;         // переменная для хранения состояния кнопки*/

#include "GyverButton.h"
//GButton buttonPin1(4);
//GButton buttonPin2(5);

short pixel_area_x_pos = 0;
short pixel_area_y_pos = 0;
short pixel_area_width = 128;
short pixel_area_height = 10;

short pixel_area_x_pos1 = 0;
short pixel_area_y_pos1 = 0;
short pixel_area_width1 = 128;
short pixel_area_height1 = 10;
 
short i;
short ct = 100; 
int ii;

uint32_t weight1;
uint32_t weight2;
uint32_t weight3;
uint32_t weight4;

uint32_t weight5;
uint32_t weight6;
uint32_t weight7;
uint32_t weight8;

////////////////////////////////////////////////////////////////////////////
void setup()
{
  //buttonPin1.setDebounce(100);        // настройка антидребезга (по умолчанию 80 мс)
  //buttonPin2.setDebounce(100);        // настройка антидребезга (по умолчанию 80 мс)

  //buttonPin1.setType(LOW_PULL);
  //buttonPin2.setType(LOW_PULL);

  //buttonPin1.setDirection(NORM_OPEN);
  //buttonPin2.setDirection(NORM_OPEN);

  u8g2.begin();

  //Serial.begin(57600);             // Инициируем работу последовательного порта на скорости 9600 бод
  scale.begin(DT, SCK);            // Инициируем работу с датчиком
  scale.set_scale();               // Выполняем измерение значения без калибровочного коэффициента
  scale.tare();                    // Сбрасываем значения веса на датчике в 0
  //scale.set_scale(calibration_factor); // Устанавливаем калибровочный коэффициент

  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}
//////////////////////////////////////////////////////////////////////////// 
void loop() 
{
  //buttonPin1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  //buttonPin2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);

  u8g2.clearBuffer();					// clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font

  u8g2.drawFrame(pixel_area_x_pos, pixel_area_y_pos, pixel_area_width, pixel_area_height);
  u8g2.drawStr(0, 10, "Write");
  u8g2.drawStr(0, 20, "Read");

  u8g2.sendBuffer();					// transfer internal memory to the display
  ////////////////////////////////////////////////////////////////////////////
  if (buttonState2 == HIGH) 
  {
    //while (buttonState2 == HIGH);
    delay(1000);

    pixel_area_y_pos += 10;
    if (pixel_area_y_pos == 20)
    {
      pixel_area_y_pos = 0;
    }
  }
  ////////////////////////////////////////////////////////////////////////////
  if (buttonState1 == HIGH) 
  {
    //while (buttonState1 == HIGH);
    delay(1000);
    //buttonState1 = 0;
    //buttonState2 = 0;

    if (pixel_area_y_pos == 0)
    {
      for (i=0; i<ct; i++)
      {
        //buttonPin1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
        //buttonPin2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

        u8g2.clearBuffer();

        u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font

        u8g2.drawFrame(pixel_area_x_pos1, pixel_area_y_pos1, pixel_area_width1, pixel_area_height1);
        u8g2.drawStr(0, 10, "Pad 1");
        u8g2.drawStr(0, 20, "Pad 2");
        u8g2.drawStr(0, 30, "Pad 3");
        u8g2.drawStr(0, 40, "Pad 4");

        u8g2.sendBuffer();					// transfer internal memory to the display

        if (buttonState2 == HIGH) 
        {
          //while (buttonState2 == HIGH);
          delay(1000);

          pixel_area_y_pos1 += 10;
          if (pixel_area_y_pos1 == 40)
          {
            pixel_area_y_pos1 = 0;
          }
        }

        if (buttonState1 == HIGH) 
        {
          //while (buttonState1 == HIGH);
          delay(1000);

          u8g2.clearBuffer();

          u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
          //--------------------------------------------------------------------------
          if (pixel_area_y_pos1 == 0)
          {
            scale.set_scale(calibration_factor1); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight1 = ounces;
            weight5 = eeprom_read_dword(16);
            weight5 = weight1 - weight5;
            eeprom_write_dword(0, weight1);
            eeprom_write_dword(16, weight5);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 1");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 10)
          {
            scale.set_scale(calibration_factor2); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight2 = ounces;
            weight6 = eeprom_read_dword(20);
            weight6 = weight2 - weight6;
            eeprom_write_dword(4, weight2);
            eeprom_write_dword(20, weight6);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 2");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 20)
          {
            scale.set_scale(calibration_factor3); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight3 = ounces;
            weight7 = eeprom_read_dword(24);
            weight7 = weight3 - weight7;
            eeprom_write_dword(8, weight3);
            eeprom_write_dword(24, weight7);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 3");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 30)
          {
            scale.set_scale(calibration_factor4); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight4 = ounces;
            weight8 = eeprom_read_dword(28);
            weight8 = weight4 - weight8;
            eeprom_write_dword(12, weight4);
            eeprom_write_dword(28, weight8);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 4");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
        }

        /*if (buttonState2 == HIGH)
        {
          //while (buttonState2 == HIGH);
          delay(1000);
          break;
        }*/

        delay(1000);
      }
    }

Ссылка на симуляцию в Протеус - Arduino + SSD1306 OLED SPI - Proteus 8 Professional - Schematic Capture 2024-08-03 23-28-16.mp4 - Google Drive

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

А вообще

Заведите переменную-счётчик нажатий кнопки, и, исходя из его значения входите-выходите в меню и подменю.

1 лайк

Не нужно вешать вход в меню/подменю на функцию проверки клика кнопки. Разносите эти действия. Типа: произошло нажатие - если мы еще не в меню, входим в него, если уже в меню - входим в выделенный пункт подменю. А валить все в одну кучу - толку не будет

1 лайк

Я вообще всё разделяю.
Обработка нажатий кнопок/энкодер - это одно.
Поведение после этого - другое.
Вывод на дисплей (если нужно) - третье.
И так далее…

1 лайк

Вот код. У меня он компилируется без ошибок.

#include <Arduino.h>
#include <U8g2lib.h>
#include <EEPROM.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1309_128X64_NONAME0_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

#include <HX711.h>                 // Подключаем библиотеку HX711
HX711 scale;                       // Создаём объект scale 
 
#define DT  2                      // Указываем номер вывода, к которому подключен вывод DT  датчика HX711
#define SCK 3                      // Указываем номер вывода, к которому подключен вывод SCK датчика HX711
 
float calibration_factor1 = 1;  // Вводим калибровочный коэффициент
float calibration_factor2 = 1;  // Вводим калибровочный коэффициент
float calibration_factor3 = 1;  // Вводим калибровочный коэффициент
float calibration_factor4 = 1;  // Вводим калибровочный коэффициент
float units;                       // Задаём переменную для измерений в граммах
float ounces;                      // Задаём переменную для измерений в унциях

// задаем константы
const int buttonPin1 = 4;     // номер входа, подключенный к кнопке
const int buttonPin2 = 5;     // номер входа, подключенный к кнопке
// переменные
int buttonState1 = 0;         // переменная для хранения состояния кнопки
int buttonState2 = 0;         // переменная для хранения состояния кнопки*/

#include "GyverButton.h"
//GButton buttonPin1(4);
//GButton buttonPin2(5);

short pixel_area_x_pos = 0;
short pixel_area_y_pos = 0;
short pixel_area_width = 128;
short pixel_area_height = 10;

short pixel_area_x_pos1 = 0;
short pixel_area_y_pos1 = 0;
short pixel_area_width1 = 128;
short pixel_area_height1 = 10;
 
short i;
short ct = 100; 
int ii;

uint32_t weight1;
uint32_t weight2;
uint32_t weight3;
uint32_t weight4;

uint32_t weight5;
uint32_t weight6;
uint32_t weight7;
uint32_t weight8;

////////////////////////////////////////////////////////////////////////////
void setup()
{
  //buttonPin1.setDebounce(100);        // настройка антидребезга (по умолчанию 80 мс)
  //buttonPin2.setDebounce(100);        // настройка антидребезга (по умолчанию 80 мс)

  //buttonPin1.setType(LOW_PULL);
  //buttonPin2.setType(LOW_PULL);

  //buttonPin1.setDirection(NORM_OPEN);
  //buttonPin2.setDirection(NORM_OPEN);

  u8g2.begin();

  //Serial.begin(57600);             // Инициируем работу последовательного порта на скорости 9600 бод
  scale.begin(DT, SCK);            // Инициируем работу с датчиком
  scale.set_scale();               // Выполняем измерение значения без калибровочного коэффициента
  scale.tare();                    // Сбрасываем значения веса на датчике в 0
  //scale.set_scale(calibration_factor); // Устанавливаем калибровочный коэффициент

  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}
//////////////////////////////////////////////////////////////////////////// 
void loop() 
{
  //buttonPin1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  //buttonPin2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);

  u8g2.clearBuffer();					// clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font

  u8g2.drawFrame(pixel_area_x_pos, pixel_area_y_pos, pixel_area_width, pixel_area_height);
  u8g2.drawStr(0, 10, "Write");
  u8g2.drawStr(0, 20, "Read");

  u8g2.sendBuffer();					// transfer internal memory to the display
  ////////////////////////////////////////////////////////////////////////////
  if (buttonState2 == HIGH) 
  {
    //while (buttonState2 == HIGH);
    delay(1000);

    pixel_area_y_pos += 10;
    if (pixel_area_y_pos == 20)
    {
      pixel_area_y_pos = 0;
    }
  }
  ////////////////////////////////////////////////////////////////////////////
  if (buttonState1 == HIGH) 
  {
    //while (buttonState1 == HIGH);
    delay(1000);
    //buttonState1 = 0;
    //buttonState2 = 0;

    if (pixel_area_y_pos == 0)
    {
      for (i=0; i<ct; i++)
      {
        //buttonPin1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
        //buttonPin2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

        u8g2.clearBuffer();

        u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font

        u8g2.drawFrame(pixel_area_x_pos1, pixel_area_y_pos1, pixel_area_width1, pixel_area_height1);
        u8g2.drawStr(0, 10, "Pad 1");
        u8g2.drawStr(0, 20, "Pad 2");
        u8g2.drawStr(0, 30, "Pad 3");
        u8g2.drawStr(0, 40, "Pad 4");

        u8g2.sendBuffer();					// transfer internal memory to the display

        if (buttonState2 == HIGH) 
        {
          //while (buttonState2 == HIGH);
          delay(1000);

          pixel_area_y_pos1 += 10;
          if (pixel_area_y_pos1 == 40)
          {
            pixel_area_y_pos1 = 0;
          }
        }

        if (buttonState1 == HIGH) 
        {
          //while (buttonState1 == HIGH);
          delay(1000);

          u8g2.clearBuffer();

          u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
          //--------------------------------------------------------------------------
          if (pixel_area_y_pos1 == 0)
          {
            scale.set_scale(calibration_factor1); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight1 = ounces;
            weight5 = eeprom_read_dword(16);
            weight5 = weight1 - weight5;
            eeprom_write_dword(0, weight1);
            eeprom_write_dword(16, weight5);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 1");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 10)
          {
            scale.set_scale(calibration_factor2); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight2 = ounces;
            weight6 = eeprom_read_dword(20);
            weight6 = weight2 - weight6;
            eeprom_write_dword(4, weight2);
            eeprom_write_dword(20, weight6);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 2");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 20)
          {
            scale.set_scale(calibration_factor3); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight3 = ounces;
            weight7 = eeprom_read_dword(24);
            weight7 = weight3 - weight7;
            eeprom_write_dword(8, weight3);
            eeprom_write_dword(24, weight7);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 3");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 30)
          {
            scale.set_scale(calibration_factor4); // Устанавливаем калибровочный коэффициент
            for (ii = 0; ii < 10; ii ++) 
            {    
              // Усредняем показания, считав значения датчика 10 раз
              units = + scale.get_units(), 10; // Суммируем показания 10 замеров
            }

            units = units / 10;                // Усредняем показания, разделив сумму значений на 10
            ounces = (units * 0.035274)*10;    // Переводим вес из унций в граммы

            weight4 = ounces;
            weight8 = eeprom_read_dword(28);
            weight8 = weight4 - weight8;
            eeprom_write_dword(12, weight4);
            eeprom_write_dword(28, weight8);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 4");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(ounces);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
        }

        /*if (buttonState2 == HIGH)
        {
          //while (buttonState2 == HIGH);
          delay(1000);
          break;
        }*/

        delay(1000);
      }
    }
    ////////////////////////////////////////////////////////////////////////////
    else if (pixel_area_y_pos == 10)
    {
      for (i=0; i<ct; i++)
      {
        //buttonPin1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
        //buttonPin2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

        u8g2.clearBuffer();

        u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font

        u8g2.drawFrame(pixel_area_x_pos1, pixel_area_y_pos1, pixel_area_width1, pixel_area_height1);
        u8g2.drawStr(0, 10, "Pad 1");
        u8g2.drawStr(0, 20, "Pad 2");
        u8g2.drawStr(0, 30, "Pad 3");
        u8g2.drawStr(0, 40, "Pad 4");

        u8g2.sendBuffer();					// transfer internal memory to the display

        if (buttonState2 == HIGH) 
        {
          //while (buttonState2 == HIGH);
          //delay(1000);

          pixel_area_y_pos1 += 10;
          if (pixel_area_y_pos1 == 40)
          {
            pixel_area_y_pos1 = 0;
          }
        }

        if (buttonState1 == HIGH) 
        {
          //while (buttonState1 == HIGH);
          //delay(1000);

          u8g2.clearBuffer();

          u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
          //--------------------------------------------------------------------------
          if (pixel_area_y_pos1 == 0)
          {

            /////////////////
            weight1 = eeprom_read_dword(0);
            weight5 = eeprom_read_dword(16);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 1");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(weight1);
              u8g2.setCursor(0, 40);
              u8g2.print(weight5);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 10)
          {

            /////////////////
            weight2 = eeprom_read_dword(4);
            weight6 = eeprom_read_dword(20);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 2");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(weight2);
              u8g2.setCursor(0, 40);
              u8g2.print(weight6);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //--------------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 20)
          {

            /////////////////
            weight3 = eeprom_read_dword(8);
            weight7 = eeprom_read_dword(24);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 3");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(weight3);
              u8g2.setCursor(0, 40);
              u8g2.print(weight7);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
          //-----------------------------------------------------------------------
          else if (pixel_area_y_pos1 == 30)
          {

            /////////////////
            weight4 = eeprom_read_dword(12);
            weight8 = eeprom_read_dword(28);

            for (i=0; i<ct; i++)
            {
              u8g2.drawStr(0, 10, "Pad 4");
              u8g2.drawStr(0, 20, "Weight:");

              u8g2.setCursor(0, 30);
              u8g2.print(weight4);
              u8g2.setCursor(0, 40);
              u8g2.print(weight8);

              u8g2.sendBuffer();					// transfer internal memory to the display

              if (buttonState2 == HIGH)
              {
                //while (buttonState2 == HIGH);
                //delay(1000);
                break;
              }

              delay(1000);
            }
          }
        }

        /*if (buttonState2 == HIGH)
        {
          //while (buttonState2 == HIGH);
          delay(1000);
          break;
        }*/

        delay(1000);
      }
    }
  }
}

Если нужно:
Ссылка на проект Протеус - Bee_Scale.zip - Google Drive
Ссылка на библиотеки - libraries.zip - Google Drive

Ради интереса попробовал…
Компилируется, но куча warning -ов

Спойлер

C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino: In function ‘void loop()’:
C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:172:46: warning: right operand of comma operator has no effect [-Wunused-value]
units = + scale.get_units(), 10; // Суммируем показания 10 замеров
^
C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:179:43: warning: invalid conversion from ‘int’ to ‘const uint32_t* {aka const long unsigned int*}’ [-fpermissive]
weight5 = eeprom_read_dword(16);
^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234,
from C:\Users\123\Documents\Arduino\libraries\U8g2\src/U8g2lib.h:49,
from C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:2:
c:\users\123\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\eeprom.h:149:10: note: initializing argument 1 of ‘uint32_t eeprom_read_dword(const uint32_t*)’
uint32_t eeprom_read_dword (const uint32_t __p) ATTR_PURE;
^~~~~~~~~~~~~~~~~
C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:182:43: warning: invalid conversion from ‘int’ to 'uint32_t
{aka long unsigned int*}’ [-fpermissive]
eeprom_write_dword(16, weight5);
^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234,
from C:\Users\123\Documents\Arduino\libraries\U8g2\src/U8g2lib.h:49,
from C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:2:
c:\users\123\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\eeprom.h:176:6: note: initializing argument 1 of ‘void eeprom_write_dword(uint32_t*, uint32_t)’
void eeprom_write_dword (uint32_t __p, uint32_t __value);
^~~~~~~~~~~~~~~~~~
C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:211:46: warning: right operand of comma operator has no effect [-Wunused-value]
units = + scale.get_units(), 10; // Суммируем показания 10 замеров
^
C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:218:43: warning: invalid conversion from ‘int’ to 'const uint32_t
{aka const long unsigned int*}’ [-fpermissive]
weight6 = eeprom_read_dword(20);
^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234,
from C:\Users\123\Documents\Arduino\libraries\U8g2\src/U8g2lib.h:49,
from C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:2:
c:\users\123\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\eeprom.h:149:10: note: initializing argument 1 of ‘uint32_t eeprom_read_dword(const uint32_t*)’
uint32_t eeprom_read_dword (const uint32_t *__p) ATTR_PURE;
^~~~~~~~~~~~~~~~~
C:\Users\123\Documents\ARDUINO\MYPROJ\Andromeda_BTN_forum\Andromeda_BTN_forum.ino:220:42: warning: invalid conversion from 'i

и…т.д и.т.п. …

И ещё
Скетч использует 15628 байт (50%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1585 байт (77%) динамической памяти, оставляя 463 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.

Включите у себя в настройках IDE опцию “показывать все сообщения компилятора”

Спойлер

А по коду: лучше переписать с нуля, учитывая советы выше

Это потому что я использую библиотеку U8g2 для oled ssd1309. Другой не нашел. Но она кушает очень много памяти. Есть еще GyverOled. Но она у меня не заработала

Правда эта либа только для ssd1306. И жрет она тоже много

А ssd1309 не работает от ПО для ssd1306?

Работает. На ардуино уно у меня работает дисплей ssd1309 на GyverOled. А вот на ардуино нано нет. Может я что то упустил, я только учусь ардуино. Но GyverOled несильно меньше занимает памяти чем U8g2

Хотя нет. На ардуино нано GyverOled тоже работает. Просто я не все пины подключил. Лучше ее использовать. Если выбрать OLED_NO_BUFFER, то она занимает всего 18% динамической памяти, когда U8g2 занимает около 70%.

И запустить динамическое изменение на экране…)

Не понял(
А чем Oled с буфером и без буфера отличается?

Наличием и отсутствием буфера епта …

А теперь понял.

Удобно разделять задачи. Например , забыть для начала про OLED, разобраться с меню. Только вывод в сериал.
Напишите сначала своими словами, как должны работать кнопки. Потом переведите в код.
Уберите непонятно зачем нужные циклы for , и delay тоже тормозит

Делал разные шкалы.


Я к тому, что есть другие библиотеки, например, OLED_I2C.h

Для этого есть delay(200); За него можно успеть отдёрнуть палец с кнопки и это уже будет следующим нажатием :slight_smile:

Вообще, если хочется сделать навигацию одной кнопкой, то надо использовать экран для отображения автоматического перебора пунктов и жать кнопку во время присутствия указателя на текущем пункте. Это удобно, если хорошая реакция, внимание и знакомое меню. Например, так:
VID_20230314_184911

Если хорошая реакция) я делаю весы для ульев, которыми будут пользоваться далеко не молодые родственники. Думаю у них не хватит реакции) вообще наверное для таких целей энкодер подошел бы идеально. Но под рукой не оказалось. Поэтому решил использовать две кнопки