Всем добрый день,
я не профи и только учусь.
купил несколько 4BitLed модулей - это блоки 7 сигментных индикаторов на базе 74 CH595D
на каждом модуле стоит по 2 штуки 74 CH595D
я подключил эти модули “последовательно” и закачал скет со счётчиком - это для пробы
но в будущем хочу чтобы на каждом модуле были "свои "цифры, а именно выводились потом данные с датчиков
сейчас этого не получается, так как оба модуля выдают одинаковые данные (работают “зеркально”), несмотря на то, что подключены “последовательно”
хотел узнать:
кто нибудь на этом форуме уже так делал?
И не так делали.
А Вот Вы читали правила форума, прежде, чем на него постить? В частности “как правильно задавать вопросы”?
Федор, вы предоставили крайне мало информации для ответа на свой вопрос.
Первое - дайте ссылку на даташит ваших модулей или хотя бы ссылку на лот, где вы их покупали.
Второе - выложите подробную схему подключения с указанием всех соединений, включая землю и питание.
Третье - вставьте в сообщение свой код (ПОЛНОСТЬЮ) оформив его соответвующими тегами.
Без всего этого не вижу смысла даже начинать.
Все кто написал недовольный негатив - всё равно привет!))
На данной стадии у меня вопрос не в написании кода - а в целом : возможно ли на стороне железа технически выполнение такой схемы.
Постараюсь завтра скинуть фото модулей
Про даташит и схему моделей не уверен, что найду.
Но в каждом модуле по 2 штуки 74сн595d
Поэтому я подумал что если их представить как “паровоз” из этих 74сн… То в принципе должно получиться:
“Вагон 1” - данные влажности с датчика номер 1
Вагон 2 - данные с датчика номер 2
… и так далее
Но это я рассуждал логически
Теперь осталось определиться с реальной возможностью этих железок
Если вопрос чисто теоретический, можно ли на первые два из 4х индикаторов вывести одно значение - а на третий и четвертый другое - то ответ однозначный - можно.
Вы бы сразу так и спросили.
А негатива вам никто не писал.
добрый день,
добрался я до компа, чтобы дополнить свой вопрос.
и сейчас, пока готовил поправки к своему вопросу по 4BitLed модулям, частично нашел ответ на свои вопросы:), но пока что только частично.
По порядку.
Сами модули выглядят вот так:
На фото лицевая и оборотная часть.
Таких полно на Али. например можно посмотреть тут.
Каждый модуль имеет 2 штуки 74CH595D.
Пока что дата шит не нашел, но обычно для каждого 7 сегментного индикатора в рукодельных изделиях ставится по 1 штуки 74CH595., то есть для 4 индикаторов нужно 4 штуки.
Тут же их стоит 2 (точно не знаю, но возможно это потом повлияет на сам скетч для ардуино).
У каждого блока есть “выходы” с двух сторон!
на одной стороне уже припаяны штекера.
На другой стороне их нет, то есть отверстия с надписями:
Имеются следующие входы-выходы:
- со стороны подключения к ардуино:
- VCC
- SCLK
- RCLK
- DIO - GND
- с обратной стороны:
- VCC
- SCLK
- RCLK
- QH - GND
Вот когда стал делать фотки - внимательно разглядел 4-й выход (вход) и до меня дошло, что он как раз и создан для того, чтобы несколько 4 таких модуля можно было соединить параллельно.
Еще вчера я на этот выход я припаял штыри для штекера и соединил их, а также частично “прозвонил” 74CH595.
Получилось следующее:
ножка (выход) № 9 крайней 74CH595 после соединения двух модулей последовательно “прозванивается” на ножке № 14 74CH595 находящейся на соседнем модуле.
То есть еще вчера я сообразил, что при последовательном соединении они как раз образуют схему из 4-х расширителей портов 74CH595 . Следовательно со стороны “железа” такая схема допустима.
Теперь осталось решить вопрос о коде - скетче для этой схемы.
Задача:
- данные с нескольких датчиков влажности или температуры должны выдаваться на каждом отдельном указанном 7 сегментном модуле отдельно (самостоятельно).
При этом повторюсь - модули идут последовательно (для экономии выходов на ардуино).
Датчики в будущем планирую тоже подключать через “расширитель” портов (жду когда доставят из китая).
Сейчас я эксперементирую с “произвольным” кодов, то есть кодом, который не совсем подходит под мою будущую схему.
Например у Алекса Гувера я взял скетч (точнее там библиотека) именно для такого 4 LED модуля.
Но эта его библиотека содержит счётчик (не нужный в моем случае).
Сам СКЕТЧ выглядит вот так:
//---- ПИНЫ ----
byte SCLK = 6;
byte RCLK = 5;
byte DIO = 4;
int Rele1 = 7;
//---- ПИНЫ ----
#include "tm74hc595display.h"
#include <TimerOne.h>
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char SYM[39];
void setup() {
symbols(); // объявление пачки символов для работы дисплея
Timer1.initialize(1500); // установка таймера на каждые 1500 микросекунд
Timer1.attachInterrupt(timerIsr); // запуск таймера
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
}
void loop() {
// вывод
disp.set(SYM[13], 0); // вывести 0 в первый порт
delay(20);
disp.set(SYM[14], 1); // вывести 0. в четвёртый порт
delay(20);
disp.set(SYM[15], 2); // вывести 0. в четвёртый порт
delay(20);
disp.set(SYM[16], 3); // вывести 0. в четвёртый порт
delay(20);
disp.set(SYM[17], 4); // вывести 0. в четвёртый порт
delay(20);
disp.clear(); // очистить дисплей
digitalWrite (7, LOW); // включить реле на 7 пине - реле "низкое"
for (int i = 0; i <= 20; i++) {
disp.digit2(i, 0); // счётчик 0-50 на портах 1 и 2
delay(50);
}
digitalWrite (7, HIGH); // вЫключить реле на 7 пине - реле "низкое"
disp.clear();
for (int i = 0; i <= 20; i++) {
disp.digit2(i, 1); // счётчик 0-50 на портах 2 и 3
delay(50);
}
disp.clear();
for (float i = 00.00; i <= 25; i += 0.10) {
disp.float_dot(i, 2); // счётчик 00.00 - 25.00 до десятых (точка на 2 знаке)
delay(70);
}
disp.clear();
}
void timerIsr() { // прерывание таймера
disp.timerIsr(); // пнуть дисплей
}
// символы для дисплея
void symbols() {
// обычные
SYM[0] = 0xC0; //0
SYM[1] = 0xF9; //1
SYM[2] = 0xA4; //2
SYM[3] = 0xB0; //3
SYM[4] = 0x99; //4
SYM[5] = 0x92; //5
SYM[6] = 0x82; //6
SYM[7] = 0xF8; //7
SYM[8] = 0x80; //8
SYM[9] = 0x90; //9
// с точкой
SYM[10] = 0b01000000; //0.
SYM[11] = 0b01111001; //1.
SYM[12] = 0b00100100; //2.
SYM[13] = 0b00110000; //3.
SYM[14] = 0b00011001; //4.
SYM[15] = 0b00010010; //5.
SYM[16] = 0b00000010; //6.
SYM[17] = 0b01111000; //7.
SYM[18] = 0b00000000; //8.
SYM[19] = 0b00010000; //9.
}
Но для выведения информации с разных датчиков мне кажется проблема не в этом коде
а в файле реализации “.CPP”:
#include "TM74HC595Display.h"
#include <Arduino.h>
unsigned char _LED_0F[20];
TM74HC595Display::TM74HC595Display(int SCLK, int RCLK, int DIO)
{
pinMode(SCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(DIO, OUTPUT);
_SCLK = SCLK;
_RCLK = RCLK;
_DIO = DIO;
_LED_0F[0] = 0xC0; //0
_LED_0F[1] = 0xF9; //1
_LED_0F[2] = 0xA4; //2
_LED_0F[3] = 0xB0; //3
_LED_0F[4] = 0x99; //4
_LED_0F[5] = 0x92; //5
_LED_0F[6] = 0x82; //6
_LED_0F[7] = 0xF8; //7
_LED_0F[8] = 0x80; //8
_LED_0F[9] = 0x90; //9
_LED_0F[10] = 0b01000000; //.0
_LED_0F[11] = 0b01111001; //.1
_LED_0F[12] = 0b00100100; //.2
_LED_0F[13] = 0b00110000; //.3
_LED_0F[14] = 0b00011001; //.4
_LED_0F[15] = 0b00010010; //.5
_LED_0F[16] = 0b00000010; //.6
_LED_0F[17] = 0b01111000; //.7
_LED_0F[18] = 0b00000000; //.8
_LED_0F[19] = 0b00010000; //.9
clear();
}
void TM74HC595Display::timerIsr()
{
send(_DATA[0]);
send(0b000001);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
send(_DATA[1]);
send(0b000010);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
send(_DATA[2]);
send(0b000100);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
send(_DATA[3]);
send(0b001000);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
}
void TM74HC595Display::send(unsigned char X)
{
for (int i = 8; i >= 1; i--)
{
if (X & 0x80)
{
digitalWrite(_DIO, HIGH);
}
else
{
digitalWrite(_DIO, LOW);
}
X <<= 1;
digitalWrite(_SCLK, LOW);
digitalWrite(_SCLK, HIGH);
}
}
void TM74HC595Display::send(unsigned char X, unsigned char port)
{
send(X);
send(port);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
}
void TM74HC595Display::digit4(int n, bool showZero)
{
int n1, n2, n3, n4;
n1 = (int) n % 10;
n2 = (int) ((n % 100)-n1)/10;
n3 = (int) ((n % 1000) - n2 - n1) / 100;
n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000;
set(_LED_0F[n1], 0);
if(showZero | n>9)set(_LED_0F[n2], 1);
if(showZero | n>99)set(_LED_0F[n3], 2);
if(showZero | n>999)set(_LED_0F[n4], 3);
}
void TM74HC595Display::digit4(int n)
{
digit4(n,false);
}
void TM74HC595Display::digit4showZero(int n)
{
digit4(n, true);
}
void TM74HC595Display::digit2(int n, int port)
{
int n1, n2;
n1 = (int) n % 10;
n2 = (int) ((n % 100)-n1)/10;
set(_LED_0F[n1], port);
set(_LED_0F[n2], port+1);
}
void TM74HC595Display::set(unsigned char X, int port ){
_DATA[port] = X;
}
void TM74HC595Display::clear(){
_DATA[0]= 0xFF;
_DATA[1]= 0xFF;
_DATA[2]= 0xFF;
_DATA[3]= 0xFF;
}
void TM74HC595Display::int_dot(int n, int pos) {
int n1, n2, n3, n4, n5, n6, n7, n8;
n1 = (int) n % 10;
n2 = (int) ((n % 100) - n1) / 10;
n3 = (int) ((n % 1000) - n2 - n1) / 100;
n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000;
int dot1 = 0, dot2 = 0, dot3 = 0;
switch (pos) {
case 1: dot1 = 10; break;
case 2: dot2 = 10; break;
case 3: dot3 = 10; break;
}
set(_LED_0F[n1], 0); //вывод
if (n > 9) set(_LED_0F[n2 + dot1], 1); //вывод
if (n > 99) set(_LED_0F[n3 + dot2], 2); //вывод
if (n > 999) set(_LED_0F[n4 + dot3], 3); //вывод
}
void TM74HC595Display::float_dot(float value, int pos) {
int whole = floor(value);
int fract = floor(((float)value - whole) * pow(10, pos));
byte w1, w2, w3, w4;
w1 = (int) whole % 10;
w2 = (int) ((whole % 100) - w1) / 10;
w3 = (int) ((whole % 1000) - w2 - w1) / 100;
w4 = (int) ((whole % 10000) - w3 - w2 - w1) / 1000;
byte f1, f2, f3, f4;
f1 = (int) fract % 10;
f2 = (int) ((fract % 100) - f1) / 10;
f3 = (int) ((fract % 1000) - f2 - f1) / 100;
f4 = (int) ((fract % 10000) - f3 - f2 - f1) / 1000;
byte n0, n1, n2, n3;
switch (pos) {
case 0: n0 = w1; n1 = w2; n2 = w3; n3 = w4;
break;
case 1: n0 = f1; n1 = w1 + 10; n2 = w2; n3 = w3;
break;
case 2: n0 = f1; n1 = f2; n2 = w1 + 10; n3 = w2;
break;
case 3: n0 = f1; n1 = f2; n2 = f3; n3 = w1 + 10;
break;
}
set(_LED_0F[n0], 0);
if (!(n3 == 0 && n2 == 0 && n1 == 0)) set(_LED_0F[n1], 1);
if (!(n3 == 0 && n2 == 0)) set(_LED_0F[n2], 2);
if (n3 != 0) set(_LED_0F[n3], 3);
}
Пока что проблему вывода разной информации на 2 указанных модуля решить не получилось.
“Козябрил” код как мог. Всё равно информация выходит одинаковая на обоих модулях.
Скорее всего это связано с int n1, n2, n3, n4;, “DATA” и “case”
Но простым увеличением количества этих показателей решить вопрос не удалось
Вот думаю - есть смысл мучиться с этим кодом?
или нужно искать другой, более подходящий?
На счётчик в коде внимания не обращайте - он пока что не нужен. Хотя в будущем может пригодится - для регулировки времени полива растений.
- Не найти datasheet на эту микросхему - суметь надо.
- Две штуки их потому, что одна отвечает за выбор сегмента, вторая за выбор цифры
- Если бы модуль поддерживал каскадирование, то обязательно бы один разъём был помечен как вход, другой как выход. У Вас это просто дублирующиеся разъёмы, используете какой удобнее конструктивно. Просто взять и соединить в цепочку не получится.
вот видите, а другие считают что можно:)
как не получится - если уже получилось))
они же работаю - только выдают одинаковую информацию.
или вы имеет ввиду, что не будут выдавать разную информацию? только одинаковую?
И выходы то не совсем дублирующие, а именно получается:
на одной стороне модуля - это выход ноги № 14
а с другой стороны - это выход ноги № 9!, которая предназначена для соединения с ногой № 14 следующего блока модуля.
Следовательно, если один перевернуть и подключить его напрямую в ардуину - то он работать не будет!, так как на выход ноги № 9 не получится посылать инфу, предназначенную для ноги № 14
(это если конечно я не ошибаюсь с выводами)
Я свое “можно” отзываю
я отвечал не на этот вопрос.
про распределение и роль этих двух 74CH595 я прочитал уже после размещения вопроса - где то час назад нашел инфу в другой ветке форума - но там опять же рассматривали вопрос о подключении-создании одного блока индикаторов (хотя на Али продается уже готовая сборка - зачем самому городить).
Но там нет инфы как собрать и сделать их “последовательно”
вот вы предатель - я же начал надеяться - что можно всё исправить - доделав только код
тогда зачем китайцы предусмотрели возможность последовательного подсоединения и дублирования инфы на модулях?
у меня вчера еще один вопрос возник:
а можно ли в моей ситуации подключать 74CH595 не только последовательно - но и с “развитвлениями”?
например: к ноге № 1 и № 2 подключить ещё по 2 штуки 74CH595 ?
тогда может быть получится с помощью 74CH595 управлять 7-8 штуками других модулей?
перечитайте мой ответ. Он не имеет ни малейшего отношения к ТЕХНИЧЕСКОЙ ВОЗМОЖНОСТИ заставить два ваших модуля работать вместе. Этого как я тогда не знал, так и сейчас не знаю.
Вы просили абстрагироваться от технической стороны дела - я абстрагировался.
Это к вопросу о том, почему надо давать подробное описание своего оборудования и схемы.
Как сделать последовательно - написано в любой краткой справке по использованию 595 регистров.
Остается только попробовать: будет это работать с Вашими модулями или нет.
я уже попробывал))
выше написал, что работает
но работает “спецфически”, а именно: на двух модулях выдаются одинкаовые цифры
теперь осталось решить: можно ли технически или программно заставить их выдавать разную информацию
например чтобы: на модуле № 1 были данные с датчика № 1 а на модуле № 2 были данные с датчика № 2
при этом модули должны быть подключены последовательно ! чтобы не тратить лишние порты ардуино
Да, я имел ввиду, что не будут выдавать разную информацию.
Можно ли переделать? Теоретически можно, вопрос - а стоит ли оно того? Может найти что-то более подходящее готовое? Тут надо корректировать печатную плату - одно обрезать, другое вывести и написать новую библиотеку, т.к. эта предназначена конкретно для одного 4-хзначного индикатора
Должно быть не сложно модифицировать библиотеку вот под такой девайс:
Подозреваю, что там просто нужно указать, что цифр не 4 а 8. Здесь по схеме всё то же самое, только регистр цифр задействован на все выводы, а не на половину.
Вот если ещё больше цифр надо - это уже сложнее.
такой индикатор на 8 цифр я видел, у меня даже есть 1, но блок с кнопками .
только они не совсем подходят для моего проекта.
будет минимум 4 или более зоны полива растений
у каждого вида растений своей режим
где то тут видел проект с умной теплицей, может там найду скеч полезный - но там опять же ЛСД дисплеи используются - а я его не хотел использовать.
Конечно если с модулями не получится, то придется применить ЛСД дисплей.
Кстати посмотрел дата шит на модуль
если первая микросхема 74CH595 включает условно “знаки”, а вторая “сегменты”
то почему нельзя в коде сделать так, чтобы микросхема № 1 и № 3 включали знаки, а № 2 и № 4 включали сегменты?
это если логически размышлять
ведь 74CH595 передает сигналы как по вагончикам в составе поезда:)
Так и нужно сделать, только для этого ещё и правильно их соединить между собой надо. Сейчас Вы сигнал с выхода МК подаёте на входы обоих модулей. А надо соединять соответствующие выходы первого модуля и входы второго. Остальное да, в коде.
Вы, часом, не робот Фёдор? Тогда с ЛСД поосторожней.
у меня была мысль “разорвать” проводок на 4 ножке модуля
но тогда придётся каждой ножке выделять свое гнездо на ардуине
буду эксперементировать))