Так. Я уже почти съел дневной лимит траффика на телефоне. Пойду-ка я лучше свой класс "оптимизирую" до невозможности, а там - посмотрим что получится ))))
Все не надо угождать . Угодите хотя бы себе. Сможите вы пользуясь вашей библиотекой ускорить вашу работу в любом другом отличном от этого проекта.
Цитата:
Во вторых - "надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать. Я не могу запретить копать своё творение всем кому не попадя и потом еще выслушивать нелестные отзывы в свой адрес насчёт надёжности и удобства использования.
Копать придется вам. Потому что если ваша библиотека хоть немного не подходит к другому проекту, то вам придется ее "точить напильником" под эту задачу.
Цитата:
В третих - человек не понимающий как работает его скетч, скорее всего, не является его автором. Так что это не обо мне.
Да вы что говорите. Сюда , на форум такие автора приходят. Или тащую чужие скетчи , или свои убожества, в которых они как автора заблудились. Например Вы. Вы автор и вы как автор не понимаете как работает язык Си, его компилятор и в конце концов как работает ваша программа.
Цитата:
В четвертых: я не собираюсь торговать своими библиотеками потому что я только еще учусь программировать и врядли мне вообще такое придёт в голову.
Вот попробуйте продать вашу библиотеку с нулевой стоимостью и бесплатной раздачей. Это позволяет трезво смотреть на жизнь , свою работу и свои увлечения.
Цитата:
В пятых: мега и дуэ - не панацея и я уже не уверен что мне хватит 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 заодно не забудьте.
Что до Ваших дилемм, это вопрос стиля, привычек и т.п. Любыми своими комментариями я рискую вызвать такой холивар, по сравнению с которым то, что здесь сейчас - научная дискуссия специалистов по бабочкам.
В целом нет ничего страшного и ненормального в том, что функции маленикие. Скорее наоборот. Также нет ничего страшного в том, что одни классы использую другие, а для чего их тогда создавать. Более того, классы умеют наследоваться друг от друга (в этом их главная прелесть) и классы потомки вовсю используют методы классов-родителей. Всё это нормальные будни.
Что до размера функций, посмотрите на кусочек кода и того проекта, о котором я здесь уже писал (в котором куча наследуемых классов)
Видите размер функций? Вот такие они у меня практически всегда. Для данного языка (за очень редким исключением) действует правило: "если функция не умещается на экран, значит что-то не так со структурой программы".
"если функция не умещается на экран, значит что-то не так со структурой программы".
Так вот, оказывается, почему я люблю большие экраны с портретной компоновкой! :)
"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать.
Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "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
"Даже не знаю, как это её надо так вызывать :) Ну, покажите, похихикаем.
А вот смотрите как:
Это главный скетч:
Это хэдер user.h:
А это - исполняемый user.cpp:
А это то, с чем не согласен компилятор:
Сейчас, правда, он нашёл другой способ вынести мне мозг, но зато, кажется, всё правильно хотя бы с точки зрения синтаксиса...
Вот 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:
и user.cpp:
Всё работает, 11% памяти занимает и основной скетч пустой теперь ))))) А это главное.
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
Это еще что! Я так вообще не понял о чем Вы. Такого языка я еще не изучал. Это наверно брайнфак, за который Евгений рассказывал ))))
Это еще что! Я так вообще не понял о чем Вы. Такого языка я еще не изучал. Это наверно брайнфак, за который Евгений рассказывал ))))
Наверно ;)
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
А класс-то зачем для двух функций?
Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))
А класс-то зачем для двух функций?
Так это пока только две и то - функциями их назвать как-то не получается. Первая - это баловство, удалю потом. просто что бы не пихать сразу километр кода, а научиться с классами обращаться. А вторая - это одна из ветвей проекта и самая простенькая причём. А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.
как-то так -
скетч:
где
setup.h
loop.h
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.
Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?
Это шо за жесть вообще? Что делают строки 79-85 в .h файле?
Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.
Так если их объявить в главном скетче - их тогда вообще никто не видит ((((
Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле
int kaka;
и описывается со словом exetrn в .h файле
extern int kaka;
тогда её видно везде, куда включён этот include файл.
Мне бы на Ваших лекциях посидеть )))) А книжная инфа с первого раза не доходит...
Так книжки читать нужно. Сидеть на них - занятие малопродуктивное.
А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.
как-то так -
скетч:
где
setup.h
loop.h
Интересно, но как раз секции ''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 и собирать по мере необходимости в виде списка инклудов.
так, если в лупе подпрограмма, то будет так
где содержимое podprogramm.h
В главном .ino, в void loop(), крутится коротенькая програмка-меню...
ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.
так, если в лупе подпрограмма, то будет так
где содержимое podprogramm.h
Во всяком случае если Вы знакомы с инклудами, что мешает и мне сделать тоже самое? Разве что - время...
забиваешь в гугл [C++ препроцессор] и читаешь
И почитаю...
Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками. А это раззделение по файлам для новичка еще более запутаннее будет.
Вот вопрос именно по возможностям языка: а как в С++ происходит возврат в вызывающую программу? Потому что "return" либо ничего не хочет делать, либо он не должен передавать управление, либо я его как-то не так использую, либо надо вообще это решить как-то иначе.
В общем - не могу теперь выбраться из своего любимого класса, обратно в "void loop()"
Главный скетч:
user.h
user.cpp
Вот инетесно. Спасибо! Если бы Notepad++ еще и компилировать скетчи умел - я был бы просто счастлив ))))
https://m.geektimes.ru/post/258766/
Ой, извиняюсь - всё работает. Просто я этого не вижу, потому что экран не изменяется )))))) Вот так - всё работает!
Скетч
user.h
user.cpp
А! Вспомнил! Я его уже пытался припаять к 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)
???
Текущий вариант проекта выглядит следующим образом:
Скетч :
user.h :
user.cpp :
Пока что - всё работает. Но и особых претензий к этой части, как бы, и нет... Ой - уже есть: если не успеваешь убрать палец с экрана, а особенно если тапаешь в районе области кнопки - опять вываливаешься в 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
Bus4.cpp
скетч
Ошибки компиляции
Если в скетче я напишу
ProtocolBus4 Bus4;
Тогда компилируется нормально. Но мне не надо давать возможности создавать более 1 го экземпляра.
Но один то Вам создать надо?
А если написали extern, то это означает. что "где-то в другом месте он есть". А у Вас нет нигде.
Вот когда Вы его хоть где-то объявляете, тогда всё нормально.
Поставьте своё
ProtocolBus4 Bus4;
в .cpp файл библиотеки и будет Вам счастье, т.к. "где-то есть" и в скетче определять не надо.
--------------
А какие меры Вы предприняли, чтобы было невозможно создать второй экземпляр? Просто оставили но "совесть разработчика"? Я не вижу у Вас никаких программных запретов на это.