Здравствуйте, нужна помощь. Необходимо чтобы при нажатии на кнопку произошел вход в подменю. А потом при следующем нажатии на кнопку в подменю произошел вход в еще одно подменю. Сейчас получается что в первом подменю я не могу переходить между “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