в общий провод ТМ резистор?
не вариант, яркость будет прыгать.
Тогда ждать ТСа
ТСа - это что?
Автора проекта, может напряжение снизить, контроллер позволяет
В скетче нашел ссылку в "Инициализация дисплея TM1650… " - там есть описание, как менять яркость. Попробую.
ты о таблице?
// адреса регистров управления и данных ТМ1650
// 1-0х24
// 2-0х25
// 3-0х26
// 4-0х27
// *********инициализация дисплея************
//___________________________________________
//b7 b6 b5 b4 b3 b2 b1 b0 IФункция I опис. I
//___________________________________________
//x 0 0 0 x x I I 8 I
//x 0 0 1 x x I I 1 I
//x 0 1 0 x x I I 2 I
//x 0 1 1 x x I яркость I 3 I
//x 1 0 0 x x I I 4 I
//x 1 0 1 x x I I 5 I
//x 1 1 0 x x I I 6 I
//x 1 1 1 x x I I 7 I
//____________________________________________
//x 0 x x I режим I 8ceгм I
//x 1 x x I 7/8 bit I 7ceгм I
//____________________________________________
//x x x 0 Ibit ON/OFFI OFF I
//x x x 1 I дисплея I ON I
//____________________________________________
Да, о ней.
по умолчанию яркость =8 дисплей 7 сегментный?
I2CWrite(B00010001);
яркость = 1, 8 сегм. отображение ON - так вроде?
Восьмой сегмент это точка. В народе эти дисплеи зовут - семисегментными
это я взял из скетча по ссылке
034 // *********инициализация дисплея************
035 //___________________________________________
036 //b7 b6 b5 b4 b3 b2 b1 b0 IФункция I опис. I
037 //___________________________________________
038 //x 0 0 0 x x I I 8 I
039 //x 0 0 1 x x I I 1 I
040 //x 0 1 0 x x I I 2 I
041 //x 0 1 1 x x I яркость I 3 I
042 //x 1 0 0 x x I I 4 I
043 //x 1 0 1 x x I I 5 I
044 //x 1 1 0 x x I I 6 I
045 //x 1 1 1 x x I I 7 I
046 //____________________________________________
047 //x 0 x x I режим I 8ceгм I
048 //x 1 x x I 7/8 bit I 7ceгм I
049 //____________________________________________
050 //x x x 0 Ibit ON/OFFI OFF I
051 //x x x 1 I дисплея I ON I
052 //____________________________________________
053
054
055 Wire.beginTransmission(0x24); //обращаемся к любому порту 0х24-0х27
056 Wire.write(0b01000001); //включаем:яркость 4,8 битный режим, отображение ON
057 Wire.endTransmission(); // закрываем сессию
Пришли индикаторы с общим катодом, все заработало. Яркость пришлось даже добавить из-за светофильтра (сделал пока 4, как в примере выше, в оригинале 1).
// I2CWrite(B00010001); // яркость 1
I2CWrite(B01000001); // яркость 4
Код замечательный. На ATTiny13 работает отлично. Но без правки на ATmega328 не работает.
Вот поправленный код под ATmega328 + добавлен гистерезис в 1 градус, чтобы не скакали показания + добавлена сигнализация о превышении заданной температуры (постоянный сигнал на светодиоде или пищалке на ноге 13) и об обрыве термопары (прерывистый сигнал). На ATmega328 занимает 808 байт памяти. (Скетч использует 808 байт (2%) памяти устройства. Всего доступно 32768 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 2048 байт для локальных переменных. Максимум: 2048 байт.)
// Точный термометр до 1000 градусов на attiny13 с max6675 и TM1637
// с фильтрацией дребезга - гистерезис - 1 градус
// с индикацией на 13 пине превышения температуры и обрыва датчика
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
// Контрольная температура, при превышении которой, будет сигнализация
#define MAX_TEMP 220 // Граничная температура для сигнализации - при её достижении срабатывает сигнализация
// Настройка пинов
#define MISO_PIN PB0 // D8
#define CS_PIN PB1 // D9
#define SCK_PIN PB2 // D10
#define CLK_TM PB3 // D11
#define DIO_TM PB4 // D12
#define BEEP_PIN PB5 // D13
#define TM_DELAY() _delay_us(2)
#define DIO_H() (PORTB |= (1 << DIO_TM))
#define DIO_L() (PORTB &= ~(1 << DIO_TM))
#define DIO_OUT() (DDRB |= (1 << DIO_TM))
#define DIO_IN() (DDRB &= ~(1 << DIO_TM))
#define DIO_RD() ((PINB & (1 << DIO_TM)) ? 1 : 0)
#define CLK_H() (PORTB |= (1 << CLK_TM))
#define CLK_L() (PORTB &= ~(1 << CLK_TM))
#define BEEP_ON() (PORTB |= (1 << BEEP_PIN))
#define BEEP_OFF() (PORTB &= ~(1 << BEEP_PIN))
//------------- ¤ркость свечени¤ индикатора ----------
#define Bright0 0x88
#define Bright1 0x89
#define Bright2 0x8A
#define Bright3 0x8B
#define Bright4 0x8C
#define Bright5 0x8D
#define Bright6 0x8E
#define Bright7 0x8F
#define SetBright Bright5 //сюда прописать ¤ркость от 0 до 7
//------------------------------------------------------------------
PROGMEM const uint8_t _digit2segments[] =
{
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x00, // пусто
0x63 // Значок градуса
};
// Прототипы функций
void TM1637_start();
void TM1637_stop();
uint8_t TM1637_write_byte(uint8_t value);
void send_cmd(uint8_t value);
int spiRead();
int main(void)
{
// Настройка портов
DDRB |= (1 << CS_PIN) | (1 << SCK_PIN) | (1 << CLK_TM) | (1 << DIO_TM) | (1 << BEEP_PIN);
DDRB &= ~(1 << MISO_PIN);
_delay_ms(300);
send_cmd(SetBright); // Яркость
send_cmd(0x40); // Режим автоинкремента
int lastDispVal = -5000;
int filteredTemp = -5000;
int maxTemp = MAX_TEMP;
while(1)
{
int t = spiRead();
if (t == -99)
{
BEEP_ON();
if (lastDispVal != -99)
{
TM1637_start();
TM1637_write_byte(0xC0);
TM1637_write_byte(0x79);
TM1637_write_byte(0x50);
TM1637_write_byte(0x50);
TM1637_write_byte(0x00);
TM1637_stop();
lastDispVal = -99;
}
_delay_ms(100);
BEEP_OFF();
}
else {
int currentTemp = t >> 2;
if (filteredTemp == -5000)
filteredTemp = currentTemp;
else
filteredTemp = (filteredTemp + currentTemp) / 2;
if (filteredTemp >= maxTemp)
BEEP_ON();
else
BEEP_OFF();
if (filteredTemp != lastDispVal)
{
uint8_t d0, d1, d2;
int v = filteredTemp;
d0 = (v >= 100) ? pgm_read_byte(&_digit2segments[v / 100]) : 0x00;
d1 = pgm_read_byte(&_digit2segments[(v % 100) / 10]);
d2 = pgm_read_byte(&_digit2segments[v % 10]);
TM1637_start();
TM1637_write_byte(0xC0);
TM1637_write_byte(d0);
TM1637_write_byte(d1);
TM1637_write_byte(d2);
TM1637_write_byte(pgm_read_byte(&_digit2segments[11])); // Выводим символ Градуса
TM1637_stop();
lastDispVal = filteredTemp;
}
}
_delay_ms(200);
}
}
int spiRead()
{
int rawData = 0;
PORTB &= ~(1 << CS_PIN); TM_DELAY();
PORTB |= (1 << CS_PIN); _delay_ms(50);
PORTB &= ~(1 << CS_PIN); TM_DELAY();
for (int i = 15; i >= 0; i--)
{
PORTB |= (1 << SCK_PIN);
TM_DELAY();
if (PINB & (1 << MISO_PIN))
rawData |= (1 << i);
PORTB &= ~(1 << SCK_PIN);
TM_DELAY();
}
PORTB |= (1 << CS_PIN);
if (rawData & 0x04)
return -99;
return (rawData >> 3) & 0x0FFF;
}
void TM1637_start()
{
DIO_OUT();
DIO_H();
CLK_H();
TM_DELAY();
DIO_L();
TM_DELAY();
CLK_L();
}
void TM1637_stop()
{
DIO_OUT();
CLK_L();
DIO_L();
TM_DELAY();
CLK_H();
TM_DELAY();
DIO_H();
}
uint8_t TM1637_write_byte(uint8_t value)
{
for (uint8_t i = 0; i < 8; i++, value >>= 1)
{
CLK_L();
if (value & 0x01)
DIO_H();
else
DIO_L();
TM_DELAY();
CLK_H();
TM_DELAY();
}
CLK_L();
DIO_IN();
DIO_H();
TM_DELAY();
CLK_H();
TM_DELAY();
uint8_t ack = DIO_RD();
CLK_L();
DIO_OUT();
return ack;
}
void send_cmd(uint8_t value)
{
TM1637_start();
TM1637_write_byte(value);
TM1637_stop();
}
Схема из Протеуса
Простите за, возможно, глупый вопрос… но всё же: Нахуа?
Странный вопрос. )) Автор дал код, о котором написал, что он подойдёт для ATmega328, на которой код реально не стартанёт. Я дал правку проверенного в Протеусе варианта, чтобы не мучались желающие использовать код на ATmega328, на которой можно дополнить решение кучей доработок для управления или сигнализации устройств с MAX6675 и термопарой. Например управление порогом срабатывания сигнализации, плавным разогревом до нужной температуры, поддержанием заданной температуры и т.д. Места для дополнительного кода просто море.
В каком посте он это писал? Если не сложно - напиши. Я что-то не вижу…
Замена авторскому и дешевле и без батарейков.
https://www.ozon.ru/product/termometr-vysokoy-temperatury-nerzhaveyushchey-stali-1933768727/
И где там точночть до градуса?

