The easiest way of charging a 12V Lead-Acid Battery from a 17 to 21Vopen-circuit solar panel is to use a low-impedance switch (FET or Relay) that is fully-on or fully-off. Close the switch when the battery voltage drops (due to load or self-discharge) below ~13.5V, and open the switch when the battery voltage climbs above ~14.4V. You don't need a Zener in the path between the panel and the battery.
This means the Arduino needs to measure the battery voltage directly on the downstream side of the switch. The Arduino can turn the switch on/off. However, you really don't need an Arduino. I have built several chargers like this using just a 555 (used as a window comparitor) and a TL431 voltage reference (Cost ~ $2).
Since the solar panel behaves like a constant-current source while its terminal voltage is between ~10V and it's open-circuit Voltage, the battery charging current is whatever the panel will deliver based on the solar flux landing on it. Current limiting is intrinsic in the panel.
As long as the rated output current of the panel (in full sun) is less than the maximum allowed charging current for the battery, then nothing else need be done... While the switch is on, the panel voltage is only a few mV higher than the battery voltage, so the power dissipation in the switch is minimal. (No heatsink required). When the switch is off, the panel voltage will rise to its open-circuit value.
I have been doing this for years in several battery chargers and battery maintainers. Most commercial solar battery charge regulators do it this way. My ham station is powered with a 240W panel feeding a 200Ah 12V battery bank. The charge regulator is based on this scheme.
Is your battery a flooded battery, or sealed AGM type? That affects the cut-in and cut-out voltages a bit. The cut-in and cut-out voltages should be compensated for ambient temperature, too.