Так. Я уже почти съел дневной лимит траффика на телефоне. Пойду-ка я лучше свой класс "оптимизирую" до невозможности, а там - посмотрим что получится ))))
Все не надо угождать . Угодите хотя бы себе. Сможите вы пользуясь вашей библиотекой ускорить вашу работу в любом другом отличном от этого проекта.
Цитата:
Во вторых - "надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать. Я не могу запретить копать своё творение всем кому не попадя и потом еще выслушивать нелестные отзывы в свой адрес насчёт надёжности и удобства использования.
Копать придется вам. Потому что если ваша библиотека хоть немного не подходит к другому проекту, то вам придется ее "точить напильником" под эту задачу.
Цитата:
В третих - человек не понимающий как работает его скетч, скорее всего, не является его автором. Так что это не обо мне.
Да вы что говорите. Сюда , на форум такие автора приходят. Или тащую чужие скетчи , или свои убожества, в которых они как автора заблудились. Например Вы. Вы автор и вы как автор не понимаете как работает язык Си, его компилятор и в конце концов как работает ваша программа.
Цитата:
В четвертых: я не собираюсь торговать своими библиотеками потому что я только еще учусь программировать и врядли мне вообще такое придёт в голову.
Вот попробуйте продать вашу библиотеку с нулевой стоимостью и бесплатной раздачей. Это позволяет трезво смотреть на жизнь , свою работу и свои увлечения.
Цитата:
В пятых: мега и дуэ - не панацея и я уже не уверен что мне хватит 512к для того, что я задумал (((((((.....
Ну да дайте мне дохрена денег и я покажу на что я способен. Но скорее всего их тупо просрать и дать стране говно. Умерте свои неуемные фантазии. Если из малого не можете сделать конфетку, то и из большого и подавно.
А я почему-то считал, что в первую очередь тот, кто разработал/произвел эту краску.
А тот, кто с кисточкой в руках, может вообще иметь весьма смутные представление о физике, химии и экономике.
Да вы первоклассный клиент. В магазине готовы брать рекомендованную краску по любой цене, в ресторане есть, что дали... Ведь повар же лучше знает, чем вам питаться, он профессионал и, возможно, сам разработал подаваемое блюдо.
andriano пишет:
Другими словами: если мы видим покрашенную поверхность, то при некоторых условиях (достаточноая толщина покрытия, приемлемое освещение и отсутствие проблем со зрением) мы вполне адекватно можем судить о цвете этой краски.
Вы меня извините, но я не считаю себя вправе спорить с тем, кто на глазок может достоверно определить цвет и толщину лакокрасочного покрытия, а так же концепцию всего, чего угодно во всех существующих философских смыслах. Я простой человек. Считайте, что вы меня убедили и покончим с этим. Право на последнее слово оставляю за вами.
о-то не получается пока что. После описания всех используемых шрифтов в "user.h" компилятор пишет вот что:
In file included from sketch\user.cpp:1:0:
user.h:3: error: 'uint8_t' does not name a type
extern uint8_t BigFont[];
И так на каждый шрифт.
Как только увидели подобную хрень, тут ставьте в начало этого .h файла #include <arduino.h> и как руокй снимет. Этит типы там определены (не там, на там нужный файл включается).
Позже я вижу. что Вы решили проблему вставкой #include <UTFT.h>, правильно, потому что UTFT.h в свою очередь включает arduino.h
"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать.
Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "3,14здец котёнку" - работать не будет к гадалке не ходи. Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)
Кстати у меня есть сомнения насчёт строки №2 в "user.cpp"
Не, знаю какого рода у Вас сомнения, но если сомневаетесь - выбросьте. Только тогда и строку 3 заодно не забудьте.
Что до Ваших дилемм, это вопрос стиля, привычек и т.п. Любыми своими комментариями я рискую вызвать такой холивар, по сравнению с которым то, что здесь сейчас - научная дискуссия специалистов по бабочкам.
В целом нет ничего страшного и ненормального в том, что функции маленикие. Скорее наоборот. Также нет ничего страшного в том, что одни классы использую другие, а для чего их тогда создавать. Более того, классы умеют наследоваться друг от друга (в этом их главная прелесть) и классы потомки вовсю используют методы классов-родителей. Всё это нормальные будни.
Что до размера функций, посмотрите на кусочек кода и того проекта, о котором я здесь уже писал (в котором куча наследуемых классов)
Видите размер функций? Вот такие они у меня практически всегда. Для данного языка (за очень редким исключением) действует правило: "если функция не умещается на экран, значит что-то не так со структурой программы".
"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать.
Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "3,14здец котёнку" - работать не будет к гадалке не ходи. Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)
Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))
Насчет холивара не переживайте, будет желание его затеять - с удовольствием почитаю. В спорах всегда что-нибудь рождается.
Вот о наследовании и вызове друг друга из одного исполняемого.cpp: Эта строчка мне не понятна:
void ClockScreen::ShowTime(void)
Как это по русски? Типа: "Функция: "ClockScreen" использует внутри себя функцию "ShowTime" ? Или, скорее всего я чего-то не понимаю. В общем - вчера я хотел вынести в класс, буквально, три куска программы...
Сразу хочу оговориться что использовать классы в привычном понимании мне пока что не требуется: создать несколько удобных и часто используемых функций, которые потом, возможно, найдут применение и в других проектах. Всё обстоит несколько иначе. На данном этапе мне нужно просто разгрузить основной скетч. Я уже даже готов вовсе отказаться от классов, а просто оставить отлаженый кусок программы в другом файле, а следующую часть - писать с нуля, за исключением общих #define и переменных.
Так вот. У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "does not name a type"
Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))
Нет, я никогда не делю баги на крупные и мелкие.
Buzzer2010 пишет:
Эта строчка мне не понятна:
void ClockScreen::ShowTime(void)
Как это по русски?
Интересный вопрос. Вот вторая строка Вашего .cpp файла из стартового поста данного топика
void user::InitEMU()
Как это по русски? Так вот, точно также.
Buzzer2010 пишет:
У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "does not name a type"
Даже не знаю, как это её надо так вызывать :) Ну, покажите, похихикаем.
Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))
Нет, я никогда не делю баги на крупные и мелкие.
Я не о Вас, а о Законах Мерфи ))))
ЕвгенийП пишет:
Buzzer2010 пишет:
Эта строчка мне не понятна:
void ClockScreen::ShowTime(void)
Как это по русски?
Интересный вопрос. Вот вторая строка Вашего .cpp файла из стартового поста данного топика
void user::InitEMU()
Как это по русски? Так вот, точно также.
Нет не точно так ! У меня "void" второй раз в скобке не написан. И чего это у Вас в одном файле два класса что ли? Или это примеры из разных файлов? Я думал что один класс - один файл...
ЕвгенийП пишет:
Buzzer2010 пишет:
У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "does not name a type"
Даже не знаю, как это её надо так вызывать :) Ну, покажите, похихикаем.
sketch\user.cpp.o: In function `_GLOBAL__sub_I_time_x':
sketch/user.cpp:12: multiple definition of `temp'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:E:\!ARDUINO\WORK\DUE\DUE_GRAFIC_TEMP_MENU_USER_h/DUE_GRAFIC_TEMP_MENU_USER_h.ino:22: first defined here
sketch\user.cpp.o:(.data.menu_temp+0x0): multiple definition of `menu_temp'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:(.data.menu_temp+0x0): first defined here
sketch\user.cpp.o: In function `_GLOBAL__sub_I_time_x':
sketch/user.cpp:12: multiple definition of `gr'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:E:\!ARDUINO\WORK\DUE\DUE_GRAFIC_TEMP_MENU_USER_h/DUE_GRAFIC_TEMP_MENU_USER_h.ino:22: first defined here
sketch\user.cpp.o:(.data.tr+0x0): multiple definition of `tr'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:(.data.tr+0x0): first defined here
sketch\user.cpp.o:(.data.go+0x0): multiple definition of `go'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:(.data.go+0x0): first defined here
sketch\user.cpp.o: In function `_GLOBAL__sub_I_time_x':
sketch/user.cpp:12: multiple definition of `temp_y'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:E:\!ARDUINO\WORK\DUE\DUE_GRAFIC_TEMP_MENU_USER_h/DUE_GRAFIC_TEMP_MENU_USER_h.ino:22: first defined here
sketch\user.cpp.o: In function `_GLOBAL__sub_I_time_x':
sketch/user.cpp:12: multiple definition of `time_x'
sketch\DUE_GRAFIC_TEMP_MENU_USER_h.ino.cpp.o:E:\!ARDUINO\WORK\DUE\DUE_GRAFIC_TEMP_MENU_USER_h/DUE_GRAFIC_TEMP_MENU_USER_h.ino:22: first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Due (Programming Port).
Сейчас, правда, он нашёл другой способ вынести мне мозг, но зато, кажется, всё правильно хотя бы с точки зрения синтаксиса...
Вот 135-я строка в user.cpp - не вызывается "temp_ClrScrn()" пишет что.... Сейчас уже ничего не пишет ((( Но писал что перед "temp_ClrScrn()" ожидается какой-то идентификатор... А сейчас не пишет, потому что везде у него либо "multiple definition of" либо, если переменные выносишь в главный скетч - "not declared in this scope" (((((( Уже и не знаю что делать ((((
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Я Вам уже раньше писал - почитайте хорошую книжку, ну нельзя такие вещи осваивать методом тыка.
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Мне бы на Ваших лекциях посидеть )))) А книжная инфа с первого раза не доходит...
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
А класс-то зачем для двух функций?
Так это пока только две и то - функциями их назвать как-то не получается. Первая - это баловство, удалю потом. просто что бы не пихать сразу километр кода, а научиться с классами обращаться. А вторая - это одна из ветвей проекта и самая простенькая причём. А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.
как-то так -
скетч:
#include <setup.h>
#include <loop.h>
Используем библиотеку tmp в папке: D:\MyDOC\Arduino\libraries\tmp (legacy)
Скетч использует 298 байт (4%) памяти устройства. Всего доступно 6144 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле
int kaka;
и описывается со словом exetrn в .h файле
extern int kaka;
тогда её видно везде, куда включён этот include файл.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.
как-то так -
скетч:
#include <setup.h>
#include <loop.h>
Используем библиотеку tmp в папке: D:\MyDOC\Arduino\libraries\tmp (legacy)
Скетч использует 298 байт (4%) памяти устройства. Всего доступно 6144 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
где
setup.h
void setup() {}
loop.h
void loop() {}
Интересно, но как раз секции ''Setup()" и "Loop()" не займут много места. Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, зацикленные по "do-while(переменная-условие выхода из цикла)", доступ к которым, будет происходить из "Loop()".
sadman41 пишет:
Buzzer2010 пишет:
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?
Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()".
приведи простой пример на языке дуино, иначе я не понимаю твой руский языка - что за нах "самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()""?
Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()".
приведи простой пример на языке дуино, иначе я не понимаю твой руский языка - что за нах "самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()""?
На языке - не могу еще: я еще главное меню не написал ))))) Но принцип такой:
В главном .ino, в void loop(), крутится коротенькая програмка-меню со считыванием нажатий на тачскрин. В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)". Ну и так со всеми элементами основного меню будет происходить. Каждая такая функция будет лежмя лежать в классе "user" и ждать своего звёздного часа )))))
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле
int kaka;
и описывается со словом exetrn в .h файле
extern int kaka;
тогда её видно везде, куда включён этот include файл.
Вот чего я не учёл! Описание переменных как внешних, блин. Но ведь так как я сделал в посте #69
это же не очень сильно безграмотно? С областью видимости я еще разберусь!
В главном .ino, в void loop(), крутится коротенькая програмка-меню...
ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.
В главном .ino, в void loop(), крутится коротенькая програмка-меню...
ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.
До меня еще 99% этого непонятного языка не доходит, так что неудивительно что инклуды не вошли в этот 1%. Но я надеюсь что мне-таки удастся отделить зёрна от плевел. Во всяком случае если Вы знакомы с инклудами, что мешает и мне сделать тоже самое? Разве что - время...
Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками. А это раззделение по файлам для новичка еще более запутаннее будет.
Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками. А это раззделение по файлам для новичка еще более запутаннее будет.
Вот инетесно. Спасибо! Если бы Notepad++ еще и компилировать скетчи умел - я был бы просто счастлив ))))
Вот вопрос именно по возможностям языка: а как в С++ происходит возврат в вызывающую программу? Потому что "return" либо ничего не хочет делать, либо он не должен передавать управление, либо я его как-то не так использую, либо надо вообще это решить как-то иначе.
В общем - не могу теперь выбраться из своего любимого класса, обратно в "void loop()"
Теперь я понимаю, почему у нас ракеты падают на взлете, у них в конце RocketClass::Start() стоит return (Earth).
ЭЭЭЭ!!! Это я просто проверял надо ли указывать куда возвращаться ))))) Будет без него работать или нет - сейчас посмотрим еще...
Не, блин. Если вконце не ставить return (draw_Menu); а просто return; - не выполняется прорисовка меню, но назад в loop() возвращается: нажимаешь тач там где кнопка должна быть прорисована - опять запускается user::temp_Main(). Так что насчёт ракет - всё нормально ;) А что бы они на взлёте не падали, между RocketClass::Start() и return (Earth) поставтеdelay()побольше )))))
В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)".
В таком случае она будет игнорировать все другие нажатия и вообще ничего не делать "пока не нажата". Неужели это то, чего Вы хотите?
В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)".
В таком случае она будет игнорировать все другие нажатия и вообще ничего не делать "пока не нажата". Неужели это то, чего Вы хотите?
Да. Эта ветка будет только отображать график температуры и выполняться, пока не тапнешь по экрану.
Кстати есть вопрос: есть ли разница между этими условиями:
while (!myTouch.dataAvailable()) и while (myTouch.dataAvailable()== false)
#include "user.h"
void user::draw_Menu()
{
myGLCD.clrScr();
myGLCD.setFont(BigFont);
myGLCD.setBackColor(VGA_TRANSPARENT);
myGLCD.setColor(VGA_BLUE);
myGLCD.fillRoundRect (10, 50, 150, 100);
myGLCD.setColor(VGA_WHITE);
myGLCD.drawRoundRect (10, 50, 150, 100);
myGLCD.print("Temp", 45, 67);
myGLCD.setColor(VGA_BLUE);
myGLCD.fillRoundRect (160, 50, 300, 100);
myGLCD.setColor(VGA_WHITE);
myGLCD.drawRoundRect (160, 50, 300, 100);
myGLCD.print("Dash.brd", 165, 67);
myGLCD.setColor(VGA_BLUE);
myGLCD.fillRoundRect (10, 130, 150, 180);
myGLCD.setColor(VGA_WHITE);
myGLCD.drawRoundRect (10, 130, 150, 180);
myGLCD.print("######", 40, 147);
myGLCD.setColor(VGA_BLUE);
myGLCD.fillRoundRect (160, 130, 300, 180);
myGLCD.setColor(VGA_WHITE);
myGLCD.drawRoundRect (160, 130, 300, 180);
myGLCD.print("######", 190, 147);
myGLCD.setBackColor (VGA_BLACK);
}
void user::temp_Main()
{
int time_x = 0; // переменная: время, координата Х для кривой графика
int temp_y = 0; // переменная: температура, координата Y для кривой графика
int go = 10; // переменная: шаг перемещения машинки
boolean tr = true; // триггер мигалки
float temp = 0; // переменная температуры
sensors.begin();
myGLCD.clrScr();
myGLCD.fillScr(VGA_BLACK);
myGLCD.setBackColor(VGA_TRANSPARENT);
myGLCD.drawRoundRect(167, 1, 315, 25); // Рамочка для отображения текущего режима
myGLCD.setFont(BigFont);
// ******* Clearing temp screen area *******
myGLCD.setColor(REDX);
myGLCD.fillRoundRect(3, 80, 317, 113);
myGLCD.setColor(GREENX);
myGLCD.fillRoundRect(3, 173, 317, 113);
myGLCD.setColor(BLUEX);
myGLCD.fillRoundRect(3, 173, 317, 236);
myGLCD.setColor(VGA_WHITE);
// ******* Draw scale *******
myGLCD.setBackColor(VGA_TRANSPARENT);
myGLCD.print("95", 3, 97);
myGLCD.print("50", 3, 157);
myGLCD.print("0", 3, 223);
while (!myTouch.dataAvailable())
//while (myTouch.dataAvailable()== false)
{
//*************** Рисуем значение текущей температуры ********************
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
myGLCD.setColor(VGA_BLACK);
myGLCD.setFont(SevenSegNumFontPlusPlus);
myGLCD.print(":", 63, 1); // затираем последний символ если было три знака.
myGLCD.setFont(BigFont);
//**************** Рисуем график ********************
temp_y = map(temp, 0, 150, 3, 200); // мапим диапазон игреков
myGLCD.setColor(VGA_WHITE);
myGLCD.fillCircle(5 + time_x, 240 - temp_y, 2); // рисуем точки снизу, слевa
if (time_x <= 310) {
time_x++;
}
else {
time_x = 0;
// ******* Clearing temp screen area *******
myGLCD.setColor(REDX);
myGLCD.fillRoundRect(3, 80, 317, 113);
myGLCD.setColor(GREENX);
myGLCD.fillRoundRect(3, 173, 317, 113);
myGLCD.setColor(BLUEX);
myGLCD.fillRoundRect(3, 173, 317, 236);
myGLCD.setColor(VGA_WHITE);
// ******* Draw scale *******
myGLCD.setBackColor(VGA_TRANSPARENT);
myGLCD.print("95", 3, 97);
myGLCD.print("50", 3, 157);
myGLCD.print("0", 3, 223);
}
if (temp < 50) {
switch (tr) {
case true:
tr = false;
myGLCD.setColor(BLUEX);
myGLCD.setBackColor(BLUEX);
myGLCD.setColor(VGA_WHITE);
myGLCD.print(" WARMING ", 170, 5);
break;
case false:
tr = true;
myGLCD.setBackColor(VGA_BLACK);
myGLCD.setColor(VGA_WHITE);
myGLCD.print(" WARMING ", 170, 5);
break;
}
// Холодная машинка стоит, не двигается!
myGLCD.setColor(VGA_WHITE); // устанавливаем цвет рисования - белый
myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку
myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой
myGLCD.print("`", 10 + go - 5, 56); // Рисуем машинку
myGLCD.setFont(SevenSegNumFontPlusPlus);
myGLCD.printNumI(temp, 1, 1);
myGLCD.setFont(BigFont);
}
if (temp > 50 && temp < 95) {
myGLCD.setColor(VGA_WHITE);
myGLCD.setBackColor(GREENX);
myGLCD.print(" DRIVE ", 169, 5);
// Прогретая машинка едет!
myGLCD.setBackColor(VGA_BLACK);
myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный
myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой
myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку
myGLCD.setColor(GREEN); // устанавливаем цвет рисования - зеленый
myGLCD.print("`", 10 + go, 56); // Рисуем машинку
go = go + 5;
myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку
myGLCD.setFont(SevenSegNumFontPlusPlus);
myGLCD.printNumI(temp, 1, 1);
myGLCD.setFont(BigFont);
}
if (temp > 95) {
switch (tr) {
case true:
tr = false;
myGLCD.setBackColor(REDX);
myGLCD.setColor(VGA_WHITE);
myGLCD.print("OverHeat!", 170, 5);
break;
case false:
tr = true;
myGLCD.setBackColor(VGA_BLACK);
myGLCD.setColor(RED);
myGLCD.print("OverHeat!", 170, 5);
break;
}
myGLCD.setBackColor(VGA_BLACK);
myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный
myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой
myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку
myGLCD.setColor(RED); // устанавливаем цвет рисования - Красный
myGLCD.print("`", 10 + go, 56); // Рисуем машинку
go = go + 5;
myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку
myGLCD.setFont(SevenSegNumFontPlusPlus);
myGLCD.printNumI(temp, 1, 1);
myGLCD.setFont(BigFont);
}
if (go > 280) {
go = 0;
}
}
return(draw_Menu()); // прорисовка главного меню после возврата
}
//***************** END of void user::temp_Main() *****************************
Пока что - всё работает. Но и особых претензий к этой части, как бы, и нет... Ой - уже есть: если не успеваешь убрать палец с экрана, а особенно если тапаешь в районе области кнопки - опять вываливаешься в temp_Main()... Надо задержку какую-то предусмотреть.
--------------------------------
Нет. Всё-таки если проверять условие в конце цикла, то палец убрать успеваешь. А то - никакие задержки не помогают.
Короче вместо while (!myTouch.dataAvailable()) в данном случае лучше использовать do ... while (!myTouch.dataAvailable())
Кстати - что-то странное происходит со считыванием с датчика температуры! Вот, в частности, из-за того что цикл do...while крутится слишком медленно, надо держать палец на экране пока myTouch.dataAvailable() не считается в while (!myTouch.dataAvailable(). А потом быстро включается основное меню и если палец оказался на кнопке -myTouch.dataAvailable() так и остаётся в true! Однако пару раз была такая ситуация, когда считывание происходило раза в 3 быстрее. Это, обычно происходит когда датчик не подключен. Ну я и подумал что просто провод выскочил из пина, а потом смотрю - температуру-то показывает правильно и график рисуется! Это что такое может быть? 18B20 подглючивает? Скорее всего нет, потому что если в процессе работы выдернуть провод данных датчика (#define ONE_WIRE_BUS 10) из ардуины, то показания становятся -127, что означает что данных не поступает, а цикл быстрее тикать не начнает!!!!
Почему это может происходить? Помогите пожалуста!
Выявил когда именно это происходит: если запустить ардуину со снятым датчиком - скорость считывания быстрее, но показаний, естественно, нет. Но как только вставляешь датчик - показания правильные, а скорость остаётся прежней! НО! Если нажимаешеь "Сброс" на плате, следующий раз - уже скорость низкая. Даже если выдернуть датчик при такой скорости - показания сразу сваливаются, но скорость остаётся медленной!
А если написали extern, то это означает. что "где-то в другом месте он есть". А у Вас нет нигде.
Вот когда Вы его хоть где-то объявляете, тогда всё нормально.
Поставьте своё
ProtocolBus4 Bus4;
в .cpp файл библиотеки и будет Вам счастье, т.к. "где-то есть" и в скетче определять не надо.
--------------
А какие меры Вы предприняли, чтобы было невозможно создать второй экземпляр? Просто оставили но "совесть разработчика"? Я не вижу у Вас никаких программных запретов на это.
поскольку считывание показаний температуры с 18B20 происходит настолько медленно, что в цикле не надо даже delay() ставить.
у тебя чтение датчиков останавливает весь код?
Так. Я уже почти съел дневной лимит траффика на телефоне. Пойду-ка я лучше свой класс "оптимизирую" до невозможности, а там - посмотрим что получится ))))
поскольку считывание показаний температуры с 18B20 происходит настолько медленно, что в цикле не надо даже delay() ставить.
у тебя чтение датчиков останавливает весь код?
Не что что бы останавливал, но чаще чем 1 раз в секунду - не происходит. А это что - редко? О.о
Не что что бы останавливал, но чаще чем 1 раз в секунду - не происходит. А это что - редко? О.о
ок.
и, при чём здесь delay() и какой-то цикл?
ты загоняешь программу в цикл и тупо ждёшь, что ответит датчик?
а, если не ответит никогда? - хакнешь сам себя?
Во первых - всем не угодишь.
Ну да дайте мне дохрена денег и я покажу на что я способен. Но скорее всего их тупо просрать и дать стране говно. Умерте свои неуемные фантазии. Если из малого не можете сделать конфетку, то и из большого и подавно.
А я почему-то считал, что в первую очередь тот, кто разработал/произвел эту краску.
А тот, кто с кисточкой в руках, может вообще иметь весьма смутные представление о физике, химии и экономике.
Да вы первоклассный клиент. В магазине готовы брать рекомендованную краску по любой цене, в ресторане есть, что дали... Ведь повар же лучше знает, чем вам питаться, он профессионал и, возможно, сам разработал подаваемое блюдо.
Вы меня извините, но я не считаю себя вправе спорить с тем, кто на глазок может достоверно определить цвет и толщину лакокрасочного покрытия, а так же концепцию всего, чего угодно во всех существующих философских смыслах. Я простой человек. Считайте, что вы меня убедили и покончим с этим. Право на последнее слово оставляю за вами.
о-то не получается пока что. После описания всех используемых шрифтов в "user.h" компилятор пишет вот что:
И так на каждый шрифт.
Как только увидели подобную хрень, тут ставьте в начало этого .h файла #include <arduino.h> и как руокй снимет. Этит типы там определены (не там, на там нужный файл включается).
Позже я вижу. что Вы решили проблему вставкой #include <UTFT.h>, правильно, потому что UTFT.h в свою очередь включает arduino.h
"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать.
Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "3,14здец котёнку" - работать не будет к гадалке не ходи. Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)
Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)
госдуму я отменил - с 2014-го вами правят зомби
Кстати у меня есть сомнения насчёт строки №2 в "user.cpp"
Не, знаю какого рода у Вас сомнения, но если сомневаетесь - выбросьте. Только тогда и строку 3 заодно не забудьте.
Что до Ваших дилемм, это вопрос стиля, привычек и т.п. Любыми своими комментариями я рискую вызвать такой холивар, по сравнению с которым то, что здесь сейчас - научная дискуссия специалистов по бабочкам.
В целом нет ничего страшного и ненормального в том, что функции маленикие. Скорее наоборот. Также нет ничего страшного в том, что одни классы использую другие, а для чего их тогда создавать. Более того, классы умеют наследоваться друг от друга (в этом их главная прелесть) и классы потомки вовсю используют методы классов-родителей. Всё это нормальные будни.
Что до размера функций, посмотрите на кусочек кода и того проекта, о котором я здесь уже писал (в котором куча наследуемых классов)
void ClockScreen::SetTime(uint8_t h, uint8_t m) { m_h = h; m_m = m; ShowTime(); } void ClockScreen::ShowTime(void) { ShowHours(); ShowMinutes(); phs.Refresh(this); } void ClockScreen::ShowMinutes(void) { m_screen[2] = _Number2Symbol(m_m / 10); m_screen[3] = _Number2Symbol(m_m % 10); } void ClockScreen::ShowHours(void) { m_screen[0] = _Number2Symbol(m_h / 10); m_screen[1] = _Number2Symbol(m_h % 10); } void ClockScreen::getTime(DayTime *dt) const { dt->minutes = m_m; dt->hours = m_h; } void NumericScreen::OnActivate(void) { if (m_led) m_led->blinkOn(); gpButtonProcessor = this; m_start = getSeconds(); ShowNumber(); } void NumericScreen::OnDeactivate(void) { if (m_led) m_led->blinkOff(false); gpButtonProcessor = NULL; m_start = 0; }Видите размер функций? Вот такие они у меня практически всегда. Для данного языка (за очень редким исключением) действует правило: "если функция не умещается на экран, значит что-то не так со структурой программы".
"если функция не умещается на экран, значит что-то не так со структурой программы".
Так вот, оказывается, почему я люблю большие экраны с портретной компоновкой! :)
"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать.
Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "3,14здец котёнку" - работать не будет к гадалке не ходи. Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)
Насчет холивара не переживайте, будет желание его затеять - с удовольствием почитаю. В спорах всегда что-нибудь рождается.
Вот о наследовании и вызове друг друга из одного исполняемого.cpp: Эта строчка мне не понятна:
Как это по русски? Типа: "Функция: "ClockScreen" использует внутри себя функцию "ShowTime" ? Или, скорее всего я чего-то не понимаю. В общем - вчера я хотел вынести в класс, буквально, три куска программы...
Сразу хочу оговориться что использовать классы в привычном понимании мне пока что не требуется: создать несколько удобных и часто используемых функций, которые потом, возможно, найдут применение и в других проектах. Всё обстоит несколько иначе. На данном этапе мне нужно просто разгрузить основной скетч. Я уже даже готов вовсе отказаться от классов, а просто оставить отлаженый кусок программы в другом файле, а следующую часть - писать с нуля, за исключением общих #define и переменных.
Так вот. У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "
does not name a type"Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))
Нет, я никогда не делю баги на крупные и мелкие.
Эта строчка мне не понятна:
Как это по русски?
Интересный вопрос. Вот вторая строка Вашего .cpp файла из стартового поста данного топика
Как это по русски? Так вот, точно также.
У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "
does not name a type"Даже не знаю, как это её надо так вызывать :) Ну, покажите, похихикаем.
Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))
Нет, я никогда не делю баги на крупные и мелкие.
Я не о Вас, а о Законах Мерфи ))))
Эта строчка мне не понятна:
Как это по русски?
Интересный вопрос. Вот вторая строка Вашего .cpp файла из стартового поста данного топика
Как это по русски? Так вот, точно также.
Нет не точно так ! У меня "void" второй раз в скобке не написан. И чего это у Вас в одном файле два класса что ли? Или это примеры из разных файлов? Я думал что один класс - один файл...
У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "
does not name a type"Даже не знаю, как это её надо так вызывать :) Ну, покажите, похихикаем.
А вот смотрите как:
Это главный скетч:
#include "user.h" //#include <UTFT.h> //#include <UTouch.h> //#include <OneWire.h> //#include <DallasTemperature.h> //UTFT myGLCD(ILI9327, 38, 39, 40, 41); UTouch myTouch( 42, 43, 44, 45, 46); //#define ONE_WIRE_BUS 10 //OneWire oneWire(ONE_WIRE_BUS); //DallasTemperature sensors(&oneWire); //******************** SETUP **************** void setup () { myGLCD.InitLCD(); // запуск дисплея myGLCD.clrScr(); // очистка дисплея myTouch.InitTouch(); // запуск тачскрина myTouch.setPrecision(PREC_MEDIUM); // установка величины силы нажатия на тач myGLCD.setFont(BigFont); // установка типа шрифта myGLCD.setBackColor(VGA_TRANSPARENT); user::InitEMU(); user::temp_Main(); } void loop() { } // END -----> Void loop()Это хэдер user.h:
#ifndef user_h #define user_h #include <UTFT.h> #include <UTFT.h> #include <UTouch.h> #include <OneWire.h> #include <DallasTemperature.h> /******* HEX Palette ******* Некоторые стандартные цвета можно задавать при помощи идентификаторов: VGA_BLACK – черный, VGA_SILVER – серебряный VGA_GRAY – серый VGA_WHITE – белый VGA_MAROON – красно-коричневый VGA_RED – красный VGA_PURPLE – пурпурный VGA_FUCHSIA – фуксия VGA_GREEN – зеленый VGA_LIME – лайм VGA_NAVY – темно-синий VGA_BLUE – синий VGA_TEAL – сине-зеленый VGA_AQUA – морская волна setBackColor – устанавливает цвет фона для команд печати. В качестве параметра указывается необходимый цвет. Цвета задаются обычным способом – числами или идентификаторами (см. команду fillScr) однако для этой команды существует еще один идентификатор – VGA_TRANSPARENT, позволяющий печатать символы на «прозрачном» фоне. При необходимости печати на дисплее, залитом любым цветом, отличным от черного, необходимо задавать точно такой же цвет фона командой setBackColor, или использовать команду setBackColor(VGA_TRANSPARENT). ----------------------------- #define BLACK 0x0000 #define BLUE 0x001F #define BLUEX 0x001A #define RED 0xF800 #define REDX 0xA000 #define REDD 0xF422 #define GREEN 0x07E0 #define GREENX 0x02E0 #define LGREEN 0x17E1 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define YELLOWW 0xEEE0 #define WHITE 0xFFFF #define PINK 0xF273 #define LGREY 0x836A #define LLGREY 0xEED2 #define SPEC1 0x28E2 #define SPEC2 0x23F3 #define SPEC3 0x5273 #define SPEC4 0x0551 // Windows 98 default color #define SPEC5 0x2A20 */ //******* Useful Palette ******* #define RED 0xF800 #define REDX 0xA000 #define GREEN 0x07E0 #define GREENX 0x02E0 #define BLUE 0x001F #define BLUEX 0x001A #define SPEC4 0x0551 #define PINK 0xF273 extern UTFT myGLCD; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFontPlusPlus[]; extern uint8_t Dingbats1_XL[]; extern uint8_t battery_24x48[]; extern uint8_t SmallFont[]; extern uint8_t Various_Symbols_32x32[]; //extern unsigned short Life[0xFB40]; int time_x = 0; // переменная времени, координата Х для кривой графика int temp_y = 0; // переменная температуры, координата Y для кривой графика int go = 10; // переменная перемещения машинки boolean tr = true; // триггер мигалки boolean gr = false; // триггер сетки boolean menu_temp = true; // триггер меню_температура float temp = 0; // переменная температуры class user { public: user(); static void InitEMU(); static void temp_ClrScrn(); static void temp_Main(); }; #endifА это - исполняемый user.cpp:
#include "user.h" UTFT myGLCD(ILI9327, 38, 39, 40, 41); //UTouch myTouch( 42, 43, 44, 45, 46); #define ONE_WIRE_BUS 10 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //user::user(){} void user::InitEMU() { //myGLCD.drawBitmap (0, 0, 320, 201, Life, 1); // BitMap logo myGLCD.setFont(SmallFont); myGLCD.setColor(VGA_WHITE); myGLCD.print("Init start:", 0, 220); delay(210); myGLCD.print(" ", 0, 220); myGLCD.setColor(VGA_WHITE); myGLCD.print("Init start:", 0, 210); myGLCD.print("Loading", 0, 220); delay(310); for (int i = 0; i <= 75; i = i + 9) { myGLCD.print(".", 75 + i, 220); delay(40); } myGLCD.print(" ", 0, 220); myGLCD.print("Init start:", 0, 200); myGLCD.print("Loading .......... Done!", 0, 210); delay(340); myGLCD.print("Init start:", 0, 190); myGLCD.print(" ", 0, 210); myGLCD.print("Loading .......... Done!", 0, 200); myGLCD.print("Init sensors: ", 0, 220); myGLCD.setFont(battery_24x48); delay(340); myGLCD.print(String(9), 110, 215); delay(340); myGLCD.print(String(8), 110, 215); delay(340); for (int i = 1; i <= 6; i++) { myGLCD.print(String(i), 110, 215); delay(200); } myGLCD.print("7", 110, 215); delay(300); myGLCD.print("6", 110, 215); delay(300); myGLCD.print("7", 110, 215); delay(300); myGLCD.print("6", 110, 215); delay(300); myGLCD.print("7", 110, 215); } //***************** END of void user::InitEMU() ***************************** void user::temp_ClrScrn() // ***************** ReDraw Temp Color Bars ************** { time_x = 0; sensors.begin(); // ********** Draw axis ******* // myGLCD.setColor(RED); // myGLCD.fillRect(0,40,3,239); // myGLCD.fillRect(0,237,315,240); // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw vertical grid ******* switch (gr) { case true: myGLCD.drawLine(20, 80, 20, 221); myGLCD.drawLine(40, 80, 40, 221); myGLCD.drawLine(60, 80, 60, 221); myGLCD.drawLine(80, 80, 80, 221); myGLCD.drawLine(100, 80, 100, 221); myGLCD.drawLine(120, 80, 120, 221); myGLCD.drawLine(140, 80, 140, 221); myGLCD.drawLine(160, 80, 160, 221); myGLCD.drawLine(180, 80, 180, 221); myGLCD.drawLine(200, 80, 200, 221); myGLCD.drawLine(220, 80, 220, 221); myGLCD.drawLine(240, 80, 240, 221); myGLCD.drawLine(260, 80, 260, 221); myGLCD.drawLine(280, 80, 280, 221); myGLCD.drawLine(300, 80, 300, 221); myGLCD.drawLine(320, 80, 320, 221); // ******* Draw horisontal grid ******* // myGLCD.drawLine(3,41,316,41); // myGLCD.drawLine(3,61,316,61); myGLCD.drawLine(3, 81, 316, 81); myGLCD.drawLine(3, 101, 316, 101); myGLCD.drawLine(3, 121, 316, 121); myGLCD.drawLine(3, 141, 316, 141); myGLCD.drawLine(3, 161, 316, 161); myGLCD.drawLine(3, 181, 316, 181); myGLCD.drawLine(3, 201, 316, 201); myGLCD.drawLine(3, 221, 316, 221); break; } // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); //myGLCD.setColor(VGA_WHITE); //myGLCD.print("120", 3,64); // myGLCD.setBackColor(REDX); myGLCD.print("95", 3, 97); // myGLCD.setBackColor(GREENX); myGLCD.print("50", 3, 157); // myGLCD.setBackColor(BLUEX); myGLCD.print("0", 3, 223); // myGLCD.setBackColor(VGA_BLACK); } //***************** END of void temp_ClrScrn() ***************************** void user::temp_Main() { // temp_ClrScrn (); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.drawRoundRect(167, 1, 315, 25); // Рамочка для отображения текущего режима // myGLCD.setFont(Various_Symbols_32x32); myGLCD.setFont(Dingbats1_XL); myGLCD.print("9", 290, 27); myGLCD.setFont(BigFont); // myGLCD.drawRoundRect(147, 32, 295, 55); // Рамочка для температуры // myGLCD.print("t ", 155, 36); // Знак температуры // myGLCD.drawCircle(170, 40, 2); // Кужочек обозначения температуры // myGLCD.print("C", 280, 36); // Знак Celsium // myGLCD.drawCircle(278, 40, 3); // Кужочек Celsium do { //*************** Рисуем значение текущей температуры ******************** sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); myGLCD.setColor(VGA_BLACK); // myGLCD.setBackColor(VGA_BLACK); //myGLCD.print(" ", 259, 35); // затираем последний символ если было три знака до запятой. myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.print(":", 63, 1); // затираем последний символ если было три знака. myGLCD.setFont(BigFont); // myGLCD.setColor(SPEC4); // myGLCD.print(String(temp), 179, 36); // рисуем численное значение температуры // myGLCD.printNumI(temp, 179, 36); // myGLCD.setColor(RED); // myGLCD.print(String(time_x),265, 220); // Отладочная: позиция X (time) // myGLCD.print(String(240-temp_y),180, 220); // Отладочная: позиция Y (temp) /**************** Рисуем график ********************/ temp_y = map(temp, 0, 150, 3, 200); // мапим диапазон игреков myGLCD.setColor(VGA_WHITE); myGLCD.fillCircle(5 + time_x, 240 - temp_y, 2); // рисуем точки снизу, слевa if (time_x <= 310) { time_x++; } else { // user::temp_ClrScrn(); } if (temp < 50) { switch (tr) { case true: tr = false; myGLCD.setColor(BLUEX); myGLCD.setBackColor(BLUEX); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; } // Холодная машинка стоит, не двигается! myGLCD.setColor(VGA_WHITE); // устанавливаем цвет рисования - белый myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Рисуем машинку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 50 && temp < 95) { myGLCD.setColor(VGA_WHITE); myGLCD.setBackColor(GREENX); myGLCD.print(" DRIVE ", 169, 5); // Прогретая машинка едет! myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(GREEN); // устанавливаем цвет рисования - зеленый myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 95) { switch (tr) { case true: tr = false; myGLCD.setBackColor(REDX); myGLCD.setColor(VGA_WHITE); myGLCD.print("OverHeat!", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(RED); myGLCD.print("OverHeat!", 170, 5); break; } myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(RED); // устанавливаем цвет рисования - Красный myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (go > 280) { go = 0; } //delay (100); } while (menu_temp = true); } //***************** END of void user::temp_Main() *****************************А это то, с чем не согласен компилятор:
Сейчас, правда, он нашёл другой способ вынести мне мозг, но зато, кажется, всё правильно хотя бы с точки зрения синтаксиса...
Вот 135-я строка в user.cpp - не вызывается "temp_ClrScrn()" пишет что.... Сейчас уже ничего не пишет ((( Но писал что перед "temp_ClrScrn()" ожидается какой-то идентификатор... А сейчас не пишет, потому что везде у него либо "multiple definition of" либо, если переменные выносишь в главный скетч - "not declared in this scope" (((((( Уже и не знаю что делать ((((
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Я Вам уже раньше писал - почитайте хорошую книжку, ну нельзя такие вещи осваивать методом тыка.
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Мне бы на Ваших лекциях посидеть )))) А книжная инфа с первого раза не доходит...
Никогда в include файлах ничего не объявляется.
кто запретил?
Не тема - треш. Поскромничал Buzzer2010, надо с шаблона фабрики классов начинать было изучать основы С++.
Некоторым еще оказывается не понимают за что програмеры ЗП получают. Одну темку на форуме прочитал и либки+ООП освоено )))
Всё. Тогда вот так пусть будет, user.h:
#ifndef user_h #define user_h #include <UTFT.h> #include <UTouch.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 //******* Useful Palette ******* #define RED 0xF800 #define REDX 0xA000 #define GREEN 0x07E0 #define GREENX 0x02E0 #define BLUE 0x001F #define BLUEX 0x001A #define SPEC4 0x0551 #define PINK 0xF273 extern UTFT myGLCD; extern UTouch myTouch; extern OneWire oneWire; extern DallasTemperature sensors; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFontPlusPlus[]; extern uint8_t Dingbats1_XL[]; extern uint8_t battery_24x48[]; extern uint8_t SmallFont[]; extern uint8_t Various_Symbols_32x32[]; //extern unsigned short Life[0xFB40]; class user { public: user(); static void InitEMU(); static void temp_Main(); }; #endifи user.cpp:
#include "user.h" void user::InitEMU() { //myGLCD.drawBitmap (0, 0, 320, 201, Life, 1); // BitMap logo myGLCD.setFont(SmallFont); myGLCD.setColor(VGA_WHITE); myGLCD.print("Init start:", 0, 220); delay(210); myGLCD.print(" ", 0, 220); myGLCD.setColor(VGA_WHITE); myGLCD.print("Init start:", 0, 210); myGLCD.print("Loading", 0, 220); delay(310); for (int i = 0; i <= 75; i = i + 9) { myGLCD.print(".", 75 + i, 220); delay(40); } myGLCD.print(" ", 0, 220); myGLCD.print("Init start:", 0, 200); myGLCD.print("Loading .......... Done!", 0, 210); delay(340); myGLCD.print("Init start:", 0, 190); myGLCD.print(" ", 0, 210); myGLCD.print("Loading .......... Done!", 0, 200); myGLCD.print("Init sensors: ", 0, 220); myGLCD.setFont(battery_24x48); delay(340); myGLCD.print(String(9), 110, 215); delay(340); myGLCD.print(String(8), 110, 215); delay(340); for (int i = 1; i <= 6; i++) { myGLCD.print(String(i), 110, 215); delay(200); } myGLCD.print("7", 110, 215); delay(300); myGLCD.print("6", 110, 215); delay(300); myGLCD.print("7", 110, 215); delay(300); myGLCD.print("6", 110, 215); delay(300); myGLCD.print("7", 110, 215); } //***************** END of void user::InitEMU() ***************************** void user::temp_Main() { int time_x = 0; // переменная времени, координата Х для кривой графика int temp_y = 0; // переменная температуры, координата Y для кривой графика int go = 10; // переменная перемещения машинки boolean tr = true; // триггер мигалки boolean gr = false; // триггер сетки boolean menu_temp = true; // триггер меню_температура float temp = 0; // переменная температуры sensors.begin(); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.drawRoundRect(167, 1, 315, 25); // Рамочка для отображения текущего режима // myGLCD.setFont(Various_Symbols_32x32); myGLCD.setFont(Dingbats1_XL); myGLCD.print("9", 290, 27); myGLCD.setFont(BigFont); // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); switch (gr) { case true: // ******* Draw vertical grid ******* myGLCD.drawLine(20, 80, 20, 221); myGLCD.drawLine(40, 80, 40, 221); myGLCD.drawLine(60, 80, 60, 221); myGLCD.drawLine(80, 80, 80, 221); myGLCD.drawLine(100, 80, 100, 221); myGLCD.drawLine(120, 80, 120, 221); myGLCD.drawLine(140, 80, 140, 221); myGLCD.drawLine(160, 80, 160, 221); myGLCD.drawLine(180, 80, 180, 221); myGLCD.drawLine(200, 80, 200, 221); myGLCD.drawLine(220, 80, 220, 221); myGLCD.drawLine(240, 80, 240, 221); myGLCD.drawLine(260, 80, 260, 221); myGLCD.drawLine(280, 80, 280, 221); myGLCD.drawLine(300, 80, 300, 221); myGLCD.drawLine(320, 80, 320, 221); // ******* Draw horisontal grid ******* myGLCD.drawLine(3, 81, 316, 81); myGLCD.drawLine(3, 101, 316, 101); myGLCD.drawLine(3, 121, 316, 121); myGLCD.drawLine(3, 141, 316, 141); myGLCD.drawLine(3, 161, 316, 161); myGLCD.drawLine(3, 181, 316, 181); myGLCD.drawLine(3, 201, 316, 201); myGLCD.drawLine(3, 221, 316, 221); break; } // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); do { //*************** Рисуем значение текущей температуры ******************** sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); myGLCD.setColor(VGA_BLACK); myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.print(":", 63, 1); // затираем последний символ если было три знака. myGLCD.setFont(BigFont); //**************** Рисуем график ******************** temp_y = map(temp, 0, 150, 3, 200); // мапим диапазон игреков myGLCD.setColor(VGA_WHITE); myGLCD.fillCircle(5 + time_x, 240 - temp_y, 2); // рисуем точки снизу, слевa if (time_x <= 310) { time_x++; } else { time_x = 0; // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw vertical grid ******* switch (gr) { case true: myGLCD.drawLine(20, 80, 20, 221); myGLCD.drawLine(40, 80, 40, 221); myGLCD.drawLine(60, 80, 60, 221); myGLCD.drawLine(80, 80, 80, 221); myGLCD.drawLine(100, 80, 100, 221); myGLCD.drawLine(120, 80, 120, 221); myGLCD.drawLine(140, 80, 140, 221); myGLCD.drawLine(160, 80, 160, 221); myGLCD.drawLine(180, 80, 180, 221); myGLCD.drawLine(200, 80, 200, 221); myGLCD.drawLine(220, 80, 220, 221); myGLCD.drawLine(240, 80, 240, 221); myGLCD.drawLine(260, 80, 260, 221); myGLCD.drawLine(280, 80, 280, 221); myGLCD.drawLine(300, 80, 300, 221); myGLCD.drawLine(320, 80, 320, 221); // ******* Draw horisontal grid ******* myGLCD.drawLine(3, 81, 316, 81); myGLCD.drawLine(3, 101, 316, 101); myGLCD.drawLine(3, 121, 316, 121); myGLCD.drawLine(3, 141, 316, 141); myGLCD.drawLine(3, 161, 316, 161); myGLCD.drawLine(3, 181, 316, 181); myGLCD.drawLine(3, 201, 316, 201); myGLCD.drawLine(3, 221, 316, 221); break; } // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); } if (temp < 50) { switch (tr) { case true: tr = false; myGLCD.setColor(BLUEX); myGLCD.setBackColor(BLUEX); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; } // Холодная машинка стоит, не двигается! myGLCD.setColor(VGA_WHITE); // устанавливаем цвет рисования - белый myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Рисуем машинку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 50 && temp < 95) { myGLCD.setColor(VGA_WHITE); myGLCD.setBackColor(GREENX); myGLCD.print(" DRIVE ", 169, 5); // Прогретая машинка едет! myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(GREEN); // устанавливаем цвет рисования - зеленый myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 95) { switch (tr) { case true: tr = false; myGLCD.setBackColor(REDX); myGLCD.setColor(VGA_WHITE); myGLCD.print("OverHeat!", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(RED); myGLCD.print("OverHeat!", 170, 5); break; } myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(RED); // устанавливаем цвет рисования - Красный myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (go > 280) { go = 0; } //delay (100); } while (menu_temp = true); } //***************** END of void user::temp_Main() *****************************Всё работает, 11% памяти занимает и основной скетч пустой теперь ))))) А это главное.
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
Это еще что! Я так вообще не понял о чем Вы. Такого языка я еще не изучал. Это наверно брайнфак, за который Евгений рассказывал ))))
Это еще что! Я так вообще не понял о чем Вы. Такого языка я еще не изучал. Это наверно брайнфак, за который Евгений рассказывал ))))
Наверно ;)
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
А класс-то зачем для двух функций?
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
А класс-то зачем для двух функций?
Так это пока только две и то - функциями их назвать как-то не получается. Первая - это баловство, удалю потом. просто что бы не пихать сразу километр кода, а научиться с классами обращаться. А вторая - это одна из ветвей проекта и самая простенькая причём. А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.
как-то так -
скетч:
где
setup.h
void setup() {}loop.h
void loop() {}А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле
int kaka;
и описывается со словом exetrn в .h файле
extern int kaka;
тогда её видно везде, куда включён этот include файл.
Мне бы на Ваших лекциях посидеть )))) А книжная инфа с первого раза не доходит...
Так книжки читать нужно. Сидеть на них - занятие малопродуктивное.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.
как-то так -
скетч:
где
setup.h
void setup() {}loop.h
void loop() {}Интересно, но как раз секции ''Setup()" и "Loop()" не займут много места. Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, зацикленные по "do-while(переменная-условие выхода из цикла)", доступ к которым, будет происходить из "Loop()".
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?
Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()".
приведи простой пример на языке дуино, иначе я не понимаю твой руский языка - что за нах "самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()""?
Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()".
приведи простой пример на языке дуино, иначе я не понимаю твой руский языка - что за нах "самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()""?
На языке - не могу еще: я еще главное меню не написал ))))) Но принцип такой:
В главном .ino, в void loop(), крутится коротенькая програмка-меню со считыванием нажатий на тачскрин. В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)". Ну и так со всеми элементами основного меню будет происходить. Каждая такая функция будет лежмя лежать в классе "user" и ждать своего звёздного часа )))))
Так понятнее?
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле
int kaka;
и описывается со словом exetrn в .h файле
extern int kaka;
тогда её видно везде, куда включён этот include файл.
Вот чего я не учёл! Описание переменных как внешних, блин. Но ведь так как я сделал в посте #69
это же не очень сильно безграмотно? С областью видимости я еще разберусь!
В главном .ino, в void loop(), крутится коротенькая програмка-меню...
ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.
так, если в лупе подпрограмма, то будет так
void loop() {podprogramm();} #include <podprogramm.h>где содержимое podprogramm.h
void podprogramm() {}В главном .ino, в void loop(), крутится коротенькая програмка-меню...
ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.
так, если в лупе подпрограмма, то будет так
void loop() {podprogramm();} #include <podprogramm.h>где содержимое podprogramm.h
void podprogramm() {}Во всяком случае если Вы знакомы с инклудами, что мешает и мне сделать тоже самое? Разве что - время...
забиваешь в гугл [C++ препроцессор] и читаешь
И почитаю...
Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками. А это раззделение по файлам для новичка еще более запутаннее будет.
Вот вопрос именно по возможностям языка: а как в С++ происходит возврат в вызывающую программу? Потому что "return" либо ничего не хочет делать, либо он не должен передавать управление, либо я его как-то не так использую, либо надо вообще это решить как-то иначе.
В общем - не могу теперь выбраться из своего любимого класса, обратно в "void loop()"
Главный скетч:
#include "user.h" UTFT myGLCD(ILI9327, 38, 39, 40, 41); UTouch myTouch(52, 43, 51, 50, 46); OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int x, y; //****************************************** //*************** USER PROC **************** //****************************************** void drawButtons() { myGLCD.setFont(BigFont); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (10, 50, 150, 100); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (10, 50, 150, 100); myGLCD.print("Temp", 45, 67); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (160, 50, 300, 100); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (160, 50, 300, 100); myGLCD.print("Dash.brd", 165, 67); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (10, 130, 150, 180); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (10, 130, 150, 180); myGLCD.print("Clear", 40, 147); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (160, 130, 300, 180); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (160, 130, 300, 180); myGLCD.print("Enter", 190, 147); myGLCD.setBackColor (VGA_BLACK); } //******************** SETUP **************** void setup () { myGLCD.InitLCD(); // запуск дисплея myGLCD.clrScr(); // очистка дисплея myTouch.InitTouch(); // запуск тачскрина myTouch.setPrecision(PREC_MEDIUM); // установка величины силы нажатия на тач drawButtons(); } void loop() { if (myTouch.dataAvailable()) { myTouch.read(); x = myTouch.getX(); y = myTouch.getY(); // myGLCD.printNumI(x, 10, 10); // myGLCD.printNumI(y, 150, 10); if ((y >= 50) && (y <= 100) && (x >= 10) && (x <= 150)) { user::temp_Main(); } } } // END -----> Void loop()user.h
#ifndef user_h #define user_h #include <UTFT.h> #include <UTouch.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 //******* Useful Palette ******* #define RED 0xF800 #define REDX 0xA000 #define GREEN 0x07E0 #define GREENX 0x02E0 #define BLUE 0x001F #define BLUEX 0x001A #define SPEC4 0x0551 #define PINK 0xF273 extern UTFT myGLCD; extern UTouch myTouch; extern OneWire oneWire; extern DallasTemperature sensors; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFontPlusPlus[]; extern uint8_t Dingbats1_XL[]; extern uint8_t SmallFont[]; extern uint8_t Various_Symbols_32x32[]; //extern unsigned short Life[0xFB40]; class user { public: user(); static void temp_Main(); }; #endifuser.cpp
#include "user.h" void user::temp_Main() { int time_x = 0; // переменная: время, координата Х для кривой графика int temp_y = 0; // переменная: температура, координата Y для кривой графика int go = 10; // переменная: шаг перемещения машинки boolean tr = true; // триггер мигалки float temp = 0; // переменная температуры sensors.begin(); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.drawRoundRect(167, 1, 315, 25); // Рамочка для отображения текущего режима myGLCD.setFont(BigFont); // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); // do { while (!myTouch.dataAvailable()) { //*************** Рисуем значение текущей температуры ******************** sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); myGLCD.setColor(VGA_BLACK); myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.print(":", 63, 1); // затираем последний символ если было три знака. myGLCD.setFont(BigFont); //**************** Рисуем график ******************** temp_y = map(temp, 0, 150, 3, 200); // мапим диапазон игреков myGLCD.setColor(VGA_WHITE); myGLCD.fillCircle(5 + time_x, 240 - temp_y, 2); // рисуем точки снизу, слевa if (time_x <= 310) { time_x++; } else { time_x = 0; // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); } if (temp < 50) { switch (tr) { case true: tr = false; myGLCD.setColor(BLUEX); myGLCD.setBackColor(BLUEX); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; } // Холодная машинка стоит, не двигается! myGLCD.setColor(VGA_WHITE); // устанавливаем цвет рисования - белый myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Рисуем машинку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 50 && temp < 95) { myGLCD.setColor(VGA_WHITE); myGLCD.setBackColor(GREENX); myGLCD.print(" DRIVE ", 169, 5); // Прогретая машинка едет! myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(GREEN); // устанавливаем цвет рисования - зеленый myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 95) { switch (tr) { case true: tr = false; myGLCD.setBackColor(REDX); myGLCD.setColor(VGA_WHITE); myGLCD.print("OverHeat!", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(RED); myGLCD.print("OverHeat!", 170, 5); break; } myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(RED); // устанавливаем цвет рисования - Красный myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (go > 280) { go = 0; } } return (loop()); } //***************** END of void user::temp_Main() *****************************Вот инетесно. Спасибо! Если бы Notepad++ еще и компилировать скетчи умел - я был бы просто счастлив ))))
https://m.geektimes.ru/post/258766/
Ой, извиняюсь - всё работает. Просто я этого не вижу, потому что экран не изменяется )))))) Вот так - всё работает!
Скетч
#include "user.h" UTFT myGLCD(ILI9327, 38, 39, 40, 41); UTouch myTouch(52, 43, 51, 50, 46); OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int x, y; //****************************************** //*************** USER PROC **************** //****************************************** //******************** SETUP **************** void setup () { myGLCD.InitLCD(); // запуск дисплея myTouch.InitTouch(); // запуск тачскрина myTouch.setPrecision(PREC_MEDIUM); // установка величины силы нажатия на тач user::draw_Menu(); } void loop() { if (myTouch.dataAvailable()) { myTouch.read(); x = myTouch.getX(); y = myTouch.getY(); // myGLCD.printNumI(x, 10, 10); // myGLCD.printNumI(y, 150, 10); if ((y >= 50) && (y <= 100) && (x >= 10) && (x <= 150)) { user::temp_Main(); } } } // END -----> Void loop()user.h
#ifndef user_h #define user_h #include <UTFT.h> #include <UTouch.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 //******* Useful Palette ******* #define RED 0xF800 #define REDX 0xA000 #define GREEN 0x07E0 #define GREENX 0x02E0 #define BLUE 0x001F #define BLUEX 0x001A #define SPEC4 0x0551 #define PINK 0xF273 extern UTFT myGLCD; extern UTouch myTouch; extern OneWire oneWire; extern DallasTemperature sensors; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFontPlusPlus[]; extern uint8_t Dingbats1_XL[]; extern uint8_t SmallFont[]; extern uint8_t Various_Symbols_32x32[]; //extern unsigned short Life[0xFB40]; class user { public: user(); static void temp_Main(); static void draw_Menu(); }; #endifuser.cpp
#include "user.h" void user::draw_Menu() { myGLCD.clrScr(); myGLCD.setFont(BigFont); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (10, 50, 150, 100); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (10, 50, 150, 100); myGLCD.print("Temp", 45, 67); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (160, 50, 300, 100); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (160, 50, 300, 100); myGLCD.print("Dash.brd", 165, 67); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (10, 130, 150, 180); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (10, 130, 150, 180); myGLCD.print("Clear", 40, 147); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (160, 130, 300, 180); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (160, 130, 300, 180); myGLCD.print("Enter", 190, 147); myGLCD.setBackColor (VGA_BLACK); } void user::temp_Main() { int time_x = 0; // переменная: время, координата Х для кривой графика int temp_y = 0; // переменная: температура, координата Y для кривой графика int go = 10; // переменная: шаг перемещения машинки boolean tr = true; // триггер мигалки float temp = 0; // переменная температуры sensors.begin(); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.drawRoundRect(167, 1, 315, 25); // Рамочка для отображения текущего режима myGLCD.setFont(BigFont); // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); // do { while (!myTouch.dataAvailable()) { //*************** Рисуем значение текущей температуры ******************** sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); myGLCD.setColor(VGA_BLACK); myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.print(":", 63, 1); // затираем последний символ если было три знака. myGLCD.setFont(BigFont); //**************** Рисуем график ******************** temp_y = map(temp, 0, 150, 3, 200); // мапим диапазон игреков myGLCD.setColor(VGA_WHITE); myGLCD.fillCircle(5 + time_x, 240 - temp_y, 2); // рисуем точки снизу, слевa if (time_x <= 310) { time_x++; } else { time_x = 0; // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); } if (temp < 50) { switch (tr) { case true: tr = false; myGLCD.setColor(BLUEX); myGLCD.setBackColor(BLUEX); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; } // Холодная машинка стоит, не двигается! myGLCD.setColor(VGA_WHITE); // устанавливаем цвет рисования - белый myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Рисуем машинку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 50 && temp < 95) { myGLCD.setColor(VGA_WHITE); myGLCD.setBackColor(GREENX); myGLCD.print(" DRIVE ", 169, 5); // Прогретая машинка едет! myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(GREEN); // устанавливаем цвет рисования - зеленый myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 95) { switch (tr) { case true: tr = false; myGLCD.setBackColor(REDX); myGLCD.setColor(VGA_WHITE); myGLCD.print("OverHeat!", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(RED); myGLCD.print("OverHeat!", 170, 5); break; } myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(RED); // устанавливаем цвет рисования - Красный myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (go > 280) { go = 0; } } return (draw_Menu()); } //***************** END of void user::temp_Main() *****************************А! Вспомнил! Я его уже пытался припаять к IDE. Ничего не получилось. Ну руки кривые - что поделаешь ))))
Теперь я понимаю, почему у нас ракеты падают на взлете, у них в конце RocketClass::Start() стоит return (Earth).
Теперь я понимаю, почему у нас ракеты падают на взлете, у них в конце RocketClass::Start() стоит return (Earth).
ЭЭЭЭ!!! Это я просто проверял надо ли указывать куда возвращаться ))))) Будет без него работать или нет - сейчас посмотрим еще...
Не, блин. Если вконце не ставить return (draw_Menu); а просто return; - не выполняется прорисовка меню, но назад в loop() возвращается: нажимаешь тач там где кнопка должна быть прорисована - опять запускается user::temp_Main(). Так что насчёт ракет - всё нормально ;) А что бы они на взлёте не падали, между RocketClass::Start() и return (Earth) поставте delay() побольше )))))
В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)".
В таком случае она будет игнорировать все другие нажатия и вообще ничего не делать "пока не нажата". Неужели это то, чего Вы хотите?
В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)".
В таком случае она будет игнорировать все другие нажатия и вообще ничего не делать "пока не нажата". Неужели это то, чего Вы хотите?
Да. Эта ветка будет только отображать график температуры и выполняться, пока не тапнешь по экрану.
Кстати есть вопрос: есть ли разница между этими условиями:
while (!myTouch.dataAvailable()) и
while (myTouch.dataAvailable()== false)
???
Текущий вариант проекта выглядит следующим образом:
Скетч :
#include "user.h" UTFT myGLCD(ILI9327, 38, 39, 40, 41); UTouch myTouch(52, 43, 51, 50, 46); OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int x, y; void setup () { myGLCD.InitLCD(); // запуск дисплея myTouch.InitTouch(); // запуск тачскрина myTouch.setPrecision(PREC_LOW); // установка точности определения координат точки прикосновения к сенсорному дисплею. user::draw_Menu(); // начальная прорисовка главного меню } void loop() { if (myTouch.dataAvailable()) { myTouch.read(); x = myTouch.getX(); y = myTouch.getY(); // myGLCD.printNumI(x, 10, 10); // myGLCD.printNumI(y, 150, 10); if ((y >= 50) && (y <= 100) && (x >= 10) && (x <= 150)) { user::temp_Main(); } } } // Void loop()user.h :
#ifndef user_h #define user_h #include <UTFT.h> #include <UTouch.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 //******* Useful Palette ******* #define RED 0xF800 #define REDX 0xA000 #define GREEN 0x07E0 #define GREENX 0x02E0 #define BLUE 0x001F #define BLUEX 0x001A #define SPEC4 0x0551 #define PINK 0xF273 extern UTFT myGLCD; extern UTouch myTouch; extern OneWire oneWire; extern DallasTemperature sensors; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFontPlusPlus[]; extern uint8_t Dingbats1_XL[]; extern uint8_t SmallFont[]; extern uint8_t Various_Symbols_32x32[]; //extern unsigned short Life[0xFB40]; class user { public: user(); static void temp_Main(); static void draw_Menu(); }; #endifuser.cpp :
#include "user.h" void user::draw_Menu() { myGLCD.clrScr(); myGLCD.setFont(BigFont); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (10, 50, 150, 100); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (10, 50, 150, 100); myGLCD.print("Temp", 45, 67); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (160, 50, 300, 100); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (160, 50, 300, 100); myGLCD.print("Dash.brd", 165, 67); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (10, 130, 150, 180); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (10, 130, 150, 180); myGLCD.print("######", 40, 147); myGLCD.setColor(VGA_BLUE); myGLCD.fillRoundRect (160, 130, 300, 180); myGLCD.setColor(VGA_WHITE); myGLCD.drawRoundRect (160, 130, 300, 180); myGLCD.print("######", 190, 147); myGLCD.setBackColor (VGA_BLACK); } void user::temp_Main() { int time_x = 0; // переменная: время, координата Х для кривой графика int temp_y = 0; // переменная: температура, координата Y для кривой графика int go = 10; // переменная: шаг перемещения машинки boolean tr = true; // триггер мигалки float temp = 0; // переменная температуры sensors.begin(); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.drawRoundRect(167, 1, 315, 25); // Рамочка для отображения текущего режима myGLCD.setFont(BigFont); // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); while (!myTouch.dataAvailable()) //while (myTouch.dataAvailable()== false) { //*************** Рисуем значение текущей температуры ******************** sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); myGLCD.setColor(VGA_BLACK); myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.print(":", 63, 1); // затираем последний символ если было три знака. myGLCD.setFont(BigFont); //**************** Рисуем график ******************** temp_y = map(temp, 0, 150, 3, 200); // мапим диапазон игреков myGLCD.setColor(VGA_WHITE); myGLCD.fillCircle(5 + time_x, 240 - temp_y, 2); // рисуем точки снизу, слевa if (time_x <= 310) { time_x++; } else { time_x = 0; // ******* Clearing temp screen area ******* myGLCD.setColor(REDX); myGLCD.fillRoundRect(3, 80, 317, 113); myGLCD.setColor(GREENX); myGLCD.fillRoundRect(3, 173, 317, 113); myGLCD.setColor(BLUEX); myGLCD.fillRoundRect(3, 173, 317, 236); myGLCD.setColor(VGA_WHITE); // ******* Draw scale ******* myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.print("95", 3, 97); myGLCD.print("50", 3, 157); myGLCD.print("0", 3, 223); } if (temp < 50) { switch (tr) { case true: tr = false; myGLCD.setColor(BLUEX); myGLCD.setBackColor(BLUEX); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_WHITE); myGLCD.print(" WARMING ", 170, 5); break; } // Холодная машинка стоит, не двигается! myGLCD.setColor(VGA_WHITE); // устанавливаем цвет рисования - белый myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Рисуем машинку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 50 && temp < 95) { myGLCD.setColor(VGA_WHITE); myGLCD.setBackColor(GREENX); myGLCD.print(" DRIVE ", 169, 5); // Прогретая машинка едет! myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(GREEN); // устанавливаем цвет рисования - зеленый myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (temp > 95) { switch (tr) { case true: tr = false; myGLCD.setBackColor(REDX); myGLCD.setColor(VGA_WHITE); myGLCD.print("OverHeat!", 170, 5); break; case false: tr = true; myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(RED); myGLCD.print("OverHeat!", 170, 5); break; } myGLCD.setBackColor(VGA_BLACK); myGLCD.setColor(VGA_BLACK); // устанавливаем цвет стирания - черный myGLCD.setFont(Dingbats1_XL); // Устанавливаем шрифт с машинкой myGLCD.print("`", 10 + go - 5, 56); // Стираем машинку myGLCD.setColor(RED); // устанавливаем цвет рисования - Красный myGLCD.print("`", 10 + go, 56); // Рисуем машинку go = go + 5; myGLCD.setBackColor(VGA_BLACK); // Гасим подсветку myGLCD.setFont(SevenSegNumFontPlusPlus); myGLCD.printNumI(temp, 1, 1); myGLCD.setFont(BigFont); } if (go > 280) { go = 0; } } return(draw_Menu()); // прорисовка главного меню после возврата } //***************** END of void user::temp_Main() *****************************Пока что - всё работает. Но и особых претензий к этой части, как бы, и нет... Ой - уже есть: если не успеваешь убрать палец с экрана, а особенно если тапаешь в районе области кнопки - опять вываливаешься в temp_Main()... Надо задержку какую-то предусмотреть.
--------------------------------
Нет. Всё-таки если проверять условие в конце цикла, то палец убрать успеваешь. А то - никакие задержки не помогают.
Короче вместо while (!myTouch.dataAvailable()) в данном случае лучше использовать do ... while (!myTouch.dataAvailable())
Кстати - что-то странное происходит со считыванием с датчика температуры! Вот, в частности, из-за того что цикл do...while крутится слишком медленно, надо держать палец на экране пока myTouch.dataAvailable() не считается в while (!myTouch.dataAvailable(). А потом быстро включается основное меню и если палец оказался на кнопке - myTouch.dataAvailable() так и остаётся в true! Однако пару раз была такая ситуация, когда считывание происходило раза в 3 быстрее. Это, обычно происходит когда датчик не подключен. Ну я и подумал что просто провод выскочил из пина, а потом смотрю - температуру-то показывает правильно и график рисуется! Это что такое может быть? 18B20 подглючивает? Скорее всего нет, потому что если в процессе работы выдернуть провод данных датчика (#define ONE_WIRE_BUS 10) из ардуины, то показания становятся -127, что означает что данных не поступает, а цикл быстрее тикать не начнает!!!!
Почему это может происходить? Помогите пожалуста!
Выявил когда именно это происходит: если запустить ардуину со снятым датчиком - скорость считывания быстрее, но показаний, естественно, нет. Но как только вставляешь датчик - показания правильные, а скорость остаётся прежней! НО! Если нажимаешеь "Сброс" на плате, следующий раз - уже скорость низкая. Даже если выдернуть датчик при такой скорости - показания сразу сваливаются, но скорость остаётся медленной!
Ну что за фигня ? (((((((
Добрый день всем.
Решил не создавать дублирующую тему и задать вопрос в этой.
Для организации протокола обмена по блютус сделал формат пакета которым будут обмениваться приемник и передатчик.
Программа заработала. Теперь решил оформить ее в виде библиотеки.
Создаю класс. Так как допустим только один экземпляр такого класса, в h файле создаю экземпляр через extern
При компиляции получаю ошибки и ни как не пойму где я допускаю ошибку. Создавал по аналогии HarwareSerial класса
bus4.h
#ifndef Bus4_h #define Bus4_h #if defined(ARDUINO) && ARDUINO >= 100 #include <Arduino.h> #else #include <WProgram.h> #endif // ******************************************************************* //Command code #define CMD_READL 1 #define CMD_READ8 2 #define CMD_READ16 3 #define CMD_READ32 4 #define CMD_WRITEL 5 #define CMD_WRITE8 6 #define CMD_WRITE16 7 #define CMD_WRITE32 8 // Следующие переменные для замера времени выполнения основного цикла, мкс //uint32_t t1; //uint32_t t2; // Структура буфера приема struct xBuf_t { // Структура буфера uint8_t adr; uint8_t cmd; uint8_t reg; uint8_t b3; uint8_t b2; uint8_t b1; uint8_t b0; }; class ProtocolBus4 { public: void init(uint32_t SIGN ); void Recv(void); // Процедура приема. // передача данных void sendLine(uint8_t adr, uint8_t reg, uint8_t value); // void sendLine(uint8_t adr, uint8_t reg, uint16_t value); // void sendLine(uint8_t adr, uint8_t reg, uint32_t value); // private: uint32_t _SIGN; // = 0x33333333; // Сигнатура начала пакета uint8_t _count; // Счетчик байт данных (принимаем 4 байта данных) uint8_t _inChr; // принятый байт uint32_t _sign; // регистр сигнатуры с линии. Данные полученные с линии. uint8_t _crc; // Подсчет CRC (XOR) с линии. Сигнатура не считается. uint8_t _mode; // Режим. // 0 - ожидание сигнатуры, 1 - ожидание адреса, // 2 - ожидание команды, 3 - ожидание регистра, // 4 - ожидание данных, 5 - проверка crc Если crc верно - буфер готов xBuf_t xBuf; // Буфер данных с линии uint8_t *p_b0; // Указатель на xBuf.b0 uint32_t _tStart; // = 0; uint32_t _millisec; // = 0; uint32_t _timeOut; // = 10000; // В реальной системе тайм аут следует снизить. Например 50 мс. // Следующие переменные для замера времени выполнения основного цикла, мкс //uint32_t t1; //uint32_t t2; uint8_t sendBuf[8]; // Буфер для отправки void sendPacket(void); }; extern ProtocolBus4 Bus4; #endifBus4.cpp
#include <Bus4.h> // Протокол обмена // sendBuf[7], recvBuf[7] // <Адрес><Команда><Регистр><D3><D2><D1><D0><CRC> // Адрес - Адрес устройства кому предназначен пакет. Если FF - всем // Команда-0xff - Передача ID устройства (ID в поле данных) // 0x01 - Чтение uint8_t D0 // 0x02 - Чтение uint16_t D1, D0 // 0x03 - Чтение uint32_t D3, D2, D1, D0 // 0x11 - Запись байта D0 // 0x12 - Запись uint8_t D0 // 0x13 - Запись uint16_t D1, D0 // 0x14 - Запись uint32_t D3, D2, D1, D0 // 0xFA - Чтение переменных из EEPROM // 0xFB - Запись переменных в EEPROM // Регистр - 00..FF - Адрес регистра // D0..D3 - данные // CRC - контрольная сумма // //******************************************************************** //void (*func)(); //void initRecv(void (*f)()) { // Процедура инициализации приемника. Указатель на процедуру // func = f; //}; // Запускать с высокой частотой, что бы не переполнился буфер приема serial (1 мс) void ProtocolBus4::init(uint32_t SIGN) { _SIGN = SIGN; } void ProtocolBus4::Recv() { // Обработка тайм-аута. Если на линии ничего нет более чем TIME_OUT - сбрасываем режим _millisec = millis(); if ( (_millisec - _tStart) > _timeOut) { _mode = 0; // Сброс режима _sign = 0; // Сброс регистра сигнатуры } uint8_t n = Serial.available(); // Если буфер приема не пустой if ( n > 0) { _tStart = _millisec; // Время отсчета тайм-аута //t1 = micros(); // Для отладки. Вычисление времени работы цикла _inChr = Serial.read(); //Serial.print(" inChr = "); //Serial.println(inChr, HEX); //Serial.print(" n = "); //Serial.println(n); //Serial.print(" mode = "); //Serial.println(mode); switch ( _mode ) { // Режим 0. Проверка на сигнатуру case 0: _sign |= _inChr; // Принятый с линии байт помещаем в младший байт 4-х байтовой переменной //Serial.print(" sign = "); //Serial.println(sign, HEX); if (_sign == _SIGN) { // Если сигнатура с линии совпала с заданной _sign = 0; // Обнуляем сигнатуру для следующего пакета //Serial.println("SIGN - OK"); _mode = 1; // Переходим на ввод адреса _crc = 0; // Очистили подсчет crc _count = 0; // Обнулили счетчик байт данных. (4 байта) } else { _sign = _sign << 8; //Serial.println("SIGN - Filed"); } break; // Ввод адреса устройства case 1: _crc ^= _inChr; // Считаем контрольную сумму XOR xBuf.adr = _inChr; // записали адрес в буфер _mode = 2; // Переходим на ввод команды //Serial.print(" xBuf.adr = "); //Serial.println(xBuf.adr, HEX); break; // Ввод команды case 2: _crc ^= _inChr; // Считаем контрольную сумму XOR xBuf.cmd = _inChr; // Записали команду в буфер _mode = 3; // Переходим на ввод регистра //Serial.print(" xBuf.cmd = "); //Serial.println(xBuf.cmd, HEX); break; // Ввод регистра case 3: _crc ^= _inChr; // Считаем контрольную сумму XOR xBuf.reg = _inChr; // Записали регистр в буфер _mode = 4; // Переходим на ввод команды p_b0 = &xBuf.b0; // Получаем адрес xBuf.b0 //Serial.print(" xBuf.reg = "); //Serial.println(xBuf.reg, HEX); break; // Ввод данных 4 байта case 4: _crc ^= _inChr; // Считаем контрольную сумму XOR *(p_b0 - _count) = _inChr; // Записываем байт по адресу xBuf.b0 скорректированному на номер байта _count++; // Переходим к следующему байту данных if (_count == 4) { // Если 4 байта приняты (от 0 до 3) _mode = 5; // Переходим на ввод crc //Serial.print("b3 = "); //Serial.println(xBuf.b3, HEX); //Serial.print("b2 = "); //Serial.println(xBuf.b2, HEX); //Serial.print("b1 = "); //Serial.println(xBuf.b1, HEX); //Serial.print("b0 = "); //Serial.println(xBuf.b0, HEX); } //Serial.print("count = "); //Serial.println(count, HEX); break; // Ввод crc case 5: if (_crc == _inChr) { // Сравниваем подсчитанную crc с указанной в inChr _mode = 0; // Сбрасываем режим //Serial.println(" crc - OK!"); //Serial.println("OK"); // Успешное чтение пакета // Тут может быть вызов процедуры установки значений // или просто взведение флага готовности // или копирование буфера в выходные переменные // (*func)(); } else { // Контрольная сумма не совпала _mode = 0; // Сброс режима //Serial.println(" crc - FALSE!"); //Serial.println("Err"); // (*func)(); }; break; } // switch ( mode ) //Serial.print("crc = "); //Serial.println(crc, HEX); // Для отладки. Подсчте времени выполнения цикла. // Без отладочных вызовов Serial.print колеблется от 12 до 40 мкс // С отладочными Serial.print - время увеличивается до 800 мкс //t2 = micros(); //Serial.print(" T = "); //Serial.println(t2-t1); } // if ( n > 0) } // Recv() // ************************************************** // ПЕРЕДАЧА // // Передача байта void ProtocolBus4::sendLine(uint8_t adr, uint8_t reg, uint8_t value) { sendBuf[0] = adr; sendBuf[1] = CMD_WRITE8; sendBuf[2] = reg; sendBuf[3] = 0; sendBuf[4] = 0; sendBuf[5] = 0; sendBuf[6] = value; sendBuf[7] = adr ^ CMD_WRITE8 ^ reg ^ sendBuf[3] ^ sendBuf[4] ^ sendBuf[5] ^ sendBuf[6]; sendPacket(); } // Передача uint16_t void ProtocolBus4::sendLine(uint8_t adr, uint8_t reg, uint16_t value) { sendBuf[0] = adr; sendBuf[1] = CMD_WRITE8; sendBuf[2] = reg; sendBuf[3] = 0; sendBuf[4] = 0; sendBuf[5] = (value & 0xff00) >> 8; sendBuf[6] = value & 0x00ff; sendBuf[7] = adr ^ CMD_WRITE8 ^ reg ^ sendBuf[3] ^ sendBuf[4] ^ sendBuf[5] ^ sendBuf[6]; sendPacket(); } // Передача uint32_t void ProtocolBus4::sendLine(uint8_t adr, uint8_t reg, uint32_t value) { sendBuf[0] = adr; sendBuf[1] = CMD_WRITE32; sendBuf[2] = reg; sendBuf[3] = (value & 0xff000000) >> 24; sendBuf[4] = (value & 0x00ff0000) >> 16; sendBuf[5] = (value & 0x0000ff00) >> 8; sendBuf[6] = value & 0x000000ff; sendBuf[7] = adr ^ CMD_WRITE8 ^ reg ^ sendBuf[3] ^ sendBuf[4] ^ sendBuf[5] ^ sendBuf[6]; sendPacket(); } void ProtocolBus4::sendPacket() { Serial.write((uint8_t*)(&_SIGN),4); for (int i=0; i < 8; i++) { Serial.write(sendBuf[i]); } }скетч
#include <Bus4.h> void setup() { Serial.begin(115200); Bus4.init(0x33333333); } void loop() { Bus4.Recv(); }Ошибки компиляции
Если в скетче я напишу
ProtocolBus4 Bus4;
Тогда компилируется нормально. Но мне не надо давать возможности создавать более 1 го экземпляра.
Но один то Вам создать надо?
А если написали extern, то это означает. что "где-то в другом месте он есть". А у Вас нет нигде.
Вот когда Вы его хоть где-то объявляете, тогда всё нормально.
Поставьте своё
ProtocolBus4 Bus4;
в .cpp файл библиотеки и будет Вам счастье, т.к. "где-то есть" и в скетче определять не надо.
--------------
А какие меры Вы предприняли, чтобы было невозможно создать второй экземпляр? Просто оставили но "совесть разработчика"? Я не вижу у Вас никаких программных запретов на это.