Авторизация
Регистрация

Напомнить пароль

Зарядная станция MaAnt DianBa No.1 и доработка модулем ESP32

  1. Цена: 3 535 руб.
  2. Перейти в магазин
Как-то замучался на работе заряжать кучу устройств через USB-порты системного блока и приобрел приглянувшийся мне MaAnt на aliexpress.

Брал давно, сейчас уже новая версия появилась с отличающимся дизайном. Устройство красивое, имеет дисплей с показом потребления как по всем каналам (пользуюсь только этим режимом), так и переключается в режим отображения по каждому каналу с увеличенным размером шрифта и дополнительным отображением информации, например напряжениями на линиях D- и D+. Есть еще силовой выход на 5В для подсоединения бананов, который имеет плохую защиту по КЗ (или мне не повезло), ну собственно я его коротнул и он стал не силовым, а слаботочным, держит 5В при токе не более 100мА, а далее просаживается, до КЗ 2А выдавал смело, больше не пробовал. Также на экране не выводятся по нему никакие параметры, но это так у меня, я видел у людей есть вывод данных, у них видимо более поздние ревизии изделия. Прибор умеет еще заряжать по беспроводной технологии. Также если зажать две кнопки одновременно, то попадем в дополнительное меню, в котором ничего кроме уровня яркости подсветки изменить нельзя.

Приведу выдержку параметров из страницы продавца:
  • Входное напряжение: 110v-220v
  • Выходное напряжение: 5 В
  • Максимальный ток: 25А
  • Мощность PD: макс. 22 Вт
  • Мощность беспроводной зарядки: 10 Вт
  • Максимальное напряжение: 5,1 V
  • Максимальный ток одного порта: 5A
  • Размеры: 102×100x88 мм

Ниже приведу пару изображений по поддерживаемым протоколам на портах QC3.0 и PD20W, остальные порты стандартные на 5В 2А выдают.

QC3.0:

PD20W:

Также приложу фоточки внутренностей, во время вскрытия присоской оторвал экран, но он уцелел и остался работоспособным:

Основная управляющая плата с экраном и USB выводами:

Блок питания вид сверху:

Блок питания вид снизу:

Гугл поиск по маркировке блока питания ничего интересного не выдал, но на вид все массивно и добротно, возможно даже на 25А тянет при 5В.

Плата беспроводной зарядки:

Ну и поскольку у устройства нет никаких тумблеров включения, а из розетки выдергивать его совсем неудобно решил его доработать на авто включению по моему присутствию и отключению по моему отсутствию. Хотелось, чтобы реагировало именно на меня и всякие датчики движения я отмел. Взор пал на ESP32-WROVER-B с Wifi и Bluetooth и захотелось его немного поковырять, ну и сказано-сделано. Очень мне полюбилась среда EspHome для домашней автоматизации, но ничто не мешает ее использовать для программирования автономных модулей. Собственно, получилась такая конфигурация в формате Yaml:

Кодаманама
esphome:
  name: maant
  on_boot:
  - priority: 800
    then:
    - delay: 300ms
    - lambda: |-
        id(relay_out).turn_off();
        wifi::global_wifi_component->disable();
        
esp32:
  board: esp32dev
  framework:
    type: arduino
    
web_server:
  port: 80
    
preferences:
  #one on day
  flash_write_interval: 1440min
  
wifi:
  ssid: "Тута имя точки"
  password: "Тута пароль"
  reboot_timeout: 3min
  enable_on_boot: false
  
ota:
  safe_mode: true
  password: тута пароль
    
logger:
 level: INFO
 
globals:
    - id: out_timeout
      type: int
      restore_value: no
      initial_value: '0'
    - id: wifi_timeout
      type: int
      restore_value: no
      initial_value: '0'      
    - id: in_uuid
      type: std::string
      restore_value: no
      initial_value: '"0x88FFEE11"'
    - id: ble_id_name
      type: std::string
      restore_value: no
      initial_value: '"Amazfit Bip"'
      
  
interval:
  - interval: 1s
    then: 
      - lambda: |-
          if(id(out_timeout) != 0) {
              id(out_timeout)--;
              if((id(out_timeout) < 3550) && ((id(out_timeout) % 60) == 0) ) {
                int t = id(out_timeout) / 60;
                ESP_LOGI("BLE_SOCKET", "relay time left = %i min", t);
              }
              if(id(out_timeout) == 0) {
                id(relay_out).turn_off();
                ESP_LOGI("BLE_SOCKET", "RELAY OFF");
              }
          }
          
          if(id(wifi_timeout) != 0) {
              id(wifi_timeout)--;
              
              if((id(wifi_timeout) % 60) == 0) {
                int t = id(wifi_timeout) / 60;
                ESP_LOGI("BLE_SOCKET", "wifi time left = %i min", t);
              }
              if(id(wifi_timeout) == 0) {
                wifi::global_wifi_component->disable();
                ESP_LOGI("BLE_SOCKET", "WIFI OFF");
              }
          }
  
esp32_ble_tracker:
  on_ble_advertise:
    then:
      - lambda: |-       
         if(x.get_service_uuids().size() != 0) {
            auto uuid = x.get_service_uuids()[0];
            if(strcmp(uuid.to_string().c_str(), id(in_uuid).c_str()) != 0) return;
            ESP_LOGI("BLE_SOCKET", "Success - mac: %s uuid: %s", x.address_str().c_str(), uuid.to_string().c_str());
            id(out_timeout) = 3600;
            id(relay_out).turn_on();
         }
         
         if(strlen(x.get_name().c_str()) > 0) {
           ESP_LOGI("BLE_SOCKET", "Name: %s", x.get_name().c_str());
           if(strcmp(x.get_name().c_str(), id(ble_id_name).c_str()) >= 0) {
               ESP_LOGI("BLE_SOCKET", "Success - name: %s mac: %s", x.get_name().c_str(), x.address_str().c_str());
               id(out_timeout) = 3600;
               id(relay_out).turn_on();
           }
         }
         if(x.get_service_datas().size() != 0) {
            auto data = x.get_service_datas()[0];
            std::string s(data.data.begin(), data.data.end());
            ESP_LOGI("ble_adv", "Data - %s", s.c_str());
         }
         if(x.get_service_uuids().size() != 0) {
             ESP_LOGI("ble_adv", "  Advertised service UUIDs:");
             for (auto uuid : x.get_service_uuids()) {
                 ESP_LOGI("ble_adv", "    - %s", uuid.to_string().c_str());
             }
         }
    
switch:
  - platform: gpio
    id:  relay_out
    pin: GPIO25
    restore_mode: ALWAYS_OFF
    inverted: True
    on_turn_on:
      then:
        - lambda: |-
           return;
           ESP_LOGI("Relay", "on_turn_on");
    on_turn_off:
      then:
        - lambda: |-
           return;
           ESP_LOGI("Relay", "on_turn_off");  
    
binary_sensor:
  - platform: gpio
    name: "Test Button"
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
      inverted: True
    on_click:
        min_length: 50ms
        max_length: 2s
        then:
          - lambda: |-
              id(wifi_timeout) = 360;
              wifi::global_wifi_component->enable();
              ESP_LOGI("Wifi", "Wifi on");


Собираем и зашиваем из консоли командой: esphome run maant.yaml



Большинство часов с Bluetooth соединением периодически отправляют посылки, с которых можно выдернуть их наименование. Собственно, ловлю посылки с моих часов Amazfit Bip, а также если вдруг забыл часы, то ловлю посылки с uuid данными генерируемым приложением nRF Connect на Android, поскольку политика безопасности в смартфонах не предусматривает периодической отправки каких-либо идентификаторов с включенным Bluetooth.

По обнаружению присутствия устанавливается таймер на один час и включается MaAnt с помощью реле. Таймер сбрасывается пока я рядом, как только я ушел, то через час MaAnt отключится.

Также на ESP32 с большим сенсорным экраном WT32-SC01, тоже купленной на aliexpress, вывожу список найденных рядом Bluetooth устройств ради интереса:

Приложу фотки доработки по встраиванию ESP32 внутрь. Внутри есть выступы под которые распечатал на 3Д-принтере салазки и расположил все модули на них, прям над блоком питания:

Чтобы питать ESP32 встроил для него отдельный блок питания из какого-то дешманского зарядника, который выдает 5В на выход, 5В идут на модуль реле, на котором есть понижающий стабилизатор на 3.3В которые питают ESP32, а ESP32 же с помощью модуля реле включает основной блок питания MaAnt:

Этот дешманский блоки питания кстати меня уже подвел вздутым конденсатором после непродолжительной работы, пришлось вскрывать и перепаивать его.

Вот так выглядит все это дело всунутое внутрь:

Кнопочку включения Wifi модуля в ESP32 вывел на заднюю часть:

Включенный Wifi автоматом подключается к точке доступа, по параметрам, которые забиты заранее в строках ssid и password, а строки ota со своими параметрами позволяют мне обновлять прошивку по wifi не подключаясь ничем физически. Но первую конфигурацию придется залить как-то физически, поэтому сделал это с помощью подключения конвертора USB-UART и EspHome по увиденному COM-порту в системе все успешно залил в модуль:

После нажатия кнопки запускается обратный таймер отключения и через 10 минут Wifi отключится. После подачи питания Wifi не включается сам, все привязано к кнопке.

Ну собственно сама зарядная станция меня устраивает, красивая, много портов USB и много пустого места внутри для доработки :) Засим все.
Планирую купить +1 Добавить в избранное
+51 +64
свернутьразвернуть
Комментарии (33)
RSS
+
avatar
+16
Просто интересно, что именно вы там заряжаете, причем разом, причем только в своем присутствии:)
Но чудо техники конечно интересное. Вот уж точно сумрачный азиатский гений.
+
avatar
+2
  • Skylab
  • 30 января 2025, 07:55
Авторское решение по-своему уникально и не исключено продолжение — включение по радужке глаза или голосовое управление.
+
avatar
+17
электричество с работы домой носит в павербанках
+
avatar
0
Для майнинга!
+
avatar
+1
Offtop
Просто интересно, что именно вы там заряжаете, причем разом, причем только в своем присутствии:)
Не могу ответить за автора, конечно, но, имхо, стоит учитывать, что объекты, втыкаемые в розетку и имеющие USB выходы — это де-факто блоки (источники) питания, а не зарядные устройства, и многие люди используют их именно так.
Например, сетап на рабочем столе: 2 ноутбука (личный + рабочий), монитор, лампа, ЛБП, усилитель, паяльник — 7 устройств, которые постоянно запитаны от «зарядных устройств» с USB-C PD. К этому добавим устройства, которые требуют именно регулярной зарядки, т.е. подключаются на короткий срок, но практически каждый день (т.е. для их зарядки не переиспользуешь порты, которые питают «стационарные» устройства, не удобно): два телефона, пауэрбанк, наушники, фонарь, bluetooth-колонка, планшет.
Можно, конечно, иметь определённое количество малопортовых ЗУ и постоянно играть в «передёрни кабель», или даже сделать вот так:
.
Но, имхо, если есть постоянная нужда в определённом количестве силовых USB одновременно — то удобнее использовать одно устройство, в котором это количество имеется. А пользователей, у которых возникает такая нужда, становится всё больше и больше, поскольку стандарт USB-C PD замещает всё больше проприетарных источников питания для самой разной цифровой и просто бытовой техники.
+
avatar
+4
  • Corvair
  • 30 января 2025, 03:34
Кнопки управления забавляют: верхняя кнопка «вниз», нижняя «вверх». Интересно, это где запретили эргономику? Если "+" слева и "-" справа в азиатских разработках ещё можно понять, то это не лезет ни в какие ворота, даже для космических кораблей и колёсных пароходов :)
+
avatar
0
  • smos
  • 30 января 2025, 15:10
Привыкать, что ли?
Вот, например, паяльная станция. Температура выставляется кнопками. Для паяльника: левая — «вниз» (меньше), правая — «вверх» (больше). Для фена — наоборот: левая — «вверх» (больше), правая — «вниз» (меньше).
+
avatar
+2
  • Vintiks
  • 30 января 2025, 07:36
Колхоз уровня бог.
В сомнительнейшую китайскую зарядку коммутировать реле с еще более слмнительным блоком питания.
Вся надежда на противопожарное узо и 6ka автоматы
+
avatar
0
  • vlo
  • 30 января 2025, 15:36
предохранитель на входе есть, причем тут автоматы?
+
avatar
+5
собрал себе сам из 24В 3А бп и модулёчков алишных: 3хUSB-A и 2xType-C
https://aliexpress.com/item/1005004929106387.html
https://aliexpress.com/item/1005007278568377.html
планирую еще пару модификаций: впилить вентилятор-улитку и бп мощней, текущий просто без дела валялся
+
avatar
+1
Спасибо за ссылки на модульки, не видел таких, заряжать за ночь 3 повербанки и 4 телефона становится проблемным.Думаю запитать от 12В, все равно больше 9В ни один девайс пока не просит.
Профиль очень знакомый, раньше в рекламных щитах широко применялся.
+
avatar
+6
Зарядка понравилась, а этот колхоз с выключением — не очень… Вообще не понял, зачем это.
+
avatar
+2
  • mzr910
  • 30 января 2025, 09:08
у меня эволюция многопортовых зарядок закончилась на anker gan prime 250w, там тоже wifi есть
+
avatar
0
Посмотрел, выглядит круто…
PS: У меня медленная на 5 портов у кровати 2А на порт, быстрее не надо :))
+
avatar
0
  • Shura_m
  • 30 января 2025, 09:13
А не проще было добавить кнопку включения?
Место позволяет.
+
avatar
0
  • Setjet
  • 30 января 2025, 09:39
Проще.
Но «хотелось, чтобы реагировало именно на меня».
+
avatar
+9
Дык а в результате что вы выключаете и зачем? У вас ваш БП и esp запитаны все равно всегда…
+
avatar
0
  • chas2
  • 30 января 2025, 10:31
А почему у FNIRSI-FNB48 старая версия ПО: нет возможности посмотреть QC4/4+/5…
+
avatar
+1
  • Cakypa
  • 30 января 2025, 10:43
Максимальное напряжение: 5,1 V
А потом фотографии тестеров с QC 9V. Ни чего не понимаю.
+
avatar
0
5,1 V указаны в спецификациях у продавца. По факту оказалось, что может больше.
+
avatar
0
  • Cakypa
  • 30 января 2025, 14:20
Ааа, значит за те же деньги мы купили более дорогой мех.
+
avatar
+1
Но всё равно продавец обманул, может я хотел, чтобы только 5 вольт и ничего больше. Надо открывать спор ;-)
+
avatar
0
  • vlo
  • 30 января 2025, 15:41
дык основные 6 портов там и есть 5вольтовые.
пара которые qc/pd — отдельно.
+
avatar
0
  • dan-sss
  • 30 января 2025, 13:19
автор, есть ведь нормальные кнопки. сверлится отверстие вставляется кнопка, изнутри закручивается гайка.
вид приличный и нажать на кнопку можно не боясь что выдавиш внутрь.
+
avatar
0
  • stump
  • 30 января 2025, 13:56
proleyka — автор
Setjet -?
То есть приходишь домой с севшими часами, и их даже зарядить нельзя?
+
avatar
0
Задача (выключать зарядник, если хозяина нет дома), конечно, высосана из пальца, но реализация прикольная. Наши руки, так сзать, не для скуки.
+
avatar
0
  • vlo
  • 30 января 2025, 15:40
а общий бп — на какой напряжение, 5В?
+
avatar
0
Отличная доработка!
Поясните по коду:
1) в лямбдах — команда return; прерывает выполнение лямбда-блока, поэтому строка с ESP_LOGI ниже просто не выполнится. Или тут как раз ничего не нужно делать? Тогда может убрать лишний ESP_LOGI?

2) if(strcmp(x.get_name().c_str(), id(ble_id_name).c_str()) >= 0) {

}
вы тут точное равенство проверяете? Если так, может лучше:

if (strcmp(x.get_name().c_str(), id(ble_id_name).c_str()) == 0) {

}
+
avatar
0
  • ArtyRH
  • 30 января 2025, 17:44
Основательный подход к делу ))
Я бы таким сделал… чтобы только в моем присутствии )
+
avatar
0
Ну так что мелочится рубильником весь дом туши)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.