Люксметр (измеритель освещенности) из китайского плеера
- Войдите на сайт для отправки комментариев
Давно я ничего нового и рабочего и удовлетворяющего меня не делал. Исправляюсь).
Была давняя идея сделать люксметр, и удачно нашел на али комактный калиброванный датчик BH1750. Также на форуме есть тема про китайский плеер, позволяющий из него что то собрать, так как уже и либа для дисплея есть (но об этом позже). И мне захотелось скрестить их: дисплей, ардуину, датчик и конечно все на питании от встроенного в плеер аккумулятора.
Собственно получилось вот что:
Компактный люксметр в корпусе плеера.
Характеристики определяются датчиком, а он может измерять освещенность от 1 до 65535 люкс.
Кстати есть еще один датчик на али TSL2561, но я его похоже потерял или где то лежит в куче других деталей в куче коробок. По характеристикам пишут что он лучше, так и не проверил(.
Как видно на фото на экране кроме цифр ничего нет, даже едениц измерения. я просто не стал заморачиваться, да и экран мелкий что то на нем городить. Контроля батареи нет, и не хочу делать. Вообще я его оставлю как есть, коды выложу, можно модернизировать как угодно.
По сборке: никакой схемы у меня нет . Просто я ее не делал, но самую главную инфу я сохранил:
Я покупал плеер у этого продавца. Почему я специально дал ссылку: да просто в данном корпусе минимум 2 варианта платы плеера, а контакты куда провода подпаивать буду давать по фото своего плеера.
Маленькое замечание по плееру: я оставил родную схему зарядки, а она никакая и легко убивает аккумулятор, я забыл снять с зарядки и аккумулятор вздулся. Аккумулятор в утиль, снял с другого плеера, хорошо купил два, второй кстати такой, и в него ардуина не влезет, придется делать плату свою. Так к сведенью.
Сборка:
1. Плеер аккуратно разобрать, все детали сохранить! Они вам еще пригодятся.
2. Выпаять родной контроллер, разъем 3.5мм (для наушников), разъем для карты памяти, светодиод фонарика. Скажу честно я разъемы тупо вырвал, но не советую так делать. Аккумулятор временно отпаять.
3. Нужна Ардуино про мини, у меня 5В 16мгц только была, но она успешно работает и от 3.3В и разумеется переходник USB-UART на 3.3В. Я использовал такой с переключателем 3.3-5В. Сильно подорожал, много вариантов дешевле.
4. Нужен тонкий провод. У меня МГТФ диаметр не помню, но толстый для этой задачи, с трудом засунул, берите сразу максимально тонкий
И собственно фото с нужными контактами:
Ну остальное думаю будет понятно по фото. Конечно сделать свою плату и вставить, не морочится с проводами можно, сделать нормальную на плате зарядку, но подогнать плату под коннекторы и вырезы в плате геморно. Я не стал.
Да и конечно код. Его можно оформить в библиотеку и т.д. Ах да чуть не забыл. Для этого дисплея есть 2 библиотеки ST7765 и Dogm. Dogm я так и не запустил, а вот с ST7765 помучался.
Я планировал пойти простым путем и использовать шрифты 16*32 из хронографа и используя фукнцию либы для вывода картинки вывести на дисплей. Но не тут то было. Если в нуле по оси Y выводить все вроде нормально, но стоит попробовать приподнять начинается такое: разрывы символов(часть снизу часть сверху) и так далее. Победить не удалось. Они зачем то видеобуфер распилили на полосы и по странному алгоритму расположили, думаю отсуда получились мои разорванные символы. Это мое предположение. Пришлось на основе кода от хронографа, а точнее либы для дисплея 1202 сделать либу для ST7765, точнее код. Я удалил многие тригонометрические функции чтобы не мешали править код, но добавить их не проблема, тупо копипаст из хронографа и будет работать, все названия функций одинаковые.
Собственно код, он у меня разбит как в хронографе по файлам, но думаю будет понятно. Компилировал в ардуино 1.6.12. Так к сведенью.
Luxmeter_mod2.ino
#include <avr/pgmspace.h> #define pgm pgm_read_byte #include <Wire.h> #include <BH1750.h> BH1750 lightMeter; unsigned int lux; #define CS 10 #define Data 11 #define Clock 13 #define DC A0 #define LCD_X 128 #define LCD_Y 64 #define LCD_String 8 #define swap(a, b) { int t = a; a = b; b = t; } #define LCD_D 1 #define LCD_C 0 byte LCD_RAM[LCD_X*LCD_String]; #define BLACK 1 #define WHITE 0 #define LCDWIDTH 128 #define LCDHEIGHT 64 #define CMD_DISPLAY_OFF 0xAE #define CMD_DISPLAY_ON 0xAF #define CMD_SET_DISP_START_LINE 0x40 #define CMD_SET_PAGE 0xB0 #define CMD_SET_COLUMN_UPPER 0x10 #define CMD_SET_COLUMN_LOWER 0x00 #define CMD_SET_ADC_NORMAL 0xA0 #define CMD_SET_ADC_REVERSE 0xA1 #define CMD_SET_DISP_NORMAL 0xA6 #define CMD_SET_DISP_REVERSE 0xA7 #define CMD_SET_ALLPTS_NORMAL 0xA4 #define CMD_SET_ALLPTS_ON 0xA5 #define CMD_SET_BIAS_9 0xA2 #define CMD_SET_BIAS_7 0xA3 #define CMD_RMW 0xE0 #define CMD_RMW_CLEAR 0xEE #define CMD_INTERNAL_RESET 0xE2 #define CMD_SET_COM_NORMAL 0xC0 #define CMD_SET_COM_REVERSE 0xC8 #define CMD_SET_POWER_CONTROL 0x28 #define CMD_SET_RESISTOR_RATIO 0x20 #define CMD_SET_VOLUME_FIRST 0x81 #define CMD_SET_VOLUME_SECOND 0 #define CMD_SET_STATIC_OFF 0xAC #define CMD_SET_STATIC_ON 0xAD #define CMD_SET_STATIC_REG 0x0 #define CMD_SET_BOOSTER_FIRST 0xF8 #define CMD_SET_BOOSTER_234 0 #define CMD_SET_BOOSTER_5 1 #define CMD_SET_BOOSTER_6 3 #define CMD_NOP 0xE3 #define CMD_TEST
Font.ino
//цифры размером 16х32 пикселей static const char mass16x32 [10][64] PROGMEM ={ { 0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //0 0x3F, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x3F, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xF8, //1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F}, {0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //2 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F, 0xFE, 0xFF, 0xFE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x40, 0x00, 0x00}, {0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //3 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}, {0xF8, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xF8, //4 0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F}, {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, //5 0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}, {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, //6 0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}, {0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //7 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F}, {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //8 0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F, 0xFE, 0xFF, 0xFE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}, {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //9 0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}};
LCD.ino
//======================================================================== // Графические функции //======================================================================== /* Clear_LCD(); Update(); fillScreen(color); drawPixel (x, y, color); drawChar(x, y, color, char c); drawString(x, y, color, char *str); drawLine(x0, y0, x1, y1, color); drawFastVLine(x, y, h, color); drawFastHLine(x, y, w, color); drawRect(x, y, w, h, color); drawCircle(x0, y0, r, color); drawRoundRect(x, y, w, h, r, color); drawTriangle(x0, y0, x1, y1, x2, y2, color); drawCircleHelper(x0, y0, r, cornername, color); fillCircle(x0, y0, r, color); fillCircleHelper(x0, y0, r, cornername, delta, color); fillRect(x, y, w, h, color); fillRoundRect(x, y, w, h, r, color); fillTriangle(x0, y0, x1, y1, x2, y2, color); drawBitmap(x, y, const uint8_t *bitmap, w, h, boolean color); */ //======================================================Очистка дисплея void Clear_LCD() { for (int index = 0; index < 864 ; index++) { LCD_RAM[index] = (0x00); } } //=======================================================Управление пинами void dWrite(byte pin, byte val) { byte bit = digitalPinToBitMask(pin); volatile byte *out; out = portOutputRegister(digitalPinToPort(pin)); (val) ? *out |= bit : *out &= ~bit; } #define _BV(bit) (1<<(bit)) //=========================================================Отправка 9 байт void SendByte(byte mode, byte c) { dWrite(CS, 0); (mode) ? dWrite(DC, 1) : dWrite(DC, 0); for (byte i = 0; i <8; i++) { dWrite(Clock, 0); (c & 0x80) ? dWrite(Data, 1) : dWrite(Data, 0); dWrite(Clock, 1); c <<= 1; } } //=====================================================Обновить дисплей void Update() { for (byte p = 0; p < 8; p++) { //SendByte(LCD_C, CMD_SET_PAGE | pagemap[p]); SendByte(LCD_C, CMD_SET_PAGE | p); byte col = 0; SendByte(LCD_C, CMD_SET_COLUMN_LOWER | (1 & 0xf)); SendByte(LCD_C, CMD_SET_COLUMN_UPPER | ((1 >> 4) & 0x0F)); SendByte(LCD_C, CMD_RMW); for (byte col = 0; col < LCD_X; col++) { SendByte(LCD_D, LCD_RAM[(LCD_X * p) + col]); } } } //===================================================Нарисовать пиксель void drawPixel (byte x, byte y, boolean color) { if ((x < 0) || (x >= LCD_X) || (y < 0) || (y >= LCD_Y)) return; if (color) LCD_RAM[x + (y / 8)*LCD_X] |= _BV(y % 8); else LCD_RAM[x + (y / 8)*LCD_X] &= ~_BV(y % 8); } //======================================================Вывод картинки void drawBitmap(byte x, byte y, const char *bitmap, byte w, byte h, boolean color) { for (int16_t j = 0; j < h; j++) { for (int16_t i = 0; i < w; i++ ) { if (pgm(bitmap + i + (j / 8)*w) & _BV(j % 8)) { drawPixel(x + i, y + j, color); } } } } //======================================================================== // Управление дисплеем //======================================================================== //===================================================Инициализация дисплея void Inicialize() { pinMode(CS, OUTPUT); pinMode(Data, OUTPUT); pinMode(Clock, OUTPUT); pinMode(DC, OUTPUT); // Инициализация дисплея dWrite(CS, 0); delay(500); SendByte(LCD_C, CMD_SET_BIAS_7); // LCD bias select SendByte(LCD_C, CMD_SET_ADC_NORMAL); // ADC select SendByte(LCD_C, CMD_SET_COM_REVERSE); // SHL select SendByte(LCD_C, CMD_SET_DISP_START_LINE); // Initial display line SendByte(LCD_C, CMD_SET_POWER_CONTROL | 0x4); // turn on voltage converter (VC=1, VR=0, VF=0) delay(50); SendByte(LCD_C, CMD_SET_POWER_CONTROL | 0x6); // turn on voltage regulator (VC=1, VR=1, VF=0) delay(50); SendByte(LCD_C, CMD_SET_POWER_CONTROL | 0x7); // turn on voltage follower (VC=1, VR=1, VF=1) delay(10); SendByte(LCD_C, CMD_SET_RESISTOR_RATIO | 0x6); // set lcd operating voltage (regulator resistor, ref voltage resistor) SendByte(LCD_C, CMD_DISPLAY_ON); SendByte(LCD_C, CMD_SET_ALLPTS_NORMAL); SendByte(LCD_C, CMD_SET_DISP_REVERSE); SendByte(LCD_C, CMD_SET_VOLUME_FIRST); SendByte(LCD_C, CMD_SET_VOLUME_SECOND | (0 & 0x3f)); Clear_LCD(); Update(); } //=========================Вывод символа 16х32 пикселя в координаты XY void simb16x32(byte x, byte y, boolean color, byte c) { for (byte k = 0; k < 4; k++) { for (byte i = 0; i < 16; i++) { byte line = pgm(&(mass16x32[c][i + k * 16])); for (byte j = 0; j < 8; j++) { (line & 0x01) ? drawPixel(x + i, y + j + k * 8, color) : drawPixel(x + i, y + j + k * 8, !color); line >>= 1; } } } }
Main.ino
void setup(){ Inicialize(); lightMeter.begin(); } + void loop(){ lux = lightMeter.readLightLevel(); simb16x32(95, 17, 1, lux%10); lux/=10; simb16x32(75, 17, 1, lux%10); lux/=10; simb16x32(55, 17, 1, lux%10); lux/=10; simb16x32(35, 17, 1, lux%10); lux/=10; simb16x32(15, 17, 1, lux%10); Update(); delay(300); }
Видео будет позже
админ пожалуйста поменяй картинки местами какие разъемы удалять
Привет!
Классно получилось, ждем видео!!!
Интересно получилось. Подпишусь.
спасибо. отредактирую видео и может вечером выложу
jeka_tm а + в Main.ino нужен или нет. – 05 строка.
Скетч скомпилировался в IDE Arduino 1.8.1. закомментировав + в Main.ino. В железе проверить быстро не смогу. Плеер есть, датчика пока нет.
(Компилировал из интереса компиляции целого кода из нескольких .ino файлов вроде разобрался – получилось.)
нет конечно. случайно видно нажал
Какие-то не очень приятные ощущения у меня от этого BH1750. Располагаю двумя экземплярами, купленными в разное время и у разных продавцов на али. Оба демонстрируют несколько странное поведение. При выборе разных разрешений (режимы High Resolution Mode и High Resolution Mode 2), показатели освещенности разые, при неизменном положении самого датчика и источника освещения. При заявленной производителем точности измерений в 1 и 0.5 процента для этих режимов соответвенно, имею, например, 12 lux в режиме HiRes и не сходя с места тут же 60 lux в режиме HiRes2. Разница в пять раз как-то не сильно располагает к доверию, что внутри датчика где-то действительно обитает точность с допуском 0.5 - 1 процент.
ну это и не точный измерительный прибор. это как у нас на работе: изредка мне нужен штангельциркуль, и он имеется. но когда отк пристает ко мне что нужно поверить, я говорю это просто индикатор и поверка не нужна)) на полгода отстают
Замечательное изготовление, примите мои поздравления.
Тут уже был автор, который делал люксометр на каком-то тоже калиброванном датчике. Ваше изделие меня интересует с теми же целями: калибровка, пусть хотя бы сильно примерная моих поделок датчиков освещенности на базе TSC3200 ..
Соответственно к Вам просьба тоже (предыдущий автор отказался проводить экспермент):
Возьмите обыкновенную настольную лампу, вкрутите в неё лампочку на 40вт, и в полной темноте или "почти полной" измерьте уровень освещенности листа белой бумаги такой лампой при условии: лампа светит поперпендикулярно листу с расстояния 0.5м.; датчик освещенности расположен как можно перпендикулярнее листа на расстоянии 0.5м. (исключить засветку от лампы напрямую!)
Что покажет ваш калиброванный датчик?
В.2: положить на стол датчик и посветить на него той же лампой 40вт перпендикулярно с расстояния 1метр ровно и тоже исключая сторонние засветки.
Заранее спасибо.
спасибо. да могу. а нужно именно 40вт? у меня ни одной лампы накаливания. люминесцентные только
Да, нужна именно лампа накаливания. 40вт просто диапазон "удобный", но можно и 60вт, дальше будет не так интересно.
ну нет у меня ламп накаливания
Видео без звука
рекомендую попробовать вот эту библиотеку. больше полета для творчества и раскрывает весь потенциал датчика. подробности тут.
спасибо. но пожалуй не рискну разбирать, изза проводов итак все внатяг, как бы не сломалось чего нибудь
рекомендую попробовать вот эту библиотеку. больше полета для творчества и раскрывает весь потенциал датчика. подробности тут.
Нет у него никакого потенциала. Весьма посредственный датчик. А если время экспозиции менять, то и точности никакой уже не будет.
Прошу извинить за поднятие темы, хочу поделиться фоткой для подключения Arduino на плеере который попался мне (заказывал в сентябре 2017 на Ali у Da Da Electronic):
На 9 пин не обращайте внимания, захотел регулировать яркость подсветки через ШИМ
Датчик взял немного другой (MAX44009), но скетч остался почти без изменений, только скачал библиотеку отсюда, в файлах C:\Users\имя\Documents\Arduino\libraries\MAX44009-master\MAX44009.h и MAX44009.cpp закомментрировал использование шины I2C и раскомментрировал Wire.h. Работает :)
jeka_tm, спасибо вам за интересную разработку! Этот плеер с дисплеем настоящая находка для подобных проектов)
Поздравляю) Так ты получается родной микроконтроллер не выпаивал?
Спасибо!
Не, это просто так получилось на фото, потом конечно выпаял микросхему и SD
Не, так даже понятнее. У меня труднее понять
Я кстати заказал еще пару плееров по 129 рублей, так на всякий случай, но немного в другом корпусе
Тоже видел в таком корпусе, но побоялся сильных отличий на плате (в итоге они все равно попались).
Добавлю лот в избранное, может разместите потом на Ali фото платы вместе с отзывом? жаль, что на форуме нет личных сообщений
хорошо и туда и сюда если не забуду
Как обещал
Спасибо за фото, в целом детальки такие же, выводы только придется выискивать. Взял на заметку :)