pppkadaf писал(а): ↑14 апр 2019, 07:37
Драйверов на 7 сегментные дисплее с I2C я не нашел. Все делают на MAX7219/MAX7221, а это SPI/Microwire или TM1637, а это "two-wire serial interface (CLK, DIO)".
Т.е. без поддержки со стороны контроллера не обойтись.
Андрей реально добавить протокол для TM1637 в прошивку?
Andrey_B писал(а): ↑14 апр 2019, 11:45
"Two-wire serial interface" - это тот же I2C, прозванный так из-за некогда существующих лицензионных сложностей.
Вопрос в другом. Если вы собираетесь выводить просто цифры, контроллер, наверное, сможет чем-то помочь. А если произвольные символы, то будет проще взять библиотеку I2C-PHP и управлять отдельными сегментами дисплея через I2C-API. Получится немногим медленнее. В данном случае передается мало информации. Я бы сказал, что это тот случай, когда использование I2C-API оправдано.
pppkadaf писал(а): ↑14 апр 2019, 15:03
Если это так, то PHP-I2C достаточно. Чтобы контроллер сам выводил инфу на дисплей в моем случае не нужно.Закажу модуль, попробую.
Я попробовал. Пришло вот это. С виду вроде и ничего...
- tm1637-disp.jpg (30.21 КБ) 5930 просмотров
Разумеется, им можно управлять через I2C-API серверным скриптом.
- tm1637-run.gif (915.54 КБ) 5930 просмотров
Код простейший.
Код: Выделить всё
<?php
$digits = array("FC", "60", "DA", "F2", "66", "B6", "BE", "E0", "FE", "F6", "00");
define("SCL", "30");
define("SDA", "31");
define("MD", "http://192.168.0.14/sec/?");
define("V", "3");
require_once("mod_i2c_lib.php");
for ( $i = 5; $i > 0; $i-- )
{
for ( $j = 3; $j >= 0; $j-- )
{
i2c_start();
i2c_send("40");
i2c_stop();
i2c_start();
i2c_send("C0");
for ( $k = 0; $k < 4; $k++ )
{
if ( $k == $j )
i2c_send($digits[$i]);
else
i2c_send("00");
}
i2c_send("00");
i2c_send("00");
i2c_stop();
i2c_start();
i2c_send("F1"); // Должно быть 8F
i2c_stop();
usleep(10000);
}
}
// Shandarah
for ( $i = 0; $i < 6; $i++ )
{
i2c_start();
i2c_send("40");
i2c_stop();
i2c_start();
i2c_send("C0");
for ( $k = 0; $k < 4; $k++ )
{
if($i % 2 == 0)
i2c_send("FF");
else
i2c_send("00");
}
i2c_send("00");
i2c_send("00");
i2c_stop();
usleep(10000);
}
?>
А можно вывести часы.
- tm1637-clock.gif (324.65 КБ) 5930 просмотров
Код еще проще
Код: Выделить всё
<?php
$digits = array("FC", "60", "DA", "F2", "66", "B6", "BE", "E0", "FE", "F6", "00");
define("SCL", "30");
define("SDA", "31");
define("MD", "http://192.168.0.14/sec/?");
define("V", "3");
require_once("mod_i2c_lib.php");
$my_cnt = 0;
while (true)
{
$hour = date("H");
$min = date("i");
i2c_start();
i2c_send("40");
i2c_stop();
i2c_start();
i2c_send("C0");
$val = hexdec($digits[$hour[1]]);
if ( $my_cnt == 1 )
{
$val |= (1 << 0 );
$my_cnt = 0;
}
else
$my_cnt++;
$val = sprintf("%02X", $val);
echo $val;
i2c_send($digits[$hour[0]]);
i2c_send($val);
i2c_send($digits[$min[0]]);
i2c_send($digits[$min[1]]);
i2c_send("00");
i2c_send("00");
i2c_stop();
i2c_start();
i2c_send("F1"); // Должно быть 8F
i2c_stop();
sleep(1);
}
?>
Но в то же время хочу отметить, что мой экземпляр имеет несколько странностей.
1. Стабильно работает только режим "Auto increment mode". Data command: 0x40
Режим "Fixed address mode" не работает или работает некорректно! Data command: 0x44
2. Команда Display Control (полная яркость) согласно даташиту должна быть 0x8F (b1000 1111). Однако мой дисплей такую команду игнорировал.
Эмпирическим и экспериментальным путем выяснил, что мой чип вместо 0x8F включает дисплей по команде 0xF1
Если присмотреться, то 0xF1 - это (b1111 0001), то есть 0x8F, но с обратной последовательностью битов (не B7:B0, а B0:B7).
Обычно я не использую эмодзи, но если бы использовал, то обязательно вставил бы "рука-лицо". Наверное, это нормально для китайских чипов. Люди не парятся по мелочам.
3. При любых некорректных операциях, дисплей уходит в какие-то странные режимы. Функции программного ресета нет. Только отключение питания.
4. 2-Wire Serial Interface - это урезанная I2C. У дисплея нет адреса. А потому на одной шине с дисплеем не могут висеть другие I2C-устройства.
5. Попадаются дисплеи двух типов (заранее это не всегда известно). У одних бит "dp" (SEG8) отвечает за точку рядом с цифрой, у других этот же бит отвечает за двоеточие и работает только в отношении второго сегмента. Мой дисплей оказался именно таким. Точками я управлять не могу, они как бы ни к чему не подключены, могу управлять только двоеточием.
tm1637-examples.zip