The code seems to be up and running successfully. Tested for several hours with no issues. The up-to-date version and schematics is available in the GitHub repository. Still some TODOs, but the main flow is there.
Next step was to improve the efficiency. Started by removing the power LEDs from both the Arduino and the SIM800C. Current measurements showed the following results after that was done:
Step down converter - 7mA @ 12V .
SIM800C in sleep mode - from 0.5mA to 1.2mA @ 12V .
Arduino - 3.9mA @ 12V .
Pretty disappointing results for the step down module. After quick look at the datasheet for LM2596 I found out that the quiescent current should be between 5mA and 10mA. That explained it all.
I'll try with MP2307 based module. According the datasheet this should reduce the step down converter consumption below 1.5mA. There are even more efficient ICs, but I don't find modules with them, and I don't want to invest much time in creating the step down converter by myself.
The SIM800C current is pretty reasonable. Nothing to change there.
The Arduino current is a bit high, but still is quite acceptable.
Software optimization can reduce it quite a lot, but will complicate the code. There is LowPower library, but from the quick research I did - it stops the millis() timer and the current code relay on it.
The goal is to have the GSM remote running below 10mA. If I manage to achieve that I'll not invest efforts in further improvement related to the efficiency.
The hardware is ready and running. Below you can find the connection diagram for some of the components.
The cheep module from China was 'broken' by design. The module is designed to work at 5V. To lower the voltage two diodes were added (in red rectangle). SIM800 is well known to be power hungry and can consume over 1A at startup. The forward voltage of the two diodes combined is about 0.8V. However at peek current the voltage drop is over 1.5V and the supply voltage for the module drops below 3.3V. As result - the module restarts 9 of 10 times during startup. To resolve this the DC-DC step down converter was adjusted at 3.8V and the diodes were short circuited. The module was working stable after that. 3.8V is sufficient for stable operation at 16MHz for the ATmega328 processor.
The diode on the 3.8V is used to avoid burning up SIM800C module while the Arduino is powered from the USB. While USB powered the Arduino works at 5V. The SIM800C will not survive at 5V according the data sheet. The diode can freely be removed after the processor is programmed.
The PWX pin (orange wire below) is used to startup the module. If you just power it up it is in shutdown mode. To start it up you need to bring PWD pin to ground. Well, not exactly to ground, but low enough. The diode limits the 5V from the Arduino flowing to the SIM800C and destroying it. To startup the SIM800C the D4 pin is set to output mode. Bringing it low for 1 second powers on/off the SIM800C.
Shortly - 5 wires are needed between the Arduino and the SIM800C module:
Common ground (black wire).
Common VCC at 3.8V (red wire). Connected to 5V and V_TTL at SIM800C and to 5V on Arduino side. V_TTL is the power of the built in TTL level converter in the SIM800C module.
RX (green). Connected to RX on SIM800C and D2 on the Arduino.
TX (blue). Connected to TX on SIM800C and D3 on the Arduino.
PWX (orange). Connected to PWX on SIM800C and D4 on the Arduino. Split by low drop diode.