HELP , не могу реализовать меню настройки времени. Код (C++): } void loop() { if ( !menuActiv && !SetTimeActiv) // если не активно меню, и меню настройки времени - выводим время { times(); if (myTouch.dataAvailable())//если было касание по тачу { tone(8,800,20);//пищалка last_tach = millis(); // в процедуре меню, после каждого нажатия на кнопку не забываем обновлять время last_tach = millis() myGLCD.clrScr(); //чистим экран от часов menu();//идем в меню } } /*****************************************/ /***************MENU**********************/ /*****************************************/ else if ( menuActiv ) // если активно меню { if (myTouch.dataAvailable())//если есть нажатие { tone(8,300,10);//пищим от нажатия last_tach = millis();//обновляем таймер check = myButtons.checkButtons();// чекаем что было нажато /****************************************************/ if (check == block) { if (myButtons.buttonEnabled(button6)) myButtons.disableButton(button6, true); else myButtons.enableButton(button6, true); } /****************************************************/ if (check == MyTime) { myButtons.deleteAllButtons(); menuActiv = false; myGLCD.clrScr(); } /****************************************************/ if (check == settime) // если нажали, то идем настраивать время { menuActiv = false;// вырубили меню myButtons.deleteAllButtons(); // удалили ненужные кнопки myGLCD.clrScr(); // почистили дисплей setTimeData(); } } } /************************************************************ /***********************SET TIME***************************** /* *********************************************************/ else if ( SetTimeActiv ) // если активны настройки времени { /******************Заносим данные даты/времени в переменные****************/ time_sec = time.seconds; time_min = time.minutes; time_hour = time.Hours; time_day = time.day; time_month = time.month; time_year = time.year ; /******************Выводим данные времени************/ myGLCD.printNumI(time_hour, 132, 42); myGLCD.printNumI(time_min, 202, 42); myGLCD.printNumI(time_sec, 272, 42); /************************и даты********************/ myGLCD.printNumI(time_day, 132, 141); myGLCD.printNumI(time_month, 202, 141); myGLCD.printNumI(time_year, 272, 141); if (myTouch.dataAvailable())//если есть нажатие { tone(8,300,10);// пищим от радости last_tach = millis();//обновляем таймер check2 = myButtons.checkButtons();// чекаем что было нажато /********************** Отмена изменений**************************/ if (check2 == cancel) { SetTimeActiv = false; myButtons.deleteAllButtons(); myGLCD.clrScr(); menu(); } /*****************************СЕКУЕДЫ up*****************************/ if (check2 == sec_up) { Serial.print("sec up = "); time_sec ++; if (time_sec > 59) { time_sec = 1; } Serial.println(time_sec); } /*****************************СЕКУЕДЫ down*****************************/ if (check2 == sec_down) { Serial.print("sec down = "); time_sec--; if (time_sec < 1) { time_sec = 59; } Serial.println(time_sec); } /*****************************МИНУТЫ + *****************************/ if (check2 == min_up) { time_min ++; if (time_min >59) { time_min = 0; } } /*****************************МИНУТЫ - *****************************/ if (check2 == min_down) { time_min --; if (time_min < 1) { time_min = 59; } } /*****************************ЧАСЫ + *****************************/ if (check2 == hours_up) { time_hour ++; if (time_hour > 23) { time_hour = 1; } } /*****************************ЧАСЫ - ******************************/ if (check2 == hours_down) { time_hour --; if (time_hour < 1) { time_hour = 23; } } /*****************************ДНИ + *****************************/ if (check2 == day_up) { time_day ++; if (time_day > 31) { time_day = 1; } } /*****************************ДНИ - *****************************/ if (check2 == day_down) { time_day --; if (time_day < 1) { time_day = 1; } } /*****************************МЕСЯЦ + *****************************/ if (check2 == day_up) { time_month ++; if (time_month > 12) { time_month = 1; } } /*****************************МЕСЯЦ - *****************************/ if (check2 == month_down) { time_month --; if (time_month < 1) { time_month = 12; } } /*****************************ГОД + *****************************/ if (check2 == year_up) { time_year ++; if (time_year > 99) { time_year = 1; } } /*****************************ГОД - *****************************/ if (check2 == year_down) { time_year --; if (time_year = 1) { time_year = 99; } } } } /****************************************************/ if ( menuActiv && millis() - last_tach > 60000 ) //если ничего не нажимали 3 минуты - деактивируем меню { menuActiv = !menuActiv; //меню теперь не активно myButtons.deleteAllButtons();//т.к из меню вышли принудительно удаляем кнопки. myGLCD.clrScr();//стираем графику от меню,loop прогрузит часы } /*********************************************************/ if ( SetTimeActiv && millis() - last_tach > 60000 ) //если ничего не нажимали 3 минуты - деактивируем меню { SetTimeActiv = !SetTimeActiv; myButtons.deleteAllButtons();//т.к из меню вышли принудительно удаляем кнопки. myGLCD.clrScr();//стираем графику от меню,loop прогрузит часы } }
и продолжение /*********************Меню****************/ Код (C++): void menu() { Serial.print("menuActiv="); Serial.println(menuActiv); if ( !menuActiv ) { Serial.println("Start Menu"); menuActiv = true; myGLCD.setFont(SmallFont); int but_hg, but_wh, otstup_x, otstup_y, check; but_hg = 30; but_wh = 85; otstup_x = 19; otstup_y = 10; Serial.print("menuActiv= "); Serial.println(menuActiv); button1 = myButtons.addButton(otstup_x, otstup_y, but_wh, but_hg, "Settings"); MyTime = myButtons.addButton(otstup_x * 2 + but_wh, otstup_y, but_wh, but_hg, "Time"); settime = myButtons.addButton(but_wh * 2 + otstup_x * 3, otstup_y, but_wh, but_hg, "Set Time"); button4 = myButtons.addButton(otstup_x, otstup_y * 2 + but_hg, but_wh, but_hg, "Test"); button5 = myButtons.addButton(otstup_x * 2 + but_wh, otstup_y * 2 + but_hg, but_wh, but_hg, "Test"); button6 = myButtons.addButton(but_wh * 2 + otstup_x * 3, otstup_y * 2 + but_hg, but_wh, but_hg, "Test", BUTTON_DISABLED); block = myButtons.addButton(279, 199, 40, 40, "Y", BUTTON_SYMBOL); myButtons.drawButtons(); } } /*****************************настройка времени***************************/ void setTimeData() { Serial.print("SetTimeActiv="); Serial.println(SetTimeActiv); if ( !SetTimeActiv ) { Serial.println("Start SetTimeActiv"); SetTimeActiv = true; Serial.print("SetTimeActiv="); Serial.println(SetTimeActiv); myGLCD.setFont(BigFont); delay(10); /***********************ОФОРМЛЕНИЕ*************************/ myGLCD.drawRoundRect(1, 1, 318, 100);//рамка для часов myGLCD.print("Time:", 16, 42); myGLCD.drawRoundRect(1, 104, 318, 194);//рамка для даты myGLCD.print("Date:", 16, 141); myGLCD.print(":", 175, 42 ); myGLCD.print(":", 245, 42); myGLCD.print("-", 175, 141); myGLCD.print("-", 245, 141); /******************************************************/ short int but_hg, but_wh; but_hg = 25; but_wh = 25; /**********************TIME BUTTONS****************************/ hours_up = myButtons.addButton(135, 10, but_wh, but_hg, " +"); hours_down = myButtons.addButton(135, 64, but_wh, but_hg, " -"); min_up = myButtons.addButton(205, 10, but_wh, but_hg, " +"); min_down = myButtons.addButton(205, 64, but_wh, but_hg, " -"); sec_up = myButtons.addButton(275, 10, but_wh, but_hg, " +"); sec_down = myButtons.addButton(275, 64, but_wh, but_hg, " -"); /**********************DATE BUTTONS****************************/ month_up = myButtons.addButton(135, 112, but_wh, but_hg, "+"); month_down = myButtons.addButton(135, 161, but_wh, but_hg, "-"); day_up = myButtons.addButton(205, 112, but_wh, but_hg, "+"); day_down = myButtons.addButton(205, 161, but_wh, but_hg, "-"); year_up = myButtons.addButton(275, 112, but_wh, but_hg, "+"); year_down = myButtons.addButton(275, 161, but_wh, but_hg, "-"); /**********************BUTTONS*************************/ cancel = myButtons.addButton(1, 200, 150, 39, "Cancel"); save = myButtons.addButton(167, 200, 150, 39, "Save"); myButtons.drawButtons(); } } пробывал разные варианты но что то не получается, есть косячек но не знаю где зарыт, частенько как захожу в меню настройки времени, рамки иногда не отрисовывается, а создаются одни кнопки, раза 2-4 выйду до главного экрана, потом опять до настроек и все отображается. этот глюк не постоянный time_sec = time.seconds;//беру время из time.seconds , и записываю в переменную time_sec. проверяю выводя в монитор т.к на дисплее изменений нет Код (C++): /*****************************СЕКУЕДЫ up*****************************/ if (check2 == sec_up) { Serial.print("sec up = "); time_sec ++; if (time_sec > 59) { time_sec = 1; } Serial.println(time_sec); } /*****************************СЕКУЕДЫ down*****************************/ if (check2 == sec_down) { Serial.print("sec down = "); time_sec--; if (time_sec < 1) { time_sec = 59; } получатеся так. допустим сейчас 40 секунд. нажимаю sec_up значение будет 41? и sec_sown = 39 как будто центр отсчета при любом раскладе 40 секунд, и больше не прибавляет, и не уменьшает
Сначало time_sec = time.seconds, потом или time_sec ++ или time_sec --, а дальше, в следующем цикле сново происходит time_sec = time.seconds. Почему рамки рисуются через раз, не знаю, надо копаться. Попробуйте отрисовку рамок вынести в отдельную процедуру, на входе и выходе процедуры поставьте контрольные точки (Serial.println('чего-нибудь") и вызываетй эту процедуру из нужного места.
Спасибо,действительно чушь написал. изменил до такого вида Код (C++): if ( !menuActiv && !SetTimeActiv) // если не активно меню, и меню настройки времени - выводим время { /******Заносим данные даты/времени в переменные пока настройки не активны******/ time_sec = time.seconds; time_min = time.minutes; time_hour = time.Hours; time_day = time.day; time_month = time.month; time_year = time.year ; times(); } далее клацаю по тачу, эти переменные больше не трогаются. время изменяет, сохраняет. кроме рамок. сделал для проверки так Код (C++): if (!SetTimeActiv) { /***********************ОФОРМЛЕНИЕ*************************/ Serial.println(" In"); myGLCD.drawRoundRect(1, 1, 318, 100);//рамка для часов myGLCD.print("Time:", 16, 42); myGLCD.drawRoundRect(1, 104, 318, 194);//рамка для даты myGLCD.print("Date:", 16, 141); myGLCD.print(":", 175, 42 ); myGLCD.print(":", 245, 42); myGLCD.print("-", 175, 141); myGLCD.print("-", 245, 141); Serial.println(" Out"); SetTimeActiv = true; } if (SetTimeActiv) { //код } в мониторе все проходит но рамок нет. появляются после выхода в главное меню(до часов) потом обратно в настройки( и то не всегда отображается).
Да вы мега мозг просто) и в мыслях небыло так сделать, да и подумать даже не мог что из за этого через раз может срабатывать. Сейчас отрисовка идет на отлично. сбоев не наблюдается. Спасибо большое за отличную помощь.
Оу,красотище какая, очень здорово). не поделитесь русификацией библиотеки? Я находил библиотеку с русиком, но у меня даже вложеный скетч ИДЕшка не компилит. а такой вариант как то не очень Код (C++): myGLCD.print("SmallFont (c \xA3""o""\x99\x99""ep""\x9b\x9f""o""\x9e"" pycc""\x9f""o""\x98""o):", 15, 15);
Тут вынужден огорчить, сам использую именно такой вариант русификации. Я все используемые слова определил в таблицу, далее в коде просто выбираю нужное слово из таблицы. Не очень удобно, но меня устраивает. Код (C++): // Определение строк отображаемых дисплеем (храним во flash, а не в ОЗУ) const char p_minino[] PROGMEM = "M""\x9D""\xA2""\x9D""\xA2""o"; const char p_street[]PROGMEM = "\x8A""\xA0""\x9D""\xA6""a"; const char p_inhome[] PROGMEM = "\x82""o""m""a"; ..... // Затем создаем таблицу для ссылки на строки. PGM_P const string_table[] PROGMEM = { "", p_minino, // 1 p_street, // 2 p_inhome, // 3 ...... // пример вывода нужной фразы myGLCD.print(GetWord(2),x,y-35);
Заберайте в копилку, добрый человек поделился библиотекой с вшитой функцией printRus, и шрифтами. выводится очень удобно Код (C++): myGLCD.printRus("Пишем по Русски ", 15, 100);