test123456789clok — Arduino Uno simulation

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by dave.

Components

Sketch code

// Reloj digital HH:MM con display 7 segmentos de 4 digitos
// Usa breadboard. Segmentos con resistor 220 a D2-D9.
//
// Conexiones:
//   Segmentos -> Arduino
//     A (col 21t) -> R1 -> D2
//     B (col 25t) -> R2 -> D3
//     F (col 22t) -> R3 -> D4
//     C (col 23b) -> R4 -> D5
//     D (col 21b) -> R5 -> D6
//     E (col 20b) -> R6 -> D7
//     G (col 24b) -> R7 -> D8
//     DP(col 22b) -> R8 -> D9
//   Digitos -> Arduino (directo)
//     DIG1(col 20t) -> D10
//     DIG2(col 23t) -> D11
//     DIG3(col 24t) -> D12
//     DIG4(col 25b) -> D13
//   Comunes
//     COM(col 26b) -> GND
//     CLN(col 26t) -> A0 (colon)

// Orden de segmentos: A, B, F, C, D, E, G, DP
const byte segPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte digPins[] = {10, 11, 12, 13};
const byte colonPin = A0;

// Patrones de segmentos [A,B,F,C,D,E,G,DP] binario (bit7=seg0=A)
// 0bABCDEFG?  -> bit7=A, bit6=B, bit5=F, bit4=C, bit3=D, bit2=E, bit1=G, bit0=DP
const PROGMEM byte digitos[10] = {
  0b11011100, // 0: A B C D E F
  0b01001000, // 1: B C
  0b11001110, // 2: A B D E G
  0b11011010, // 3: A B C D G
  0b01110010, // 4: B C F G
  0b10111010, // 5: A C D F G
  0b10111110, // 6: A C D E F G
  0b11001000, // 7: A B C
  0b11111110, // 8: A B C D E F G
  0b11111010  // 9: A B C D F G
};

byte hora = 12, minuto = 0, segundo = 0;
unsigned long tSegundo = 0;
unsigned long tColon = 0;
bool colonState = true;

void setup() {
  for (byte i = 0; i < 8; i++) pinMode(segPins[i], OUTPUT);
  for (byte i = 0; i < 4; i++) pinMode(digPins[i], OUTPUT);
  pinMode(colonPin, OUTPUT);

  // Apagar todo
  for (byte i = 0; i < 4; i++) digitalWrite(digPins[i], LOW);
  for (byte i = 0; i < 8; i++) digitalWrite(segPins[i], LOW);
  digitalWrite(colonPin, LOW);
}

void loop() {
  unsigned long ahora = millis();

  // Actualizar hora cada 1 segundo
  if (ahora - tSegundo >= 1000) {
    tSegundo = ahora;
    segundo++;
    if (segundo >= 60) { segundo = 0; minuto++; }
    if (minuto >= 60) { minuto = 0; hora++; }
    if (hora >= 24) { hora = 0; }
  }

  // Parpadeo del colon cada 500ms
  if (ahora - tColon >= 500) {
    tColon = ahora;
    colonState = !colonState;
    digitalWrite(colonPin, colonState ? HIGH : LOW);
  }

  // Multiplexado de los 4 digitos
  byte nums[4] = { hora / 10, hora % 10, minuto / 10, minuto % 10 };

  for (byte d = 0; d < 4; d++) {
    // Apagar todos los digitos
    for (byte i = 0; i < 4; i++) digitalWrite(digPins[i], LOW);

    // Cargar patron del digito actual
    byte pat = pgm_read_byte(&digitos[nums[d]]);
    for (byte s = 0; s < 8; s++) {
      digitalWrite(segPins[s], (pat >> (7 - s)) & 1);
    }

    // Encender solo este digito
    digitalWrite(digPins[d], HIGH);
    delay(2);
  }
}

More projects by dave