Светодиоды на потенциометре

Гасить все а поджигать тот самый

Руки бы поотрывать за такие скетчи.

У него их нет. :smiley:

“Критикуешь - предлагай!”(с) И членовредительство это не предложение!

ой, я код толстый опубликовал из 35го и даже не заметил)))
ну судя по сообщениям, и не только в этой теме, не один я стал не внимательно читать темы)))

вот это версия! необычно))) хоть и 0-7

ну да, если задействовать весь порт D (RX и TX в том числе) то так, осталось увидеть, что Green предложит, но ожидать чуда не приходится

тогда вот моя версия))) вроде работает
пишите так, и после проекта вас не пнут под зад))) но это не точно…

#include <avr/io.h>
#include <avr/interrupt.h>

/* ==================== КОНФИГУРАЦИЯ ==================== */
constexpr uint8_t  HYST      = 20;     // Гистерезис (единицы АЦП)
constexpr uint16_t ZONE_W    = 128;    // Ширина зоны (1024 / 8)
constexpr uint8_t  TIMER_TOP = 155;    // ~10 мс: (155+1)*1024/16e6

/* ==================== СОСТОЯНИЕ ==================== */
volatile int8_t lastZone = 0;

/* ==================== ЧТЕНИЕ АЦП НАПРЯМУЮ ==================== */
static inline uint16_t adc_read() {
  ADCSRA |= _BV(ADSC);          // Старт преобразования
  while (ADCSRA & _BV(ADSC));   // Ждём завершения
  return ADC;
}

/* ==================== SETUP ==================== */
void setup() {
  // --- Настройка портов для пинов 2-7 (PORTD) и 8-9 (PORTB) ---
  DDRD  |= 0b11111100;          // Пины 2-7 — выход
  DDRB  |= 0b00000011;          // Пины 8-9 — выход
  PORTD &= ~0b11111100;         // Выключить
  PORTB &= ~0b00000011;         // Выключить

  // --- Тест-мигание при старте ---
  for (uint8_t i = 0; i < 8; i++) {
    PORTD = (PORTD & 0b00000011) | (1 << (i + 2));  // Пины 2-7
    if (i >= 6) {
      PORTB = (PORTB & 0b11111100) | (1 << (i - 6)); // Пины 8-9
    }
    delay(80);
    PORTD &= ~0b11111100;
    PORTB &= ~0b00000011;
  }
  delay(200);

  // --- Настройка АЦП ---
  ADMUX  = _BV(REFS0);                                          // AVcc, ADC0
  ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);  // Вкл, /128

  // --- Настройка Таймера 2 (8-битный) ---
  TCCR2A = _BV(WGM21);                        // CTC режим
  TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20); // Делитель 1024
  OCR2A  = TIMER_TOP;                         // TOP для ~10 мс
  TIMSK2 = _BV(OCIE2A);                       // Прерывание по совпадению
  sei();                                      // Глобальные прерывания
}

/* ==================== ВСЯ ЛОГИКА В ПРЕРЫВАНИИ ==================== */
ISR(TIMER2_COMPA_vect) {
  uint16_t v = adc_read();

  // --- Гистерезис без if ---
  int16_t lo = (int16_t)lastZone * ZONE_W + HYST;
  int16_t hi = (int16_t)(lastZone + 1) * ZONE_W - HYST;
  lastZone += (v > hi) - (v < lo);
  if (lastZone < 0) lastZone = 0;
  if (lastZone > 7) lastZone = 7;

  // --- Формируем маски для портов ---
  // Для простоты используем сдвиги, но можно и таблицы, как раньше.
  uint8_t mask_d = (lastZone < 6) ? (1 << (lastZone + 2)) : 0;
  uint8_t mask_b = (lastZone >= 6) ? (1 << (lastZone - 6)) : 0;

  // --- Пишем в порты, сохраняя пины 0,1 (RX/TX) ---
  PORTD = (PORTD & 0b00000011) | mask_d;
  PORTB = (PORTB & 0b11111100) | mask_b;
}

/* ==================== ПУСТОЙ LOOP ==================== */
void loop() {}

Чего тут предлагать! Вместо того что бы делать просто и ясно пишешь накручено и как курица лапой. Выключай все и зажигай нужный - уже сказали. Пины светодиодов в массив, что бы можно было подключать как непопадя и что бы можно было подключать разное их кол-во. И форматирование включай, не будь быдлокодером!

Пнут

Дядь, я тя, конечно, тоже люблю, но в этой ветке нет ни одного моего скетча. :grinning_face:
“Редакция ответственности не несёт и опубликовано без исправлений”(с)

не всё так оптимистично - https://wokwi.com/projects/475390323970510849

да как так то ?))) ладно, тогда такая версия, один хороший человек который не зажмотил код, и поделился им! и благодаря этому вот такую версию можно сделать, однако на wokwi не скомпилировалось, слишком долго… а на ардуино собирать проект на макетке лень))) после такого тоже пнуть могут ?)))

/* ============================================================
   ПРЕПРОЦЕССОРНЫЙ МЕТАЯЗЫК ДЛЯ 8 LED + ПОТЕНЦИОМЕТРА
   ============================================================ */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdint.h>

/* ===== БАЗОВЫЕ ПРИМИТИВЫ ===== */
#define cat(a, ...) primitive_cat(a, __VA_ARGS__)
#define primitive_cat(a, ...) a ## __VA_ARGS__

/* ===== IF НА ПРЕПРОЦЕССОРЕ ===== */
#define iif(c) primitive_cat(iif_, c)
#define iif_0(t, ...) __VA_ARGS__
#define iif_1(t, ...) t

/* ===== ПРОВЕРКА НА СКОБКИ ===== */
#define check_n(x, n, ...) n
#define check(...) check_n(__VA_ARGS__, 0,)
#define probe(x) x, 1,
#define empty()
#define defer(id) id empty()
#define obstruct(...) __VA_ARGS__ defer(empty)()
#define expand(...) __VA_ARGS__

/* ===== ЛОГИЧЕСКИЕ ОПЕРАЦИИ ===== */
#define _not_(x) check(primitive_cat(not_, x))
#define not_0 probe(~)
#define _compl(b) primitive_cat(_compl_, b)
#define _compl_0 1
#define _compl_1 0
#define _bool_(x) _compl(_not_(x))
#define _if_(c) iif(_bool_(c))

/* ===== WHEN ===== */
#define eat(...)
#define when(c) _if_(c)(expand, eat)

/* ===== DEC1 ===== */
#define dec1(x) primitive_cat(dec1_, x)
#define dec1_0 0
#define dec1_1 0
#define dec1_2 1
#define dec1_3 2
#define dec1_4 3
#define dec1_5 4
#define dec1_6 5
#define dec1_7 6
#define dec1_8 7
#define dec1_9 8

/* ===== EVAL ===== */
#define eval(...)  eval1(eval1(eval1(__VA_ARGS__)))
#define eval1(...) eval2(eval2(eval2(__VA_ARGS__)))
#define eval2(...) eval3(eval3(eval3(__VA_ARGS__)))
#define eval3(...) eval4(eval4(eval4(__VA_ARGS__)))
#define eval4(...) eval5(eval5(eval5(__VA_ARGS__)))
#define eval5(...) __VA_ARGS__

/* ============================================================
   ПРИКЛАДНЫЕ МАКРОСЫ
   ============================================================ */

/* Пин = номер LED + 2 (LED0 → пин 2, LED7 → пин 9) */
#define PIN(n) (n + 2)

/* Маска для PORTD (только пины 2-7) */
#define MASKD(n) ((n) < 6 ? (1 << ((n) + 2)) : 0)

/* Маска для PORTB (только пины 8-9) */
#define MASKB(n) ((n) >= 6 ? (1 << ((n) - 6)) : 0)

/* ===== REPEAT ===== */
#define repeat(count, macro, ...) \
  when(count) (obstruct(repeat_indirect)()(dec1(count), macro, __VA_ARGS__) \
               obstruct(macro)(dec1(count), __VA_ARGS__))
#define repeat_indirect() repeat

/* ===== SETUP: НАСТРОЙКА 8 ПИНОВ ===== */
#define M(i, _) pinMode((i) + 2, OUTPUT);

/* ===== ТЕСТ-МИГАНИЕ ===== */
#define BLINK(i, _) \
  PORTD = (PORTD & 0b00000011) | MASKD(i); \
  PORTB = (PORTB & 0b11111100) | MASKB(i); \
  delay(80); \
  PORTD &= ~0b11111100; \
  PORTB &= ~0b00000011;

/* ===== ГИСТЕРЕЗИС ===== */
#define HYST 20
#define ZONE_W 128

/* ============================================================
   ТАБЛИЦЫ МАСОК (генерируются препроцессором)
   ============================================================ */
#define MASK_D_TABLE { \
  MASKD(0), MASKD(1), MASKD(2), MASKD(3), \
  MASKD(4), MASKD(5), MASKD(6), MASKD(7) \
}
#define MASK_B_TABLE { \
  MASKB(0), MASKB(1), MASKB(2), MASKB(3), \
  MASKB(4), MASKB(5), MASKB(6), MASKB(7) \
}

const uint8_t MASK_D[8] PROGMEM = MASK_D_TABLE;
const uint8_t MASK_B[8] PROGMEM = MASK_B_TABLE;

/* ============================================================
   РАНТАЙМ
   ============================================================ */
volatile int8_t lastZone = 0;

static inline uint16_t adc_read() {
  ADCSRA |= _BV(ADSC);
  while (ADCSRA & _BV(ADSC));
  return ADC;
}

/* ===== SETUP ===== */
void setup(void) {
  DDRD  |= 0b11111100;
  DDRB  |= 0b00000011;
  PORTD &= ~0b11111100;
  PORTB &= ~0b00000011;

  /* Препроцессорный цикл: 8 раз pinMode(...) */
  eval(repeat(8, M, ~))

  /* Препроцессорное тест-мигание: 8 раз BLINK(...) */
  eval(repeat(8, BLINK, ~))
  delay(200);

  ADMUX  = _BV(REFS0);
  ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);

  TCCR2A = _BV(WGM21);
  TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
  OCR2A  = 155;
  TIMSK2 = _BV(OCIE2A);
  sei();
}

/* ===== ISR ===== */
ISR(TIMER2_COMPA_vect) {
  uint16_t v = adc_read();

  int16_t lo = (int16_t)lastZone * ZONE_W + HYST;
  int16_t hi = (int16_t)(lastZone + 1) * ZONE_W - HYST;
  lastZone += (v > hi) - (v < lo);
  if (lastZone < 0) lastZone = 0;
  if (lastZone > 7) lastZone = 7;

  PORTD = (PORTD & 0b00000011) | pgm_read_byte(&MASK_D[lastZone]);
  PORTB = (PORTB & 0b11111100) | pgm_read_byte(&MASK_B[lastZone]);
}

void loop(void) {}

я им не пользуюсь, - не умею))) но вроде там в коде пины 0 -7 а на схеме 2-9

Потому и пнут, что результат тебе неинтересен, ибо лень.

вот зачем плодить лишние сущности? ты серьёзно считаешь, что надо писать код не отталкиваясь от принципиальной схемы (универсальный)?

а ты считаешь, что ее надо изменить сначала под себя,
написать потом 12 строчек кода “не для новичка”, не увидеть там “косяк”, который ранее увидел в коде от ИИ и продолжать словоблудить?

вот! от таблеток и я бы не отказался наверное… если есть качественные… и на халяву!

Нормально ИМХО, но
это для новичка не ардуино, а “голого” AVR, для какой-нибудь Тиньки , где сериала нет)))

Зато это единственный код, что я понял :slightly_smiling_face:

Из всех сообщ, мне ещё понравилось

  int zone = analogRead(potPin) / 128; 

:slightly_smiling_face:

ну да, а главное это “укладывается” в ранее выдвинутые притензии/косяк