Part 4 of the Crafted Circuits – Reflow Timer series.
Now that all the pieces of the circuit are known, more or less (I’ll assume that the MAX31855 can be used), it’s time to figure out whether everything will fit together. One issue I’d like to get out of the way early on, is pin assignments on the ATmega. There are 20 I/O pins: 14 digital, of which 6 PWM, and 6 digital-or-analog.
The best thing would be to make this as compatible with existing products as possible, because that simplifies the re-use of libraries. For this reason, I’ll hook up the RFM12B wireless module in the same way as on a JeeNode:
- D.2 = INT0 = RFM12B INT
- D.10 = SS = RFM12B CS
- D.11 = MOSI = RFM12B SI
- D.12 = MISO = RFM12B SO
- D.13 = SCK = RFM12B SCK
5 I/O pins used up – let’s see how many the rest needs:
- 2 LED’s = 2 pins
- 2 buttons = 2 pins
- buzzer = 1 pin
- LCD + backlight = 7 pins
- thermocouple = 3 pins
- SSR output = 1 pin
Total 5 + 16 = 21 pins. Whoa, we’re running out of pins!
Unfortunately, we’re not there yet: the thermocouple chip consumes about 1 mA, so we need a way to power it down if we want a serious auto power-off option. That’s one extra pin.
Also, it would be very nice if this thing can be programmed like a regular Arduino or JeeNode, i.e. using D0 and D1 as serial I/O. That also would help a lot during debugging and in case we decide to use the serial port for configuration. Hm, another 2 pins.
And lastly, I’d like to be able to measure the current battery voltage. Drat, yet another (analog) pin.
All in all we seem to need 5 more pins than are available on an ATmega168/328 28-DIP chip!
The good news is that there are usually a few ways to play tricks and share pins for multiple purposes. One easy way out would be to just use an I/O expander (like the LCD-plug) and gain 5 I/O pins right away. But that’s cheating by throwing more hardware at the problem. Let’s look at some other options:
- the SSR output can be combined with one of the LEDs, since a red LED will probably be used to indicate “heater on” anyway
- the thermocouple chip is a (read-only) SPI chip, which means that its SCK and SO pins can be shared with those of the RFM12B
- one way to free the button pins is to put the buttons on data lines used by the LCD – with extra resistors to let the LCD output work even while pressed
- the buttons and LEDs could be combined, as on the Blink Plug (this is mildly confusing, since pressing a button always lights its LED as well), but this would prevent sharing the SSR output with the red LED
- multiple buttons could be tied to a single analog input pin by adding some extra resistors, but this rules out the use of pin-change interrupts
- yet another trick is to combine a high-impedance analog input (for measuring battery voltage) with a pin which is usually used as output, such as one of the LCD data pins
I’m inclined to adopt the first three tricks. That frees five pins – one can be used to power the thermocouple chip and two would be D0 and D1 to support standard serial I/O. We could have up to 5 push buttons this way.
So all in all, the 28-pin ATmega seems to be just right for the Reflow Timer. Depending on the complexity of the sketch, either an ATmega168 or an ATmega328 could be used. My current reflow sketch fits in either one.
With luck, the Reflow Timer can remain compatible with Arduino, RBBB, JeeNode, etc. and it will support sketch uploads in exactly the same way as with JeeNodes and RBBB’s, i.e. through an FTDI 6-pin header with a USB-to-FTDI interface such as the USB-BUB.
Let’s try and come up with a tentative pin allocation:
- D.0 and D.1 = serial I/O via FTDI pins
- D.2 and D.10 .. D.13 = RFM12B, as above
- D.3 = LCD backlight (supports hardware PWM)
- D.4 = buzzer
- D.5 and D.6 = LED outputs (both support PWM)
- D.8 and D.9 = thermocouple power and chip select
- A.0 = battery voltage readout
- A.1 .. A.5 and D7 = LCD (4 data + 2 control)
- A.1 .. A.5 = shared with up to 5 push buttons
Several pins could be changed if this will simplify the board layout later – but hey, ya gotta start somewhere!
Note that I’m using D.X as shorthand for digital pins, and A.Y for analog pins, matching Arduino terminology (where A.Y can also be used as digital pin => D.(Y+14)).
The next step will be to work out more electrical details, i.e. figure out how to add some new features.