• Code

    Max-Felix Müller05/10/2019 at 22:33 0 comments

    Here is the completed working code for a random pattern. Nothing special, not efficient or fast at all. But it needed to be done quick since it's a gift for my fathers birthday which is now...

    #define MOS1 8
    #define MOS2 9
    #define MOS3 10
    #define MOS4 11
    
    #define DAT1 0
    #define DAT2 1
    #define DAT3 2
    #define DAT4 3
    #define DAT5 4
    #define DAT6 5
    #define DAT7 6
    #define DAT8 7
    
    #define OE1 A0
    #define OE2 A1
    #define LE1 A2
    #define LE2 A3
    
    void setup() {
      // mosfets
      pinMode(MOS1, OUTPUT);
      pinMode(MOS2, OUTPUT);
      pinMode(MOS3, OUTPUT);
      pinMode(MOS4, OUTPUT);
    
      // data
      pinMode(DAT1, OUTPUT);
      pinMode(DAT2, OUTPUT);
      pinMode(DAT3, OUTPUT);
      pinMode(DAT4, OUTPUT);
      pinMode(DAT5, OUTPUT);
      pinMode(DAT6, OUTPUT);
      pinMode(DAT7, OUTPUT);
      pinMode(DAT8, OUTPUT);
    
      // latch
      pinMode(LE1, OUTPUT);
      pinMode(LE2, OUTPUT);
    
      // disable outpputs
      pinMode(OE1, OUTPUT);
      pinMode(OE2, OUTPUT);
      digitalWrite(OE1, HIGH);
      digitalWrite(OE2, HIGH);
    }
    
    int data1[] = {0, 0, 0, 0};
    int data2[] = {0, 0, 0, 0};
    
    void loop() {
      // make new random data
      for (int i = 0; i < 4; i++) {
        data1[i] = int(random(256));
        data2[i] = int(random(256));
      }
    
      for (int x = 0; x < 10; x++) {
        for (int i = 0; i < 4; i++) {
          // enable outpputs
          digitalWrite(OE1, LOW);
          digitalWrite(OE2, LOW);
    
          // load data1
          if (data1[i] % 2 == 0) {
            digitalWrite(DAT1, HIGH);
          }
          if (data1[i] % 3 == 0) {
            digitalWrite(DAT2, HIGH);
          }
          if (data1[i] % 4 == 0) {
            digitalWrite(DAT3, HIGH);
          }
          if (data1[i] % 5 == 0) {
            digitalWrite(DAT4, HIGH);
          }
          if (data1[i] % 6 == 0) {
            digitalWrite(DAT5, HIGH);
          }
          if (data1[i] % 7 == 0) {
            digitalWrite(DAT6, HIGH);
          }
          if (data1[i] % 8 == 0) {
            digitalWrite(DAT7, HIGH);
          }
          if (data1[i] % 9 == 0) {
            digitalWrite(DAT8, HIGH);
          }
    
          // latch
          digitalWrite(LE1, HIGH);
          delay(1);
          digitalWrite(LE1, LOW);
    
          // reset
          digitalWrite(DAT1, LOW);
          digitalWrite(DAT2, LOW);
          digitalWrite(DAT3, LOW);
          digitalWrite(DAT4, LOW);
          digitalWrite(DAT5, LOW);
          digitalWrite(DAT6, LOW);
          digitalWrite(DAT7, LOW);
          digitalWrite(DAT8, LOW);
    
          // load data2
          if (data2[i] % 2 == 0) {
            digitalWrite(DAT1, HIGH);
          }
          if (data2[i] % 3 == 0) {
            digitalWrite(DAT2, HIGH);
          }
          if (data2[i] % 4 == 0) {
            digitalWrite(DAT3, HIGH);
          }
          if (data2[i] % 5 == 0) {
            digitalWrite(DAT4, HIGH);
          }
          if (data2[i] % 6 == 0) {
            digitalWrite(DAT5, HIGH);
          }
          if (data2[i] % 7 == 0) {
            digitalWrite(DAT6, HIGH);
          }
          if (data2[i] % 8 == 0) {
            digitalWrite(DAT7, HIGH);
          }
          if (data2[i] % 9 == 0) {
            digitalWrite(DAT8, HIGH);
          }
    
          // latch
          digitalWrite(LE2, HIGH);
          delay(1);
          digitalWrite(LE2, LOW);
    
          // reset
          digitalWrite(DAT1, LOW);
          digitalWrite(DAT2, LOW);
          digitalWrite(DAT3, LOW);
          digitalWrite(DAT4, LOW);
          digitalWrite(DAT5, LOW);
          digitalWrite(DAT6, LOW);
          digitalWrite(DAT7, LOW);
          digitalWrite(DAT8, LOW);
    
          // enable mosfet
          if (i == 0) {
            digitalWrite(MOS1, HIGH);
            delay(1);
            digitalWrite(MOS1, LOW);
          } else if (i == 1) {
            digitalWrite(MOS2, HIGH);
            delay(1);
            digitalWrite(MOS2, LOW);
          } else if (i == 2) {
            digitalWrite(MOS3, HIGH);
            delay(1);
            digitalWrite(MOS3, LOW);
          } else if (i == 3) {
            digitalWrite(MOS4, HIGH);
            delay(1);
            digitalWrite(MOS4, LOW);
          }
    
          // disable outpputs
          digitalWrite(OE1, HIGH);
          digitalWrite(OE2, HIGH);
        }
        delay(1);
      }
    }

     If you want only one led to light up, you have to use modulo with prime numbers. Like this, when modulo 4 is zero, modulo 2 will always be zero too.