Симулятор потенциометра онлайн: ползунок 0-1023 без платы
Порог в скетче стоит, а какой цифре он должен соответствовать — загадка: руль в одной руке, плата с перезаливкой скетча — в другой, и каждая проба стоит минуты. Урок про чтение потенциометра разбирает электрику и analogRead() по ногам — здесь же ручка переезжает в браузер: крутите движок, смотрите 0-1023 в мониторе и подгоняйте map() с порогами без единой перезаливки.
Стенд живёт в симуляторе: потенциометр добавляется на макетку вручную из каталога — деталь с ползунком на аналоговые входы A0-A5, провод фиолетовый, подпись POT. Дёрнули ручку — число на входе поехало следом. Ниже — скетч-пробы на чтение и map(), лаборатория меню IDE и честная таблица, где кончается модель и начинается живой чип.
Что видно на стенде сразу
Потенциометр в каталоге компонентов подписан честно: «Ползунок 0-1023 на аналоговом входе». Деталь занимает один аналоговый вход — A0, A1 и дальше до A5, — а скетч читает её тем же analogRead(), что и на плате. Провода ложатся сами, макетка с делителем не нужна: ручка на стенде, число на входе, связь один в один с железом.
- Шкала 0-1023: движок отдаёт на вход ровно то число, что стоит на ползунке, — без пересчётов внутри.
- Крутка мышкой: тащите ручку — значение едет следом; отпустили — встало. Скетч видит каждое промежуточное число, как на живом входе.
- Автоползунок: деталь можно и не добавлять — как только скетч вызвал analogRead(), движок сам вешает на вход ползунок «Датчик на входе» с той же шкалой 0-1023.
- Пороги видны сразу: перевалил за 800 — ветка сработала, упал ниже 200 — погасла. Границы кода проверяются вживую.
- Сверка через Serial: печатайте значения в монитор — цифры на стенде и в скетче совпадают до единицы.
Скетч-проба: чтение и порог
const int PIN_POT = A0;const int PIN_LED = 13; void setup() { pinMode(PIN_LED, OUTPUT); Serial.begin(9600);} void loop() { int x = analogRead(PIN_POT); // 0..1023 if (x > 800) { digitalWrite(PIN_LED, HIGH); Serial.println("vysoko"); } else if (x < 200) { digitalWrite(PIN_LED, LOW); Serial.println("nizko"); } Serial.println(x); delay(100);}Монитор печатает сырое число и вердикт, светодиод щёлкает на границе. Пороги 200 и 800 — стартовые ориентиры, а не догма: подвигайте ручку и найдите свои. Зазор между нижним и верхним порогом — та же механика гистерезиса, что у термостата: одно значение на включение и выключение заставляет выход дёргаться на границе.
map(): пересчёт шкалы
const int PIN_POT = A0;const int PIN_LED = 9; void setup() { pinMode(PIN_LED, OUTPUT); Serial.begin(9600);} void loop() { int x = analogRead(PIN_POT); // 0..1023 int yarkost = map(x, 0, 1023, 0, 255); // → 0..255 analogWrite(PIN_LED, yarkost); Serial.print("x="); Serial.print(x); Serial.print(" yarkost="); Serial.println(yarkost); delay(50);}map(x, 0, 1023, 0, 255) — самый частый пересчёт: аналоговая шкала едет на ШИМ-яркость. Функция считает целочисленно, и на нижних значениях часть единиц съедается — откуда берётся потеря и как её обходить, разобрано в уроке про map() и приведение типов. Нелинейные шкалы — гамма-кривые для диммера — ведёт урок про нелинейный map(); обе механики проверяются на стенде той же ручкой.
8 заданий в симуляции строки меню: от библиотек из реестра до Плоттера порта.
Подгружаем интерактив…
Лаборатория выше — про меню Arduino IDE, а значит и про «Плоттер порта» из Инструментов: именно туда выводят кривую 0-1023 с потенциометра, когда хочется увидеть форму движения ручки, а не столбик чисел. Навык быстро находить нужный пункт переносится в работу со стендом один в один: запустили скетч — открыли плоттер — крутите.
Когда крутить без платы полезно
- Подбор порогов: ночник, тревога по переполнению, регулятор — граница находится на экране, а не перезаливками.
- Проверка map(): границы шкалы, перепутанные минимум с максимумом, целочисленные ступени — всё видно по цифре в мониторе.
- Крайние значения: 0 и 1023 — концы шкалы; ветки «ровно на нуле» и «ровно на максимуме» проверяются щелчком.
- Резкие скачки: дёрнули ручку через всю шкалу — скетч получает рывок значения; так проверяют ветки, чувствительные к скорости изменения.
- Регрессия логики: правка кода и перезапуск занимают секунды — ветки, сломанные свежей правкой, видны сразу.
Честная граница: модель против живого ADC
| Проверка | Симулятор | Только железо |
|---|---|---|
| Шкала 0-1023 на analogRead() | целиком, ползунок за ползунком | то же |
| map() и пороговые ветки | да, считаются как в скетче | то же |
| Резкий рывок значения 0 → 1023 | да: дёрнули ручку — скачок | то же |
| Шум живого ADC (±2 единицы) | нет: модель ровная и дискретная | да: значения подрагивают сами |
| Подрагивание ручки и износ дорожек | нет: движок идеальный | да: дребезг и мёртвые зоны |
| Нелинейность и сопротивление дорожек | нет | да — у дешёвых экземпляров заметно |
Модель движка дискретная: ползунок — чистое число 0-1023, без шума. Живой ADC на Uno дрожит на ±2 единицы даже с неподвижной ручкой, дорожки старых потенциометров теряют контакт пятнами, а движок подрагивает от руки. Поэтому финальную калибровку порогов всё равно ведут на плате с Serial.print: браузер даёт форму решения, железо — цифры своего экземпляра. Фильтр подрагивающих значений — среднее по нескольким чтениям — разобран в уроке про фильтр ADC; на стенде его проверяют резкими рывками ручки, шум модель не подмешивает.
Грабли потенциометра
- analogRead() на цифровом пине: аналоговые входы — только A0-A5; чтение с D3 вернёт не то, чего ждали. В стенде деталь встанет лишь на аналоговый вход — подсказка уже в каталоге.
- map() с перепутанными границами: map(x, 1023, 0, 0, 255) инвертирует ручку — на стенде видно сразу, регулятор крутится «наоборот».
- Шкала 0-255 по привычке: потенциометр отдаёт 0-1023; без map() светодиод на analogWrite вспыхнет и потухнет на первой десятой ручки.
- Висящий вход на железе: никуда не подключённый analogRead ловит наводки и мечется; в браузере ползунок всегда держит число — эта ловушка живёт только на плате.
- Фильтр из двух чтений: среднее по паре значений от дрожащего входа дрожит само; берите 4-10 чтений — приём из урока про фильтр ADC проверяется в браузере рывками ручки.