loading

After seeing my first Attiny85 based "Decision box" had become quite popular I decided to make a second version with more improvements using common materials so everyone can build it.

The main difference between the first and second version are the materials they're made of, while the first box was made out of wood, this version has two perforated boards stacked together with hex spacers and screws, and connected by pin headers and connectors. This makes it more modular, robust and easy to assemble. Another difference are the LED's, in this version I used three LEDs instead of a single common cathode red-green LED, not just because I had more space to put them, but also because it has allowed me to be more creative when making the program.

Step 1: Materials:

  • Attiny85
  • 8pin chip socket
  • Coin battery holder
  • CR2032 Coin battery
  • Perforated board
  • Pushbutton
  • Hex spacers (around 2cm, 3/4 inch)
  • 8 screws for the spacers
  • Long pin headers
  • Connectors for the pin headers
  • Red, green and yellow LEDs
  • Copper wire
  • 120Ohm resistor
  • 10kOhm resistor

You'll also need a soldering iron.

Step 2: The Circuit:

The circuit is quite simple, but assembling it together in two different planes can be a bit tricky.

This circuit runs on 1mA when in idle and around 5-6mA when using the LEDs, so assuming the coin battery has a capacity of 200mAh, it should run for a week before draining the battery in case its left on.

Step 3: Assembling the Cube.

Start by cutting two squares of 11x11 pads, we need an odd number of pads because components like the button occupy an odd number of them, and by making this we make sure they are symmetrical respect to the center line.I also bent the pins of the chip socket so it could fit in a 4x3 group, instead of the usual 4x4, this way it's properly aligned and vertical. You can also connect it in an horizontal way, but making the connections could be harder. If you find hard to do this you can always use a 13x13 boards, or 12x12, if your button occupies 4x4 pads.

Make a hole at the center of the 2x2 pad groups located at the edges, the hex spacers will be placed there, the holes need to be big enough for the screws to fit in. Use a precision tool for better accuracy.

Once the holes are made put the components on the board. I've traced the circuit with colors according to the schematic so you don't get lost when soldering it.

Notice that there is solder under the blue resistor (10kOhms) connecting the LEDs and the chip to ground.

For the main switch I used a a pair of pin headers and a bridge connector from a computer, you can use a small though-hole switch or even a tilt switch.

Step 4: Connectors

To assemble the pin headers and connectors that will join the two boards, solder a 5 connector row between two hex spacers, using the pads at the edge, remember to separate them into positive and negative. Once the connector is soldered, cut the long pin headers to an appropriate length so they can be fully inserted leaving just a small gap between the plastic holding the pins together and the upper board, then solder them as shown in the picture. It's quite tricky, but I haven't found any other way to overcome this.

Step 5: Uploading the Code

As always remember that to upload the code to your Attiny85 you must go to >Tools>Programmer>Arduino as ISP and Tools>Boards>Attiny85 1MHz clock.

You can check other instructables on how to program an attiny85 if you haven't worked with them yet.

I strongly recommend you to visit nqtronix's instructable, since he offered to re-do the program with power saving modes and it also contains many and very useful information like program optimization.

You can also check gmiller6's program, he changed the display mode of the random function.

Step 6: Customization and Probabilities

The yellow LED, which wasn't enabled in the previous version, can now be used, and interpreted as a "maybe". This can be undone changing the program and removing the LED, you could even add a button pattern recognition function or an extra button to disable and enable it.

You can also change the probabilities, for example, you can set red and green (no and yes) to 40%, and keep the yellow (maybe) at 20%. To do this, simply expand the range of the elements in the random function and include them in the statements as shown as shown in the picture.

The random function will output anything from 0 to the second variable minus 1, meaning that if we introduce 3, the results can be 0, 1, or 2 (red, yellow, green). By introducing 5 as the second variable we can get 0, 1, 2, 3 or 4. We can use an "if" function so 0 or 1 are recognized as red (40% chance), 2 yellow (20% chance) and 3 or 4 green (40% chance).

To compare two variables at a time you can use " || " (Alt+124), this is OR, and means that if one OR the other occurs, the statements will be executed.

Step 7: ???

Since easter is just around the corner I've added an easter egg to the program. And of course I won't reveal what it is or does, if you want to find out you'll have to build the circuit, you could also analyze the program, but that would be cheating. I'll just say this easter egg is quite more elaborated than the random part itself, and you'll probably end using it more too.

Step 8: Thanks for Watching!

<p>As mentioned in the comments I made my own version (WOOHOOOO!!!). It's mainly a code improvement, which means it's 100% hardware compatible.</p><p>Check it out: </p><p><a href="https://www.instructables.com/id/Arduino-Decision-Box-BE-Attiny85/?ALLSTEPS" rel="nofollow">https://www.instructables.com/id/Arduino-Decision-B...</a></p>
<p>Thanks for all the work, I've featured your post and I'll add the link to the &quot;code step&quot; so everyone can see it, it contains many useful information, some of which I haven't even started to grasp. </p>
<p>Thanks very much! :)</p>
<p>I bodged together the circuit, and it works. The easter egg was cute, but confusing. I eventually stripped it out of the code. I plan to mount the circuit in a mini Altoids tin. If I could find a smaller battery, I have an idea for a pendant with a neopixel based on this.<br><br>I used 220 resisters. I had a bunch on hand from another project. I tried the 10k like you did but it made my LEDs too dim. The 220 seems to be just right.<br><br>Good job, and thank you for the inspiration!</p>
<p>All inspired by this Instructable. Thank you!</p>
<p>I was fiddling with another project and realized I could get all the parts on a 1in round board if I use tiny LEDs.</p>
<p>Here is some alternate code for this project.<br><br>In this version the lights scroll fast until you release the button. Then the scrolling slows until it blinks the answer. This builds some fun suspense!</p>
<p>The tin can enclosure looks really neat, also thanks for the code, I'll add it to the step 5. </p>
<p>The 10k resistor was to debounce the button, for the LEDs I used a 120 Ohm resistor. I'm glad you liked it!</p>
<p>Ah, ok. I changed out the resister on the button and it is working better. Thank you!</p>
<p>I made it too! Nice little instructable.</p><p>I made a few modifications: &frac12; AA 3.6 V lithium battery (should last forever!); PB4 is connected to ground through the switch and internally pulled up; common cathode LED with a single 2.2 K resistor between cathode and ground; probability ratio is red (127), green (127) and blue (2); and I used nqtronix <a href="https://www.instructables.com/id/Arduino-Decision-Box-BE-Attiny85/" rel="nofollow">software</a>.</p>
<p>You're right, with that battery it'll last an eternity. Neat. </p>
<p>whats the easter egg please tell me</p>
<p>After some time has passed I think it isn't worth to keep it secret anymore. If you keep the button pressed for 3 seconds you enter a mini game, kind of like stacker, but with just one row obviously. You have to push the button when the yellow LED is lit, if you do this, you advance one level, and the difficulty increased by reducing the time between shifts. If you fail to do so you stay on the same level, the red LED will flash indicating the remaining lives, if you run out of lives you're thrown out of the game. (I just lost it btw) </p>
<p>Hey, i made one! I used an RGBLed and added sound. My first piece of soldering! It's a bit dodgy and buggy, but works most of the time. The only thing is the coincell drains very quickly. I skipped the resistors altogether just to find out if that would work...</p><p><iframe allowfullscreen="" frameborder="0" height="281" src="//www.youtube.com/embed/REqT4Ie8zmA" width="500"></iframe></p>
<p>Nice, I like the sound and light effects. The CR2032 can only deliver 200mAh, and although they have a high internal resistance, they quickly drain if the LEDs are set to work at their max current. </p><p>In my case they're quite underpowered just to save battery time. </p>
<p>looks great. where did you find the black perfboard? I start to get bored by the yellowish brown that I have</p>
<p>I painted it black, it was some kind of yellow or faint green before, maybe someone should sell one that it's actually black, since I've been asked about it a lot of times. </p>
<p>thanks. looks good</p>
<p>It is nicely done, but you should not call it an Arduino decision box. It has got very little to do with Arduino, which is also a protected trademark. Attiny85 based decision box was more appropriate.</p>
<p>Well, I used an Arduino board and the Arduino IDE to program it. But I guess the final thing has not to much to do with Arduino as you said and could be made without the things mentioned above. </p>
<p>Technically, you can install an Arduino-compatible bootloader onto the 'tiny85, and still have room for your code, so it _could_ be an Arduino.</p><p>The trademark should be respected, of course, but Arduino do not use it as a weapon against the community... tons of projects use &quot;Arduino&quot; in their name. </p>
<p>Nice! Where'd you source the black perf board?</p>
<p>It is normal perf board, you can notice the typical faint green color underneath. I just painted the top with permanent black marker because I didn't like that color. </p>
<p>Good! =D</p><p>Just love AtTiny85!</p>
<p>call his 803683-46478</p>
<p>where</p>
<p>yup</p>
<p>u gusse it</p>
<p>thxs </p>
<p>This is actually a really nice remake of the old version. The barebone construction was a good idea.</p><p>I'm not sure if the arduino libary supports that, but the attiny85 supports different sleep modes to reduce the current consumption to just about 2 uA. This results in a standby battery time of mor than 11 years from a CR2032 eliminating the need of an on/off switch. The device can then simply be woken up by any pin change interupt such as pressing the button.</p><p>If you want to I can write the program in native C, it shouldn't take too long. :)</p>
<p>Yes, I've heard about the power saving modes of the Attiny, however I haven't been able to implement it because I haven't done enough research. I'll try to update the program as soon as I can If I can come up with it.</p><p>Thanks for your suggestion, I don't want to bother you, although if you are going to write and improve the program anyway I would be very grateful if you posted it here. </p>
<p>I'm working on it right now ;)</p>
<p>I've just re-uploaded the program because I found some minor bugs, it's fixed now. </p>
<p>I've written the code from scretch anyway to optimize the power consumption as far as possible. The code also includes a &quot;push button pull down resistor present&quot; detection, if there's none he internal pullup will be used. The &quot;randomness&quot; is now truely randon utilizing the noise generated by the red LED. Right now my code doesn't include the easteregg, and I don't plan to implement that.</p><p>I'm still struggeling a bit with staeting the sleep mode from an interrupt, it somhow puts the attiny in an infinite loop locking it. I'll focus on that tomorrow.</p><p>Would you mind if I'd create a seperate instructable for my setup? I'd link back to this page for all the hardware aspects, if that'd be ok.</p>
<p>Yea, it's quite difficult to get it right. I've got a toy on my desk that does just about what you need (wakeup interrupts on an attiny85). Here's a snippet of the code. It looks like I'm using a library called Sleepy to do the work.</p><p>#include &lt;Ports.h&gt;</p><p>#include &lt;avr/interrupt.h&gt;</p><p>#ifndef sbi</p><p>#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))</p><p>#endif</p><p>void setup() {</p><p> pinMode(pinLed, OUTPUT);</p><p> installInterrupt();</p><p>}</p><p>void loop() {</p><p> // do some work here</p><p> // maybe turn on a led and delay() a bit</p><p> Sleepy::powerDown();</p><p>}</p><p>void installInterrupt() {</p><p> sbi(PCMSK, pinButton);</p><p> sbi(GIMSK, PCIE);</p><p>}</p><p>ISR(PCINT0_vect) {</p><p> // wakeup</p><p>}</p>
<p>Honestly that didn't help me very much, I'm not using the Arduino code, but native C. However I tried a few things, now all major code is in the main loop and it homehow works. My guess is that it doesn't handle sleepmodes within an interrupt very well.</p><p>Thanks for all your efforts :)</p>
<p>Ah, bare C might be a bit harder :). It is best practice not to do any work in the interrupt because they are so unpredictable. For instance, it might fire more than once. If you do have to update a counter or something, make sure the variable is marked volatile. I don't know for sure that this is necessary on arduino, but for other architectures, it will prevent the compiler from making optimizations that break things.</p>
<p>Of course I don't mind, thanks for all the work you're doing.</p>
<p>Thanks! :)</p>
I like to see projects like this. It seems very well-written as well as well-designed. I hope to see more projects like this.
<p>nice :)</p>
<p>nice job is it necessary to use only 10k and 120 ohm resistors</p>
<p>The 10k resistor can be left completely away if you enable the internal pull-ups of the attiny (I don't know how or if thats possible with arduino) or or replace with any value in the range of 3.3k to 100k.</p><p>The 120ohm resistor can be replaced with any value from 68 ohms up, however lower values increase the power consumption and higher values (&gt; 1k) significantly decrease the brightness.</p><p>Hope that was helpfull :) </p>
<p>That's right, the 10k resistor is used to debounce the button, the <br>120Ohm resistor is used to regulate the brightness and energy <br>consumption.</p>
I like the design of this. I made your first one but I made it with a rgb led and I modified the code so I have definitely yes and no and ask again
<p>very cool indeed</p>
<p>Hi, the comment in the yellow statement in the screenshot is &quot;green&quot;... <br>I think it should be &quot;yellow&quot; (no function, only easier for code beginner)</p>
<p>Thanks, I must have copy-pasted it without changing the color name. I'm going to change it and upload the modified program. </p>
<p>I really like how it looks as well! So great! </p>

About This Instructable

36,422views

421favorites

License:

Bio: I'm an electronic engineering student. I don't usually have much spare time but I like to work on random projects to keep myself ... More »
More by Victor805:The Joule Blinker Cheap caliper battery life hack Wood LED Desk Lamp 
Add instructable to: