/*  Ejemplo de uso de displays de 7 segmentos mediante el driver TM1637
    Utiliza la biblioteca: https://github.com/avishorp/TM1637
*/

#include <TM1637Display.h>

const int CLK = 2;
const int DIO = 3;
const int TEST_DELAY = 500;

const uint8_t SEG_DONE[] = {
  SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,          // d
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,  // O
  SEG_C | SEG_E | SEG_G,                          // n
  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G           // E
};

TM1637Display display(CLK, DIO);

void setup() {}

void loop() {

  int k;
  uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };
  uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };

  display.setBrightness(0x0f);

  // Encender todos los segmentos
  display.setSegments(data);
  delay(TEST_DELAY);

  // Selectivamente setear diferentes digitos
  data[0] = display.encodeDigit(0);
  data[1] = display.encodeDigit(1);
  data[2] = display.encodeDigit(2);
  data[3] = display.encodeDigit(3);
  display.setSegments(data);
  delay(TEST_DELAY);

  display.clear();
  display.setSegments(data + 2, 2, 2);
  delay(TEST_DELAY);

  display.clear();
  display.setSegments(data + 2, 2, 1);
  delay(TEST_DELAY);

  display.clear();
  display.setSegments(data + 1, 3, 1);
  delay(TEST_DELAY);

  // Mostrar números decimales con/sin ceros
  // ___0
  display.showNumberDec(0, false);
  delay(TEST_DELAY);
  // 0000
  display.showNumberDec(0, true);
  delay(TEST_DELAY);
  // ___1
  display.showNumberDec(1, false);
  delay(TEST_DELAY);
  // 0001
  display.showNumberDec(1, true);
  delay(TEST_DELAY);
  // _301
  display.showNumberDec(301, false);
  delay(TEST_DELAY);
  // 0301
  display.showNumberDec(301, true);
  delay(TEST_DELAY);
  display.clear();
  // _14_
  display.showNumberDec(14, false, 2, 1);
  delay(TEST_DELAY);
  display.clear();
  // 04__
  display.showNumberDec(4, true, 2, 2);
  delay(TEST_DELAY);
  // __-1
  display.showNumberDec(-1, false);
  delay(TEST_DELAY);
  // _-12
  display.showNumberDec(-12);
  delay(TEST_DELAY);
  // -999
  display.showNumberDec(-999);
  delay(TEST_DELAY);
  display.clear();
  // _-5_
  display.showNumberDec(-5, false, 3, 0);
  delay(TEST_DELAY);
  // f1Af
  display.showNumberHexEx(0xf1af);
  delay(TEST_DELAY);
  // __2C
  display.showNumberHexEx(0x2c);
  delay(TEST_DELAY);
  // 00d1
  display.showNumberHexEx(0xd1, 0, true);
  delay(TEST_DELAY);
  display.clear();
  // d1__
  display.showNumberHexEx(0xd1, 0, true, 2);
  delay(TEST_DELAY);

  // Recorrer todos los puntos
  for (k = 0; k <= 4; k++) {
    display.showNumberDecEx(0, (0x80 >> k), true);
    delay(TEST_DELAY);
  }

  // Prueba de brillo
  for (k = 0; k < 4; k++)
    data[k] = 0xff;
  for (k = 0; k < 7; k++) {
    display.setBrightness(k);
    display.setSegments(data);
    delay(TEST_DELAY);
  }

  // Prueba On/Off
  for (k = 0; k < 4; k++) {
    display.setBrightness(7, false);  // Apagar
    display.setSegments(data);
    delay(TEST_DELAY);
    display.setBrightness(7, true);  // Encender
    display.setSegments(data);
    delay(TEST_DELAY);
  }

  // Done!
  display.setSegments(SEG_DONE);

  while (1)
    ;
}
4-Digit Display