For my 20 high, I'm using a CO2 reactor kit from Amazon. It came with a diffuser, solenoid, pressure gauge, etc. Every 2-3 weeks I clean out the reactor, mix up some baking soda + citric acid powder + water, and away I go. After a lot of experimentation with diffusers, I found the simplest solution was just to insert the CO2 output line into my powerhead air intake (in my case an AquaClear 20). Surprisingly, the powerhead was able to chop up the gas into fine enough bubbles that will float around my tank. For a demonstration, see the YT video "Best Co2 Diffusers Reviewed + Explained". I'm aiming the powerhead across the back wall of my tank. Combined with the circular downward force from my HOB, it seems to spread the bubbles around the tank reasonably well. I found that a lot of getting DIY CO2 to work for you is in getting the bubbles to distribute properly so they actually land on your plant leaves. If you have uneven flow, some plants will get all the CO2 and/or some will simply rise to the surface and escape.
As for not gassing your fish, make sure to get a drop checker so your don't run too much CO2 during the day. Get everything you have on a timer. I'm using the "Kasa Smart HS300 Plug Power Strip" which lets me individually program timers for everything in my tank (air pump, CO2 solenoid, filter, heater, lights, powerhead). That power strip is probably the best purchase I've ever made in terms of tank equipment.
I've got the lights on for 8 hours a day + 1 hour on each side for ramp up and ramp down (fluval 3.0). At the start of the ramp-up, the air stone goes off (Aquarium Co-op pump + air stone), the powerhead comes on and the CO2 comes on. At the start of the ramp-down, the process reverses (with an hour gap in between the CO2 turning off and the air starting). In theory, all of this should help the plants get O2 and night and CO2 during the day. Through the magic of the powerstrip (and the fluval light app), I don't have to touch anything to make all this work.