init
можно задавать с uart и бета экранчик
This commit is contained in:
commit
7075f11e2b
193
TecktroHack.ino
Normal file
193
TecktroHack.ino
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
/*
|
||||||
|
Разъем 6 пинов (2 ряда по 3 пина):
|
||||||
|
|
||||||
|
+--------------+---------+---------+--+
|
||||||
|
|--------------| none | SCL |--| <-- верхний ряд, пины 1 и 2
|
||||||
|
+--------------+---------+---------+--+
|
||||||
|
|--------------| GND | 3.3V |--| <-- нижний ряд, пины 3 и 4
|
||||||
|
+--------------+---------+---------+--+
|
||||||
|
|--------------| none | SDA |--| <-- нижний ряд, пины 5 и 6
|
||||||
|
+--------------+---------+---------+--+
|
||||||
|
|
||||||
|
Пояснения:
|
||||||
|
- SCL = I2C Clock pin
|
||||||
|
- SDA = I2C Data pin
|
||||||
|
- GND = общий минус
|
||||||
|
- 3.3V = питание EEPROM
|
||||||
|
- none = не подключен
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EEPROM_SIZE 256
|
||||||
|
#define I2C_MIN_ADDR 0x50
|
||||||
|
#define I2C_MAX_ADDR 0x57
|
||||||
|
|
||||||
|
#define SDA_PIN 21
|
||||||
|
#define SCL_PIN 22
|
||||||
|
|
||||||
|
uint8_t eeprom_addr = 0;
|
||||||
|
uint16_t startAddr = 0x04; // адрес записи строк по умолчанию
|
||||||
|
char versionStr[32] = {0}; // буфер для версии
|
||||||
|
|
||||||
|
bool findEEPROM() {
|
||||||
|
Serial.println("Scanning for EEPROM...");
|
||||||
|
|
||||||
|
for (uint8_t addr = I2C_MIN_ADDR; addr <= I2C_MAX_ADDR; addr++) {
|
||||||
|
Wire.beginTransmission(addr);
|
||||||
|
if (Wire.endTransmission() == 0) {
|
||||||
|
eeprom_addr = addr;
|
||||||
|
Serial.print("Found EEPROM at address 0x");
|
||||||
|
Serial.println(eeprom_addr, HEX);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("EEPROM not found!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void eepromWriteByte(uint8_t addr, uint8_t data) {
|
||||||
|
Wire.beginTransmission(eeprom_addr);
|
||||||
|
Wire.write(addr);
|
||||||
|
Wire.write(data);
|
||||||
|
Wire.endTransmission();
|
||||||
|
delay(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t eepromReadByte(uint8_t addr) {
|
||||||
|
Wire.beginTransmission(eeprom_addr);
|
||||||
|
Wire.write(addr);
|
||||||
|
Wire.endTransmission();
|
||||||
|
|
||||||
|
Wire.requestFrom(eeprom_addr, (uint8_t)1);
|
||||||
|
if (Wire.available()) {
|
||||||
|
return Wire.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeStringToEEPROM(const char* str, uint16_t addr) {
|
||||||
|
size_t len = strlen(str);
|
||||||
|
if (addr + len + 1 > EEPROM_SIZE)
|
||||||
|
len = EEPROM_SIZE - addr - 1;
|
||||||
|
|
||||||
|
Serial.print("Writing to EEPROM @ 0x");
|
||||||
|
Serial.print(addr, HEX);
|
||||||
|
Serial.print(": ");
|
||||||
|
Serial.println(str);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
eepromWriteByte(addr + i, str[i]);
|
||||||
|
}
|
||||||
|
eepromWriteByte(addr + len, 0); // null-терминатор
|
||||||
|
}
|
||||||
|
|
||||||
|
void readVersionFromEEPROM() {
|
||||||
|
// Читаем строку версии из EEPROM начиная с 0
|
||||||
|
for (size_t i = 0; i < sizeof(versionStr) - 1; i++) {
|
||||||
|
uint8_t b = eepromReadByte(i);
|
||||||
|
if (b == 0 || b == 0xFF) {
|
||||||
|
versionStr[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
versionStr[i] = (char)b;
|
||||||
|
}
|
||||||
|
versionStr[sizeof(versionStr)-1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void readAndDumpEEPROM() {
|
||||||
|
Serial.println("\nDumping full EEPROM contents:\n");
|
||||||
|
|
||||||
|
for (uint16_t base = 0; base < EEPROM_SIZE; base += 16) {
|
||||||
|
char ascii[17] = {0};
|
||||||
|
|
||||||
|
Serial.print("0x");
|
||||||
|
if (base < 0x10) Serial.print('0');
|
||||||
|
Serial.print(base, HEX);
|
||||||
|
Serial.print(": ");
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 16; i++) {
|
||||||
|
uint8_t val = eepromReadByte(base + i);
|
||||||
|
if (val < 0x10) Serial.print('0');
|
||||||
|
Serial.print(val, HEX);
|
||||||
|
Serial.print(' ');
|
||||||
|
|
||||||
|
ascii[i] = isPrintable(val) ? (char)val : '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print(" |");
|
||||||
|
Serial.print(ascii);
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial);
|
||||||
|
|
||||||
|
setupUI();
|
||||||
|
Wire.begin(SDA_PIN, SCL_PIN);
|
||||||
|
|
||||||
|
bool eeprom_found = findEEPROM();
|
||||||
|
|
||||||
|
if (eeprom_found) {
|
||||||
|
readVersionFromEEPROM();
|
||||||
|
readAndDumpEEPROM();
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("Ready.");
|
||||||
|
Serial.println("Set start address with 'ADDR=<number>'");
|
||||||
|
Serial.println("Set version with 'VER=<version_string>'");
|
||||||
|
Serial.println("Then type string and press ENTER to write it.");
|
||||||
|
Serial.print("Current start address = 0x");
|
||||||
|
Serial.println(startAddr, HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String inputBuffer;
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
while (Serial.available()) {
|
||||||
|
char c = Serial.read();
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
inputBuffer.trim();
|
||||||
|
|
||||||
|
if (inputBuffer.length() > 0) {
|
||||||
|
if (inputBuffer.startsWith("ADDR=")) {
|
||||||
|
String valStr = inputBuffer.substring(5);
|
||||||
|
int val = valStr.toInt();
|
||||||
|
if (val >= 0 && val < EEPROM_SIZE) {
|
||||||
|
startAddr = (uint16_t)val;
|
||||||
|
Serial.print("Start address set to 0x");
|
||||||
|
Serial.println(startAddr, HEX);
|
||||||
|
} else {
|
||||||
|
Serial.println("Invalid address! Must be 0..255");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (inputBuffer.startsWith("VER=")) {
|
||||||
|
String ver = inputBuffer.substring(4);
|
||||||
|
ver.trim();
|
||||||
|
ver.toCharArray(versionStr, sizeof(versionStr));
|
||||||
|
writeStringToEEPROM(versionStr, 0);
|
||||||
|
Serial.print("Version written: ");
|
||||||
|
Serial.println(versionStr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
writeStringToEEPROM(inputBuffer.c_str(), startAddr);
|
||||||
|
delay(100);
|
||||||
|
readAndDumpEEPROM();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inputBuffer = "";
|
||||||
|
Serial.println("\nEnter command or string:");
|
||||||
|
} else {
|
||||||
|
inputBuffer += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loopUI();
|
||||||
|
}
|
180
ui_interface.ino
Normal file
180
ui_interface.ino
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SSD1306.h>
|
||||||
|
|
||||||
|
// OLED дисплей 128x64, I2C адрес по умолчанию — 0x3C
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
// Кнопки
|
||||||
|
#define BTN_UP_PIN 32
|
||||||
|
#define BTN_DOWN_PIN 33
|
||||||
|
#define BTN_OK_PIN 25 // #
|
||||||
|
#define BTN_BACK_PIN 26 // *
|
||||||
|
|
||||||
|
extern uint16_t startAddr;
|
||||||
|
extern void writeStringToEEPROM(const char* str, uint16_t addr);
|
||||||
|
extern void readVersionFromEEPROM();
|
||||||
|
extern char versionStr[32];
|
||||||
|
char moduleStr[32] = {0}; // буфер для считанного модуля
|
||||||
|
extern uint8_t eepromReadByte(uint8_t addr);
|
||||||
|
extern uint16_t startAddr;
|
||||||
|
|
||||||
|
enum MenuState {
|
||||||
|
MENU_MAIN,
|
||||||
|
MENU_SELECT_MODULE,
|
||||||
|
MENU_SELECT_VERSION,
|
||||||
|
MENU_SHOW_EEPROM
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const char* moduleOptions[] = {
|
||||||
|
"DPO4COMP", "DPO2EMBD", "DPO4EMBD", "DPO4AUTO", "DPO4AUTOMAX", "DPO4PWR",
|
||||||
|
"DPO4USB", "DPO4ENET", "DPO4LMT", "DPO4AUDIO", "MSO5204B 5RL", "MDO4MSO", "MDO4EMBD",
|
||||||
|
"MDO4AERO", "MDO4AUTO", "MDO4COMP", "MDO4FLEX", "MDO4LMT", "MDO4SA", "MDO4SA3",
|
||||||
|
"MDO4SA6", "MDO4AFG", "MDO4PWR", "MDO4BND", "MDO4SEC", "MDO4AUDIO"
|
||||||
|
};
|
||||||
|
const uint8_t moduleCount = sizeof(moduleOptions) / sizeof(moduleOptions[0]);
|
||||||
|
|
||||||
|
MenuState currentMenu = MENU_MAIN;
|
||||||
|
uint8_t cursorPos = 0;
|
||||||
|
|
||||||
|
extern char versionStr[32]; // Используется из основного кода
|
||||||
|
|
||||||
|
void readModuleFromEEPROM() {
|
||||||
|
memset(moduleStr, 0, sizeof(moduleStr));
|
||||||
|
for (size_t i = 0; i < sizeof(moduleStr) - 1; i++) {
|
||||||
|
uint8_t b = eepromReadByte(startAddr + i);
|
||||||
|
if (b == 0 || b == 0xFF) {
|
||||||
|
moduleStr[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
moduleStr[i] = (char)b;
|
||||||
|
}
|
||||||
|
moduleStr[sizeof(moduleStr)-1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setupUI() {
|
||||||
|
pinMode(BTN_UP_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(BTN_DOWN_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(BTN_OK_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(BTN_BACK_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
|
||||||
|
Serial.println(F("SSD1306 not found"));
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
display.clearDisplay();
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SSD1306_WHITE);
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
showMainMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loopUI() {
|
||||||
|
static uint32_t lastPress = 0;
|
||||||
|
if (millis() - lastPress < 200) return;
|
||||||
|
|
||||||
|
if (!digitalRead(BTN_UP_PIN)) {
|
||||||
|
if (cursorPos > 0) cursorPos--;
|
||||||
|
updateMenuDisplay();
|
||||||
|
lastPress = millis();
|
||||||
|
} else if (!digitalRead(BTN_DOWN_PIN)) {
|
||||||
|
cursorPos++;
|
||||||
|
updateMenuDisplay();
|
||||||
|
lastPress = millis();
|
||||||
|
} else if (!digitalRead(BTN_OK_PIN)) {
|
||||||
|
handleOk();
|
||||||
|
lastPress = millis();
|
||||||
|
} else if (!digitalRead(BTN_BACK_PIN)) {
|
||||||
|
handleBack();
|
||||||
|
lastPress = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void showMainMenu() {
|
||||||
|
currentMenu = MENU_MAIN;
|
||||||
|
cursorPos = 0;
|
||||||
|
updateMenuDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateMenuDisplay() {
|
||||||
|
display.clearDisplay();
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
|
||||||
|
if (currentMenu == MENU_MAIN) {
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print(cursorPos == 0 ? "> Module" : " Module");
|
||||||
|
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print(cursorPos == 1 ? "> Version" : " Version");
|
||||||
|
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print(cursorPos == 2 ? "> Read" : " Read");
|
||||||
|
} else if (currentMenu == MENU_SELECT_MODULE) {
|
||||||
|
display.print("Module:");
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print(">");
|
||||||
|
display.print(moduleOptions[cursorPos % moduleCount]);
|
||||||
|
} else if (currentMenu == MENU_SELECT_VERSION) {
|
||||||
|
display.print("Set version via UART:");
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("VER=1.23");
|
||||||
|
} else if (currentMenu == MENU_SHOW_EEPROM) {
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Module: ");
|
||||||
|
display.println(moduleStr);
|
||||||
|
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Version: ");
|
||||||
|
display.println(versionStr);
|
||||||
|
}
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleOk() {
|
||||||
|
if (currentMenu == MENU_MAIN) {
|
||||||
|
if (cursorPos == 0) {
|
||||||
|
currentMenu = MENU_SELECT_MODULE;
|
||||||
|
cursorPos = 0;
|
||||||
|
} else if (cursorPos == 1) {
|
||||||
|
currentMenu = MENU_SELECT_VERSION;
|
||||||
|
} else if (cursorPos == 2) {
|
||||||
|
// Считать из EEPROM
|
||||||
|
readVersionFromEEPROM(); // версия из 0x00
|
||||||
|
readModuleFromEEPROM(); // модуль из startAddr
|
||||||
|
currentMenu = MENU_SHOW_EEPROM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (currentMenu == MENU_SELECT_MODULE) {
|
||||||
|
const char* sel = moduleOptions[cursorPos % moduleCount];
|
||||||
|
writeStringToEEPROM(sel, startAddr);
|
||||||
|
readAndDumpEEPROM();
|
||||||
|
strncpy(versionStr, sel, sizeof(versionStr) - 1);
|
||||||
|
versionStr[sizeof(versionStr) - 1] = 0;
|
||||||
|
Serial.print("[UI] Module written to EEPROM: ");
|
||||||
|
Serial.println(sel);
|
||||||
|
showMainMenu();
|
||||||
|
}
|
||||||
|
else if (currentMenu == MENU_SELECT_VERSION) {
|
||||||
|
writeStringToEEPROM("v1.23", 0);
|
||||||
|
readAndDumpEEPROM();
|
||||||
|
strncpy(versionStr, "v1.23", sizeof(versionStr) - 1);
|
||||||
|
versionStr[sizeof(versionStr) - 1] = 0;
|
||||||
|
Serial.print("[UI] Version written to EEPROM: ");
|
||||||
|
Serial.println(versionStr);
|
||||||
|
showMainMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
updateMenuDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void handleBack() {
|
||||||
|
showMainMenu();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user