When I was first learning microcontroller programming, nobody told you this stuff. The great thing about the Arduino community is that it makes casual hacking so much easier to get into.
Another great resource for hardware hacking is the SparkFun tutorials:
It's not too bad: keep an exponentially decaying average of the pin state, and use some hysteresis (different levels for on/off) on that value. You should be most of the way there.
It'll take (worst case) 8 bits for the average and 1 for the current state. You could probably still get reasonable results with a 7-bit average so that the whole thing still fits in a byte of RAM.
Is it just me, or does this idiom sound very similar to one of the critiqued "incorrect" programming idioms in the recently analyzed breathalyzer code?
Yes; it's almost identical. It's one of the simplest digital low-pass filters you can write. Basically, it does the same thing that an analog R/C filter would do (given sufficient precision and sampling rates).
The issue with the breathalyzer code wasn't that the algorithm was incorrect, but that the programmer used the wrong algorithm.
After reading a button press, wait a while for the level to settle (say 50ms or so). This kind of thing is normally done from a timer interrupt that polls all buttons and saves their state for the foreground thread (I'd think this would be in the Arduino library somewhere).
Yes, you can, but obviously speed is an issue. You will never saturate an USB 2.0 link with a pure software stack on an ATMega, but reading out a few sensors or some input device that is limited by the speed of the user's fingers is possible, search for avr-hid or hidkeys (can't copy and paste URLs in Opera Mini).
Another great resource for hardware hacking is the SparkFun tutorials:
http://www.sparkfun.com/commerce/tutorials.php