Rotary encoders/switches and shift registers

I'm looking for a way to read a 12 way indexed dial (i.e. it clicks into place), that has absolute positions. Initially I thought this was a rotary encoder, but they only transmit on changes, so when the arduino is first powered it has no way to know what the position is. Absolute rotary encoders apparently do this, but they seem to be like hens teeth, and very expensive compared to incremental ones for some reason.

So I've looked at using a simple 12way rotary switch, with a shift-in-register, which would work but seems quite clunky as I'd need to solder up all 12 outputs & the shift register. Space is tight so this isn't a great solution.

Is there a better way to do this? e.g. a rotary switch with a built in shift-register or an absolute rotary encoder that exists and is actually affordable i.e. under £5?

I've in the UK and have searched high and low, but not found anything like it!

Why do you need it, exactly?

If it's always powered on, there's no problem.

If you want to power it off, store the previous 'position' in EEPROM so it boots up in the same position as when you powered it off.

It will be a "setting" dial for lighting modes/patterns, and power will be turned on and off. I'd like to have it so the same position is always the same mode otherwise it could get confusing, if a reading is missed or something the modes would move around the dial.

A common solution to your situation is to wire the rotary switch as if it is a potentiometer with fixed positions, using 11 resistors. Then you can feed the resulting voltage into an analog input, call analogRead, and work out the position. I can't say I like this approach, but it works.

Another possibility is to ground the switch wiper, and connect diodes between the switch contacts and 4 digital inputs (in INPUT_PULLUP mode) so as to encode the position in 4-bit binary. This would require 24 20 small signal diodes.

You can solder the resistors or diodes directly to the back of the switch, so you don't need many wires between the switch and your board.

How about this?

I still think you can do it electronically though. Store the state in EEPROM for power off/on.

Maybe combine it with one of these:

Is there a reason you can't just use a potentiometer?

Here is a potentiometer with 21 detents.