Arduino schéma - arduino.sk

nastavovacie menu

Programovanie arduina
Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

nastavovacie menu

Poslaťod roman » Sob 22. Aug 2015 16:45:19

vedel by mi niekto pomôcť ako na nastavovacie menu s megou a LCD 1602 s tlačítkami ? chcel by som zobrazovanie na lcd - to viem ale ked stlačím na LCD select - ako vstup do menu , tlačítkami left a right - posuvanie v menu a up a down nastavovanie hodnôt , niečo som už skúšal ale nejde mi to , potreboval by som od niekoho čo to riešil nejaký príklad ako to riešil . Dík .

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: nastavovacie menu

Poslaťod posjirka » Ned 23. Aug 2015 20:52:07

to už se tu řešillo několikrát. neexistuje universalni řešení. napiš co a jak chceš nastavovat (ideláně i pohledy na obrazovky) a dá se s tím něco dělat.
Někdo chce nasatvit jen čas nebo teplotu (to jde řešit na 1 obrazovku), někdo má 8 čidel one-wire a potřebuje definovat adresy (to máš pro každé čidlo 1 obrazovku), někdo chce rolovací manu o 10 řádcích na 2 řádkovým LCD, .... prostě nekonečný počet možností.

Zkus to popsat něják takto:
1. hlavní obrazovka : nic nenastavuji jen zobrazuji
12:59 PONDELI
23°C / 45°C
2. Nastaveni adresy one-wire prvniho čidla
OBYVAK:
01AA2598AC000011
...

Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

Re: nastavovacie menu

Poslaťod roman » Ned 23. Aug 2015 21:02:17

mám program - niečo ako regulátor cez relé , mám megu 2560 a na ňom lcd s tlačítkami / sel, right, left,up,down / a chcel by som tlačítkami nastavovať regulačné teploty . normálne bude bežať program a display zobrazovať hodnoty . Keď stlačím select tak sa dostanem do menu a UP a DOWN si nastavím ktorú hodnotu chcem zmeniť / napr. teplota rele 1 , teplota rele 2, teplota rele 3 atď / . Nastavím na teplota relé 2 stlačím select vypíše sa mi teplota rele 2 je 33 stupňov a tlačidlami UP a DOWn ju budem vedieť znížiť - zvíšiť a potvrdím uloženie a zápis tlačídlom RIGHT a LEFT výstup z nastavovania menu .

Niečo také by som potreboval .

Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

Re: nastavovacie menu

Poslaťod roman » Str 26. Aug 2015 20:23:50

nikto nič ?

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: nastavovacie menu

Poslaťod posjirka » Štv 27. Aug 2015 20:43:30

na to ti staci zakladni menu knihovna hledej menu backen.
kratky exampl jsem dava na blog posjirka.pise.cz

nadefinujes si nazvy jednotlivych obrazovek a jejich typy (menu. podmenu)
pak tomu vlozich hirearchii tedy co je pod cim
nakonwc ti kazdy koncovy prvek bude volat nejaky podprogram / funkci a tam si zadas co to ma delat.

je tu nevyhoda ze pises pro kazdou teplotu zvlast polozku ale je to dan za jednoduchost a kompilator arduina je tu vcelku efektivni a docela to smrskne.

ja jsem s nim zacinal a uz jsem dlouho menu nedelal ale naposledy jsem si navrhnul vlastni princip protoze jsem mel velke mnozstvi variant koncovych hodnot. nakonwc je to vcelku pruzne menu ale ma asi 1300 radku takze by ti to asi moc nepomohlo. udelal jsem to jako x obrazovek kde 0 byla prehledova a 1 az 10 nastavovaci jednoucelove. ke kazde obrazovce jsem si udelal promenou min a max jako mezni hodnoty promenne. jestli se na to dostanu tak ti zkusim napsat kratky example.

jak mas vyreseno volani tlacitek ? ptas se na ne v nejakych casovych intervalech nebo v hlavni smycce a pak mas timeout? nekdy je lepsi volat lcd treba 1x za sekundu protoze kdyz nechas zobrazit kurzor a obnovujes lcd casteji tak neni videt ..

Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

Re: nastavovacie menu

Poslaťod roman » Štv 27. Aug 2015 22:46:36

zatiaľ som to pozrel na rýchl oale neviznal som sa z toho

Ešte sa na to pozriem .

Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

Re: nastavovacie menu

Poslaťod roman » Ned 30. Aug 2015 13:52:52

posjirka - nemáš ešte nejaký link kde je pouzite menu becken ?

Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

Re: nastavovacie menu

Poslaťod roman » Ned 30. Aug 2015 20:10:19

posjirka - našiel som na príklad toto , ale ked som to nahral do arduina tak som sa z položky menu P1 nedosta do polozky P11, nevieš mi pomocť prečo ?
https://codebender.cc/sketch:37125#Menu ... sample.ino

Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Re: nastavovacie menu

Poslaťod barado » Ned 30. Aug 2015 20:15:20

Chlapci, ak mate viac skusenosti s vyuzitim menu, tak sa pripajam s poziadavkou na Vase odporucania. Viem, ze neexistuje univerzalny navod, ale ak ma niekto viac skusenosti, tak aspon take zhrnutie, na co su ktore menu kniznice vhodne b bodlo.
Osobne som vyskusal 5 roznych moznosti a zatial som zostal pri LCDMenuLib. Mimochodom to laborovanie mi zabralo asi 2 mesiace (som zaciatocnik).
Avsak tato kniznica je "obrovska" a zabera vela miesta v programe na UNO-e.
Myslim ze je to kniznica odtialto:
http://forum.arduino.cc/index.php/topic,73816.0.html

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: nastavovacie menu

Poslaťod posjirka » Uto 01. Sep 2015 15:12:41

tady jsem napsal velmi jednoduche menu jen pro predstavu na co vsechno je potreba pamatovat.
Zkusim se jeste podivat po internetu a napsat ten samy priklad za pouziti knihoven.
Doufam ze je to dobre okomentovane a na konci se nelekejte toho vyuziti stejneho nazvu funkce pro 2 odlišné funkce. řiká se tomu přetěžování metody/funkce a program si vybírá tu verzi, která mu sedí víc.
Kód: Vybrať všetko
// jednoduche menu
// by JP 2015
// HW
// Arduino Uno
// LCD Keypad Shield DF Robot v1
//
// SW
// Arduino IDE 1.0.5
// http://www.arduino.cc/en/Tutorial/LiquidCrystal
//

// OBRAZOVKA 0 - prehledova
// 0123456789012345
// Teplota:  20   C
// Termostat:0

// OBRAZOVKA 1 - nastavení termostatu
// 0123456789012345
// Nast.termostatu
// 20 C

// OBRAZOVKA 2 - podsviceni LCD
// 0123456789012345
// Podsviceni LCD
// 100 %

// OBRAZOVKA 3 - about
// 0123456789012345
//   Termostat v1
//    by JP 2015

// funkce:
// sipka nahoru/dolu prepina mezi obrazovkami
// sipka vlevo/vpravo upravuje hodnoty

// knihovny
#include <LiquidCrystal.h>

// piny kde je pripojen LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Promenne
int merenaTeplota = 20; // jakoby merena teplota
int nastavenaTeplota = 10; // teplota sepnuti termostatu
int aktualniObrazovka = 0; // cislo prave sledovane obrazovky
int pocetObrazovek = 3; // cislo posledni obrazovky + 0-tá obrazovka
int minimum = 0; // doraz minimalni hodnoty - nasatvuje se pro kazdou obrazovku zvlast
int maximum = 0; // doraz maximalni hodnoty - nasatvuje se pro kazdou obrazovku zvlast
int krok = 0; // o kolik se bude zvysovat/snizovat hodnota
int podsviceni = 50; // intenzita podsviceni v %
boolean termostat = 0; // stav termostatu 0 - vypnut / 1 - zapnut
int pomocna = 0; // pomocna promenna pro


void setup() {
  lcd.begin(16, 2); // nastavení LCD
  lcd.clear(); // smaze LCD
  aktualniObrazovka = 0; // nulovani cisla obrazovky 
}

void loop() {
 
  // tady by byla merici cast kodu ja jsem nastavil teplotu natvrdo jako 20 
 
  // cteni klaves
  lcd.clear(); // mazani lcd
  switch (aktualniObrazovka) // rozdeluje funkce a text jednotlivych obrazovek
  {
    case 0 :
    { // prehledova obrazovka
      lcd.setCursor(0,0); // nastav kurzor na zacatek prvniho radku
      lcd.print("Teplota:"); // perfix
      lcd.print(merenaTeplota); // hodnota "merene" teploty
      lcd.print("C"); // jednotky
      lcd.setCursor(0,1); // nastav kurzor na zacatek druheho radku
      lcd.print("Termostat:"); // perfix
      lcd.print(termostat); // stav termostatu
      readkey(); // cteni klaves
      break;
    }
    case 1 :
    { // nastaveni tremostatu
      minimum = 0; // doraz minimalni hodnoty
      maximum = 50; // doraz maximalni hodnoty
      krok = 1; // o kolik se bude zvysovat/snizovat hodnota
      lcd.setCursor(0,0); // nastav kurzor na zacatek prvniho radku
      lcd.print("Nast.termostatu");
      lcd.setCursor(0,1); // nastav kurzor na zacatek druheho radku
      lcd.print(nastavenaTeplota); // teplota sepnuti termostatu
      lcd.print("C"); // jednotky
      nastavenaTeplota = readkey(nastavenaTeplota); // cteni klaves a uprava promenne
      break;
    }
    case 2 :
    { // nastaveni podsviceni
      minimum = 0; // doraz minimalni hodnoty
      maximum = 100; // doraz maximalni hodnoty
      krok = 5; // o kolik se bude zvysovat/snizovat hodnota
      lcd.setCursor(0,0); // nastav kurzor na zacatek prvniho radku
      lcd.print("Podsviceni LCD");
      lcd.setCursor(0,1); // nastav kurzor na zacatek druheho radku
      lcd.print(podsviceni); // teplota sepnuti termostatu
      lcd.print("%"); // jednotky
      podsviceni = readkey(podsviceni); // cteni klaves a uprava promenne
      break;
    }
    case 3 :
    { // about
      lcd.setCursor(0,0); // nastav kurzor na zacatek prvniho radku
      lcd.print("  Termostat v1");
      lcd.setCursor(0,1); // nastav kurzor na zacatek druheho radku
      lcd.print("   by JP 2015"); // jednotky
      readkey(); // cteni klaves
      break;
    }
    default :
    { // pro pripad kolize cisla obrazovek
      aktualniObrazovka = 0; // nulovani cisla obrazovky 
      break;
    }
  } 
 
  // tady by mela byt nejaka ovladaci logika
  if (nastavenaTeplota >= merenaTeplota) {
    termostat = 1; // sepni termostat 
  } else {
    termostat = 0; // vypni termostat
  }
  analogWrite(10, podsviceni*2.5); // intenzita podsviceni
  delay(250); // zabranuje kmitani obrazovky a vytvari zpozdeni mezi stisky klaves
}

int readkey(int hodnota) { // cteni klaves a reakce na jejich stisk
  if (analogRead(0) < 555 && analogRead(0) > 380) { // sipka vlevo
    if (hodnota > minimum) {
      hodnota = hodnota - krok; // zmensi o krok
    }
  }
  if (analogRead(0) < 380 && analogRead(0) > 195) { // sipka dolu
    if (aktualniObrazovka < pocetObrazovek) {
      aktualniObrazovka++; //prejdi na na dalsi obrazovku
    } else {
      aktualniObrazovka = 0; // prejdi na obrazovku 0
    }
  }
  if (analogRead(0) < 195 && analogRead(0) > 50) { // sipka nahoru
    if (aktualniObrazovka > 0) {
      aktualniObrazovka--; //prejdi na na dalsi obrazovku
    } else {
      aktualniObrazovka = pocetObrazovek; // prejdi na obrazovku 0
    }
  }
  if (analogRead(0) < 50)  { // sipka vpravo
    if (hodnota  < maximum) {
      hodnota = hodnota + krok; // zvetsi o krok
    }
  }
  return hodnota; // navrat upravene hodnoty
}

void readkey() { // cteni klaves a reakce na jejich stisk - bez editace
  if (analogRead(0) < 380 && analogRead(0) > 195) { // sipka dolu
    if (aktualniObrazovka < pocetObrazovek) {
      aktualniObrazovka++; //prejdi na na dalsi obrazovku
    } else {
      aktualniObrazovka = 0; // prejdi na obrazovku 0
    }
  }
  if (analogRead(0) < 195 && analogRead(0) > 50) { // sipka nahoru
    if (aktualniObrazovka > 0) {
      aktualniObrazovka--; //prejdi na na dalsi obrazovku
    } else {
      aktualniObrazovka = pocetObrazovek; // prejdi na obrazovku 0
    }
  }
}

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: nastavovacie menu

Poslaťod posjirka » Uto 01. Sep 2015 15:14:35

vetsina knihoven ma navic tu nevyhodu, ze neumi "prehledovou" obrazovku, jen polozky menu....

Príspevky: 28
Registrovaný: Štv 12. Feb 2015 11:05:28

Re: nastavovacie menu

Poslaťod roman » Uto 01. Sep 2015 21:26:58

Dík za pomoc , niečo takéto jednoduché som potreboval . Skúšal som ten menusystem ale nevedel som to s tým .

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: nastavovacie menu

Poslaťod posjirka » Uto 01. Sep 2015 22:26:43

menusystem je vcelku jednoduchý. Zkoušel jsem te´d najít pár knihoven a je to vsechno jednoucelove a celkem zasnu že pro keypad lcd shield není žádná přednastavená.
Přemýšlím ,jak udělat změnu hodnot, protože menusystem je na principu představený/výběr, takže nemůžeš plynule měmnit pramatry, ale jen si vybrat položku a podle ní zavolat funkci....

Príspevky: 89
Registrovaný: Uto 03. Jún 2014 21:48:35
Bydlisko: Košice Slovakia

Re: nastavovacie menu

Poslaťod kosice4 » Str 02. Sep 2015 1:40:33

@ posjirka si ty hlavička a dobrý človek čo chce pomôcť :)
Ďakujem za pomoc posjirka, Diego, Xeram a barado :)

Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Re: nastavovacie menu

Poslaťod barado » Str 02. Sep 2015 13:55:04

posjirka píše:menusystem je vcelku jednoduchý. Zkoušel jsem te´d najít pár knihoven a je to vsechno jednoucelove a celkem zasnu že pro keypad lcd shield není žádná přednastavená.
Přemýšlím ,jak udělat změnu hodnot, protože menusystem je na principu představený/výběr, takže nemůžeš plynule měmnit pramatry, ale jen si vybrat položku a podle ní zavolat funkci....


ahoj.
Tvoje konanie je samozrejme vynimocne a preto si ho vazim. A ak najdes vhodnu knihovnu, tak slubujem, ze tu moju aplikaciu prerobim.

Ta knihovna LCDMenu_Lib ma v examploch moznost pouzitia viacerych sposobov ovladania:
seriovu - dobre na odladenie arduina
analogovu - tam by mal fungovat ten lcd keypad shield, je pouzity iba jeden analogovy vstup
digitalnu - kazde tlacidlo ma svoj digitalny vstup
encoder - to je myslim jasne.
Knihovna osetruje aj kmitanie tlacidiel (debounce?? ci ako)

A ma aj inicializacnu (prehladovu) obrazovku, ktorej nastavis cas a po jeho uplynuti sa do nej LCD prepne.
Ale je naozaj moc velka. Aby som do Arduina zmestil nejake riadenie kurenia, musel som velmi optimalizovat kod a vela veci neosetrovat. Menil som napriklad aj prikazy if za switch, pretoze to vyslo za menej obsadeneho miesta.

Ďalší

Späť na Software