I have been struggling with the same issue myself for a while, but I think I have a good idea how to fix this.
First, remove the PI from the casing
I know this is strange, but in my experience, this was the main issue. HDMI through the case was working fine with a desktop monitor, but not with the TV. I removed the PI from the case, and tried again, it worked right away. This is because some covers don't allow the mini HDMI cable to fully attach, and hence giving out a weaker signal through the HDMI cable.
If the first step didn't work, we still have a few options. I would list them here in order, so you can try them gradually.
Increase the outgoing signal
You can do that with the
config_hdmi_boost=4 config property in
/boot/config.txt, the maximum value that you can set for this option is
11, however, the documentation advises against using such a high power boost unnecessarily.
Force outputting HDMI
By using the property
force_hotplug=1. Usually this option is already configured for you under
/boot/config.txt. It forces the HDMI output even if the monitor was not detected as HDMI-ready.
Increase HDMI compatibility by running in "safe mode"
By using the option
/boot/config.txt. This runs the HDMI video output in a 'highly compatible' mode. It also changes the resolution to
640X480, but don't worry, we can change it later.
Manually configure the resolution and output mode
Under the HDMI specification, the monitor can 'negotiate' with the attached device, which resolutions and video modes it supports and which it 'prefers'. This is the so-called
edid information. The PI should then be able to choose the correct resolution and mode to be outputted. However, this could be problematic in some cases, and it might be better to 'force' output a resolution and a mode if we already know it.
In short, you need to
ssh into the RaspberryPi while it is connected to the monitor/tv, and using the commands
tvservice -d /tmp/edid and
edidparser /tmp/edid to figure out the preferred resolution and mode. You can then set these values using the properties
hdmi_mode in the
/boot/config.txt file. You might also need to set the property
hdmi_ignore_edid=0xa5000080 to ignore the
edid negotiation. Here's a nice tutorial on how to do this.
Remember, you can always take a look at the documentation to understand better what each of these configuration parameters does