Embedded Programming
Back to EAGLE
I never got my board from two weeks ago working, so I redesigned it in EAGLE to be more spacious so that it would mill more reliably. It also gave me a chance to keep the black plastic casing around the serial pins inside the board's border for better stability.
Programming
Programming the board was surprisingly straightforward. I first thought I'd use Atmel Studio, so I downloaded and installed it before thinking "why?" and then just used the Arduino IDE following this guide instead. You probably want "ATtiny24/44/84", "ATtiny44", and "External 20 MHz", respectively.
My board only has one button and one LED, so I didn't have much I/O bandwidth to play with. I first wrote a simple program that would turn the LED on when the button was pressed and off when it was released:
int out = 7;
int in = 8;
void setup() {
pinMode(out, OUTPUT);
pinMode(in, INPUT_PULLUP);
}
void loop() {
digitalWrite(out, digitalRead(in) ? HIGH : LOW);
delay(100);
}
It turns out that this actually did the opposite of what I wanted:
... this was because digitalRead(in) returns 0 when the button is pressed (i.e. grounded) and floats high (i.e. 1) otherwise.
After that, I made it keep an incrementing counter of how many blinks to blink:
int out = 7;
int in = 8;
int c = 0;
void setup() {
pinMode(out, OUTPUT);
pinMode(in, INPUT_PULLUP);
}
void blink(int n) {
for (;n;n--) {
digitalWrite(out, HIGH);
delay(500);
digitalWrite(out, LOW);
delay(500);
}
}
void loop() {
if (digitalRead(in)) {
delay(100);
} else {
blink(c++);
}
}
... and after that, I made it count button-presses and play that number back: Warning! This code was written at 3am. This is not Good Code. There is no Good Code. T̗h̙i͙s̘ ̪c͚o̠d̮e̲ ͙iͅs̗ ͚ķn̥o̲w̲n̺ ̺t̲o̪ ̞t̘h͚e͙ ̘S̭t̠a̰t̠e̫ ̪o̩f͔ ͖C̤a̢ḽi̬f͓o͚r̝n͇i̲a̳ ̰t̪oͅ ̝c̪a͍u̮s͚e̘ ͔b͓ḭr̞t͇h͓ ̪d͔e̤f̬e̮c̼t̮s͜.̜ I di͉̎d͍̒ ̭͘n͚̓ỏ̰ṫ̹ ̲̽i͍̽n͑͜v͇̓e̞̋ṋ͝t͈̐ ̱̽t͔͂ȟ̪i̮̔s̠̓ ͇͘ċ͔ö͍́d͚̿é̩.̜͠ T̰̚h̢̽i͂͜s̲̓ ̖̎c̫̿o̦̿d̙̐e̥̒ ̛̘c̠͂ò͉n̢̈s̡̅i͎̍s̞̕t͕̋ë̫́ñ͚ẗ̰́l̨̉y̺͐ ̭̊f̲͗i̮͑ň̩d̯̀s̰̃ ̖̓J̘̐e̬͝s̢̔ū̹s̗̿.̡͂ ͖̄T̯̀h̛͍i̠̓s͙͋ ̨͂c̬̕ô̻d̩̽e̫͆ ͓̅k̭̀ḭ͊ḷ̒ľ̜e̩̍d̼͛ ̱̐J̠̋e̫͝e̥͐v̙̏e̮͌ş͌.̜̓ ̶̞̀T̸̟̀h̶̳͋i̴̘̍s̵̠̐ ̴̨̄c̵̛̪o̶͉̾d̸̢͒é̸͖ ̷͍̈́i̵͚̎s̶͈̐ ̴̙͐b̴͉̄a̴͍̚n̴̜͋n̸̘̊ê̵̖ḓ̴̛ ̸̨̆i̷̙͑n̴͉̎ ̶̖̈́C̴̄͜h̸̩̒i̷̤͌n̵̰̐a̵̮̕.̴̡͑ ̶̙̈́Ţ̵͘h̴̼̉i̴͇͂s̵̜͆ ̵͙̈́c̴̙̅o̷͇̽d̴̘̄ȇ̶̘ ̵̡̆ǐ̵̞s̵̖̃ ̶̖͒f̵̖͑ŕ̴̢ọ̶̈́m̷͕̔ ̷̱̃J̴̗͂e̵͍͛ṙ̷̪s̴̙̏ȇ̸̲y̵̢̿.̷̱̇ ̵̝̐̒ͅT̷̖̳̈́̅h̶͍̲͊́ì̵͙̬̃s̵̲͚͑͗ ̷̠̽́ͅc̵̳̹͂͒ó̶̗͇͘ḑ̸̳͆́ḙ̷̃̊ͅ ̸͖̮̊̕ć̵̱͇͛o̶̦̻͒̈ń̶̩̻͝s̷̨̤͂͠t̸͔͖̉̉ȧ̷̧̻̈́n̷̫͔̓̄ẗ̸̝̩̀l̴̟̪̈̂ỳ̸̘͉͂ ̵͔̜͊̍f̷̛͓̖͝i̶͚͈͆̉n̷̤̩̄̚d̷͖̹̎͂s̴͕̣̑̽ ̶̝͎̐̓J̷̗̲͋́ë̸̹̲́̋s̷̻͚̀͘ȗ̴͔̭̀s̷̗̃̑͜.̷̬̳̿͘ T̴̢̛̬͕̮͐͗͠ḥ̶̙͈̹̑̏̀̕ỉ̵͚̻̰̦̂͒͘s̴̤̼͈̃̀͂̚ͅ ̵͎̳͇͌́̈̍͜i̵̢͈̮͍͐͗̄͝s̸̨̯͔͒͑̏͠ͅ ̸̼̱̫͙͗͐͐͘ṅ̸̩͉̣̖̈̒͂ȍ̷̲͓͎̣̅̀̄ṫ̵̲͓̺͙̑̏͝ ̴̡̧̗̞̔͛͊̕t̸̡̛͖̼̼͒̀͂h̵̙͇̯͉͂̓̐͠ë̷̦͍̞̙́̑̆͠ ̵͍͉̘͓̉͋̈́̏ć̶̻͕̲͗̂̏ͅȏ̵̠̠̻̖̑̒̕d̵̛̟̞̼̖͌̿͐e̶̢͓͉̻͗̑̀̚.̸̨̢̣̘͌̉̐́ ̵̭̱͙̥̐͑̍̆Ţ̶̛̘̲͎͌̇͆h̷̡̟͍̗͛͗͝͝i̸̭͍̦̽̂͐͝ͅş̸̡̗̑͑̈́̍ͅ ̵͖̠͎̮̀͒́̒i̶̻͓̜͖͊̓͐̕š̸͖̲̟͙̈́̅͝ ̴̢̢͕̼̊́̄̚c̴̦͔̠̺̽̈̏͗ļ̶̙͚̦͋̿͑͂ơ̸̟͔̲̞̈́̂̄ş̷͉͍̏̈́̿̔ͅě̵͈̼̥͔̒̽̏.̷̝͔͉̯͂͋͗͑.
int out = 7;
int in = 8;
int c = 0;
int little = 100;
int big = 300;
int maxTrip = 10;
void setup() {
pinMode(out, OUTPUT);
pinMode(in, INPUT_PULLUP);
}
void output(int n) {
for (;n;n--) {
digitalWrite(out, HIGH);
delay(big);
digitalWrite(out, LOW);
delay(big);
}
}
int input() {
bool go = true;
bool reset = false;
int value = 0;
int trip = 0;
while (trip < maxTrip) {
if (digitalRead(in)) {
if (reset) {
reset = false;
}
trip += 1;
} else {
trip = 0;
if (!reset) {
reset = true;
value += 1;
}
}
delay(little);
}
return value;
}
void loop() {
output(input());
}