Where to start and where to go from there?

Focalist has it right. If you need to eat an elephant, you do it one bite at a time. Same with programming. Virtually any software task is a five step process (i.e., The Five Programming Steps). They are:

  1. Initialization Step-- things you must do to create the environment in which the program will run. On a PC, it might be to set up a database connection, a printer port, etc. For the Arduino, it might be as simple as setting the baud rate for the serial communications for the serial monitor. Quite often, this step is done in the setup() loop.

  2. Input Step -- this is where you get the data that needs to be acted upon. Programs usually take data in one form (e.g., from a sensor) and transform it into another form (e.g., save it on an SD card).

  3. Process Step -- this is where you transform the data from the Input Step in some way.

  4. Output Step -- this is where you show the results of your process. It might be sending data to Serial.print() or storing the data on an SD card, or...whatever.

  5. Termination Step -- this is sort of a cleanup process...releasing any resources the program used (e.g., file handles, ports, etc.) Quite often, it's the Initialization Step in reverse. For Arduino type of programs, there might not even be a termination process, although usually there is some "bail out" path if things go very badly.

The point is, take your programming task and divided it down into manageable chunks like Focalist suggested. Having done that, you can use Sideways Refinement to flesh out additional details that each of the Five Programming Steps might require. For example, if the Input Step is using sensors to get the raw data, you might refine this as InitializeSensors(), ReadSensorData(), and ParseSensorData(). Having done that, you are ready to hand the raw data off to the Process Step. This Divide-and-Conquer process can often help answer the "The-problem-is-so-big-I-don't-know-where-to-start" issues.