Fazendo AutoBrilho para LCD 1602

Prezados,

Então gente estou tendo dificuldade em realizar essa tarefa a um nível mais apurado e gostaria da opinião de vcs para melhorar o projeto.

Com esse código estou usando dois LDR’s para um precisão melhor (não acho q adiantou muito, mas ta nele) e o LCD 1602.

O problema é o seguinte, de acordo com a média da leitura dos LDR’s, quero que o brilho do LCD aumente ou diminui GRADATIVAMENTE igual o efeito FADE, também visto nos celulares, só que não estou conseguindo fazer esse efeito, o que consegui foi aumenta ou diminuir em meio que estágios, tipo em degrau.

#include <LiquidCrystal.h>   //incluindo biblioteca do display 

LiquidCrystal lcd(2,3,4,5,6,7); //setando os pinos do display

//variaveis e pinos do auto brilho
int ledPin = 9; //led do display
int ldrPin1 = A0; //ldr
int ldrPin2 = A1;
int ldrVal1; //variavel ldr - leitura
int ldrVal2;
int ldrM;//ldr media

const unsigned long eventLdr = 2000; //intervalo de atualizacao do autobrilho
unsigned long previousTime = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  //setando pinos do auto brilho
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  
  // escrevendo o texto
  lcd.begin(16,2);
  lcd.setCursor(5,0);
  lcd.print("Projeto");
  lcd.setCursor(2,1);
  lcd.print("Felipe Ishii");
  delay(3000);
  lcd.clear();
  lcd.print("V_1: ");
}

void loop() {
  // put your main code here, to run repeatedly:
  unsigned long currentTime = millis();
  
  //esquema de autobrilho
  if (currentTime - previousTime >= eventLdr){
    
   ldrVal1 = analogRead(ldrPin1);//leitura do ldr1
   ldrVal2 = analogRead(ldrPin2);
   
   ldrM = (ldrVal1 + ldrVal2)/2; //Media
   
   ldrM = map(ldrM,0,1023,0,255);// equipara a leitura do ldrM de 0 a 1023(MAX) ao pino PWM do led (0 a 255)

   Serial.print("LDR:");
   Serial.println(ldrM);
   
   analogWrite(ledPin, ldrM);// acende o led de acordo com a variacao de brilho
   
   previousTime = currentTime;
  }

}