First, you are right that internal port and external port do NOT need to be the same: you can map external port 111 to OpenSprinkler at port 80. The only exception I’ve seen is that occasionally some routers require external and internal ports to be the same, in which case you will have to change OpenSprinkler’s port to 111 as well. Generally this happens on old routers which do not give you an option to specify internal port.
I am not sure if 111 might be a reserved port, but you can try something more typically, like port 8080, or 8000 or 8888. Again, set your router to map external port 8080 to OpenSprinkler at port 80 (make sure 80 is your OpenSprinkler’s port). Then you can use external_ip:8080 to access the controller.
Some routers will block external IP access if the request is coming from inside the network. So the best way is to use your phone’s mobile network to access it through external IP.