Vysvětlím k čemu to bude. Dělám zařízení, které bude mít složitější menu, bude ovládané rotačním enkodérem s tlačítkem a zobrazovat bude na 2*16LCD.
Moje idea je mít v EEPROM strukturu, kde budou uložené texty i adresy pro skok na další po dané volbě.
Třeba (po zjednodušení):
text 1. řádku, text 2. řádku, adresa co zobrazit při otočení tam, adresa co zobrazit při otočení zpět, adresa kam skočit při stisknutí.
od adresy 0 bude:
0: vyber z nabídky, _popis volby__1:, 69, 69, 138
69: vyber z nabídky, _popis volby__2:, 0, 0, 207
138: tohle je volba 1, a nic víc, 138, 138, 138
207: tohle je volba 2, - chceš nazpátek ? -, 207, 207, 0
Budu potřebovat:
na každý text 33 bytů, protože délka řádku LCD je 16 a některé znaky jsou v ASCII dvoubajtové. V případě všech dvoubajtových by to bylo 32 a pak 1, který tam dává kód sám, asi Enter, nevadí mi, beru to tak, že délka dvou řádků zabere 33 + 33 bytů. A pak ty 3 ovládací. Takže
33+33+3 = 69 bytů na 1 volbu menu.
Na LCD se vypíše:
vyber z nabídky
_popis volby__1:
Rotačním spínačem budu skákat na popis druhé volby a zpět (adresa 69 a 0), a po potvrzení skočím buď na volbu 1, tedy na adresu 138 nebo 2, což je adresa 207. Na volbě 1 tahle ukázka už zůstane (138 je u její řádky možnost pro otočení tam i zpět i pro stisknutí), u volby 2 je možnost po stisku skočit zase na začátek.
A takových řádek bude v přístroji několik desítek. Převáděl jsem pokusně část do HEX ručně, ale připadá mi teď lepší části po větách a číslech adres zadávat přes sériovou linku rovnou do Arduina a přes něj rovnou do paměti. Z té bych si pak mohl udělat dump.
Zatím zkouším následující jednoduchý, neohrabaný a nedodělaný kód, protože se učím od začátku.
Zatím umí jen přebrat znaky čísla a textu, zapsat do pole, zkontrolovat je a doplnit na délku 33.
Teď bych chtěl vypsat to pole zpět jako textovou větu pro kontrolu, pak doplnit o zadané adresy skoků a posílat do EEPROM.
Nejdřív jsem pracoval fyzicky na desce Arduina, a pak našel tuhle stránku, která mi šetří hodně času při kompilaci a uploadu a taky flash Atmegy
https://wokwi.com/projects/new/arduino-uno
Pořád hledám nejelegantnější řešení.
Kód: Vybrat vše
unsigned int vlozenyByte = 0;
unsigned int CisloAdresy = 0;
int vlozenyTextPole[34]; // to je pozice 0 az 33, nultou nepouziji (nebo později jinak)
unsigned int pocetBytuRetezce = 0;
void setup() {
Serial.begin(9600);
Serial.println("Vlož číslo adresy v DEC a stiskni Enter");
}
void loop() {
if (Serial.available() > 0)
{
if (CisloAdresy==0)
{
CisloAdresy = Serial.parseInt();
Serial.print("Zadal jsi číslo adresy: ");
Serial.println(CisloAdresy, DEC);
if(CisloAdresy==0)
{
Serial.println("Vlož číslo adresy znovu:");
}
else
{
Serial.println("Teď vlož text a stiskni Enter");
}
}
else
{
vlozenyByte = Serial.read();
// načítat tak dlouho, až se objeví znak enteru (10), do té doby spojovat do jednoho řetězce a ten pak najednou vypsat
if(vlozenyByte==10)
{
Serial.println("Vložil jsi ENTER");
if (pocetBytuRetezce==33)
{
Serial.println("Počet Bytů vloženého řetězce je 33, což je správně");
}
else if (pocetBytuRetezce<33)
{
Serial.println("Počet Bytů vloženého řetězce je " + (String)(pocetBytuRetezce) + ", zbytek do 33 zůstává 0");
for (int i = 1; i <= 32; i++)
{
Serial.print(vlozenyTextPole[i]);
Serial.print(";");
}
}
else
{
Serial.println("Počet Bytů vloženého řetězce je > 33, vlož znovu");
}
Serial.println("\n- - - - - ");
// vymazani promenne a pole
pocetBytuRetezce=0;
for (int i = 0; i <= 33; i++)
{
vlozenyTextPole[i]=0;
}
// /vymazani promenne a pole
}
else
{
pocetBytuRetezce++;
vlozenyTextPole[pocetBytuRetezce]=vlozenyByte;
}
}
}
else
{
}
}