> ## Documentation Index
> Fetch the complete documentation index at: https://akibahackspace.mintlify.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Часть 1: цифровые пины

## 1.1. Мигаем встроенным светодиодом

**Задача:** помигать светодиодом, расположенным на отладочной плате ESP32.

### Выясняем номер пина

У каждого пина микроконтроллера есть свой номер. Ножки обычно подписаны на плате, например, D5 означает, что это **D**igital пин с номером 5. Как узнать пин чего-то, что распаяно на светодиоде? Наиболее надёжный способ - найти светодиод на схеме платы (гуглим что-то типа "esp32 devkit schematics") и посмотреть, к чему он подключен. Возьмём схему платы [отсюда](https://wiki.amperka.ru/_media/products:esp32-wroom-wifi-devkit-v1:esp32-wroom-wifi-devkit-v1_schematic.pdf):

<img src="https://mintcdn.com/akibahackspace/L5YNEsrOLlc9gkLB/esp32/guides/01-digital-pins-devkit-schematics.png?fit=max&auto=format&n=L5YNEsrOLlc9gkLB&q=85&s=dd97a44f4c469208a278d54c61751b81" alt="Периферия, установленная на отладочной плате" width="1015" height="382" data-path="esp32/guides/01-digital-pins-devkit-schematics.png" />

Для удобства, пины встроенных светодиодов и кнопок отладочных плат, обитающих в хакспейсе, приведены ниже.

| Отладочная плата        | Пин светодиода | Пин кнопки |
| ----------------------- | -------------- | ---------- |
| ESP32 DevKit            | 2              | 0          |
| Lolin S2 Mini (ESP32S2) | 15             | 0          |
| LuatOS ESP32C3-CORE     | 12, 13         | 9          |

### Конфигурируем пин на выход

Для работы с цифровыми пинами импортируем модуль [digitalio](https://docs.circuitpython.org/en/latest/shared-bindings/digitalio/), а для обращения к пинам по их номеру - модуль `board`. Также здесь и в 99% других проектов мы планируем много спать, поэтому нам пригодится модуль [time](https://docs.circuitpython.org/en/latest/shared-bindings/time/index.html).

```python theme={null}
import digitalio, board, time
```

Чтобы использовать пин, мы оборачиваем его в объект `DigitalInOut` и устанавливаем режим работы `OUTPUT`:

```python theme={null}
led = digitalio.DigitalInOut(board.IO2)
led.direction = digitalio.Direction.OUTPUT
```

<Warning>В зависимости от версии CircuitPython (у каждой отладочной платы она своя), вместо `board.IO2` придётся подставить `board.D2` или что-то подобное. Как проверить названия пинов? Напишите в скрипте `print(dir(board))` или в REPL-консоли импортируйте `board` и понажимайте клавишу Tab после ввода `board.`, чтобы увидеть список всех доступных пинов.</Warning>

Теперь мы можем устанавливать этому пину значения `True` (высокий сигнал, 3.3V) или `False` (низкий сигнал, 0V), таким образом включая или выключая светодиод:

```python theme={null}
while True:
    led.value = True
    time.sleep(1)
    led.value = False
    time.sleep(1)
```

<Note>Мы используем бесконечный цикл, потому что, в отличие от обычных программ на ПК, если закончить выполнять прошивку, микроконтроллер перезагрузится и начнёт исполнять её снова. В CircuitPython вместо перезагрузки вас выкинет в REPL консоль питона и скрипт перестанет исполняться. Короче, в 99% проектов вы будете делать две вещи: `time.sleep` и бесконечный цикл.</Note>

Если после сохранения скрипта ваша отладочная плата начала мигать - значит всё прошло успешно и можно переходить к следующей задаче. Если нет - изучите консоль на предмет ошибок.

## 1.2. Включаем светодиод по кнопке

**Задача:** если нажата кнопка - включить светодиод, если не нажата - выключить.

В дополнение к переменной `led`, создаём ещё одну переменную `button` с ещё одним `DigitalInOut`, но передаём номер пина встроенной кнопки (см. таблицу выше). Пин кнопки мы конфигурируем в `INPUT` для чтения значения. Инициализацию всех пинов мы делаем перед основным циклом!

Основной цикл у нас будет выглядеть так:

```python theme={null}
while True:
    led.value = button.value
    time.sleep(0.05)
```

Здесь мы спим, чтобы не загружать процессор, но при этом спим достаточно мало, чтобы задержка была незаметна нашему глазу.

**Дополнительные задачи:**

* пофиксить основной цикл, чтобы при нажатии кнопки светодиод включался, а не выключался
* придумать алгоритм, чтобы при нажатии кнопки светодиод инвертировал состояние и оставался таким до следующего нажатия кнопки

## 1.3. Внешняя кнопка

**Задача:** оставить скрипт от прошлой задачи, но поменять встроенную кнопку на внешнюю.

Для этого необходимо вставить отладочную плату ESP32 и саму кнопку в BreadBoard.

Как видно из рисунка ниже кнопка имеет 4 контакта, 2 контакта в каждой из пар соеденины внутри самой кнопки. Для получения логической единицы на пине необходимо подключить один контакт кнопки к VCC (+3.3), а другой к любому свободному пину микрооконтроллера. Если необходимо получать на пине логический ноль, то вместо VCC к кнопке подключаем GND. Не забываем про подтяжку пина в инверсную сторону от подключения кнопки (если подключили кнопку к GND то делаем PULL\_UP, а при подключении кнопки к VCC, пин настраиваем на PULL\_DOWN).

Как сделать подтяжку в CircuitPython:

```python theme={null}
# Подтянуть пин к земле ("0" по умолчанию)
button.pull = digitalio.Pull.DOWN

# Подтянуть пин к VCC ("1" по умолчанию)
button.pull = digitalio.Pull.UP
```

<img src="https://mintcdn.com/akibahackspace/L5YNEsrOLlc9gkLB/esp32/guides/01-buttonschematic.png?fit=max&auto=format&n=L5YNEsrOLlc9gkLB&q=85&s=b94a1ab57fc54ab5b7885ac1af74ab1f" alt="Схема работы кнопки" width="1920" height="1071" data-path="esp32/guides/01-buttonschematic.png" />

Вариант собранной схемы, которая при нажатии кнопки возвращает 0, представлен рисунком ниже.

<img src="https://mintcdn.com/akibahackspace/L5YNEsrOLlc9gkLB/esp32/guides/01-buttonexample.png?fit=max&auto=format&n=L5YNEsrOLlc9gkLB&q=85&s=ccd35ed3c0c22a87b89ac00b37e86154" alt="Вариант сборки кнопки" width="823" height="471" data-path="esp32/guides/01-buttonexample.png" />

## 1.4. Внешний светодиод

**Задача:** оставить скрипт от прошлой задачи, но поменять встроенный светодиод на внешний.

Светодиод устроен следующим образом:

<img src="https://mintcdn.com/akibahackspace/L5YNEsrOLlc9gkLB/esp32/guides/01-ledpinout.jpg?fit=max&auto=format&n=L5YNEsrOLlc9gkLB&q=85&s=6cfc656c584bec17c30b57e414e15e32" alt="Распиновка светодиода" width="1099" height="1098" data-path="esp32/guides/01-ledpinout.jpg" />

Чтобы светодиод засветился, ток должен течь от анода к катоду. Другими словами от + светодиода к его - или от VCC к пину с выставленным на нем логческим 0 или от пина с выставленной на нем логической 1 к GND

Чтобы светодиод светился больше чем 1 раз необходимо последвательно с резистором подключить резистор с номиналом 220 Ом. Делается это для ограничения протекающего через него тока. Как правило максимальный ток светодиода равен 20 мА.

Один из вариантов схемы подключения светодиода к отладочной плате представлен на рисунке ниже.

<img src="https://mintcdn.com/akibahackspace/L5YNEsrOLlc9gkLB/esp32/guides/01-ledexample.png?fit=max&auto=format&n=L5YNEsrOLlc9gkLB&q=85&s=514eca4b3c7afde481fffcc6ba267340" alt="Пример подключения светодиода" width="784" height="476" data-path="esp32/guides/01-ledexample.png" />
