Cica Mica proti ATtiny85

Zápisník experimentátora

Hierarchy: ATtiny85

Petrík už není Bambino a cvakání vypínačem ho už nebaví. Na jeho místo nastoupila Cica Mica a ráda si cvaká vypínačem. Zopakuje se úspěch první krabičky, v níž bylo ATtiny13A? To nevíme. Ale teď jsem použil ATtiny85 a rafinovaný program, který náhodně vyměňuje 4 sekvence blikání LED diodou.

Teď jsem použil o něco větší krabičku s růžovým víčkem, protože malé holčičky mají všechny věci laděné v růžové barvě. Do víku jsem vyřezal nožem otvor, vyvrtal čtyři díry a připevnil něj masivní vypínač, který se používá k ovládání stropní lampy. Uvnitř se nachází mikrokontrolér se třemi LED diodami.

Program

Program obsahuje čtyři různé sekvence, které se přepínají s pravděpodobností 6 procent po každém kroku. Sekvence se spouštějí s různou rychlostí, což vyvolává dojem, že je tam více algoritmů.

// Sequence 1
const char PROGMEM sequence1[] = {
  0b00000001,
  0b00000010,
  0b00000100,
};
const int sequence_length1 = sizeof(sequence1) / sizeof(char);

// Sequence 2
const char PROGMEM sequence2[] = {
  0b00000001,
  0b00000011,
  0b00000010,
  0b00000110,
  0b00000100,
  0b00000101,
};
const int sequence_length2 = sizeof(sequence2) / sizeof(char);

// Sequence 3
const char PROGMEM sequence3[] = {
  0b00000001,
  0b00000010,
  0b00000100,
  0b00000010,
};
const int sequence_length3 = sizeof(sequence3) / sizeof(char);

// Sequence 4
const char PROGMEM sequence4[] = {
  0b00000001,
  0b00000000,
  0b00000001,
  0b00000000,
  0b00000000,
  0b00000010,
  0b00000000,
  0b00000010,
  0b00000000,
  0b00000000,
  0b00000100,
  0b00000000,
  0b00000100,
  0b00000000,
  0b00000000,
  0b00000010,
  0b00000000,
  0b00000010,
  0b00000000,
  0b00000000,
};
const int sequence_length4 = sizeof(sequence4) / sizeof(char);

class Sequencer {
    char *data;
    int len;
    int pos;

  public:
    Sequencer(char *_data, int _len)
      : data(_data), len(_len), pos(0)
    {}

    void next() {
      char b = pgm_read_byte(&data[pos]);
      digitalWrite(0, b & 0b00000001);
      digitalWrite(1, b & 0b00000010);
      digitalWrite(2, b & 0b00000100);
      pos++;
      if (pos == len)
        pos = 0;
    }
};

Sequencer seq1(sequence1, sequence_length1);
Sequencer seq2(sequence2, sequence_length2);
Sequencer seq3(sequence3, sequence_length3);
Sequencer seq4(sequence4, sequence_length4);
enum states {st1, st2, st3, st4, st5, st6, st7};
states state = st1;

void setup() {
  for (uint8_t i = 0; i < 3; i++)
    pinMode(i, OUTPUT);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
}

void loop() {
  switch (state) {
    case st1:
      seq1.next();
      delay(80);
      break;
    case st2:
      seq2.next();
      delay(80);
      break;
    case st3:
      seq1.next();
      delay(200);
      break;
    case st4:
      seq2.next();
      delay(200);
      break;
    case st5:
      seq3.next();
      delay(200);
      break;
    case st6:
      seq3.next();
      delay(400);
      break;
    case st7:
      seq4.next();
      delay(200);
      break;
  }
  int r = random(100);
  if (r > 94) {
    state = random(7);
  }
}

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


13.07.2018


Menu