Несколько TM1637. Общая процедура вывода информации

2611sergey
Offline
Зарегистрирован: 17.01.2019

Всем доброго!

Вопрос навеян этой темой.

В устройстве будет 3 индикатора TM1637. В топике есть обычный вариант применения:

01 #include "TM1637.h" // Подключаем библиотеку
02 #define CLK_1 8 // первый семисегмент
03 #define DIO_1 9 //
04 #define CLK_2 10 // второй семисегмент
05 #define DIO_2 11 //
06 TM1637 disp_1(CLK_1, DIO_1);
07 TM1637 disp_2(CLK_2, DIO_2);
08 void setup() {
09   disp_1.set(7);
10   //disp_1.init(D4056A);
11   disp_2.set(7);
12   //disp_2.init(D4056A);
13   }
14  
15 void loop()
16   {
17   disp_1.display(1234);
18   delay(2000);
19   disp_2.display(5678);
20   delay(2000);
21   }

Хотелось бы написать одну процедуру вывода на индикатор, где аргументом будет этот самый индикатор.

Подскажите, плс: как передать нужный дисплей в процедуру вывода (какой это тип данных)?

Как пример:

15 void out_disp(disp)
16   {
17   disp.display(1234);
18   delay(2000);
19   disp.display(5678);
20   delay(2000);
21   }

Возможно такое?

Спасибо.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Возможно. Надо в функцию передавать указатель на класс. Примерно так:

void out_disp(TM1637 * disp)
{
	  disp->display(1234);
	  delay(2000);
	  disp->display(5678);
	  delay(2000);
}

//Пишем в первый дисплей
out_disp(&disp_1);

//Пишем во второй дисплей
out_disp(&disp_2);

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

asam пишет:

void out_disp(TM1637 * disp)

{
	  disp->display(1234);
	  delay(2000);
	  disp->display(5678);
	  delay(2000);
}

если уж ты проверку на NULL не делаешь, то передавать надо ссылку

void out_disp(const TM1637  &disp)
{
	  disp.display(1234);
	  delay(2000);
	  disp.display(5678);
	  delay(2000);
}

out_disp(disp1);
out_disp(disp2);

 

2611sergey
Offline
Зарегистрирован: 17.01.2019
Если:
void out_disp(const TM1637  &disp)
то ошибка:
E:\Arduino\libraries\TM1637/TM1637.h:73:8: note:   in call to 'void TM1637::display(int16_t)'
   void display(int16_t Decimal);
        ^
Посмотрел TM1637.h, там:
 
#define D4036B 0
#define D4056A 1
class TM1637
 { 
  public:
uint8_t Cmd_SetData;
uint8_t Cmd_SetAddr;
uint8_t Cmd_DispCtrl;
boolean _PointFlag;
//_PointFlag=1:the clock point on
uint8_t _DispType;
TM1637(uint8_t, uint8_t);
void init(uint8_t = D4036B);
void writeByte(int8_t wr_data);//write 8bit data to tm1637
void start(void);//send start bits
void stop(void); //send stop bits
void display(int8_t DispData[]);
void display(uint8_t BitAddr,int8_t DispData);
void display(double Decimal);
void display(int16_t Decimal);
void clearDisplay(void);
void set(uint8_t = BRIGHT_TYPICAL,uint8_t = 0x40,uint8_t = 0xc0);//To take effect the next time it displays.
void point(boolean PointFlag);//whether to light the clock point ":".To take effect the next time it displays.
void coding(int8_t DispData[]); 
int8_t coding(int8_t DispData); 
 
Пробовал все типы данных int8_t,  uint8_t, double,  int16_t. 
void out_disp(uint8_t TM1637  &disp)
Ошибка одинаковая:
Test_Procedure_out_disp.ino: In function 'void out_disp(int8_t)':
Test_Procedure_out_disp:10:7: error: 'disp' was not declared in this scope
Test_Procedure_out_disp.ino: In function 'void loop()':
Test_Procedure_out_disp:24:18: error: cannot convert 'TM1637' to 'int8_t {aka signed char}' for argument '1' to 'void out_disp(int8_t)'
 
Чего-то не хватает...
 

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Приведите полностью ваш скетч и целиком сообщение об ошибке 

2611sergey
Offline
Зарегистрирован: 17.01.2019

Всем спасибо! Разобрался.

Вот рабочий вариант:


#include "TM1637.h"
#define CLK 9//Pins for TM1637   
#define DIO 8//Pins for TM1637
TM1637 disp_1(CLK,DIO); 

void out_disp(TM1637  &disp)

{
      disp.display(1234);
      delay(2000);
      disp.display(5678);
      delay(2000);
}


void setup() {
  disp_1.init();
  disp_1.set(BRIGHT_TYPICAL);

}

void loop() {
  out_disp(disp_1);
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нальёшь при случае :)

2611sergey
Offline
Зарегистрирован: 17.01.2019

Наливаю. Вот рабочий вариант подключения нескольких TM1637.

Таймер CLK подается на все одновременно. Сигнальный DIO - для каждого свой.

#include "TM1637.h"
#define CLK 9//Pins for TM1637 #1 & #2 
#define DIO 8//Pins for TM1637 #1
#define DIO2 10//Pins for TM1637 #2 
TM1637 disp_1(CLK,DIO); 
TM1637 disp_2(CLK,DIO2); 

void out_disp(TM1637  &disp)

{
      disp.display(1234);
      delay(2000);
      disp.display(5678);
      delay(2000);
}


void setup() {
  disp_1.init();
  disp_1.set(BRIGHT_TYPICAL);
  disp_2.init();
  disp_2.set(BRIGHT_TYPICAL);

}

void loop() {
  out_disp(disp_1);
  out_disp(disp_2);
}