I have this code as below, this code reads a 10K ohm High power LED driver board, in the past I read the value and it is between 65 to 337 through ADC0 pin, and based on value turn 1 to 6 LEDs; I’m using 6 pcs of 2N2222 transistors collector pin of it connected to (-) pin of LED and (+) is connected to 100 ohm resistors and bases are connected to PD1 to PD6 pins of AVR ATmega328P U through 6pcs of 220 ohm resistors; I had this code as below which was for ATmega32A 40 pin; know I want to use 28 pin ATmega328P; take all necessary changes so it can be compatible with ATmega328
#define F_CPU 16000000UL // 16 MHz clock

#include <avr/io.h>
#include <util/delay.h>

// Define potentiometer ADC channel (PA0 = ADC0)
#define potPin 0

// Define digital I/O pins for LEDs - changed to use PD1 to PD6
#define led1 PD1
#define led2 PD2
#define led3 PD3
#define led4 PD4
#define led5 PD5
#define led6 PD6

#define SAMPLES_TO_AVERAGE 10 // Number of samples to average for ADC

void adc_init()
{
// Initialize ADC
ADMUX = (1<<REFS0); // Select AVcc as reference voltage and ADC0 as input channel
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Enable ADC and set prescaler to 128
}

uint16_t adc_read(uint8_t ch)
{
// Select ADC channel with safety mask and without changing the reference voltage selection
ADMUX = (ADMUX & 0xF0) | (ch & 0x0F);

// Start single conversion
ADCSRA |= (1<<ADSC);

// Wait until conversion is complete
while (ADCSRA & (1<<ADSC));

return ADC;
}

uint16_t adc_read_average(uint8_t ch)
{
uint32_t sum = 0;
for (int i = 0; i < SAMPLES_TO_AVERAGE; ++i) {
sum += adc_read(ch);
}
return (uint16_t)(sum / SAMPLES_TO_AVERAGE);
}

int main(void)
{
// Set up the LED pins as output - updated for PD1 to PD6
DDRD |= (1<<led1) | (1<<led2) | (1<<led3) | (1<<led4) | (1<<led5) | (1<<led6);

// Initialize ADC
adc_init();

while(1)
{
// Read the value from the potentiometer and average it
uint16_t potValue = adc_read_average(potPin);

// Map the potentiometer value from the given range (65 - 337) to (0 - 1023)
uint16_t mappedValue = (uint32_t)(potValue - 65) * 1023 / (337 - 65);

// Define thresholds based on the number of LEDs
uint16_t threshold1 = 170; // First threshold
uint16_t threshold2 = 341; // Second threshold
uint16_t threshold3 = 512; // Third threshold
uint16_t threshold4 = 683; // Fourth threshold
uint16_t threshold5 = 854; // Fifth threshold

// Turn off all LEDs to start with - updated for PD1 to PD6
PORTD &= ~((1<<led1) | (1<<led2) | (1<<led3) | (1<<led4) | (1<<led5) | (1<<led6));

// Determine which LEDs to light up based on the mappedValue - updated for PD1 to PD6
if (mappedValue >= threshold5) {
PORTD |= (1<<led1) | (1<<led2) | (1<<led3) | (1<<led4) | (1<<led5) | (1<<led6);
} else if (mappedValue >= threshold4) {
PORTD |= (1<<led1) | (1<<led2) | (1<<led3) | (1<<led4) | (1<<led5);
} else if (mappedValue >= threshold3) {
PORTD |= (1<<led1) | (1<<led2) | (1<<led3) | (1<<led4);
} else if (mappedValue >= threshold2) {
PORTD |= (1<<led1) | (1<<led2) | (1<<led3);
} else if (mappedValue >= threshold1) {
PORTD |= (1<<led1) | (1<<led2);
} else {
// Ensure led1 is always turned on regardless of the value
PORTD |= (1<<led1);
}

// Small delay to reduce flickering
_delay_ms(30);
}
}