Создание пользовательского класса

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Buzzer2010 пишет:

поскольку считывание показаний температуры с 18B20 происходит настолько медленно, что в цикле не надо даже delay() ставить.

у тебя чтение датчиков останавливает весь код?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Так. Я уже почти съел дневной лимит траффика на телефоне. Пойду-ка я лучше свой класс "оптимизирую" до невозможности, а там - посмотрим что получится ))))

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Клапауций 112 пишет:

Buzzer2010 пишет:

поскольку считывание показаний температуры с 18B20 происходит настолько медленно, что в цикле не надо даже delay() ставить.

у тебя чтение датчиков останавливает весь код?

Не что что бы останавливал, но чаще чем 1 раз в секунду - не происходит. А это что - редко? О.о

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Buzzer2010 пишет:

Не что что бы останавливал, но чаще чем 1 раз в секунду - не происходит. А это что - редко? О.о

ок.

и, при чём здесь delay() и какой-то цикл?

ты загоняешь программу в цикл и тупо ждёшь, что ответит датчик?

а, если не ответит никогда? - хакнешь сам себя?

 

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

Buzzer2010 пишет:

Во первых - всем не угодишь.

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

Цитата:
Во вторых - "надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать. Я не могу запретить копать своё творение всем кому не попадя и потом еще выслушивать нелестные отзывы в свой адрес насчёт надёжности и удобства использования.
Копать придется вам. Потому что если ваша библиотека хоть немного не подходит к другому проекту, то вам придется ее "точить напильником" под эту задачу.

Цитата:
В третих - человек не понимающий как работает его скетч, скорее всего, не является его автором. Так что это не обо мне. 
Да вы что говорите. Сюда , на форум такие автора приходят. Или тащую чужие скетчи , или свои убожества, в которых они как автора заблудились. Например Вы. Вы автор и вы как автор не понимаете как работает язык Си, его компилятор и в конце концов как работает ваша программа. 

Цитата:
В четвертых: я не собираюсь торговать своими библиотеками потому что я только еще учусь программировать и врядли мне вообще такое придёт в голову. 
Вот попробуйте продать вашу библиотеку с нулевой стоимостью и бесплатной раздачей. Это позволяет трезво смотреть на жизнь , свою работу и свои увлечения.

Цитата:
В пятых: мега и дуэ - не панацея и я уже не уверен что мне хватит 512к для того, что я задумал (((((((.....

Ну да дайте мне дохрена денег и я покажу на что я способен. Но скорее всего их тупо просрать и дать стране говно.  Умерте свои неуемные фантазии. Если из малого не можете сделать конфетку, то и из большого и подавно.

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano пишет:

А я почему-то считал, что в первую очередь тот, кто разработал/произвел эту краску.

А тот, кто с кисточкой в руках, может вообще иметь весьма смутные представление о физике, химии и экономике.

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

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

Вы меня извините, но я не считаю себя вправе спорить с тем, кто на глазок может достоверно определить цвет и  толщину лакокрасочного покрытия, а так же концепцию всего, чего угодно во всех существующих философских смыслах. Я простой человек. Считайте, что вы меня убедили и покончим с этим. Право на последнее слово оставляю за вами.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

о-то не получается пока что. После описания всех используемых шрифтов в "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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать. 

Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "3,14здец котёнку" - работать не будет к гадалке не ходи. Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ЕвгенийП пишет:

Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)

госдуму я отменил - с 2014-го вами правят зомби

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

Кстати у меня есть сомнения насчёт строки №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;
}

Видите размер функций? Вот такие они у меня практически всегда. Для данного языка (за очень редким исключением) действует правило: "если функция не умещается на экран, значит что-то не так со структурой программы".

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

"если функция не умещается на экран, значит что-то не так со структурой программы".

Так вот, оказывается, почему я люблю большие экраны с портретной компоновкой! :)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Buzzer2010 пишет:

"надёжность и удобство" зависят от кривости рук тех, кто ее потом будет использовать. 

Если система конструируется так, что её надёжность зависит от кривости чьих-то рук, значит "3,14здец котёнку" - работать не будет к гадалке не ходи. Закон Мэрфи даже Клапауций отменить не может (не говоря уж о госдуме!)

Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))

Насчет холивара не переживайте, будет желание его затеять - с удовольствием почитаю. В спорах всегда что-нибудь рождается.

Вот о наследовании и вызове друг друга из одного исполняемого.cpp: Эта строчка мне не понятна:

void ClockScreen::ShowTime(void)

Как это по русски? Типа: "Функция: "ClockScreen" использует внутри себя функцию "ShowTime" ? Или, скорее всего я чего-то не понимаю. В общем - вчера я хотел вынести в класс, буквально, три куска программы...

Сразу хочу оговориться что использовать классы в привычном понимании мне пока что не требуется: создать несколько удобных и часто используемых функций, которые потом, возможно, найдут применение и в других проектах. Всё обстоит несколько иначе. На данном этапе мне нужно просто разгрузить основной скетч. Я уже даже готов вовсе отказаться от классов, а просто оставить отлаженый кусок программы в другом файле, а следующую часть - писать с нуля, за исключением общих #define и переменных.

Так вот. У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "does not name a type"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))

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

Buzzer2010 пишет:

Эта строчка мне не понятна:

void ClockScreen::ShowTime(void)

Как это по русски?

Интересный вопрос. Вот вторая строка Вашего .cpp файла из стартового поста данного топика

void user::InitEMU()

Как это по русски?  Так вот, точно также.

Buzzer2010 пишет:

У меня не получилось вызвать из функции, расположенной в "user.cpp", другую функцию, расположенную тут же, на несколько строк выше - компилятор стал писать что-то вроде: "does not name a type"

Даже не знаю, как это её надо так вызывать :) Ну, покажите, похихикаем.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Buzzer2010 пишет:

Это Вы о том из законов, в которм говорится что самый крупный баг вылазит через полгода безупречной работы программы? ))))))

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

Я не о Вас, а о Законах Мерфи ))))

ЕвгенийП пишет:
Buzzer2010 пишет:

Эта строчка мне не понятна:

void ClockScreen::ShowTime(void)

Как это по русски?

Интересный вопрос. Вот вторая строка Вашего .cpp файла из стартового поста данного топика

void user::InitEMU()

Как это по русски?  Так вот, точно также.

Нет не точно так ! У меня "void" второй раз в скобке не написан. И чего это у Вас в одном файле два класса что ли? Или это примеры из разных файлов? Я думал что один класс - один файл...

ЕвгенийП пишет:
Buzzer2010 пишет:

У меня не получилось вызвать из функции, расположенной в "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()  *****************************

А это то, с чем не согласен компилятор:

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" (((((( Уже и не знаю что делать ((((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это шо за жесть вообще? Что делают строки 79-85 в .h файле?

Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.

Я Вам уже раньше писал - почитайте хорошую книжку, ну нельзя такие вещи осваивать методом тыка.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Это шо за жесть вообще? Что делают строки 79-85 в .h файле?

Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.

Так если их объявить в главном скетче - их тогда вообще никто не видит ((((

Мне бы на Ваших лекциях посидеть )))) А книжная инфа с первого раза не доходит...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ЕвгенийП пишет:

Никогда в include файлах ничего не объявляется.

кто запретил?

Logik
Offline
Зарегистрирован: 05.08.2014

Не тема - треш. Поскромничал Buzzer2010, надо с шаблона фабрики классов начинать было изучать основы С++. 

Некоторым еще оказывается не понимают за что програмеры ЗП получают. Одну темку на форуме прочитал и либки+ООП освоено )))

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Всё. Тогда вот так пусть будет, 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 и у меня никогда никто не будет путаться под ногами )))))

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Logik пишет:
Некоторым еще оказывается не понимают за что програмеры ЗП получают. Одну темку на форуме прочитал и либки+ООП освоено )))

Это еще что! Я так вообще не понял о чем Вы. Такого языка я еще не изучал. Это наверно брайнфак, за который Евгений рассказывал ))))

Logik
Offline
Зарегистрирован: 05.08.2014

Buzzer2010 пишет:

Logik пишет:
Некоторым еще оказывается не понимают за что програмеры ЗП получают. Одну темку на форуме прочитал и либки+ООП освоено )))

Это еще что! Я так вообще не понял о чем Вы. Такого языка я еще не изучал. Это наверно брайнфак, за который Евгений рассказывал ))))

Наверно ;)

sadman41
Offline
Зарегистрирован: 19.10.2016

Buzzer2010 пишет:

Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))

А класс-то зачем для двух функций?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

sadman41 пишет:

Buzzer2010 пишет:

Нет. Главное что я теперь умею сливать отлаженные части проекта в свой класс user и у меня никогда никто не будет путаться под ногами )))))

А класс-то зачем для двух функций?

Так это пока только две и то - функциями их назвать как-то не получается. Первая - это баловство, удалю потом. просто что бы не пихать сразу километр кода, а научиться с классами обращаться. А вторая - это одна из ветвей проекта и самая простенькая причём. А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Buzzer2010 пишет:

А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.

как-то так -

скетч:


#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() {}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Buzzer2010 пишет:

А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.

Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

ЕвгенийП пишет:

Это шо за жесть вообще? Что делают строки 79-85 в .h файле?

Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.

Так если их объявить в главном скетче - их тогда вообще никто не видит ((((

Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле

int kaka;

и описывается со словом exetrn в .h файле

extern int kaka;

тогда её видно везде, куда включён этот include файл.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Buzzer2010 пишет:

Мне бы на Ваших лекциях посидеть )))) А книжная инфа с первого раза не доходит...

Так книжки читать нужно. Сидеть на них - занятие малопродуктивное.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Клапауций 112 пишет:

Buzzer2010 пишет:

А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток.

как-то так -

скетч:

#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 пишет:

А как еще мне убрать из основного скетча отлаженный кусок программы? Да так, что бы он был постоянно под рукой и компилировался вместе с другой ветвью. Ну что бы потом не было никаких непоняток. И еще надо учесть что это вообще мой первый опыт выноса части проекта в отдельный файл на С++. В том языке, который юзал до Си, это всё было на порядок проще.

Мне, конечно, всё равно, что вы пишете, но просто из любопыства хочу спросить: разнос функций по файлам и применение классов - это неразрывно связанные действия в вашей вселенной или всё же нет?

Это способ. Один из, насколько уже стало понятно.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Buzzer2010 пишет:

Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()".

приведи простой пример на языке дуино, иначе я не понимаю твой руский языка - что за нах "самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()""?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Клапауций 112 пишет:

Buzzer2010 пишет:

Нужно вынести "за скобки" основного скетча отдельные, самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()".

приведи простой пример на языке дуино, иначе я не понимаю твой руский языка - что за нах "самостоятельно выполняющиеся разделы, доступ к которым будет происходить из "Loop()""?

На языке - не могу еще: я еще главное меню не написал ))))) Но принцип такой:

В главном .ino, в void loop(), крутится коротенькая програмка-меню со считыванием нажатий на тачскрин. В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)". Ну и так со всеми элементами основного меню будет происходить. Каждая такая функция будет лежмя лежать в классе "user" и ждать своего звёздного часа )))))

Так понятнее?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Buzzer2010 пишет:

ЕвгенийП пишет:

Это шо за жесть вообще? Что делают строки 79-85 в .h файле?

Вы же этот файл включаете и в скетч, и в user.cpp, так почему Вас удивляет, что все эти переменные объявлены и там, и там, т.е. объявлены дважды? Никогда в include файлах ничего не объявляется.

Так если их объявить в главном скетче - их тогда вообще никто не видит ((((

Если нужна глобальная переменная кака, то она один раз нормально описывается в .cpp файле

int kaka;

и описывается со словом exetrn в .h файле

extern int kaka;

тогда её видно везде, куда включён этот include файл.

Вот чего я не учёл! Описание переменных как внешних, блин. Но ведь так как я сделал в посте #69

это же не очень сильно безграмотно? С областью видимости я еще разберусь!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Buzzer2010 пишет:

В главном .ino, в void loop(), крутится коротенькая програмка-меню...

ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.

так, если в лупе подпрограмма, то будет так

void loop() {podprogramm();}

#include <podprogramm.h>

где содержимое podprogramm.h

void podprogramm() {}

 

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Клапауций 112 пишет:

Buzzer2010 пишет:

В главном .ino, в void loop(), крутится коротенькая програмка-меню...

ок. я думал до тебя дойдёт, что скетч, который можно разобрать на части: объявление переменных, функции, макросы, подпрограммы, пр. можно разобрать на части, разбросать по файлам *.h и собирать по мере необходимости в виде списка инклудов.

так, если в лупе подпрограмма, то будет так

void loop() {podprogramm();}

#include <podprogramm.h>

где содержимое podprogramm.h

void podprogramm() {}

До меня еще 99% этого непонятного языка не доходит, так что неудивительно что инклуды не вошли в этот 1%. Но я надеюсь что мне-таки удастся отделить зёрна от плевел. Во всяком случае если Вы знакомы с инклудами, что мешает и мне сделать тоже самое? Разве что - время...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Buzzer2010 пишет:

Во всяком случае если Вы знакомы с инклудами, что мешает и мне сделать тоже самое? Разве что - время...

забиваешь в гугл [C++ препроцессор] и читаешь

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

И почитаю...

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками. А это раззделение по файлам для новичка еще более запутаннее будет.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Mr.Privet пишет:
Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками. А это раззделение по файлам для новичка еще более запутаннее будет.
Вот инетесно. Спасибо! Если бы Notepad++ еще и компилировать скетчи умел - я был бы просто счастлив ))))

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Вот вопрос именно по возможностям языка: а как в С++ происходит возврат в вызывающую программу? Потому что "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();
};
#endif

user.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()  *****************************

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

buzzer2010 пишет:

Вот инетесно. Спасибо! Если бы Notepad++ еще и компилировать скетчи умел - я был бы просто счастлив ))))

https://m.geektimes.ru/post/258766/

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Ой, извиняюсь - всё работает. Просто я этого не вижу, потому что экран не изменяется )))))) Вот так - всё работает!

Скетч

#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();
};
#endif

user.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()  *****************************

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Mr.Privet пишет:
buzzer2010 пишет:
Вот инетесно. Спасибо! Если бы Notepad++ еще и компилировать скетчи умел - я был бы просто счастлив ))))
https://m.geektimes.ru/post/258766/

А! Вспомнил! Я его уже пытался припаять к IDE. Ничего не получилось. Ну руки кривые - что поделаешь ))))

sadman41
Offline
Зарегистрирован: 19.10.2016

Теперь я понимаю, почему у нас ракеты падают на взлете, у них в конце RocketClass::Start() стоит return (Earth).

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

sadman41 пишет:

Теперь я понимаю, почему у нас ракеты падают на взлете, у них в конце RocketClass::Start() стоит return (Earth).

ЭЭЭЭ!!! Это я просто проверял надо ли указывать куда возвращаться ))))) Будет без него работать или нет - сейчас посмотрим еще...

Не, блин. Если вконце не ставить return (draw_Menu);  а просто return; - не выполняется прорисовка меню, но назад в loop() возвращается: нажимаешь тач там где кнопка должна быть прорисована - опять запускается user::temp_Main(). Так что насчёт ракет - всё нормально ;) А что бы они на взлёте не падали, между RocketClass::Start() и return (Earth) поставте delay() побольше )))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Mr.Privet пишет:
Почитал тему и понял, что ТС нужно попробовать другие редакторы, на пример Notepad++. Там можно сворачивать функции плюсиками и минумиками.
IDE вроде тоже умеет с правильными опциями.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

 В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)". 

В таком случае она будет игнорировать все другие нажатия и вообще ничего не делать "пока не нажата". Неужели это то, чего Вы хотите?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Buzzer2010 пишет:

 В зависимости от выбранного элемента меню вызывается, на языке дуино - функция, которая крутится в цикле "do-while(пока на тачскрине не нажата кнопка выхода в основное меню)". 

В таком случае она будет игнорировать все другие нажатия и вообще ничего не делать "пока не нажата". Неужели это то, чего Вы хотите?

Да. Эта ветка будет только отображать график температуры и выполняться, пока не тапнешь по экрану.

Кстати есть вопрос: есть ли разница между этими условиями:

while (!myTouch.dataAvailable())     и
while (myTouch.dataAvailable()== false)

???

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Текущий вариант проекта выглядит следующим образом:

Скетч :

#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();
};
#endif

user.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, что означает что данных не поступает, а цикл быстрее тикать не начнает!!!!

Почему это может происходить? Помогите пожалуста!

Выявил когда именно это происходит: если запустить ардуину со снятым датчиком - скорость считывания быстрее, но показаний, естественно, нет. Но как только вставляешь датчик - показания правильные, а скорость остаётся прежней! НО! Если нажимаешеь "Сброс" на плате, следующий раз - уже скорость низкая. Даже если выдернуть датчик при такой скорости - показания сразу сваливаются, но скорость остаётся медленной!

Ну что за фигня ? (((((((

Smith2007
Offline
Зарегистрирован: 30.10.2017

Добрый день всем.

Решил не создавать дублирующую тему и задать вопрос в этой.

Для организации протокола обмена по блютус сделал формат пакета которым будут обмениваться приемник и передатчик.

Программа заработала. Теперь решил оформить ее в виде библиотеки.

Создаю класс. Так как допустим только один экземпляр такого класса, в 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;
#endif

Bus4.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();
}

 

Ошибки компиляции

Arduino: 1.8.5 (Windows 7), Плата:"Arduino Leonardo"

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries D:\Project\Arduino\libraries -fqbn=arduino:avr:leonardo -vid-pid=0X2341_0X8036 -ide-version=10805 -build-path C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588 -warnings=default -build-cache C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_cache_27901 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose D:\Project\Arduino\sign\sign.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries D:\Project\Arduino\libraries -fqbn=arduino:avr:leonardo -vid-pid=0X2341_0X8036 -ide-version=10805 -build-path C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588 -warnings=default -build-cache C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_cache_27901 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose D:\Project\Arduino\sign\sign.ino
Using board 'leonardo' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR  -DUSB_VID=0x2341 -DUSB_PID=0x8036 '-DUSB_MANUFACTURER="Unknown"' '-DUSB_PRODUCT="Arduino Leonardo"' "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\leonardo" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\sketch\sign.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR  -DUSB_VID=0x2341 -DUSB_PID=0x8036 '-DUSB_MANUFACTURER="Unknown"' '-DUSB_PRODUCT="Arduino Leonardo"' "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\leonardo" "-IC:\Program Files (x86)\Arduino\libraries\Bus4" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\sketch\sign.ino.cpp" -o "nul"
Using cached library dependencies for file: C:\Program Files (x86)\Arduino\libraries\Bus4\Bus4.cpp
Generating function prototypes...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR  -DUSB_VID=0x2341 -DUSB_PID=0x8036 '-DUSB_MANUFACTURER="Unknown"' '-DUSB_PRODUCT="Arduino Leonardo"' "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\leonardo" "-IC:\Program Files (x86)\Arduino\libraries\Bus4" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\sketch\sign.ino.cpp" -o "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\preproc\ctags_target_for_gcc_minus_e.cpp"
"C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\preproc\ctags_target_for_gcc_minus_e.cpp"
Компиляция скетча...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os  -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR  -DUSB_VID=0x2341 -DUSB_PID=0x8036 '-DUSB_MANUFACTURER="Unknown"' '-DUSB_PRODUCT="Arduino Leonardo"' "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\leonardo" "-IC:\Program Files (x86)\Arduino\libraries\Bus4" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\sketch\sign.ino.cpp" -o "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\sketch\sign.ino.cpp.o"
Compiling libraries...
Compiling library "Bus4"
Используем предварительно скомпилированный файл: C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\libraries\Bus4\Bus4.cpp.o
Compiling core...
Using precompiled core
Linking everything together...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc"  -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega32u4  -o "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588/sign.ino.elf" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\sketch\sign.ino.cpp.o" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588\libraries\Bus4\Bus4.cpp.o" "C:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588/..\arduino_cache_27901\core\core_arduino_avr_leonardo_0c812875ac70eb4a9b385d8fb077f54c.a" "-LC:\Users\IGOR~1.WIN\AppData\Local\Temp\arduino_build_4588" -lm
C:\Users\IGOR~1.WIN\AppData\Local\Temp\ccZ6RnvC.ltrans0.ltrans.o: In function `init':

C:\Program Files (x86)\Arduino\libraries\Bus4/Bus4.cpp:38: undefined reference to `Bus4'

C:\Program Files (x86)\Arduino\libraries\Bus4/Bus4.cpp:38: undefined reference to `Bus4'

C:\Program Files (x86)\Arduino\libraries\Bus4/Bus4.cpp:38: undefined reference to `Bus4'

C:\Program Files (x86)\Arduino\libraries\Bus4/Bus4.cpp:38: undefined reference to `Bus4'

C:\Users\IGOR~1.WIN\AppData\Local\Temp\ccZ6RnvC.ltrans0.ltrans.o: In function `Recv':

C:\Program Files (x86)\Arduino\libraries\Bus4/Bus4.cpp:104: undefined reference to `Bus4'

C:\Users\IGOR~1.WIN\AppData\Local\Temp\ccZ6RnvC.ltrans0.ltrans.o:C:\Program Files (x86)\Arduino\libraries\Bus4/Bus4.cpp:104: more undefined references to `Bus4' follow

collect2.exe: error: ld returned 1 exit status

Используем библиотеку Bus4 в папке: C:\Program Files (x86)\Arduino\libraries\Bus4 (legacy)
exit status 1
Ошибка компиляции для платы Arduino Leonardo.

 

Smith2007
Offline
Зарегистрирован: 30.10.2017

Если в скетче я напишу 

ProtocolBus4 Bus4;

Тогда компилируется нормально. Но мне не надо давать возможности создавать более 1 го экземпляра. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Но один то Вам создать надо?

А если написали extern, то это означает. что "где-то в другом месте он есть". А у Вас нет нигде.

Вот когда Вы его хоть где-то объявляете, тогда всё нормально.

Поставьте своё

ProtocolBus4 Bus4;

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

--------------

А какие меры Вы предприняли, чтобы было невозможно создать второй экземпляр?  Просто оставили но "совесть разработчика"? Я не вижу у Вас никаких программных запретов на это.