How can i pause gradually from timeScale 1.0 to 0.0 over a second?

Hello,

Noob here. I want to smoothly pause the game after pressing Esc. I tried Mathf.Lerp with no success. I assume it’s tied to the fact that the timeScale updates only for a frame on pressing Esc.
So, i want the timeScale to go from 1.0f after pressing Esc and decrease smoothly over a second to 0.0f during which i also move the camera a bit.

This is what i have attached to the Camera:

bool CanPause;
float smooth = 1;
    void Start()
        {
            Time.timeScale = 1;
        }
    void Update()
        {
            if (Input.GetButtonDown("Cancel"))
            {
                if (CanPause)
                {
                    smooth -= smooth * Time.deltaTime;
                    Time.timeScale = smooth;
                    CanPause = false;
                }
                else
                {
                    Time.timeScale = 1;
                    CanPause = true;
                }
            }

Also I was getting some out of range values when experimenting with MathfLerp and tried the Mathf.Clamp to keep them between 1.0 and 0.0 to no avail. Please help!

Thanks to robertbu for answering a very similar topic. Modified the original a little and made it feel hackish but it works!
Here is the answer:

 IEnumerator ScaleTime(float start, float end, float time)     //not in Start or Update
            {
                float lastTime = Time.realtimeSinceStartup;
                float timer = 0.0f;
         
                while (timer < time)
                {
                    Time.timeScale = Mathf.Lerp (start, end, timer / time);
                    timer += (Time.realtimeSinceStartup - lastTime);
                    lastTime = Time.realtimeSinceStartup;
                    yield return null;
                }
         
                Time.timeScale = end;
            }
    	
    	
    	void Update ()			
    	{
            if (Input.GetButtonDown("Cancel") && Time.timeScale == 1)
            {
                StartCoroutine(ScaleTime(1.0f, 0.0f, 1.0f));
                
            }
            if (Input.GetButtonDown("Cancel") && Time.timeScale == 0)
            {
                StartCoroutine(ScaleTime(0.0f, 1.0f, 1.0f));
                
            }