Двухканальный цифровой вольтметр с графиком и шкалой на Arduino
🧾 Описание проекта
Этот проект представляет собой двухканальный цифровой вольтметр на базе Arduino, предназначенный для одновременного измерения входного и выходного напряжения, а также отображения максимального зафиксированного значения и реального графика изменения напряжения во времени.
Вольтметр отображает:
🟢 Входное напряжение (V In)
🔵 Выходное напряжение (V Out)
🔺 Максимальное выходное напряжение (V Max)
📉 График изменения выходного напряжения
📊 Вертикальную шкалу напряжения справа
Это отличный проект для начинающих радиолюбителей и разработчиков лабораторных блоков питания: он наглядно показывает работу стабилизаторов, поведение напряжения под нагрузкой и позволяет оценивать динамику процессов.
🔧 Используемые компоненты
⚙️ Схема подключения
🔌 Подключение компонентов
🖥️ OLED-дисплей:
GND → GND
VCC → 5V
SCL → A5
SDA → A4
🎛️ Измерение напряжений:
Arduino измеряет напряжения через аналоговые входы A0 и A1. Но напрямую подавать на них более 5 В опасно. Поэтому используются резистивные делители напряжения.
📥 Делитель для входного напряжения (V In → A0):
Верхний резистор: 40 кОм
Нижний резистор: 10 кОм
Входной сигнал подаётся на верхний резистор
Средняя точка подключается к A0
Позволяет измерять до 25 В
📤 Делитель для выходного напряжения (V Out → A1):
Верхний резистор: 40 кОм
Нижний резистор: 10 кОм
Средняя точка подключается к A1
Такой делитель даёт коэффициент ≈ 1/5, что позволяет измерять до 25 В
⚠️ Подбирайте резисторы с учётом нужного диапазона. Программа изначально рассчитана на вход 0–5 В, поэтому при использовании делителей нужно изменить формулу расчёта напряжения.
⚙️ Как работает программа
Программа построена на основе двух объектов класса VoltMeter, каждый из которых отвечает за измерение напряжения по одному из входов.
А также один экземпляр класса Oscilloscope (осциллограф)
📦 Смотри раздел "Скетч Arduino"
Основные этапы работы:
Измерение напряжений:
Выполняется analogRead() на пинах A0 и A1.
Полученные значения преобразуются в вольты: voltage = raw * (5.0 / 1023.0);
При необходимости можно умножать результат на коэффициент делителя, например voltage *= 2.0;
Отображение данных:
Все показания (V In, V Out, V Max) отображаются в верхней части дисплея крупным текстом.
Используется шрифт TextSize(1) для чёткости и экономии места.
Фиксация максимума:
В каждом измерении программа сравнивает текущее значение с предыдущим максимумом.
При нажатии на кнопку (подключенную к D2) максимум сбрасывается.
График напряжения:
Отдельный класс Oscilloscope сохраняет последние измерения в буфере.
В нижней части дисплея рисуется линия, отображающая изменение напряжения во времени.
График занимает 110 пикселей по горизонтали и не наезжает на шкалу.
Вертикальная шкала справа:
Сегментная шкала (10 делений) показывает текущий уровень выходного напряжения.
Обновляется при каждом цикле измерения.
🧠 Дисплей
Размещение основных блоков отображения на экране OLED дисплея
Отображение на дисплее
Программа строит интерфейс в несколько этапов:
Верхняя часть дисплея — отображает входное и максимальные значения напряжения
Средняя часть — напряжение на выходе блока питания.
Нижняя часть — график напряжения во времени, построенный с использованием массива graphBuffer[], в котором хранятся последние 128 измерений. Этот массив сдвигается каждый раз и отображается как ломаная линия, повторяя форму изменения напряжения.
Правая часть — визуальный уровень напряжения в виде сегментной шкалы, где каждый сегмент активен в зависимости от уровня сигнала.
Такой подход позволяет использовать OLED-дисплей максимально эффективно: информативно и красиво.
📜 Скетч Arduino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int inputPin = A0; // Входное напряжение
const int outputPin = A1; // Выходное напряжение
const int resetButtonPin = 2; // Кнопка сброса максимума
#define GRAPH_HEIGHT 20
#define GRAPH_WIDTH 110 // Оставляем место справа под шкалу
uint8_t graphBuffer[GRAPH_WIDTH];
// Класс вольтметра
class VoltMeter {
private:
int pin;
float voltage;
float maxVoltage;
public:
VoltMeter(int analogInputPin) { // Кнструктор класса
pin = analogInputPin;
voltage = 0.0;
maxVoltage = 0.0;
}
void measure() { // Метод -измерение
int raw = analogRead(pin);
voltage = raw * (5.0 / 1023.0);
if (voltage > maxVoltage) {
maxVoltage = voltage;
}
}
void resetMax() { // Метод - сброс максимального значения
maxVoltage = voltage;
}
float getVoltage() { // Метод - получить измеренное напряжение
return voltage;
}
float getMax() { // Метод - получить максимальное напряжение
return maxVoltage;
}
};
// Класс осциллограф
class Oscilloscope {
public:
Oscilloscope() { // Кнструктор класса
// pin = analogInputPin;
}
void updateGraph(float voltage) {
for (int i = 0; i < GRAPH_WIDTH - 1; i++) {
graphBuffer[i] = graphBuffer[i + 1];
}
uint8_t newY = map(voltage * 100, 0, 500, 0, GRAPH_HEIGHT);
graphBuffer[GRAPH_WIDTH - 1] = newY;
}
void drawGraph() {
int baseY = SCREEN_HEIGHT - 1;
for (int x = 0; x < GRAPH_WIDTH - 1; x++) {
display.drawLine(x, baseY - graphBuffer[x], x + 1, baseY - graphBuffer[x + 1], SSD1306_WHITE);
}
}
void drawScale(float value) {
const int segments = 10;
const int startX = SCREEN_WIDTH - 10; // Правая сторона экрана
const int startY = 58;
const int segWidth = 8;
const int segHeight = 4;
const int gap = 2;
int activeSegments = map(value * 100, 0, 500, 0, segments);
for (int i = 0; i < segments; i++) {
int y = startY - i * (segHeight + gap);
if (i < activeSegments) {
display.fillRect(startX, y, segWidth, segHeight, SSD1306_WHITE);
} else {
display.drawRect(startX, y, segWidth, segHeight, SSD1306_WHITE);
}
}
}
};
VoltMeter vinMeter(inputPin); //Экземпляр класса вольтметр V In
VoltMeter voutMeter(outputPin); // Экземпляр класса вольтметр V Out
Oscilloscope oscill; //Экземпляр класса осциллограф
void setup() {
pinMode(resetButtonPin, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 28);
display.println("Digital Voltmeter");
display.display();
delay(1500);
}
void loop() {
vinMeter.measure();
voutMeter.measure();
if (digitalRead(resetButtonPin) == LOW) {
vinMeter.resetMax();
voutMeter.resetMax();
delay(300);
}
float vin = vinMeter.getVoltage();
float vout = voutMeter.getVoltage();
float vmax = voutMeter.getMax();
oscill.updateGraph(vout);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("V In: ");
display.print(vin, 2);
display.println(" V");
display.setCursor(0, 10);
display.print("V Max: ");
display.print(vmax, 2);
display.println(" V");
display.setCursor(0, 20);
display.print("V Out: ");
display.print(vout, 2);
display.println(" V");
oscill.drawGraph();
oscill.drawScale(vout);
display.display();
delay(200);
}
🧠 Советы и доработки
✅ Добавить коэффициент делителя прямо в класс VoltMeter, чтобы учесть масштабирование.
💾 Сохранять максимум в EEPROM, чтобы он не сбрасывался при перезагрузке.
🧲 Добавить третью строку: ток или мощность, если есть токовый шунт.
📈 Изменить масштаб графика для отображения высокого напряжения.
⚡ Применение
Настройка и тестирование лабораторных блоков питания.
Измерение и контроль напряжения в проектах Arduino.
Демонстрация работы стабилизаторов напряжения.
Учебные и демонстрационные стенды.
Простая(почти) глушилка 433 и 315 МГц
Прошло всего 3 года с тех времен, когда писал про совсем уж простую глушилку из готовых модулей. Работала она мягко говоря плохо. Собрирал скорее по приколу. Но спустя какое то время захотелось сделать что то более дальнобойное. Поискал проекты в сети, но ничего годного не нашел. Решился заказать и посмотреть, что там у наших товарищей из поднебесной. Спустя примерно 50 долларов и пару недель ожиданий, получил такое чудо.
Потестил, вроде работает, глушит шлагбаум метров за 30. Там как повезет. Разобрал посмотреть...
Интерес представляют только модули, передатчики.
По схеме китайцев, контакт Data замкнут на 5 вольт. Поискал их на али, нашел и заказал. Интересно то, что они вполне могут питаться от 12 вольт, но греются, что котел в аду. Возникла идея сделать свое, но с блекджеком и без шлюх. Хотелось иметь возможность запитывать модули в диапазоне 5-12 вольт без использования повышающих DC-DC, на которых довольно большие потери и соответственно лишний нагрев.
А что если использовать глушилку совместно с повербанком, поддерживающим протокол QC? Тем более что у Гайвера есть отличная библиотека для запроса нужного питания.
А я накидал свою принципиальную схему и подготовил проект для заказа плат в Китае.
Кажется я даже пытался рассчитывать волновое сопротивление дорожек, чуть крыша не поехала. В общем, вооружился калькулятором и действовал в основном по наитию. Оправил проект на завод и заказал недостающие детали.
В качестве микроконтроллера использовал atmega 8. Максимально простая плата. Место для монтажа двух модулей передатчиков, кнопка, переключатель и usbc разъем для подключения повербанка.
Накидал скетч. Функций минимум. По умолчанию напряжение на входе 5 вольт. Кнопкой можно переключить на режимы 9 и 12 вольт. В зависимости от режима по разному моргает единственный светодиод. Для экономии заряда на контакт data модулей от атмеги идет сигнал похожий на меандр с частотой что то вроде 1000 герц. Как показала практика, в таком режиме модули греются меньше, а на дальность глушения шлагбаумов не влияет. Были мысли как нибудь программно улучшить, но забил.
Подобрал более менее антенны, с КСВ как можно ближе к 1. Для хотя бы примерных тестов и сравнения с китайской версией использовал SDR приемник.
Провел небольшое сравнение. Расстояние от глушилок до приемника одинаковое.
Китай запитанный от 5 вольт показывает стояк на -40dBm.
Моя запитанная от 5 вольт показывает тот же результат.
А если выбрать самый производительный режим, то -30dBm. Разница огромная (шкала логарифмическая). По ощущениям глушит сильно дальше китайского варианта. При использовании на максимальной мощности, радиаторы еле теплые. Уж не помню сколько она потребляет, но на 10 часов+ заряда небольшого повербанка точно должно хватать. По стоимости деталей, даже с учетом повербанка вышло дешевле готового китайского варианта.
Вот такая вот хреновина по итогу получилась. Глушит довольно хорошо сигналки, шлагбаумы и прочие штуки на соответствующих частотах. Лично я использовал пару раз только ради розыгрыша друзей. Авто не получалось поставить на охрану даже поднеся пульт вплотную к приемнику.
Если кто то хочет повторить, могу раздать несколько плат и скинуть скетч. С вопросами полегче, прошло 2 года с момента сборки.
p.s. напоминаю, пользоваться глушилками с такой мощностью по идеи незаконно. Если включите и забудете выключить, могут приехать злые дяди, найти вас и засунуть вам ее в задницу.
p.p.s. прошло всего два года с последнего поста на подобную тему. Долго отходил от бана после срачей в теге политика. Кто вы? Мои тысяча шестьсот с чем то подписчиков.
Делитель напряжения
Всем привет, имею автомобиль с неработающим датчиком скорости, т.е. спидометр не работает. Купить можно только оригинальный, точнее заказать. Ждать нужно месяц и не факт что придет. В общем датчик работает по принципу чем быстрее крутится, тем больше с него идет сигнал в виде напряжения. Диапазон от 0 до 32в. Нашел визуально такой же датчик, но спидометр врет чуть более чем в два раза, при скорости 50км/ч, спидометр показывает 110км/ч. По распиновке датчик 3х контактный: +, - и сигнальный. Если подкрутить просто резистор на сигнальный провод, обрежется ли напряжение и будет ли оно динамичным? И как можно более точно подобрать номинал к примеру подстроечным резистором или чтобы динамично менялось напряжение нужно делать схему на микроконтроллере?
UPD:
Отремонтировал датчик, сделал пропилы и выдернул за разъем. Когда выдернул, оказалось что по контуру была уплотнительная резинка и все закисшее, от старости она лопнула и начала пропускать влагу, корпус датчика был в окислах, почистил щеточкой и заметил сгнившую дорожку, датчик промыл в ультразвуковой ванне, спаял дорожку, покрыл токозащитным лаком, промазал все герметиком, поверх на датчик одел термоусадку и по стыку пролил суперклеем, прогрел датчик чтобы клей быстрее высох. Установил на машину и датчик заработал, оставил машину на сутки чтобы герметик полностью застыл
Почти треть инженеров радиоэлектроники в России уходят из профессии
Радиоинженеры в России стали предпочитать своей специальности продажи.
Приблизительно треть выпускников российских вузов, специализирующихся на радиоэлектронике, не продолжают работать по своей специальности. Вместо проектирования и разработки отечественных устройств они устраиваются менеджерами по продажам подобной продукции. Об этом на круглом столе в Госдуме заявил заместитель министра науки и высшего образования Дмитрий Афанасьев, передает издание «Ведомости».
Одними из основных факторов, способствующих этому переходу, Афанасьев назвал ситуацию на рынке труда, низкий уровень заработной платы, а также недостаток социальных преимуществ и возможностей для карьерного роста.
Генеральный директор холдинга по контрактной разработке электроники SND Global Ольга Квашенкина также отметила наличие разрыва между теоретическими знаниями, получаемыми в вузах, и практическими навыками, необходимыми для разработки продукции. Она подчеркнула, что выпускникам, имеющим лишь теоретические компетенции, гораздо проще трудоустроиться в сферу продаж.
Квашенкина также указала на то, что структура рынка играет важную роль, ведь большинство компаний на рынке занимаются в первую очередь перепродажей иностранного оборудования, а не разработкой собственных решений, несмотря на свои формальные названия. В России не хватает крупных проектов, требующих глубокого технического проектирования, и спрос на собственные разработки остается ограниченным.
Микрофон по схеме FIN или как я не разучился держать в руках паяльник
Сломался у меня микрофон, а в закромах у меня лежит много старых советских радиодеталей и решил я найти им применение в виде микрофона из донора BM-800 который приобрел на авито за копейки)
Накидал схему без умножителя поляризационного напряжения от разработчика с сайта forum.vegalab
Собрал в кучу нужные детали и приступил)
Удаляем не нужную плату из донора
Фазируем неполярные конденсаторы для уменьшения помех (на фото проверяю правильность работы осциллографа на электролите)
Так как качество маленьких капсюлей оставляет желать лучшего беру на али 1 дюймовый (на фото видно поврежденные пленки = некачественный звук)
Извиняюсь за отсутствие маникюра)
Компоновку держал в голове без эскиза, монтаж деталей на весу без платы)
Резину для печати кронштейна держателя капсюля на озоне продали мне не качественную, хотел прозрачную, но оказалась ужасно твердая, пришлось заказать на стороне печать, выбор цвета у ребят к сожалению ограниченный поэтому черный
Потихоньку начинаю пайку (в процессе заменил индукторы)
Небольшое 3D)))
Все детали кроме электролитов, индуктивности и диода советские)
Полностью исключил керамические конденсаторы.
В доноре оказалось всего два отверстия под болты кронштейна капсюля, дополнительные два нарезал)
Пайка последних деталей
Итоговая фотография, звук шикарный, а казалось все из говна и палок)
Примерный бюджет менее 2000 руб.