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 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 se nachází na serveru GitHub.
13.07.2018