The problem with long wires on I2C (also 1-wire) is too great capacitance. The pull-up resistor would need to charge up 'the line'. That takes time, which may be too long for a good edge to be detected.
That means:
- Decrease the value, until your MCU pins can handle no more
- Lower the clock rate/increase duty cycle, so the edges have time to recover.
12 meters may not be long fetched if you severely limit the transmission rate. Maybe at 1kHz it may work fine, but above that it gives problems.
I would look at something like RS485 as its designed for long distance communication in a bus. Have each node an assigned address, and you pretty easily work out a protocol without collisions.
If commands don't require a response, it's even simpler.
CAN is a nice system , as it has accommodations for priority, packet ID's and a good bitrate (250kb/s at reasonable distances), but it's not implemented on a simple PIC16 chip. I think you even need quite a big PIC18 or dsPIC33 to even find onboard CAN modules, which also require a separate CAN transceiver.
Not very practical if you want a minimalistic/low-cost system.
Also it may be useful to have an estimation of how many packets/s you want to send to each node, how many nodes there are, and how many bytes you expect those packets to take.
If you want to update all 12 nodes at 50Hz and require 8 bytes per packet, that's 4800 bytes/s (38400b/s). With a baud rate of 57600 that would just about do that, but wouldn't have much left.