Подскажите пример меню для ардуино

ardo
Offline
Зарегистрирован: 23.11.2016

Не могу найти толкового примера меню для ардуино, делаю часы-термометр-анемометр проблема стала именно с меню.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
ardo
Offline
Зарегистрирован: 23.11.2016

Умничать и я могу. Если бы гугл давал нормальные результаты, а не хлам - не просил бы помощи на этом форуме. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ardo пишет:

Умничать и я могу. Если бы гугл давал нормальные результаты, а не хлам - не просил бы помощи на этом форуме. 

Сложность создания меню на ардуине заключена в тупизне искателей таких меню . Ведь меню должна работать в паралель к основной программе. Вот как решить эту паралель не все могут.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Не обязательно в параллель.

я обычно делаю одну горячую кнопку ( иногда на прерывании) и после ее нажатия останавливаю основной цикл и ухожу полностью в обработку меню. Иногда меню сидит в сетапе с записью параметров в еепром, потом рабочий цикл, переход в меню ресетом или завершением цикла по условиям.

Одновременности пока не требовалось.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

inspiritus пишет:

Не обязательно в параллель.

я обычно делаю одну горячую кнопку ( иногда на прерывании) и после ее нажатия останавливаю основной цикл и ухожу полностью в обработку меню. Иногда меню сидит в сетапе с записью параметров в еепром, потом рабочий цикл, переход в меню ресетом или завершением цикла по условиям.

Одновременности пока не требовалось.

Вот вы обычно делаете так, другие иначе. Вот у каждого своя оригинальная "песня", а чужие песни они "фуфло".

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ну отчего же можно и другие песни послушать. Я спел так как мне приработалось. Может теперь Вы споёте ;)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Моя песня вам не понравится. Надо сначало изучать ООП и Си++. Потом как проектировать программу. А затем слушать "песню". А вы хотите обойтись чужим #inclune "все включено.h"

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я? Мне своих песен хватает, и я описал свои способы и они мнея устраивают. А Вы тут разглагольствуете что и как изучать и кидаетесь странными обвинениями, типа что то хочу у Вас перенять. Мне до Вас и Вашего все равно . Успехов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Что у кого вы пытаетесь перенять. Я регулярно раз в полгода прикидываю как бы я написал меню. И каждый раз получается на иных принципах, чем раньше. Сейчас в этой теме мы обсужаетм "коня в вакууме". Так как вы  "очень одаренный" ТС тупо забыли описать ТЗ и на каком железе реализуете меню. Что у вас кнопки, энкодер, аналоговая клавиатура, сенсор. Экран какой . Вы немного подвиньтесь, а то вы свой спиной закрываете вид из моего хрустального шара.

nik182
Offline
Зарегистрирован: 04.05.2015
ardo
Offline
Зарегистрирован: 23.11.2016

Ардуино нано + max7219 2последовательно включенных +кнопки(резистивная клавиатура)+ RTC +ds12b20 2шт.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну для такой конструкции у меня меню нет. Но  упрощеную версию могу показать . Клавиатура из трех кнопок + - shift . Двигать вверх вниз + и -. А вот изменение величины надо (- и shift) или (+ и shift) . Вывод в Serial.

//**/
unsigned long mill;
//------Cl_3Btn----------------------
// класс клавиатура из 3х кнопок (+,-,shift)
class Cl_3Btn {
  protected:
    const byte pin1, pin2, pin3;
    void (*Do1)(), (*Do2)(), (*Do3)(), (*Do4)();
    bool bounce1 = 0, bounce2 = 0;
    bool btn1, oldBtn1, btn2, oldBtn2;
    unsigned long past1, past2;
  public:
    Cl_3Btn(byte pin1_, byte pin2_, byte pin3_,
            void (*Do1_)(), void (*Do2_)(), void (*Do3_)(), void (*Do4_)())
      : pin1(pin1_), pin2(pin2_), pin3(pin3_),
        Do1(Do1_), Do2(Do2_), Do3(Do3_), Do4(Do4_) {}
    void setup() {
      pinMode(pin1, INPUT_PULLUP);
      pinMode(pin2, INPUT_PULLUP);
      pinMode(pin3, INPUT_PULLUP);
    }
    void loop() {
      bool newBtn1 = digitalRead(pin1);
      bool newBtn2 = digitalRead(pin2);
      bool newBtn3 = digitalRead(pin3);
      if (!bounce1 && newBtn1 != btn1) {
        bounce1 = 1;
        past1 = mill;
      }
      if (bounce1 && mill - past1 >= 10) {
        bounce1 = 0 ;
        oldBtn1 = btn1;
        btn1 = newBtn1;
        if (!btn1 && oldBtn1 && newBtn3) (*Do1)();
        if (!btn1 && oldBtn1 && !newBtn3) (*Do3)();
      }
      if (!bounce2 && newBtn2 != btn2) {
        bounce2 = 1;
        past2 = mill;
      }
      if (bounce2 && mill - past2 >= 10) {
        bounce2 = 0 ;
        oldBtn2 = btn2;
        btn2 = newBtn2;
        if (!btn2 && oldBtn2 && newBtn3) (*Do2)();
        if (!btn2 && oldBtn2 && !newBtn3) (*Do4)();
      }
    }
};
//------------------------------------
int var0 = 4;
void viev0() {
  Serial.println();
  Serial.print("var0=");
  Serial.print(var0);
}
void minus0() {
  if (0 < var0) --var0;
}
void plus0() {
  if (var0 < 10) ++var0;
}
//**
int var1 = 4;
void viev1() {
  Serial.println();
  Serial.print("var1=");
  Serial.print(var1);
}
void minus1() {
  if (0 < var1) --var1;
}
void plus1() {
  if (var1 < 10) ++var1;
}
//**
int var2 = 4;
void viev2() {
  Serial.println();
  Serial.print("var2=");
  Serial.print(var2);
}
void minus2() {
  if (0 < var2) --var2;
}
void plus2() {
  if (var2 < 10) ++var2;
}
struct Note {
  void (*viev)();
  byte up;
  byte down;
  void (*minus)();
  void (*plus)();
};
struct Note Menu[] = {
  viev0, 0, 1, minus0, plus0,//--0
  viev1, 0, 2, minus1, plus1,//--1
  viev2, 1, 2, minus2, plus2,//--2
};
byte num = 0;
//-----компоновка----------------------
void Do1Btn() {
  num = Menu[num].down;
  Menu[num].viev();
}
void Do2Btn() {
  num = Menu[num].up;
  Menu[num].viev();
}
void Do3Btn() {
  Menu[num].minus();
  Menu[num].viev();
}
void Do4Btn() {
  Menu[num].plus();
  Menu[num].viev();
}
Cl_3Btn Keys(/*пин +*/2,/*пин -*/3,/*пин shift*/4,
                         /*обработчик*/Do1Btn,/*обработчик*/Do2Btn,/*обработчик*/Do3Btn,/*обработчик*/Do4Btn);
//-----main-----------------------
int main() {
  init();
  // setup()
  Serial.begin(9600);
  Keys.setup();
  Menu[num].viev();
  for (;;) {
    // loop()
    mill = millis();
    Keys.loop();
  }
  return 0;
}
/*Скетч использует 3050 байт (9%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 264 байт (12%) динамической памяти, оставляя 1784 байт для локальных переменных. Максимум: 2048 байт.
*/