Автономный логгер для мультиметра UNI-T UT61E
Мультиметр UNI-T UT61E, как известно, имеет возможность подключения к ПК с помощью интерфейса RS-232, для вывода показаний на экран и записи логов измерений. Но для записи логов требуется держать включенными ПК или ноутбук, что не всегда удобно.
Возникла мысль сделать автономный логгер с питанием от повербанка и записью на SD карточку. Осторожно, может потребоваться 3Д-принтер, но это не точно.
Часть первая – конвертор.
Для передачи данных на компьютер используется связка между инфракрасным светодиодом на мультиметре и фотоприемником на интерфейсном кабеле. Сделано так для безопасности — гальваническая развязка.
Счастливые обладатели UT61E конечно помнят достаточно неудобный кабель RS-232 с ИК приемником из комплекта мультиметра. К нему еще требуется переходник для подключения к USB порту, хотя если у вас в ПК есть COM-порт, то можно и без него.
На первом этапе избавимся от этого кабеля и перейдем на разъем Type-C. На Али была найдена недорогая плата UART-Type-C на контроллере CH340. Она так и ищется в поиске алиэкспресса «ttl CH340 type-c». Например https://aliexpress.ru/item/1005003068458160.html
Перерезаем дорожку к 3.3В, и ставим перемычку на 5В.
Разбираем ИК приемник методом расковыривания, он заклеен по периметру, но не сильно. Исходная схема ИК приемника имеет вид:
Вместо конденсатора С202 ставим перемычку, резистор R204 меняем на 1.5кОм, еще надо добавить СМД транзистор типа BC847 (практически любой npn) и резистор 10кОм, чтобы получить схему:
Пример моей платы:
В принципе после переделки можно ИК приемник поставить в родной корпус, вывести хвост и закатать UART в термоусадку. У меня так оно и жило некоторое время.
В 3Д редакторе был нарисован новый корпус для двух платок. К ИК приемнику припаиваем 3 провода, выводим их на другую сторону и вставляем его с одной стороны.
Подключаем плату UART согласно схемы, устанавливаем. Я по периметру приклеил её суперклеем, и сверху приклеил крышку, чтобы Type-C кабель не выворачивал плату из корпуса. Крышку для ИК приемника клеить не надо, нормально держится сама.
И да, черный 6-пиновый разъем на конверторе лучше перепаять так, чтобы он торчал за край платы на пару мм, заподлицо с корпусом, это нам пригодится в дальнейшем. На картинке справа видно, что я это не сделал и залил все клеем, не повторяйте моих ошибок.
Вот мы и подошли к концу первой части, устройство собрано, вставлено в мультиметр,
И передает данные на компьютер.
Часть вторая – логгер.
Для логгера нам понадобится 2 платы: какая-нибудь ардуино про мини и адаптер для microSD Card.
Адаптер я купил локально, остальные детали у меня были и месяц ждать не хотелось.
Подобный https://aliexpress.ru/item/1005001309671718.html
На волне подорожания ардуин я купил несколько плат LGT8F328P, их несколько разных видов, у меня самая мелкая LGT8F328P-SSOP20. https://aliexpress.ru/item/1005001274098707.html И да, они тоже подорожали, я брал их по 100 р.
В общем нарисовал корпус для логгера – он состоит из двух склеиваемых частей, чтобы печатать без поддержек. Я печатаю PET-G и на нем поддержки убирать довольно тяжело, поэтому стараюсь их по возможности избегать.
Помните про черный 6-пиновый разъем, который я не перепаял, чтобы он торчал подальше? Из-за того, что он утопает в корпусе, ответная гребенка до него достает плохо и мне пришлось передвинуть пины в пластиковом держателе.
А вам придется их укоротить со стороны пайки до 2х мм, чтобы гребенка вошла на свое посадочное место.
Припаиваем к гребенке провода и вклеиваем её в первую часть корпуса, используя изготовленную ранее деталь как направляющую.
Между ардуиной и модулем SD классическое соединение SPI:
SD_Card Arduino
MOSI D11
MISO D12
SCK D13
CS D9 (можно использовать любой, поправив в коде)
Обратите внимание на упор, помеченный красной стрелкой. Моя LGT8F328P имеет длину около 31 мм, а классические китайские про мини около 33мм, для их установки данный упор надо выломать.
Заливаем прошивку, проверяем, если всё в порядке – склеиваем.
Стоит, мигает.
Часть 3 – программа.
Для работы нам потребуется microSD (или SD, если вы купили адаптер под неё) карта до 4ГБ, отформатированная в FAT16.
Имя файла генерируется автоматически при подаче питания, пока питание не снято, запись ведется в один и тот же файл
Пишутся только измерения напряжения или тока, в формате csv. Измерения частоты, сопротивления, ёмкости игнорируются, я не смог для себя придумать сценарий их логирования. В прошивке можно настроить разделитель целой и дробной части числа (точка или запятая).
Строка записи имеет вид:
00:01:23;1.2345;V
Первый столбец — время, затем измеренное значение и единицы измерения. Положительные и отрицательные значения отображаются соответствующим знаком, при измерении переменных напряжений и токов знака нет никакого.
Управление записью реализовано с помощью кнопок и переключателя мультиметра.
Чтобы начать запись на SD карточку нужно поставить и снять Hold (нажать 2 раза), так же Hold ставит запись на паузу, снятие с Hold продолжает запись на карту, при этом отсчёт времени начинается заново.
При паузе на Hold можно вытаскивать и возвращать карту.
Мультиметр передает показания с частотой примерно 2 раза в секунду (чуть чаще), при длительных измерениях создается много строк в файле. Для уменьшения объема данных была реализована возможность выбора периодичности записи на карту, для этого переключатель мультиметра ставим в положение -||- (ёмкость) и нажимая кнопку Range выбираем период согласно таблице.
Нажатие Частота_Записи На_Экране
(примерно)
1 2 раза в сек auto
2 2 раза в сек manu 0.000nF
3 1 раз в сек manu 0.00nF
4 1 раз в 5 сек manu 0.0000uF
5 1 раз в 10 сек manu 0.000uF
6 1 раз в 30 сек manu 0.00uF
7 1 раз в мин manu 0.0000mF
8 1 раз в 3 мин manu 0.000mF
9 1 раз в 5 мин manu 0.00mF
Работу устройства можно оценить по миганию светодиода, который по умолчанию подключен к 13 пину на плате ардуино. Он загорается при обращении к SD карточке. При нормальной работе это короткие вспышки в момент записи. Если светодиод циклично загорается на 2 сек, то это значит адаптер не видит вставленную карту памяти, или она не вставлена.
Программа логгера работает и на ардуино про мини (на ней и велась отладка) и на LGT8F328P-SSOP20.
Программист я не настоящий, приветствуется тестирование и отлавливание багов.
/*
Программа записи логов с мультиметра UNI-T UT61E
klimoff@gmail.com февраль 2023
SD карта до 4ГБ, форматировать в FAT16
=================================================================
== ЧТОБЫ НАЧАТЬ ЗАПИСЬ НА SD CARD нужно поставить и снять HOLD ==
=================================================================
HOLD ставит запись на паузу, снятие с HOLD продолжает запись на SD Card
При паузе на HOLD можно вытаскивать и возвращать карту
Имя файла генерируется автоматически при подаче питания, пока питание не снято, запись ведется в один и тот же файл
Настройка частоты записи: переключатель мультиметра ставим в положение Ёмкость
Нажатие Частота_Записи На_Экране
(примерно)
1 2 раза в сек auto
2 2 раза в сек manu 0.000nF
3 1 раз в сек manu 0.00nF
4 1 раз в 5 сек manu 0.0000uF
5 1 раз в 10 сек manu 0.000uF
6 1 раз в 30 сек manu 0.00uF
7 1 раз в мин manu 0.0000mF
8 1 раз в 3 мин manu 0.000mF
9 1 раз в 5 мин manu 0.00mF
т.к. мультиметр шлет ПРИМЕРНО 2 посылки в секунду (на самом деле чуть чаще), частота записи тоже не точная
просто при частоте, например "1 раз в мин", пишем на карту каждую 120-ю посылку
*/
#include <lgtx8p.h> // удалить при компиляции под ардуино
#include <arduino.h>
#include <SPI.h>
#include <SD.h>
#define digit_separator '.' // <---- НАСТРОЙКА РАЗДЕЛИТЕЛЯ ЦЕЛОЙ И ДРОБНОЙ ЧАСТИ ДЛЯ ЭКСЕЛЯ
#define PIN_CS 9 // SD Card SPI: MOSI D11, MISO D12,SCK D13, CS 9
#define _bs bit_is_set
byte b[14]; // буфер приема 14 байт
byte b_count = 0; // счетчик байт в посылке
byte f_count = 0; // счетчик в имени файлов
int cut = 0; // прореживание посылок
int c_count = 0; // счетчик прореживания посылок
int cutting[] = {0,1,10,20,60,120,360,600};
String file_name = ""; // имя файла
bool fl_start = false; // флаг разрешения записи
bool fl_init_card = false; // флаг инициализации карты после HOLD
unsigned long start_millis;
uint16_t b0() // возвращает кол-во разрядов до точки
{
if(b[6]==0xB)
{
if(b[0]==4) {return 100;}
else {return 10000/(pow(10,b[0])); }
}
else if(b[6]==0xD)
{
if(b[0]==0) {return 100;}
else {return 10;}
}
else if(b[6]==0xF)
{
if(b[0]==0) {return 1000;}
else {return 100;}
}
else if(b[6]==0x0) {return 1000;}
else {return 1;}
}
String b15() // возвращает измеренное число
{
String ret = "";
ret = b[1];
if(b0()==10000) {ret += digit_separator;}
ret += b[2];
if(b0()==1000) {ret += digit_separator;}
ret += b[3];
if(b0()==100) {ret += digit_separator;}
ret += b[4];
if(b0()==10) {ret += digit_separator;}
ret += b[5];
if(b[7]==0x1 || b[7]==0x5) {return "ovl.";}
else {return ret;}
}
String b6() // возвращает единицы измерения
{
if(b[6]==0xB) {if(b[0]==4){return "mV";} else {return "V";}}
else if(b[6]==0xD) {return "uA";}
else if(b[6]==0xF) {return "mA";}
else if(b[6]==0x0) {return "A";}
else {return " ";}
}
String b7() // возвращает для DC + или -, для AC пробел
{
if(!_bs(b[7],2) && _bs(b[10],3) && !_bs(b[10],0)) {return "+";} // флаг НЕ минус, флаг DC и нет флага Hz
else if(_bs(b[7],2) && _bs(b[10],3) && !_bs(b[10],0)) {return "-";} // флаг минус, флаг DC и нет флага Hz
else {return " ";}
}
void find_name() // ищем свободное имя файлу по порядку
{
file_name="log_";file_name+=f_count;file_name+=".csv"; // длина имени не больше 8 знаков!
while (SD.exists(file_name)) {
f_count++;
file_name="log_";file_name+=f_count;file_name+=".csv";
}
Serial.println("New file: " + file_name);
}
void sd_init() // инициализируем модуль
{
while(!SD.begin(PIN_CS)) {Serial.println("Card failed, or not present"); delay(1000);}
Serial.println("Card initialized.");
}
String disp_time() // время
{
String time_string = "";
unsigned long time_disp = (millis() - start_millis)/1000ul;
int h = time_disp/3600ul; // Время работы
time_string += h/10;
time_string += h%10;
time_string += ":";
int m = (time_disp%3600ul)/60ul;
time_string += m/10;
time_string += m%10;
time_string += ":";
int s = (time_disp%3600ul)%60ul;
time_string += s/10;
time_string += s%10;
return time_string;
}
void setup()
{
Serial.begin(19230, SERIAL_7N1);
pinMode(PIN_CS, OUTPUT);
Serial.println("Start");
sd_init();
find_name();
}
void loop()
{
if (_bs(b[11], 1)) {fl_start = true; fl_init_card = true;} // ставим флаги при нажатии HOLD
if (!_bs(b[11], 1) && fl_init_card) {sd_init(); start_millis = millis(); fl_init_card = false;} // реинициализируем карту при отпускании HOLD
while (Serial.available() > 0)
{
unsigned char in = Serial.read();
b[b_count] = in;
if (in != 'n' || in != 'r') {b[b_count] ^= 0x30;} // убираем 4 и 5 биты
b_count++;
if (in == 'n') // ловим конец пакета с данными
{
if(b[6]==0x6) {cut=c_count=cutting[b[0]]; fl_start = false;} // режим ёмкости, настройка частоты записи
if((b[6]>=0xB || b[6]==0x0) && !_bs(b[10],0) && !_bs(b[11],1)) // режимы ток, напряжение, не Hz, не HOLD
{
c_count++;
Serial.print(disp_time()+'t');Serial.print(b7());Serial.print(b15());Serial.print(b6()+'t');
//for (int i = 0; i < 12; ++i) {Serial.print(b[i], HEX);} // HEX принятого пакета
if(fl_start && c_count > cut)
{
File dataFile = SD.open(file_name, FILE_WRITE); // открываем файл на SD карте
if (dataFile) // записываем строку в файл log_X.csv
{
dataFile.println(disp_time()+";"+b7()+b15()+";"+b6()+";");
dataFile.close();
Serial.print("SD write "+file_name);
}
else {Serial.print("SD write ERRROR");}
c_count=0;
}
Serial.println();
}
b_count = 0;
}
}
}
В общем порядок действий: вставляем отформатированную в FAT16 карту размером не больше 4Гб. Подаем питание. При желании выбираем периодичность записи. Переводим переключатель в измеряемое положение, нажимаем два раза Hold и запись пошла — светодиод дает короткие вспышки.
Программа и STL-файлы выложены для общей пользы на Яндекс-диск
Бит в сек: 19200, бит данных: 7, остальное по умолчанию
500мксек/деление
Спасибо за внимание, надеюсь проделанная мной работа вам пригодится.
- Многоразовая капсула из нержавеющей стали для кофе-машин (микрообзор)...
- Лампа Берже - что такое, чем топить, как использовать от комаров
- Обзор бюджетного NVMe SSD Smartbuy Jolt SM63X на 256ГБ
- Обзор подарочного кофейного набора TimeMore
- Машинка для стрижки
- Лампочки "Космос" Е14
- Аккумуляторная УШМ Zitrek AG 20 Pro
- Коврик для выпекания. До сих пор используете для выпечки пергаментную бумагу? Предлагаю альтернативу!
- IR Infrared Remote Extender 4 Emitter Emitters 1 Receiver Repeater System Kit (Удлинитель ИК-пульта)
- Удлинитель ИК-пульта – новая версия из подручных материалов

