Programación de un 74HC595 8-Digit LED para CLAQUETA DIGITAL

Buenos días,
este es mi primer post en este genial foro, y disculpar mi falta de conocimiento en programación.

Llevo unos mes investigando la posibilidad de crear un Claqueta con un tiempo de código.
Encontré un proyecto que me resulto muy interesante, así que compre lo necesario para montarlo.
La única diferencia en la pantalla de led, porque quería un más grande.

El proyecto esta programado para esta pantalla de led:

-Display de 7 segmentos MAX7219 de 8 digitos

Y yo decidi comprar esta:

-74HC595 8-Digit LED Display Module

Como podría adaptar el código para que funcionase este panel led.

Muchas gracias.

Aqui adjunto el código:

/*
 *  BASED ON RTC Examples.
 *
 *              name    Arduino   7 Segment display
 *              -----   ----      -----
 *                      +5V       VCC
 *                      GND       GND
 *              DIN     D11/MOSI  DIN
 *              CS      D10/SS    CS
 *              CLK     D13/SCK   CLK
 *
 *              name    Arduino   RTC module
 *              -----   ----      -----
 *                      nc        32K
 *                      nc        SQW
 *              SCL     SCL/A5    SCL
 *              SDA     SDA/A4    SDA
 *                      3v3       VCC
 *                      GND       GND
 */
#include <Wire.h>
#include "DS3231.h"

// define pins attached to MAX7219 (and also see notes above)
#define MAX7219_DIN           11
#define MAX7219_CS            10
#define MAX7219_CLK           13

// enumerate the MAX7219 registers
// See MAX7219 Datasheet, Table 2, page 7
enum {  MAX7219_REG_DECODE    = 0x09,
        MAX7219_REG_INTENSITY = 0x0A,
        MAX7219_REG_SCANLIMIT = 0x0B,
        MAX7219_REG_SHUTDOWN  = 0x0C,
        MAX7219_REG_DISPTEST  = 0x0F };

// enumerate the SHUTDOWN modes
// See MAX7219 Datasheet, Table 3, page 7
enum  { OFF = 0,
        ON  = 1 };

const byte DP = 0b10000000;
const byte C  = 0b01001110;
const byte F  = 0b01000111;
const byte G  = 0b01011111;
const byte I  = 0b00000110;
const byte S  = 0b01011011;
const byte L  = 0b00001110;
const byte E  = 0b01001111;
const byte R  = 0b01100110;
const byte N  = 0b01110010;
const byte T  = 0b01000000;
const byte P  = 0b01100111;
const byte B  = 0b00000001;
const byte N2 = 0b01110110;
const byte O  = 0b01111110;


RTClib RTC;
DS3231 Clock;
int timeStart = 0;
int deltaTime = 0;
int arduinoFrames = 0;

int lastSecond = 0;

bool seMostro00000 = false;

bool animBlankDots = false;

const int BUZZER = 3; //buzzer to arduino pin 9

const int BUZZER_LOW = 4; //buzzer to arduino pin 9

const int CLAPPER_SWITCH_IN = 6;//Clapper at D6

// Define number of pieces
const int numberOfPieces = 7;
String pieces[numberOfPieces];

// This will be the buffered string from Serial.read()
// up until you hit a \n
// Should look something like "123,456,789,0"
String input = "";

// Keep track of current position in array
int counter = 0;

// Keep track of the last comma so we know where to start the substring
int lastIndex = 0;

void setup () {
  //buzzer
  pinMode(BUZZER, OUTPUT);
  //Clapper switch
  pinMode(CLAPPER_SWITCH_IN,INPUT);
  pinMode(BUZZER_LOW, OUTPUT);
  digitalWrite(BUZZER_LOW,LOW);

 /****************************** RELOJ *************************/
  timeStart = millis();
  Serial.begin(9600);
  Wire.begin();

  /****************************** DISPLAY *************************/
  // define type of pin
  pinMode(MAX7219_DIN, OUTPUT);   // serial data-in
  pinMode(MAX7219_CS, OUTPUT);    // chip-select, active low
  pinMode(MAX7219_CLK, OUTPUT);   // serial clock
  digitalWrite(MAX7219_CS, HIGH);

  resetDisplay();                 // reset the MAX2719 display
}

void loop ()
{
  sincronizar();

  int estadoClapper = digitalRead(CLAPPER_SWITCH_IN);

  if (estadoClapper == LOW){
    seMostro00000 = false;
    clapperAbierto();
  } else {
    clapperCerrado();
  }
}

// SINCRONIZAR
// ANIO:MES:DIA:HORA:MINUTO:SEGUNDO:
// Ejemplo: 2017 Octubre 4 10:35:04 pm
// 17:10:4:22:35:4:
void sincronizar()
{
  if (Serial.available()) {

    input = Serial.readString();// read the incoming data as string

    counter = 0;
    for (int i = 0; i < input.length(); i++) {
      // Loop through each character and check if it's a comma
      if (input.substring(i, i+1) == ":") {
        // Grab the piece from the last index up to the current position and store it
        pieces[counter] = input.substring(lastIndex, i);
        // Update the last position and add 1, so it starts from the next character
        lastIndex = i + 1;
        // Increase the position in the array that we store into
        counter++;
      }

      // If we're at the end of the string (no more commas to stop us)
      if (i == input.length() - 1) {
        // Grab the last part of the string from the lastIndex to the end
        pieces[counter] = input.substring(lastIndex, i);
      }
    }

    if (counter == 6 ) {
      //Setear la nueva hora
      Clock.setClockMode(false);
      Clock.setYear((byte)pieces[0].toInt());
      Clock.setMonth((byte)pieces[1].toInt());
      Clock.setDate((byte)pieces[2].toInt());
      Clock.setHour((byte)pieces[3].toInt());
      Clock.setMinute((byte)pieces[4].toInt());
      Clock.setSecond((byte)pieces[5].toInt());

      // Sincronizado pitar!
      displaySync1();
      pitarSync();
      displaySync2();
      pitarSync();
      displaySync1();
      pitarSync();
      displaySync2();
      pitarSync();
      displaySync1();
      pitarSync();
      displaySync2();
      pitarSync();
    }
  }
}

void clapperCerrado()
{
  if (!seMostro00000){
    // Mostramos
    String str = "00.00.00.00";
    displayTime(str);
    pitar();
    seMostro00000 = true;
  } else {
    if (animBlankDots) {
      displayBlankDots();
      delay(300);
      animBlankDots = false;
    } else {
      displayBlankDots2();
      delay(300);
      animBlankDots = true;
    }
  }
}

void clapperAbierto()
{
    // Leemos el reloj.
    DateTime now = RTC.now();

    int hora    = now.hour();
    int minuto  = now.minute();
    int segundo =  now.second();

    deltaTime = millis() - timeStart;

    // 24fps 41 millis aprox 38 millis (41)
    if (deltaTime > 38){
      arduinoFrames++;
      timeStart = millis();
    }

    if (segundo != lastSecond) {
      arduinoFrames = 0;
      timeStart = millis();
    }

    //Recuerde el ultimo segundo
    lastSecond = segundo;

    String str = formatDigit(hora);
    str.concat('.');
    str.concat(formatDigit(minuto));
    str.concat('.');
    str.concat(formatDigit(segundo));
    str.concat('.');
    str.concat(formatDigit(arduinoFrames));

    displayTime(str);
}

/**
 * Returns the digit formated for segment display,
 * if digit is greater than 100 will return 00.
 */
String formatDigit(int digit) {
  if (digit < 10 ) {
    return "0"+String(digit,DEC);
  } else if(digit > 99) {
    return "00";
  }
  return String(digit,DEC);
}


void set_register(byte reg, byte value)
{
  digitalWrite(MAX7219_CS, LOW);
  shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, reg);
  shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, value);
  digitalWrite(MAX7219_CS, HIGH);
}

void resetDisplay()
{
  set_register(MAX7219_REG_SHUTDOWN, OFF);
  set_register(MAX7219_REG_DISPTEST, OFF);
  set_register(MAX7219_REG_INTENSITY, 0x0D);
}

void displayTime(String timeString)
{
  set_register(MAX7219_REG_SHUTDOWN, OFF);
  set_register(MAX7219_REG_SCANLIMIT, 7);
  set_register(MAX7219_REG_DECODE, 0b11111111);

  set_register(1, timeString.charAt(10));
  set_register(2, timeString.charAt(9));
  set_register(3, timeString.charAt(7)| DP);
  set_register(4, timeString.charAt(6));
  set_register(5, timeString.charAt(4)| DP);
  set_register(6, timeString.charAt(3));
  set_register(7, timeString.charAt(1)| DP);
  set_register(8, timeString.charAt(0));

  set_register(MAX7219_REG_SHUTDOWN, ON);
}

void displayTemp(String tempString, char C_or_F )
{
  set_register(MAX7219_REG_SHUTDOWN, OFF);
  set_register(MAX7219_REG_SCANLIMIT, 5);
  set_register(MAX7219_REG_DECODE, 0b00111100);

  set_register(1, C_or_F);
  set_register(2, 0);
  set_register(3, tempString.charAt(4));
  set_register(4, tempString.charAt(3));
  set_register(5, tempString.charAt(1) | DP);
  set_register(6, tempString.charAt(0));

  set_register(MAX7219_REG_SHUTDOWN, ON);
}

void pitarSync() {
  digitalWrite(BUZZER, HIGH);
  delay(300);
  digitalWrite(BUZZER, LOW);
  delay(300);
}

void pitar()
{
  digitalWrite(BUZZER, HIGH);
  delay(500);
  digitalWrite(BUZZER, LOW);
  delay(500);
}

void displaySync1()
{
    set_register(MAX7219_REG_SHUTDOWN, OFF);
    set_register(MAX7219_REG_SCANLIMIT, 7);
    set_register(MAX7219_REG_DECODE, 0b00000000);

    set_register(1, 0);
    set_register(2, O | DP );
    set_register(3, R);
    set_register(4, C);
    set_register(5, N2);
    set_register(6, I);
    set_register(7, S);
    set_register(8, 0);

    set_register(MAX7219_REG_SHUTDOWN, ON);
}

void displaySync2()
{
    set_register(MAX7219_REG_SHUTDOWN, OFF);
    set_register(MAX7219_REG_SCANLIMIT, 7);
    set_register(MAX7219_REG_DECODE, 0b00000000);

    set_register(1, B);
    set_register(2, O | DP );
    set_register(3, R);
    set_register(4, C);
    set_register(5, N2);
    set_register(6, I);
    set_register(7, S);
    set_register(8, B);

    set_register(MAX7219_REG_SHUTDOWN, ON);
}

void displayBlankDots()
{
    set_register(MAX7219_REG_SHUTDOWN, OFF);
    set_register(MAX7219_REG_SCANLIMIT, 7);
    set_register(MAX7219_REG_DECODE, 0b00000000);

    set_register(1, 0);
    set_register(2, 0 | DP);
    set_register(3, 0);
    set_register(4, 0 | DP);
    set_register(5, 0);
    set_register(6, 0 | DP);
    set_register(7, 0);
    set_register(8, 0 | DP);

    set_register(MAX7219_REG_SHUTDOWN, ON);
}

void displayBlankDots2()
{
    set_register(MAX7219_REG_SHUTDOWN, OFF);
    set_register(MAX7219_REG_SCANLIMIT, 7);
    set_register(MAX7219_REG_DECODE, 0b00000000);

    set_register(1, 0 | DP);
    set_register(2, 0);
    set_register(3, 0 | DP);
    set_register(4, 0);
    set_register(5, 0 | DP);
    set_register(6, 0);
    set_register(7, 0 | DP);
    set_register(8, 0);

    set_register(MAX7219_REG_SHUTDOWN, ON);
}

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Ver en las normas punto 5.
5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYDUA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!

1 Like

Buscaste el 74hc595? Es en algunos casos similar, pero mas simple.
Se maneja tmb de forma serial y usa instrucciones similares.
Edita lo que te he pedido y veo como ayudarte.

1 Like

El código que he adjuntado esta pensado para dar instrucciones al MAX7219, pero no se como cambiar esta programación para que funcione en el 74HC595.

Muchas gracias!!

Moderador
Te he pedido que edites el titulo y no lo has hecho.
No continues respondiendo sin hacerlo.

1 Like

Primero no se porque tomas un código de un MAX7219 si no lo usas.
Busca código de 74HC595. Ademas hace falta como tienes conectados los displays.
Porque por lo que has pasado no se ve.
Todas las conexiones incluidas las del Arduino a los 595s conectados en cascada.

Aca tienes un ejemplo
http://fjrg76.com/2022/01/27/pantalla-d4595/
Pero no se si es tu caso
Puedes tener un 595 atacando a los 8 displays de manera multiplexada y otro 595 que comande cada uno de los transitores que activa el display que se va a encender, la persistencia del ojo hace lo demás y se ve como todo fijo.
Esa es una topologia con 2 595s.
Puedes tener un 595 por cada display como en este video

donde solo muestra dos pero sigues en cascada y llegas a 8. Obviamente no es muy eficiente pero es una manera.
Hay muchas configuraciones o topologias posibles.
Agrego mas links solo es cuestión de buscar: Arduino 74hc595 8 digits y aparecen muchas cosas ya resueltas.

y siguen.

Hola,
Yo escribí mi propia librería, en la cual se pueden manejar displays basados en shift registers del tipo 74HC595, de 2 a 8 dígitos.
De hecho se pueden manejar varios displays de diversas cantidades de dígitos simultáneamente con mucha facilidad.
La puedes encontrar aquí como FourBitLedDigitalTube o en Github, en https://github.com/GabyGold67/FourBitLedDigitalTube
Espero que te sea útil.
Saludos.
G.//

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.