Мультиметр — обязательный инструмент в арсенале любого радиоинженера, и всегда, когда речь идет о создании или разработке электрических схем, обойтись без него практически невозможно. В данной статье мы рассмотрим создание недорогого мультиметра на основе платы Arduino, с помощью которого можно будет измерять напряжение до 24 В, а также диоды, сопротивление и падение напряжения на светодиоде. Он также включает функцию наличия соединения (обрыва) в сети с зуммером, поэтому вы можете использовать его для выявления коротких замыканий в схеме.
Ранее на нашем сайты мы также рассматривали проекты других измерительных устройств на основе плат Arduino:
- тестер транзисторов на Arduino Uno;
- измеритель емкости и индуктивности на Arduino;
- ваттметр на Arduino;
- измеритель частоты (частотомер) на Arduino Uno;
- омметр (измеритель сопротивления) на Arduino Uno.
Необходимые компоненты
- Плата Arduino Pro Micro (купить на AliExpress).
- Кнопка.
- Резисторы 1 кОм, 4,7 кОм (2 шт.), 10 кОм (купить на AliExpress).
- Зуммер (купить на AliExpress).
- OLED дисплей 128x32 с диагональю 0.91”.
- Переключатель.
- Штекер типа банан (Banana Socket ).
- Литиевая батарея 3.7V, 300mA - 2 шт.
- Регулятор напряжения 5V AMS1117 (купить на AliExpress - можно купить не в виде модуля, а в виде отдельной микросхемы (от 5 до 7 рублей за штуку), но на момент публикации данной статьи не нашел на алиэкспрессе магазина с дешевой доставкой данной микросхемы).
- Перфорированная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема цифрового мультиметра на основе платы Arduino представлена на следующем рисунке.
Работа схемы достаточно проста: у нас есть плата Arduino, работающая как "мозг" нашего проекта. В схеме мы использовали две пары штекерных разъемов типа «банан» для подключения внешнего входа. Как вы можете видеть на приведенной схеме, у нас также есть резистор 10K и два резистора 4,7K, соединенные параллельно, чтобы сформировать делитель напряжения. С этой конфигурацией делителя напряжения и Arduino мы можем измерять входное напряжение максимум до 24 В. Обратите внимание на то, что входное напряжение более 24 В может повредить наше устройство. Затем у нас есть еще одна пара разъемов типа «банан», которые предназначены для проверки диодов и светодиодов. Эти тесты выполняются путем измерения определенного падения напряжения на тестовом устройстве. Мы также подключили 0,91-дюймовый OLED-дисплей для отображения всех данных, обрабатываемых Arduino, и у нас есть кнопочный переключатель для переключения между всеми функциями нашего мультиметра. Наконец, у нас есть две литиевых батареи 3.7V соединенных последовательно и регулятор напряжения AMS1117 на 5V для питания всей схемы нашего проекта.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим все необходимые библиотеки - SPI.h, Wire.h, Adafruit_GFX.h, Adafruit_SSD1306.h.
1 2 3 4 |
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> |
Далее зададим высоту и ширину дисплея и его адрес
1 2 3 4 |
#define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 |
Затем создадим объект для работы с OLED дисплеем.
1 |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); |
После этого инициализируем все необходимые переменные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int analogInput = 0; float vout = 0.0; float vin = 0.0; float R1 = 10000.0; // resistance of R1 (100K) -see text! float R2 = 2200.0; // resistance of R2 (2.2K) - see text! int value = 0; int mode = 0; int interval = 300; unsigned long previousMillis = 0; int raw = 0; int Vin = 5; float Vout = 0; float R11 = 1000; float R22 = 0; float buffer = 0; |
Затем, в функции setup, инициализируем последовательную связь и зададим режимы работы используемых контактов.
1 2 3 4 5 6 7 8 |
Serial.begin(9600); pinMode(analogInput, INPUT); pinMode(9, OUTPUT); pinMode(7, INPUT_PULLUP); digitalWrite(9, HIGH); delay(40); digitalWrite(9, LOW); pinMode(13, OUTPUT); |
Далее инициализируем OLED дисплей с помощью метода begin().
1 2 3 4 5 |
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } } |
Затем, в функции void loop() мы запрограммируем 4 режима работы нашего устройства, они будут переключаться с помощью переключателя. mode0 - для измерения напряжения, mode1 - для измерения диодов, mode2 - для режима OHM и, наконец, режим для измерения обрыва в цепи.
В режиме mode0 мы будем считывать значение с аналогового контакта A0 и сохранять его в переменной. Затем мы будем рассчитывать измеренное значение напряжение (поскольку у нас делитель напряжения) и сохранять его в переменной vin. И потом мы будем отображать это значение на экране OLED дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if (mode == 0) { // Measure Voltage value = analogRead(A0); vout = (value * 5.0) / 1024.0; vin = vout / (R2 / (R1 + R2)); if (vin < 0.09) { vin = 0.0; //statement to quash undesired reading ! } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Voltmeter Mode"); display.setTextSize(2); display.setCursor(10, 12); display.print((vin)); display.print("V"); display.display(); } |
В режиме mode1 мы будем считывать значение с контакта A2 и рассчитывать падение напряжения на резисторе и диоде.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
if (mode == 1) { // Diode Test value = analogRead(A2); vout = (value * 5.0) / 1024.0; // see text vout = 5 - vout; display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Diode/LED Test"); display.setTextSize(2); display.setCursor(10, 12); display.print((vout)); display.print(" V"); display.display(); } |
Далее у нас есть наш mode2 — это режим омметра. В этом режиме мы считываем данные АЦП с контакта A2 Arduino и вычисляем значение резистора, используя следующий код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
if (mode == 2) { // OHM Meter raw = analogRead(A2); buffer = raw * Vin; Vout = (buffer) / 1024.0; buffer = (Vin / Vout) - 1; R22 = R11 * buffer; Serial.print(Vout); Serial.print("R2: "); Serial.println(R22); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("OHM Meter Mode"); display.setTextSize(2); display.setCursor(2, 12); if (R22 < 1000) { display.setCursor(2, 12); display.print((R22)); display.print(" OHM"); } else { display.setCursor(10, 12); display.print((R22 / 1000)); display.print(" K"); } display.display(); //delay(300); } |
Наконец, у нас есть mode3 - в нем мы проверяем функцию непрерывности цифрового мультиметра. В этом состоянии мы проверяем значение сопротивления и, если значение меньше 100, мы включаем зуммер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
if (mode == 3) { // Continuity Test Mode raw = analogRead(A2); buffer = raw * Vin; Vout = (buffer) / 1024.0; buffer = (Vin / Vout) - 1; R22 = R11 * buffer; Serial.print(Vout); Serial.print("R2: "); Serial.println(R22); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("continuity Test Mode"); display.setTextSize(2); display.setCursor(2, 12); display.print((R22)); display.print(" OHM"); display.display(); if (R22 < 100) { digitalWrite(9, HIGH); } else { digitalWrite(9, LOW); } } previousMillis = currentMillis; } |
Наконец, у нас есть еще одно условие if, в этом условии if мы проверяем состояние кнопки, если на ней низкий уровень, мы увеличиваем счетчик режимов.
1 2 3 4 5 6 7 |
if (digitalRead(7) == LOW) { delay(150); mode++; if (mode >= 4) mode = 0; Serial.println(mode); } |
Разработка чехла для мультиметра с помощью Fusion360
После того, как схема была завершена, мы решили сделать крышку для мультиметра, чтобы скрыть батареи и сделать его немного аккуратнее. Корпус выглядит так, как показано на рисунке ниже
Вы можете загрузить файл STL для этого корпуса по этой ссылке. После печати он выглядит так, как показано на следующем рисунке.
Тестирование работы цифрового мультиметра
После завершения процесса сборки мы приступили к тестированию всех функций этого проекта, и полученные нами результаты показаны ниже.
Мы начали процесс тестирования с проверки напряжения с помощью вольтметра и обнаружили, что его необходимо немного откалибровать, поскольку в режиме измерения напряжения он показывал разницу в 200 мВ при сравнении с обычным мультиметром.
Далее у нас идет режим проверки диодов/светодиодов, в этом режиме вы можете проверить падение напряжения на диоде или светодиоде.
На изображении выше вы можете видеть, что мы подключили белый светодиод, и вы можете видеть прямое падение напряжения на светодиоде.
Далее у нас есть режим проверки диода и на рисунке ниже можно видеть что измеритель показывает прямое падение напряжения на диоде. Тестируемый диод — это диод Шотти, поэтому падение в 0,6 В очень точное.
Наконец, у нас есть режим проверки целостности (непрерывности) цепи. В этом режиме, как вы видите, мы закоротили два зажима типа «крокодил», а мультиметр показывает значение сопротивления провода, а зуммер также издает звук.
Это все функции, которые может предложить этот мультиметр, но есть много возможностей для улучшений. Используя дополнительную микросхему, мы можем сократить количество гнезд типа «банан» до одной пары. Мы можем заменить Arduino на модуль ESP, чтобы добавить дополнительные беспроводные возможности. Также схема может быть выполнена на печатной плате для лучшей механической стабильности.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); int analogInput = 0; float vout = 0.0; float vin = 0.0; float R1 = 10000.0; // resistance of R1 (100K) -see text! float R2 = 2200.0; // resistance of R2 (2.2K) - see text! int value = 0; int mode = 0; int interval = 300; // Tracks the time since last event fired unsigned long previousMillis = 0; int analogPin = 0; int raw = 0; int Vin = 5; float Vout = 0; float R11 = 1000; float R22 = 0; float buffer = 0; void setup() { Serial.begin(9600); pinMode(analogInput, INPUT); pinMode(9, OUTPUT); pinMode(7, INPUT_PULLUP); digitalWrite(9, HIGH); delay(40); digitalWrite(9, LOW); pinMode(13, OUTPUT); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } } void update_display(String val) { } void loop() { unsigned long currentMillis = millis(); if ((unsigned long)(currentMillis - previousMillis) >= interval) { if (mode == 0) { value = analogRead(A0); vout = (value * 5.0) / 1024.0; // see text vin = vout / (R2 / (R1 + R2)); if (vin < 0.09) { vin = 0.0; //statement to quash undesired reading ! } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Voltmeter Mode"); display.setTextSize(2); display.setCursor(10, 12); display.print((vin)); display.print("V"); display.display(); } if (mode == 1) { value = analogRead(A2); vout = (value * 5.0) / 1024.0; // see text vout = 5 - vout; display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Diode/LED Test"); display.setTextSize(2); display.setCursor(10, 12); display.print((vout)); display.print(" V"); display.display(); } if (mode == 2) { raw = analogRead(A2); buffer = raw * Vin; Vout = (buffer) / 1024.0; buffer = (Vin / Vout) - 1; R22 = R11 * buffer; Serial.print(Vout); Serial.print("R2: "); Serial.println(R22); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("OHM Meter Mode"); display.setTextSize(2); display.setCursor(2, 12); if (R22 < 1000) { display.setCursor(2, 12); display.print((R22)); display.print(" OHM"); } else { display.setCursor(10, 12); display.print((R22 / 1000)); display.print(" K"); } display.display(); //delay(300); } if (mode == 3) { raw = analogRead(A2); buffer = raw * Vin; Vout = (buffer) / 1024.0; buffer = (Vin / Vout) - 1; R22 = R11 * buffer; Serial.print(Vout); Serial.print("R2: "); Serial.println(R22); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("continuity Test Mode"); display.setTextSize(2); display.setCursor(2, 12); display.print((R22)); display.print(" OHM"); display.display(); if(R22 < 100) { digitalWrite(9, HIGH); } else { digitalWrite(9, LOW); } } previousMillis = currentMillis; } // Use the snapshot to set track time until next event //previousMillis = currentMillis; if (digitalRead(7) == LOW) { delay(150); mode++; if (mode >= 4) mode = 0; Serial.println(mode); } } |
А где полный код для ардуино?
Эх, как то я даже и забыл про эту статью. Спасибо что напомнили, в ближайшее время постараюсь дописать
У меня курсовой, сделай код пожалуйста) пробую собрать но вместо про мини у меня нано
Я пытаюсь, но сайт с оригиналом статьи пока что то не открывается, у него бывает такое, к сожалению
Удалось доработать статью, если для вас это еще актуально