Simular Pmw en Arduino Mini Pro

Yo escribí el siguiente código para hacer que un led encienda y apague lentamente cunado no no es posible conectarlo a un puerto pmw.


int Max = 25;

void setup() {
  //  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  Incrementa(LED_BUILTIN, Max);
  Decrementa(LED_BUILTIN, Max);
}

void Incrementa(int Led, int Max) {
  int On = 0;
  int Off = Max;

  for (int i = 0; i < Max; i++) {
    if (On < Max) {
      On++;
    } else {
      On = 0;
    }

    if (Off > 0 ) {
      Off--;
    } else {
      Off = Max;
    }

    digitalWrite(Led, HIGH);
    delay(On);
    digitalWrite(Led, LOW);
    delay(Off);
  }
}

void Decrementa(int Led, int Max) {
  int On = 0;
  int Off = Max;

  for (int i = 0; i < Max; i++) {
    if (On > 0) {
      On--;
    } else {
      On = Max;
    }
    if (Off < Max ) {
      Off++;
    } else {
      Off = 0;
    }

    digitalWrite(Led, HIGH);
    delay(On);
    digitalWrite(Led, LOW);
    delay(Off);
  }
}

Luego le pase el código a ChatGpt para que lo mejorara. Esto fue lo que me respondió y el código que me dio.

Este código logra encender y apagar lentamente un LED, pero su eficiencia podría ser mejorada. Una forma de hacerlo sería eliminando la duplicidad de código en las funciones «Incrementa» y «Decrementa». Se podría crear una sola función que tome un argumento adicional indicando si la intensidad del LED debe aumentar o disminuir. De esta manera, se reduciría la cantidad de código duplicado y se mejoraría la legibilidad del código.

ChatGpt
//Define el máximo valor de intensidad del LED
int Max = 25;

void setup() {
  //Configura el pin del LED como salida
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  //Fade el LED aumentando la intensidad
  fadeLED(LED_BUILTIN, Max, true);
  //Fade el LED disminuyendo la intensidad
  fadeLED(LED_BUILTIN, Max, false);
}

void fadeLED(int Led, int Max, boolean increase) {
  //Determina el valor inicial de On y Off dependiendo si se está aumentando o disminuyendo la intensidad
  int On = increase ? 0 : Max;
  int Off = increase ? Max : 0;
  //Determina el valor del incremento dependiendo si se está aumentando o disminuyendo la intensidad
  int step = increase ? 1 : -1;

  for (int i = 0; i < Max; i++) {
    //Incrementa o decrementa el valor de On y Off
    On += step;
    Off -= step;

    //Enciende el LED
    digitalWrite(Led, HIGH);
    //Espera el tiempo definido por el valor de On
    delay(On);
    //Apaga el LED
    digitalWrite(Led, LOW);
    //Espera el tiempo definido por el valor de Off
    delay(Off);

    //Detiene la ejecución del bucle si el valor de On es igual a 0 o Max
    if (On == 0 || On == Max) {
      break;
    }
  }
}