Эффективная сортировка резисторов для проектов на Arduino Nano: простой метод экономии времени
Компоненты и материалы
- Arduino Nano R3 — 1 шт.
- Резисторы известного номинала: 100 Ом, 1 кОм, 10 кОм, 100 кОм, 1 МОм — по 1 шт.
- Дисплей OLED 0.96″ 64×128 (I2C) — 1 шт.
- Провода-перемычки — 1 комплект
Необходимые инструменты
- 3D-принтер (для печати корпуса)
- Паяльник и припой
Программное обеспечение
- Arduino IDE
- Библиотека Adafruit_SSD1306 (для OLED-дисплея)
- Библиотека Adafruit_GFX
О проекте
Знакомая ситуация: после каждого проекта рабочий стол завален резисторами, которые лень разбирать по номиналам. Проверять цветовые коды или мультиметром кажется слишком долгим. Решение — собрать простой омметр на Arduino, который сам определит сопротивление неизвестного резистора и покажет результат на дисплее.
Принцип работы: делитель напряжения
Схема основана на классическом делителе напряжения. Известный резистор Rn и измеряемый Ru соединены последовательно. Напряжение на точке их соединения считывается аналоговым входом A0 Arduino. По формуле:
Vout = 5V × Ru / (Rn + Ru)
Зная Vout (в условных единицах АЦП 0–1023) и Rn, легко вычислить Ru.
Проблема точности и её решение
Точность измерения максимальна, когда Rn ≈ Ru. Если номиналы сильно отличаются, погрешность растёт. Поэтому используется набор из пяти эталонных резисторов (100 Ом … 1 МОм). Arduino последовательно подключает их к схеме через цифровые выводы D2–D6 и выбирает тот, при котором измеренное напряжение ближе всего к середине диапазона (≈ 2.5 В, или 512 единиц АЦП).
Схема подключения
- Эталонные резисторы подключены к выводам D2–D6 (один на вывод).
- Общий провод эталонов и неизвестный резистор образуют делитель; его середина — на A0.
- OLED-дисплей по I2C: SDA → A4, SCL → A5.
- Питание: 5 В и GND от Arduino.
См. схему во вложениях (раздел Schematics).
Алгоритм скетча
- В
loop()вывод D2 переводится в OUTPUT и подтягивается к HIGH (подключается 1 МОм). - Считывается «сырое» значение АЦП. Если оно в диапазоне 350–800 — номинал подходит.
- Иначе: D2 в INPUT (высокое импеданс), включается D3 (100 кОм) и так далее до D6 (100 Ом).
- Как только найден подходящий эталон, вычисляется
Ruпо формуле делителя. - Результат округляется до ближайшего стандартного значения ряда E24 (10, 100, 1к, 10к, 100к, 1М).
- Значение выводится на OLED с битмапами для красоты.
Важные нюансы кода
- Переключение pinMode: после использования вывода как OUTPUT он обязательно переводится в INPUT, иначе его низкое сопротивление исказит следующие измерения.
- Округление: в оригинале была ошибка при значений около 5 кОм; исправлено добавлением проверки диапазонов. Лучше добавить эталон 5 кОм для гарантии.
- Библиотеки: Adafruit_SSD1306 и Adafruit_GFX устанавливаются через менеджер библиотек Arduino IDE.
Корпус и сборка
Корпус печатается на 3D-принтере (файлы в разделе Custom parts). Детали склеиваются термоклеем. Эталонные резисторы припаяны компактно, чтобы поместиться внутри. На передней панели — два отверстия для ножек проверяемого резистора.
Итог
Устройство за пару секунд определяет номинал резистора без участия мультиметра. Идеально для наведения порядка в наборе компонентов. Полный код и STL-файлы корпуса доступны в разделе Code и CAD.
Код (основной скетч)
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ... битмапы myLOGO и myBitmap опущены для краткости ...
int R1 = 100, R2 = 1000, R3 = 10000;
long R4 = 100000, R5 = 1000000;
long Rn;
int D2 = 2, D3 = 3, D4 = 4, D5 = 5, D6 = 6;
float raw = 0, Vout = 0, Ru = 0;
int Analogohm = A0;
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.drawBitmap(0,0, myLOGO, 128, 64, WHITE);
display.display();
delay(2000);
}
void loop() {
// Последовательный перебор эталонов 1M → 100k → 10k → 1k → 100
pinMode(D2, OUTPUT); pinMode(D3, INPUT); pinMode(D4, INPUT); pinMode(D5, INPUT); pinMode(D6, INPUT);
digitalWrite(D2, HIGH); raw = analogRead(Analogohm); Rn = R5;
if (raw < 350 || raw > 800) {
digitalWrite(D2, LOW); pinMode(D2, INPUT);
pinMode(D3, OUTPUT); digitalWrite(D3, HIGH); raw = analogRead(Analogohm); Rn = R4;
if (raw < 350 || raw > 800) {
digitalWrite(D3, LOW); pinMode(D3, INPUT);
pinMode(D4, OUTPUT); digitalWrite(D4, HIGH); raw = analogRead(Analogohm); Rn = R3;
if (raw < 350 || raw > 800) {
digitalWrite(D4, LOW); pinMode(D4, INPUT);
pinMode(D5, OUTPUT); digitalWrite(D5, HIGH); raw = analogRead(Analogohm); Rn = R2;
if (raw < 350 || raw > 800) {
digitalWrite(D5, LOW); pinMode(D5, INPUT);
pinMode(D6, OUTPUT); digitalWrite(D6, HIGH); raw = analogRead(Analogohm); Rn = R1;
}
}
}
}
Vout = 5.0 * (raw / 1024.0);
Ru = (Rn * Vout) / (5.0 - Vout);
// Округление до стандартных значений
if (Ru < 70) Ru = 10 * round(Ru / 10);
else if (Ru < 700) Ru = 100 * round(Ru / 100);
else if (Ru < 7000) Ru = 1000 * round(Ru / 1000);
else if (Ru < 70000) Ru = 10000 * round(Ru / 10000);
else if (Ru < 700000) Ru = 100000 * round(Ru / 100000);
else Ru = 1000000 * round(Ru / 1000000);
Resistance(Ru);
delay(1000);
}
void Resistance(long Ru) {
display.clearDisplay();
display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0);
display.println(F("Hey there,"));
display.println(F("the Resistor value is"));
display.setCursor(20,25); display.setTextSize(2);
display.print(Ru); display.print(F(" Ohm"));
display.drawBitmap(0,0, myBitmap, 128, 64, WHITE);
display.display();
delay(2000);
}
Производственный процесс
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Набор USB-MIDI адаптера для Arduino Micro / Leonardo — полный список деталей
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Точный тест времени реакции на Arduino UNO
- Нулевые резисторы (0 Ом): ключевые преимущества и реальное применение