#include <Arduino.h>
#include <SoftwareSerial.h>
uint8_t DiplayNums[4];
uint32_t DisplayFlags;
// 0 - AC
// 1 - DC
// 2 - AUTO
// 3 - RS232
// 4 - minus
// 5 - DP1
// 6 - DP2
// 7 - DP3
// 8 - u
// 9 - n
// 10 - k
// 11 - diode
// 12 - m
// 13 - %
// 14 - M
// 15 - beep
// 16 - F
// 17 - Ohm
// 18 - Rel
// 19 - HOLD
// 20 - A
// 21 - V
// 22 - Hz
// 23 - Low Batt
// 24 - Far
// 25 - Cel
// 26 - user1
// 27 - user2
// 28 - AutoOff
// 29 - Min
// 30 - min-max
// 31 - max
SoftwareSerial mySerial(2, 3); // RX, TX
void ClearDisp(void)
{
for (uint8_t i=0; i<4; i++) DiplayNums[i]=0;
DisplayFlags = 0;
}
void Decode(uint8_t Number)
{
uint8_t i = Number>>4;
if (i>0xf) return;
Number &= 0xF;
uint32_t lNumber = Number;
switch (i)
{
case 1:
DisplayFlags = Number;
break;
case 2:
if (Number&1) DisplayFlags |= 1<<4; // minus
if (Number&2) DiplayNums[0] |= 1<<4; // 1E
if (Number&4) DiplayNums[0] |= 1<<5; // 1F
if (Number&8) DiplayNums[0] |= 1<<0; // 1A
break;
case 3:
if (Number&1) DiplayNums[0] |= 1<<3; // 1D
if (Number&2) DiplayNums[0] |= 1<<2; // 1C
if (Number&4) DiplayNums[0] |= 1<<6; // 1G
if (Number&8) DiplayNums[0] |= 1<<1; // 1B
break;
case 4:
if (Number&1) DisplayFlags |= 1<<5; // DP1
if (Number&2) DiplayNums[1] |= 1<<4; // 2E
if (Number&4) DiplayNums[1] |= 1<<5; // 2F
if (Number&8) DiplayNums[1] |= 1<<0; // 2A
break;
case 5:
if (Number&1) DiplayNums[1] |= 1<<3; // 2D
if (Number&2) DiplayNums[1] |= 1<<2; // 2C
if (Number&4) DiplayNums[1] |= 1<<6; // 2G
if (Number&8) DiplayNums[1] |= 1<<1; // 2B
break;
case 6:
if (Number&1) DisplayFlags |= 1<<6; // DP2
if (Number&2) DiplayNums[2] |= 1<<4; // 3E
if (Number&4) DiplayNums[2] |= 1<<5; // 3F
if (Number&8) DiplayNums[2] |= 1<<0; // 3A
break;
case 7:
if (Number&1) DiplayNums[2] |= 1<<3; // 3D
if (Number&2) DiplayNums[2] |= 1<<2; // 3C
if (Number&4) DiplayNums[2] |= 1<<6; // 3G
if (Number&8) DiplayNums[2] |= 1<<1; // 3B
break;
case 8:
if (Number&1) DisplayFlags |= 1<<7; // DP3
if (Number&2) DiplayNums[3] |= 1<<4; // 4E
if (Number&4) DiplayNums[3] |= 1<<5; // 4F
if (Number&8) DiplayNums[3] |= 1<<0; // 4A
break;
case 9:
if (Number&1) DiplayNums[3] |= 1<<3; // 4D
if (Number&2) DiplayNums[3] |= 1<<2; // 4C
if (Number&4) DiplayNums[3] |= 1<<6; // 4G
if (Number&8) DiplayNums[3] |= 1<<1; // 4B
break;
case 0xa:
DisplayFlags |= lNumber<<8;
break;
case 0xb:
DisplayFlags |= lNumber<<12;
break;
case 0xc:
DisplayFlags |= lNumber<<16;
break;
case 0xd:
DisplayFlags |= lNumber<<20;
break;
case 0xe:
DisplayFlags |= lNumber<<24;
break;
case 0xf:
DisplayFlags |= lNumber<<28;
break;
default:
break;
}
}
uint16_t SegmentDecoder(void)
{
uint16_t Result =0;
for(uint8_t i=0; i<4; i++)
{
uint8_t Number =0 ;
Result *= 10;
switch (DiplayNums[i])
{
case 0x3F:
Number = 0;
break;
case 0x06:
Number = 1;
break;
case 0x5B:
Number = 2;
break;
case 0x4F:
Number = 3;
break;
case 0x66:
Number = 4;
break;
case 0x6D:
Number = 5;
break;
case 0x7D:
Number = 6;
break;
case 0x07:
Number = 7;
break;
case 0x7F:
Number = 8;
break;
case 0x6F:
Number = 9;
break;
default:
break;
}
Result += Number;
}
return Result;
}
float DecodeFloat(uint16_t iValue)
{
float fValue = iValue;
// 4 - minus
// 5 - DP1
// 6 - DP2
// 7 - DP3
if (DisplayFlags & (1<<5)) fValue /= 1000;
else if (DisplayFlags & (1<<6)) fValue /= 100;
else if (DisplayFlags & (1<<7)) fValue /= 10;
if (DisplayFlags & (1<<4)) fValue = -fValue;
return fValue;
}
void build_mode(char *String)
{
char * Pointer;
Pointer = String;
for(uint8_t i=4; i<20; i++) *(Pointer++) = '\0';
Pointer = String;
*(Pointer++)= ' ';
// 23 - Low Batt
// 8 - u
// 9 - n
// 10 - k
// 12 - m
// 14 - M
if (DisplayFlags & (1<<8)) *(Pointer++)= 'u';
else if (DisplayFlags & (1<<9)) *(Pointer++)= 'n';
else if (DisplayFlags & (1<<10)) *(Pointer++)= 'k';
else if (DisplayFlags & (1<<12)) *(Pointer++)= 'm';
else if (DisplayFlags & (1<<14)) *(Pointer++)= 'M';
// 16 - F
// 17 - Ohm
// 20 - A
// 21 - V
// 22 - Hz
if (DisplayFlags & (1L<<16)) *(Pointer++)= 'F';
else if (DisplayFlags & (1L<<17)) *(Pointer++)= 'W';
else if (DisplayFlags & (1L<<20)) *(Pointer++)= 'A';
else if (DisplayFlags & (1L<<21)) *(Pointer++)= 'V';
else if (DisplayFlags & (1L<<22))
{
*(Pointer++)= 'H';
*(Pointer++)= 'z';
}
// 0 - AC
// 1 - DC
if (DisplayFlags & (1<<0))
{
strcpy(Pointer, " AC");
Pointer +=3;
}
else
if (DisplayFlags & (1<<1))
{
strcpy(Pointer, " DC");
Pointer +=3;
}
// 2 - AUTO
if (DisplayFlags & (1<<2))
{
strcpy(Pointer, " AUTO");
Pointer +=5;
}
// 23 - Low Batt
if (DisplayFlags & (1L<<23))
{
strcpy(Pointer, " BATT");
Pointer +=5;
}
}
void setup()
{
Serial.begin(115200);
Serial.println(F("Serial Hub"));
mySerial.begin(2400);
ClearDisp();
}
void loop()
{
char mode_str[20];
if (mySerial.available())
{
uint8_t Number;
Number = mySerial.read();
Decode(Number);
if ((Number>>4)==0x0F)
{
uint16_t Digits;
Serial.write(':');
Digits = SegmentDecoder();
float fValue;
fValue = DecodeFloat(Digits);
Serial.print(fValue,3);
build_mode(mode_str);
Serial.print((const char*)mode_str);
Serial.println();
ClearDisp();
}
}
}
+23 |
1814
52
|
+47 |
2479
88
|
+162 |
3786
45
|
А внезапная смена жанра текста (с описания м/м на его перепрошивку) напоминает фильм Тарантино — Родригеса «От заката до рассвета».
Я когда покупал в в 2017 году, мне повезло, оказался на DTM0660. А нынче на Али продают какие то упрощенные версии.
А я вечно везде выпаиваю эти EEPROMы и флэши.
Ну, как говорится, лучше поздно чем очень поздно.
У всех что я встречал, как прошьёшь — так оно жестко и будет.
Далее, через конвертор на ардуине получает вменяемый код и отправляет его в labview, в котором получает желанный график v/t. т.е. напряжение/время.
Зачем тестер — я лично не понял… В ардуине есть целая куча своих ADC, если не устраивает их разрядность то за деньги примерно той же ардуины есть ADC чуть ли не «аудиофильского» уровня…
Где я не прав, или затея была — приспособить куды нить тестер чтоб не кис?..
Короче, видимо не все объяснил, хотя все обычно объясняют специальные люди, кандидаты с докторами :)
И если с ардуинами так все хорошо — зачем народ покупает мультиметры стоимостью в несколько тысяч долларов? Наверно, ничего в жизни не смыслят и деньги деть некуда.
Аналогов море, есть на более высокое напряжение, ina3221 просто удобный пример с кучей возможностей и модульным исполнением.
Конечно, помехи никуда не денутся и бороться с ними — дело схемотехническое, что для обычного мультиметра, что для схемы с ардуино.
Что касается мульиметров и любых приборов с корпусом и экраном — большинство кандидатов, а тем более докторов не то, что программировать, а даже настроить готовую программу типа LabView не всегда могут, поэтому и берут готовый прибор. К тому же прибор — это законченное изделие, для отдельных измерений он удобен, а когда речь идет об автоматизации и связи измерений и сложной последовательности дейтсвий, вот тогда может оказаться, что правильнее и во много раз дешевле и удобнее сдлеать свое решение — разработчик самого дорогого мультиметра никогда не предположит всех вариантов использования, поэтому его устройство при всех достоинствах будет не таким гибким и удобным как решение под вашу задачу.
Попробуйте сравнить любую приставку для Arduino с потрохами мультиметра и увидите, что чего-то на «шилде» не хватает. Может эдак сотни-другой компонентов :)
Например: github.com/tpwrules/121gw-re/blob/master/pdfs/121GW%20EEVBlog%20Circuit%20diagram.pdf
Да, надо бы и температуру сделать, когда крутишь галетником — между прозвонкой и омами включаются градусы. Можно с переходником попробовать на термопару или отдельное гнездо сделать. Но режим измерения еепромкой включить надо. Не изучал тему, но точно для включения температуры биты менять надо, где-то видел, вроде в обзоре на ричметерс 101-102.
А недостаток наличия измерения тока легко компенсировать парочкой щупов и
паяльной лампойшунтом на 0.1 Ом с «молексом» для IDE устройств в качестве «мам» для щупов мультиметра.Для того LabView и существует, чтобы из измерительных кубиков-приборов делать практически что угодно.
Это обзор до какой-то степени адресован и kirich, чтобы он перестал опасаться программы сам писать.
Внешне отличается черной рамкой экрана, оранжевой крутилкой и немного другой цветовой гаммой. Внутри то же самое, но: плата обр v0.7 2018 года. Микросхема — 1106EN в корпусе. Самое забавное — я тоже писал для него на ардуине декодер) В протокол UT-61E))
Использую с дешёвым блютуз-модулем в комплекте со смартфонной прогой 61e toolkit. Работает вполне.
Ну, про мелкие улучшайзинги типа 9999, переназначение положений селектора, отдельного предела 100 мВ и режима температуры (и необходимых для этого кнопок SEL и Hz) — и так понятно.
Сейчас идёт второй, за 500р в том же магазине добытый. Посмотрим, изменилось ли что-нибудь.
Но! Год назад. И с доставкой из России. Второй (тоже из РФ) заказал буквально на неделе, ещё идёт, не знаю — вдруг чего изменилось. Хотя судя по фоткам в отзывах — до сих пор присылают такие же, даже марка VICTOR, а не RuoShui даже при доставке из Китая.
И 18 — это с доставкой? Потому что у меня показывает из Китая 11€ с бесплатной доставкой.
Али что-то дурит с доставкой последнее время — на странице товара одна цена доставки, кладешь его в корзину — там доставка уже в 4-5 раз дороже.
Ну вот у этого конкретного магазина цены часто прыгают туда-обратно, так что может быть однажды упадёт до приемлемой.
В Россию из России:
Использую альтернативный вариант — TestController — софт на Яве, поддерживает интерфейсы SCPI, GPIB, Lxi, USB-COM, в комплекте есть драйвера для некоторых популярных устройств (Agilent, Keithley, Keysight, Rigol, Fluke, Brymen, Riden, Korad и т.д.). Сам «драйвер» это текстовый файл с описанием интерфейса, поэтому можно при желании написать свой (взяв за основу готовый, например).
В общем, все домашние приборы (лабораторники, мультиметры, ваттметр, электронную нагрузку) подцепил к этой проге и на этом проблему «единого центра измерений» лично для себя закрыл:).
Драйверы тоже пишутся руками на ура.
Общеизвестный стандарт — в жизни может и для серьезных применений сгодиться.
Возможность использования встроенного С-подобного языка и подключения внешних библиотек.
Сейчас добавлена поддержка Python.
Версия под Линукс намного легче и после Windows просто летает — но в последних версиях добавились проблемы, которых прежде не было.
Серьезные производители приборов практически всегда делают поддержку LabView — и все это автоматом и к Matcad цепляется (с которым LabView очень даже дружит)
Впрочем, на вкус и цвет фломастеры разные, я дома его и в мыслях не держал использовать, пока не появилась бесплатная версия.
Но вот для хоббийного занятия, он реально избыточен, это факт.
Еще один подводный камень — если вдруг потом придется использовать наработки в чем-то коммерческом, то вместо бесплатной коммьюнити эдишн сразу вынь да положь $500 за минимальную коммерческую (а если там какие-нибудь спектры нужны — то $4000 за полную).
P.S. Кошке — здоровья.
Несколько лет назад ей вскрытие делали, брали анализы — сказали, что инфекционный перитонит, с ним кошки долго не живут.
А сейчас то ли это последствия, то ли при операции что-то повредили.
Инфо от августа месяца, а в середине сентября мой Кузя заболел Ковидом в один день со мной. У меня это был уже не первый раз, колбасило не дурно, но без поражения лёгких и пр. страхов.
Кот пролежал без движения, пищи и воды 6 суток. Мы уже полностью сдались. В нашем небольшом коммунальном доме за сентябрь перемерли 5 котов и кошек. Официальный диагноз одной (которую лечили 20 дней и так и не вытянули) Ковид подтверждённый анализами (проба — отсылка в соседнюю область — 10 дней — результат).
Наш «дворянин» на седьмой день встал, но ходить не мог, были проблемы с ЦНС, штормило его нещадно. Неделю почти не мог есть и пить, всё пересохло, но кое-как выкарабкался. Молодой и очень энергичный котик.
Такие пироги…
PS. Это не тот ковид, которым болеют люди. У кошек свой ковид.
PPS. Извиняюсь, что не в тему поста.
На счет ZOYI ZT-S1, скажу только, что не слышал о нем ничего хорошего. Сам лично его не препарировал, ибо когда вижу «тестер полный автомат», сразу прохожу мимо.
это VC921 примерно 8-10 летней давности. точнее нее помню когда купил на ebay. TruRMS. Батарейки не менялись с завода.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.