Модуль TM1637. Не проходит проверка прошивки.

Мишка
Offline
Зарегистрирован: 09.05.2017

Здравствуйте. Сегодня пришел модуль ТМ1637.Первый раз с ним работаю. Если честно в программировании не особо. Загрузил готовую прошивку для проверки ТМ1637.  Но при проверке выдает ошибку по строке tm1637.init(). Пишет:"ciass TM1637 has no member named 'init'"(нет имени...). Подскажите в чем засада? Заранее спасибо.

#include "TM1637.h"   // Подключаем библиотеку для работы с модулем
int8_t DispMSG[] = {1, 2, 3, 4};   // Настройка символов для последующего вывода на дислей
//Определяем пины для подключения к плате Arduino
#define CLK 3
#define DIO 2
//Создаём объект класса TM1637, в качестве параметров
//передаём номера пинов подключения
TM1637 tm1637(CLK, DIO);
void setup()
{
  //Инициализация модуля
  tm1637.init();
  //Установка яркости горения сегментов
  /*
     BRIGHT_TYPICAL = 2 Средний
     BRIGHT_DARKEST = 0 Тёмный
     BRIGHTEST = 7      Яркий
  */
  tm1637.set(BRIGHT_TYPICAL);
}
void loop()
{
  //Задание на включение разделителя
  tm1637.point(true);
  //Выводим массив на дисплей
  tm1637.display(DispMSG);
  //Задержка
  delay(1000);
  //Задание на выключение разделителя
  tm1637.point(false);
  //Выводим массив на дисплей
  tm1637.display(DispMSG);
  //Задержка
  delay(1000);
}

 

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

Библиотека не та подключена.

Мишка
Offline
Зарегистрирован: 09.05.2017

Спасибо. А какая нужна?

 

Мишка
Offline
Зарегистрирован: 09.05.2017

Пробовал несколько разных. Везде ошибки выдает.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Посмотрите внутри библиотеки правильный вызов метода инициализации. Там в пабликах...

Мишка
Offline
Зарегистрирован: 09.05.2017
public:
  uint8_t cmd_set_data;
  uint8_t cmd_set_addr;
  uint8_t cmd_disp_ctrl;
  boolean _PointFlag;            //_PointFlag=1:the clock point on
  TM1637(uint8_t, uint8_t);
  void init(void);               // To clear the display
  int 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 displayNum(float num, int decimal = 0, bool show_minus = true);
  void displayStr(char str[],  uint16_t loop_delay = 500);
  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);       

Вот эти паблики. Строка void init(void). Мне ее надо вписать в тот скетч ?

Мишка
Offline
Зарегистрирован: 09.05.2017

Или несколько строк надо менять ?

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

Попробуй вот это, заодно и потестируешь на дисплеях с точками, у меня на этот момент их нет

https://github.com/DetSimen/TM1637

Никаких init-ов не надо и аффтар всегда здесь, пока и отсюдова не выпилили.  :) 

До setup() поставь одно из обьявлений

TM1637 Display(Clock, Data, enTM1637Type::Number);  //для индикатора с точками
TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоеточием
 
и пиши потом, хоть тексты хоть числа функцией Print()
Мишка
Offline
Зарегистрирован: 09.05.2017

Другие библиотеки тм1637 удалить или они не мешают? А готовые скетчи есть для проверки вашей библиотеки?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
const uint8_t  CLK = 11; // Clock на 11 ноге
const uint8_t DAT = 10; // Data на 10 ноге
TM1637  Display(CLK, DAT);  // часы с двоеточием

void setup(){
Display.SetBrightness(7);
Display.Print("Err0");
delay(3000);
Display.Print(100);
delay(3000);
Display.PrintTime(20,46);
for (uint8_t i=0; i<10; i++){
Display.ToggleColon();
delay(500);
}
delay(3000);
Display.PrintDeg(-15);
delay(5000);
Display.Clear();
}

 

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

Мишка пишет:

Другие библиотеки тм1637 удалить или они не мешают? 

удали, это недолго.  Просто перемести в любую папку за пределами Arduino\libraries, чтобы при необходимости можно было просто вернуть взат.  А мои 2 файла, наоборот, создай директорию, например ..\Arduino\libraries\dts и скопируй их туда.  Тока, IDE перезапустить не забуть. 

Мишка
Offline
Зарегистрирован: 09.05.2017

На диске с в этой папке нет библиотек 1637. Может когда сам устанавливаешь библиотеки они в другую папку устанавливаются.  У меня дисплей с точками. Мне нужно выводить значение с датчика давления. У меня все работает наLCD1602. Хочу переделать на  тм1637 . Не знаю получится ли.

 

#include <LiquidCrystal.h>
const int D = 0; //Аналоговый вход 0 для подключения датчика разряжения
int V = 0;
float V1 = 0;
float P = 0;

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);



void setup() {
  lcd.begin(16, 2);
  lcd.clear();
}

void loop() {

  V = analogRead(D);
  V1 = ((4.92 / 1023.0) * V);
  P = (8.62 * V1 - 4.31);
  P = constrain(P, 0, 34.48);

  lcd.setCursor(5, 0);
  lcd.print(P);
  lcd.setCursor(11, 0);
  lcd.print("BAR");
  delay(500);

}

 

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

Пробуй. 

Мишка
Offline
Зарегистрирован: 09.05.2017

Подскажите.

01
	#include <LiquidCrystal.h>
02
	const int D = 0; //Аналоговый вход 0 для подключения датчика разряжения
03
	int V = 0;
04
	float V1 = 0;
05
	float P = 0;
06
	 
07
	LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
08
	 
09
	 
10
	 
11
	void setup() {
12
	  lcd.begin(16, 2);
13
	  lcd.clear();
14
	}
15
	 
16
	void loop() {
17
	 
18
	  V = analogRead(D);
19
	  V1 = ((4.92 / 1023.0) * V);
20
	  P = (8.62 * V1 - 4.31);
21
	  P = constrain(P, 0, 34.48);
22
	 
23
	  lcd.setCursor(5, 0);
24
	  lcd.print(P);
25
	  lcd.setCursor(11, 0);
26
	  lcd.print("BAR");
27
	  delay(500);
28
	 
29
	}

Не разберусь. Как вывести значение датчика давления на ТМ1637? Подскажите какие значения задать. Как переделать вот этот код под ТМ1637? Бары не нужны. Только цифры.

Atmega328
Offline
Зарегистрирован: 11.02.2020

Для вывода на TM1637 используется функция tm1637.display(dispMSG), где dispMSG - это массив  из четырех цифр.

Соответственно любое число, которое необходимо вывести, надо преобразовать в элементы этого массива.

Число рассматриваем как целое, четырехзначное. Пример выводит число 1234 на дисплей, а затем 34 на дисплей (два старших разряда заполняется нулями):

#include "TM1637.h"//Библиотека для работы с индикаторным модулем
#define CLK A0 // CLK модуля подключен к А0 ардуино
#define DIO A1  // DIO модуля подключен к А1 ардуино (через эти пины реализуется IIC)
TM1637 tm1637(CLK, DIO);//Объявляем сам модуль
int8_t DispMSG[] = {0, 0, 0, 0}//Массив на отображение
int P=1234;
int temp;
void setup() 
   {
tm1637.init();//Инициализация модуля
   }
void loop()
{
P=1234;
temp=P;
//Последовательно заполняем массив остатками от деления
DispMSG[3]=temp%10;
temp=temp/10;
DispMSG[2]=temp%10;
temp=temp/10;
DispMSG[1]=temp%10;
temp=temp/10;
DispMSG[0]=temp%10;
temp=temp/10;
  //Выводим массив на дисплей
  tm1637.display(DispMSG);
delay(1000);//Задержка необходима, так как IIC модуля работает гораздо медленнее, чем Arduino :)
delay(3000);//Ждем три секунды ,чтобы вывести следующее число

P=34;
temp=P;
//Последовательно заполняем массив остатками от деления
DispMSG[3]=temp%10;
temp=temp/10;
DispMSG[2]=temp%10;
temp=temp/10;
DispMSG[1]=temp%10;
temp=temp/10;
DispMSG[0]=temp%10;
temp=temp/10;
  //Выводим массив на дисплей
  tm1637.display(DispMSG);
delay(1000);//Задержка необходима, так как IIC модуля работает гораздо медленнее, чем Arduino :)
delay(3000);//Ждем три секунды ,чтобы вывести следующее число

}
Atmega328
Offline
Зарегистрирован: 11.02.2020

Далее, если данный код будет у вас работать - вставить вывод конкретно значения давления P - дело техники. 

 

Касательно библиотеки - у меня всё компилится. Не знаю, здесь можно файлы передавать (в смысле библиотеку), или нет... 

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

DetSimen пишет:

#include "TM1637.h"

TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоет
const uint8_t  CLK = 11; // Clock на 11 ноге
const uint8_t DAT = 10; // Data на 10 ноге
TM1637  Display(CLK, DAT);  // часы с двоеточием

void setup(){
Display.SetBrightness(7);
Display.Print("Err0");
delay(3000);
Display.Print(100);
delay(3000);
Display.PrintTime(20,46);
for (uint8_t i=0; i<10; i++){
Display.ToggleColon();
delay(500);
}
delay(3000);
Display.PrintDeg(-15);
delay(5000);
Display.Clear();
}
void loop(){}

Arduino: 1.6.6 (Windows 7), Плата:"Arduino/Genuino Uno"
DetSimen при компиляции  TM1637.ccp выдаёт такую ошибку. как исправить. 

C:\Users\08A4~1\AppData\Local\Temp\buildd1a1442ca84ccb5425f0ed64563a8ef5.tmp\sketch\TM1637.cpp: In member function 'void TM1637::Print(int, uint8_t)':

TM1637.cpp:189: error: invalid conversion from 'void*' to 'char*' [-fpermissive]

  char *buf = alloca(16);

            ^
C:\Users\08A4~1\AppData\Local\Temp\buildd1a1442ca84ccb5425f0ed64563a8ef5.tmp\sketch\TM1637.cpp: At global scope:

TM1637.cpp:199: error: default argument given for parameter 2 of 'void TM1637::Print(double, uint8_t)' [-fpermissive]

 void TM1637::Print(const double AValue, const uint8_t APrecision = 1) {

                                                                     ^
In file included from C:\Users\08A4~1\AppData\Local\Temp\buildd1a1442ca84ccb5425f0ed64563a8ef5.tmp\sketch\TM1637.cpp:1:0:

TM1637.h:86: error: after previous specification in 'void TM1637::Print(double, uint8_t)' [-fpermissive]

  void Print(const double AValue, const uint8_t APrecision = 1);

       ^
In file included from C:\Users\08A4~1\AppData\Local\Temp\buildd1a1442ca84ccb5425f0ed64563a8ef5.tmp\sketch\TM1637.cpp:3:0:

C:\Users\08A4~1\AppData\Local\Temp\buildd1a1442ca84ccb5425f0ed64563a8ef5.tmp\sketch\TM1637.cpp: In member function 'void TM1637::Print(double, uint8_t)':

TM1637.cpp:201: error: invalid conversion from 'void*' to 'char*' [-fpermissive]

  char *buf = alloca(12);

              ^
C:\Users\08A4~1\AppData\Local\Temp\buildd1a1442ca84ccb5425f0ed64563a8ef5.tmp\sketch\TM1637.cpp: In member function 'void TM1637::PrintDeg(int8_t)':

TM1637.cpp:249: error: invalid conversion from 'void*' to 'char*' [-fpermissive]

   char *buf = alloca(10);

               ^
exit status 1
invalid conversion from 'void*' to 'char*' [-fpermissive]

 

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

щас поправлю

Upd. Выклалъ. Пробуй. 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

DetSimen пишет:

щас поправлю

Upd. Выклалъ. Пробуй. 

ОК заработало, но если до сетапа раскоментировать какую либо из этих строк

//TM1637 Display(Clock, Data, enTM1637Type::Number);  //для индикатора с точками
//TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоеточ

то идет ошибка

Arduino: 1.6.6 (Windows 7), Плата:"Arduino/Genuino Uno"


tm1637:4: error: 'Clock' was not declared in this scope

 TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоеточ

                ^

tm1637:4: error: 'Data' was not declared in this scope

 TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоеточ

                       ^

tm1637:7: error: redefinition of 'TM1637 Display'

 TM1637  Display(CLK, DAT);  // часы с двоеточием

                 ^

tm1637:4: error: 'TM1637 Display' previously declared here

 TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоеточ

        ^

exit status 1
'Clock' was not declared in this scope

 

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

Эти строки там только для примера. Не нада их раскомментировать

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

DetSimen пишет:

Эти строки там только для примера. Не нада их раскомментировать

ОК, пойду заряжать колону, будешь в Чите угощу.

дисплейчика с точками нет, проверил только на часовом

 

Stels17
Offline
Зарегистрирован: 10.04.2020

Привет, не могу запустить для проверки дисплей в ардуино TM1637, разные библиотеки пробовал, ничего не получается, при компиляции ошибка exit status 1'class TM1637' has no member named 'init'инициализации, третий день мучаюсь, разобраться не могу(

сам скетч:

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 
 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Программу правильно вставьте.

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

Stels17 пишет:

Привет, не могу запустить для проверки дисплей в ардуино TM1637, разные библиотеки пробовал, ничего не получается, при компиляции ошибка exit status 1'class TM1637' has no member named 'init'инициализации

Используй правильную библиотеку, https://github.com/DetSimen/TM1637  там нет никаких init().  Все остальные удали, или перемести на другой диск на время, чтоб можно было быстро вернуть взат. 

Stels17
Offline
Зарегистрирован: 10.04.2020

DetSimen пишет:

Stels17 пишет:

Привет, не могу запустить для проверки дисплей в ардуино TM1637, разные библиотеки пробовал, ничего не получается, при компиляции ошибка exit status 1'class TM1637' has no member named 'init'инициализации

Используй правильную библиотеку, https://github.com/DetSimen/TM1637  там нет никаких init().  Все остальные удали, или перемести на другой диск на время, чтоб можно было быстро вернуть взат. 

Так init прописан в самой программе, я не могу её скомпилировать, эту библиотеку тоже пробовал, не получается, я хочу лишь пока проверить дисплей, как он работает, в теме новичок, но код я не менял, по ютубу пробовал по нескольким видео, не работает дисплей, другие скетчи нормально прошиваются.

Stels17
Offline
Зарегистрирован: 10.04.2020
/*
  // нумерация портов слева направо!
  disp.display(port, num);      // вывести цифру num (0-9) в порт port (0-3)
  disp.display(ARRAY);          // вывести ARRAY, где ARRAY - массив из 4х цифр ( byte ARRAY[4] = {0, 1, 2, 3}; )
  disp.displayByte(port, Byte); // вывести символ Byte в порт port (0-3) (Byte вида 0x7d)
  disp.displayByte(ARRAY_BYTE); // ARRAY_BYTE - массив кодов ( 0x7d, 0x7d, 0x7d, 0x7d )
  disp.displayByte(Byte1, Byte2, Byte3, Byte4); // вывести побайтово
  // для вывода некоторых букв доступен вывод вида _A, _b, _h. Полный список смотри в TM1637.h
  disp.displayInt(value);       // вывести 1-4 значное число
  disp.displayIntZero(value);   // вывести 1-4 значное число с нулями СЛЕВА

  // бегущая строка символов из массива arrayBytes, число символов sizeof(arrayBytes), интервал delay_time в миллисекундах
  disp.runningString(arrayBytes, sizeof(arrayBytes), delay_time); 

  disp.point(state);        // включить/выключить двоеточие (1 и 0 соответственно)

  disp.clearDisplay();      // очистить дисплей
  disp.set(7);              // яркость, 0 - 7 (минимум - максимум)
*/

#include "TM1637.h"

#define CLK 3
#define DIO 2

TM1637 disp(CLK, DIO);

byte i = 0;

void setup() {
  Serial.begin(9600);
  disp.init();  // инициализация
  disp.set(7);  // яркость, 0 - 7 (минимум - максимум)
}

void loop() {
    byte welcome_banner[] = {_t, _E, _S, _t, _empty, _empty, _O, _F, _empty, _d, _i, _S, _P, _L, _a, _y};
    disp.runningString(welcome_banner, sizeof(welcome_banner), 300);
    delay(700);
    disp.clearDisplay();

    disp.displayByte(0x38, 0x79, 0x5e, 0x6d);  // вывод символов и текста
    delay(2000);
    disp.clearDisplay();

    disp.displayByte(_L, _E, _d, _S);   // вывести LEdS, используя буквы из библиотеки
    delay(2000);
    disp.clearDisplay();

    i = 12;  // вывести переменную с нулями слева
    disp.displayIntZero(i);
    delay(2000);
    disp.clearDisplay();
    
    i = 48;  // вывести переменную без нулей слева
    disp.displayInt(i);
    delay(2000);
    disp.clearDisplay();

    for (int j = 0; j < 1235; j += 5) {  // простой счётчик 0-1235 без нулей
        disp.displayInt(j);
        delay(20);
    }
    disp.clearDisplay();

    for (byte i = 0; i <= 3; i++) {       // вывод цифр 0-9 по очереди в каждый порт
        for (byte j = 0; j <= 9; j++) {
            disp.display(i, j);
            delay(100);
        }
        disp.clearDisplay();
    }
    disp.clearDisplay();
    
    for (byte j = 0; j < 10; j++) {
        disp.displayByte(0x64, 0x64, 0x64, 0x64);
        delay(100);
        disp.displayByte(0x49, 0x49, 0x49, 0x49);
        delay(100);
        disp.displayByte(0x52, 0x52, 0x52, 0x52);
        delay(100);
    }

    for (byte j = 0; j < 10; j++) {
        disp.displayByte(0x24, 0x24, 0x24, 0x24);
        delay(100);
        disp.displayByte(0x09, 0x09, 0x09, 0x09);
        delay(100);
        disp.displayByte(0x12, 0x12, 0x12, 0x12);
        delay(100);
    }
    
    disp.clearDisplay();
    
    for (byte j = 0; j < 5; j++) {
        disp.displayByte(1, 0x01);
        delay(100);
        disp.displayByte(1, 0x02);
        delay(100);
        disp.displayByte(1, 0x40);
        delay(100);
        disp.displayByte(1, 0x10);
        delay(100);
        disp.displayByte(1, 0x08);
        delay(100);
        disp.displayByte(1, 0x04);
        delay(100);
        disp.displayByte(1, 0x40);
        delay(100);
        disp.displayByte(1, 0x20);
        delay(100);
    }

    disp.clearDisplay();
    
    
    for (byte j = 0; j < 255; j++) {  // вывести 0-99 счётчик с нулями слева
        disp.displayByte(1, j);
        delay(200);
    }
    disp.clearDisplay();
    delay(1000);
    
}

sadman41 пишет:

Библиотека не та подключена.

привет, у меня тоже проблема с подключением дисплея тм1637, ошибка при компилировании, я так понял инициализация дисплея не проходит, в чем может быть причина?

Дословно такая ошибка:exit status 1

'class TM1637' has no member named 'init'
oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Программа для проверки -> пост №9       только не забудь добавить  void loop () {}

Ссылка на библиотечку -> пост №7

 

permpermskaya
Offline
Зарегистрирован: 08.11.2020

СПАСИБО ОГРОМНОЕ, ЗАРАБОТАЛО!!!! осталось дописать в конце void loop(){}

const uint8_t  CLK = 11; // Clock на 11 ноге
const uint8_t DAT = 10; // Data на 10 ноге
TM1637  Display(CLK, DAT);  // часы с двоеточием

void setup(){
Display.SetBrightness(7);
Display.Print("Err0");
delay(3000);
Display.Print(100);
delay(3000);
Display.PrintTime(20,46);
for (uint8_t i=0; i<10; i++){
Display.ToggleColon();
delay(500);
}
delay(3000);
Display.PrintDeg(-15);
delay(5000);
Display.Clear();
}

 



 

permpermskaya
Offline
Зарегистрирован: 08.11.2020
Единственное это нахимичил с библиотеками и их местом поиска
#include <TM1637.h>
#include "TM1637.h"
//TM1637 Display(Clock, Data, enTM1637Type::Time);    //для индикатора с двоет
const uint8_t  CLK = 11; // Clock на 11 ноге
const uint8_t DAT = 10; // Data на 10 ноге
TM1637  Display(CLK, DAT);  // часы с двоеточием

void setup(){
Display.SetBrightness(7);
Display.Print("Err0");
delay(3000);
Display.Print(100);
delay(3000);
Display.PrintTime(20,46);
for (uint8_t i=0; i<10; i++){
Display.ToggleColon();
delay(500);
}
delay(3000);
Display.PrintDeg(-15);
delay(5000);
Display.Clear();
}
void loop(){}

 

permpermskaya
Offline
Зарегистрирован: 08.11.2020

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

Ну, начт, нальешь при случае

permpermskaya
Offline
Зарегистрирован: 08.11.2020

У кого непонятки, вот вам для поиска, там и описаловка идёт  

Ардуино для школьников. Индикатор на TM1637, LCD 1602 HD44780

permpermskaya
Offline
Зарегистрирован: 08.11.2020

DetSimen пишет:

Ну, начт, нальешь при случае

Без проблем, будеш в Перми - стучись. 

permpermskaya
Offline
Зарегистрирован: 08.11.2020

Вопщем реально раздраконил эту тему, СПАСИБО всем!!!