Первая деталь почти любого проекта. Два правила: правильная полярность и резистор, который ограничивает ток.
Как работает
Светодиод проводит ток только в одну сторону: от анода (длинная ножка, «+») к катоду (короткая ножка, срез на корпусе). Сам ток он не ограничивает — последовательно всегда ставят резистор. Для вывода 3,3 В и красного светодиода — 100–220 Ом, для 5 В — 220–330 Ом (точнее — калькулятором).
// Ровно одна секунда на аппаратном таймере.
//
// Проверка millis() в цикле опаздывает ровно настолько, насколько цикл
// был занят. Обычно это доли миллисекунды и никого не волнует; в часах
// за сутки набегает заметно, а в измерении частоты врёт сразу.
//
// Таймер считает сам и в момент совпадения вызывает прерывание. Цикл
// при этом может быть занят чем угодно.
//
// Откуда число 15624. Кварц 16 МГц, предделитель 1024:
//
// 16000000 / 1024 = 15625 тактов в секунду
//
// Счёт идёт с нуля, поэтому в регистр сравнения кладётся на единицу
// меньше. Ошибка на единицу здесь — это 64 микросекунды в секунду, то
// есть пять секунд в сутки.
//
// Таймер 1 выбран не случайно: таймер 0 обслуживает millis() и
// delay(), и трогать его нельзя.
const int LED = 8;
volatile bool tick = false;
ISR(TIMER1_COMPA_vect) {
tick = true;
}
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624;
TCCR1B |= (1 << WGM12); // CTC: считать до OCR1A и обнуляться
TCCR1B |= (1 << CS12) | (1 << CS10); // предделитель 1024
TIMSK1 |= (1 << OCIE1A); // разрешить прерывание по совпадению
interrupts();
Serial.println("таймер пошёл");
}
void loop() {
if (tick) {
tick = false;
digitalWrite(LED, !digitalRead(LED));
Serial.println("секунда");
}
}
В железе
Вывод ESP32 даёт 3,3 В: синему и белому светодиоду (около 3 В) на резистор остаётся мало, и они светят тускло. Для них — 5 В через транзистор или меньший резистор с оглядкой на ток.
Частые ошибки
Светодиод без резистора — горит ярко несколько секунд, потом тускнеет или гаснет навсегда; вывод контроллера тоже перегружается.
Перевёрнутый светодиод не горит — поменяйте ножки местами (он от этого не портится при низком напряжении).
Один резистор на несколько параллельных светодиодов — светят неравномерно.
analogWrite на выводе без ШИМ (Arduino Uno) — светодиод просто включается при значении больше 127.