4BitLed модуль последовательно

Всем добрый день,
я не профи и только учусь.
купил несколько 4BitLed модулей - это блоки 7 сигментных индикаторов на базе 74 CH595D
на каждом модуле стоит по 2 штуки 74 CH595D
я подключил эти модули “последовательно” и закачал скет со счётчиком - это для пробы
но в будущем хочу чтобы на каждом модуле были "свои "цифры, а именно выводились потом данные с датчиков
сейчас этого не получается, так как оба модуля выдают одинаковые данные (работают “зеркально”), несмотря на то, что подключены “последовательно”
хотел узнать:
кто нибудь на этом форуме уже так делал?:slight_smile:

И не так делали.

А Вот Вы читали правила форума, прежде, чем на него постить? В частности “как правильно задавать вопросы”?

Федор, вы предоставили крайне мало информации для ответа на свой вопрос.
Первое - дайте ссылку на даташит ваших модулей или хотя бы ссылку на лот, где вы их покупали.
Второе - выложите подробную схему подключения с указанием всех соединений, включая землю и питание.
Третье - вставьте в сообщение свой код (ПОЛНОСТЬЮ) оформив его соответвующими тегами.

Без всего этого не вижу смысла даже начинать.

Все кто написал недовольный негатив - всё равно привет!))
На данной стадии у меня вопрос не в написании кода - а в целом : возможно ли на стороне железа технически выполнение такой схемы.
Постараюсь завтра скинуть фото модулей
Про даташит и схему моделей не уверен, что найду.
Но в каждом модуле по 2 штуки 74сн595d
Поэтому я подумал что если их представить как “паровоз” из этих 74сн… То в принципе должно получиться:
“Вагон 1” - данные влажности с датчика номер 1
Вагон 2 - данные с датчика номер 2
… и так далее
Но это я рассуждал логически
Теперь осталось определиться с реальной возможностью этих железок

Если вопрос чисто теоретический, можно ли на первые два из 4х индикаторов вывести одно значение - а на третий и четвертый другое - то ответ однозначный - можно.
Вы бы сразу так и спросили.

А негатива вам никто не писал.

добрый день,
добрался я до компа, чтобы дополнить свой вопрос.
и сейчас, пока готовил поправки к своему вопросу по 4BitLed модулям, частично нашел ответ на свои вопросы:), но пока что только частично.
По порядку.
Сами модули выглядят вот так:



На фото лицевая и оборотная часть.
Таких полно на Али. например можно посмотреть тут.
Каждый модуль имеет 2 штуки 74CH595D.
Пока что дата шит не нашел, но обычно для каждого 7 сегментного индикатора в рукодельных изделиях ставится по 1 штуки 74CH595., то есть для 4 индикаторов нужно 4 штуки.
Тут же их стоит 2 (точно не знаю, но возможно это потом повлияет на сам скетч для ардуино).

У каждого блока есть “выходы” с двух сторон!
на одной стороне уже припаяны штекера.
На другой стороне их нет, то есть отверстия с надписями:


Имеются следующие входы-выходы:

  1. со стороны подключения к ардуино:
  • VCC
  • SCLK
  • RCLK
    - DIO
  • GND
  1. с обратной стороны:
  • 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”
Но простым увеличением количества этих показателей решить вопрос не удалось
Вот думаю - есть смысл мучиться с этим кодом?
или нужно искать другой, более подходящий?
На счётчик в коде внимания не обращайте - он пока что не нужен. Хотя в будущем может пригодится - для регулировки времени полива растений.

  1. Не найти datasheet на эту микросхему - суметь надо.
  2. Две штуки их потому, что одна отвечает за выбор сегмента, вторая за выбор цифры
  3. Если бы модуль поддерживал каскадирование, то обязательно бы один разъём был помечен как вход, другой как выход. У Вас это просто дублирующиеся разъёмы, используете какой удобнее конструктивно. Просто взять и соединить в цепочку не получится.

вот видите, а другие считают что можно:)
как не получится - если уже получилось))
они же работаю - только выдают одинаковую информацию.
или вы имеет ввиду, что не будут выдавать разную информацию? только одинаковую?
И выходы то не совсем дублирующие, а именно получается:
на одной стороне модуля - это выход ноги № 14
а с другой стороны - это выход ноги № 9!, которая предназначена для соединения с ногой № 14 следующего блока модуля.
Следовательно, если один перевернуть и подключить его напрямую в ардуину - то он работать не будет!, так как на выход ноги № 9 не получится посылать инфу, предназначенную для ноги № 14
(это если конечно я не ошибаюсь с выводами)

Я свое “можно” отзываю :slight_smile:
я отвечал не на этот вопрос.

про распределение и роль этих двух 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 ножке модуля
но тогда придётся каждой ножке выделять свое гнездо на ардуине
буду эксперементировать))