I'm getting close to finishing this project. I decided not to add a charger IC, as it would be very difficult to be able to charge all the different types of batteries I want to support. Right now I can test LiPo/LiIon, LiFe and Lead Acid batteries. I can basically test any battery under 14V, so I'll be adding a few more types to the software in the near future.
As for software, I have an LCD connected to the arduino as well as a few pushbuttons. I've implemented a fairly simple interface on the LCD, which allows you to pick your battery type and test current before beginning the test. You can run the test without a PC, but if you connect a PC the arduino will output CSV format data over the serial interface which you can record.
The load testing works pretty well. Due to the limited resolution of the PWM output from the arduino, I can only set the load current within about 10mA of my target, which should be fine. The important part is that it reads the load current accurately within +/-2mA. I've already been using the load tester to check some of my salvaged batteries.
Here's what the hardware looks like now. I put a beefy heatsink + fan on the power transistor. The tiny heatsink I was using before got quite hot testing a 12V battery at 150mA. On the right you can see one of the batteries I've been testing. I think this was salvaged from an old macbook, and was supposed to be rated for around 2000mAh. I tested it at 300mA which resulted in 1540mAh and also at 500mA which gave me 1082mAh. This leads me to believe that this cell is somewhat worn out and has a high internal resistance. It would be a good candidate for something that needs decent capacity but with low current draw.
Now that the software is almost done and the hardware is tested, it's time to take this off the breadboard and build it into a proper enclosure. I was going to use a metal project box, but since I have a pretty good heatsink now I can get away with using a plastic box. The software works well enough but I'm not quite ready to release it. I've been lazy with commenting so I need to go back and add some information and tidy up the code a bit.