Cica Mica proti ATtiny85

Zápisník experimentátora

Hierarchy: ATtiny85

Petrík už nie je Bambíno a cvakanie vypínačom ho už nebaví. Na jeho miesto nastúpila Cica Mica a rada si cvaká vypínačom. Zopakuje sa úspech prvej krabičky, v ktorej bolo ATtiny13A? To nevieme. Ale teraz som použil ATtiny85 a rafinovaný program, ktorý náhodne vymieňa 4 sekvencie blikania LED diódou.

Teraz som použil o čosi väčšiu krabičku s ružovým vrchnákom, pretože malé dievčatká majú všetky veci ladené v ružovej farbe. Do vrchnáku som vyrezal nožom otvor, vyvŕtal štyri diery a pripevnil naň masívny vypínač, ktorý sa používa na ovládanie stropnej lampy. Vo vnútri sa nachádza mikrokontrolér s tromi LED diódami.

Program

Program obsahuje štyri rôzne sekvencie, ktoré sa prepínajú s pravdepodobnosťou 6 percent po každom kroku. Sekvencie sa spúšťajú s rôznou rýchlosťou, čo vyvoláva dojem, že je tam viac algoritmov.

// 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 sa nachádza na serveri GitHub.


13.07.2018


Menu