Квант WiFi
(19-06-2025, 23:14)KEN : защита от полного разряда.
Разве? На этих платах нет DW01 и 8205. На сколько помню, именно они занимаются таким контролем.
Вроде там преобразователь уходит в защиту если напряжение меньше 2в, но точной информации не нашёл, надо будет проверить, хотя даже если он отключиться то через диод и дроссель будет идти ток, но тогда Mini360 точно уйдёт в защиту она не работает если напряжение меньше 4.75В.
(20-06-2025, 00:15)KEN : уходит в защиту если напряжение меньше 2в
Как я понял, прео просто не работает ниже 2в. https://radioskot.ru/publ/bp/sx1308_dc_d...7-1-0-1236
Но, на счёт разряда акума..... Вроде сама 4056 его может высосать..
(20-06-2025, 00:29)Sam : Как я понял, прео просто не работает ниже 2в
Ну да, она по схеме не может прервать полностью напряжение только отключится и напряжение пойдёт как есть через диод и дроссель.
(20-06-2025, 00:29)Sam : Вроде сама 4056 его может высосать..
Ну там месяцы нужны это я точно знаю, я на таких модулях сделал питание всем мультиметрам и тестерам.

Есть ещё копеечные платки от PowerBank там точно все защиты, у меня есть такой как-раз, заказал для ремонта а он по размерам не подошёл, пришлось микруху заказывать и менять, у меня ещё и этих микрух дофига, может их использую, дроссели тоже есть.

[Изображение: DOC007644773.jpg]

В принципе те аккумы что я буду использовать (плоские прямоугольные) уже с BMS, так что подойдёт любой модуль.
Вроде закончил, тестов было мало, если что, баги будем вылавливать вместе.
Прошивка заливается так-же, сначала заливаем  httpUpdater  https://tehnodium.ru/thread-1039-post-23...l#pid23850 потом заливаем по воздуху файл Kvant_WiFi_Client_1_0.bin, так-же обновляем основной блок на версию Kvant_WiFi_1_4.bin, советую это сделать даже если не будете делать беспроводной модуль, должна стать стабильнее дискриминация при проводке над целью.
Кнопки  ( - )  (PP/Ok) ( + )  (Menu).

Для прошивки httpUpdater по UART - выключаем питание, зажимаем кнопку (PP/Ok), включаем питание и отпускам кнопку, если будут обновления то дальше прошивка уже по воздуху, как это сделать напишу когда будут обновления.

При соединении с основным модулем будут такие сообщения, если внизу будет написано WS_DISCONNECTED ничего страшного, просто модуль сбросил соединение и будет соединяться опять, иногда соединение происходит долго иногда за пару секунд.
   
Для изменения настроек жмём (Menu) и ею-же листаем меню, кнопками +- меняем значение и жмём (PP/Ok) для выхода из меню. Порог меняется кнопками +-
   
Если зажать кнопку (Menu) на секунд 5 попадём в подменю, там можно увидеть рабаланс, выставить ток и подвигать шкалу VDI. Наблюдать одновременно разбаланс и ток нельзя, только по очереди выбирая кнопкой (Menu), для выхода жмём (PP/Ok)
   

Перемычку на звук нужно отключать при прошивке по UART, там будет постоянное напряжение и что-то может сгореть, динамик или транзистор. Ещё при включении питания не этом ESP скачки напряжения практически на всех выводах, так что звук лучше через конденсатор и микросхему усилителя звука. Мне звук особо ненужен, озвучка нажатия кнопок разве-что, так что простой схемы на транзисторе мне хватит. Регулировки громкости нет, придётся самим придумать как это реализовать.
Питание от минимального для стабилизатора 3.3в (4.75в для Mini360) и до 10в.
Дисплей любой монохромный с контроллером SSD1306 и разрешением 128x64.
   

Файлы вложений

.zip   Kvant_WiFi_Client_1_0.zip (Размер: 326.43 KB / Загрузок: 176)

.zip   Kvant_WiFi_1_4.zip (Размер: 242.96 KB / Загрузок: 184)
KEN
может помогите исправить  VDI  в этой программе , магнитуду показывает нормально.

   
Код:
#include <filters.h>

//const float cutoff_freq   = 20.0;  //Cutoff frequency in Hz

//const float cutoff_freqx   = 10.0;  //Cutoff frequency in Hz
//const float sampling_timex = 0.005; //Sampling time in seconds.
//IIR::ORDER  orderx  = IIR::ORDER::OD4; // Order (OD1 to OD4)
////////////////////
//const float cutoff_freqy   = 10.0;  //Cutoff frequency in Hz
//const float sampling_timey = 0.005; //Sampling time in seconds.
//IIR::ORDER  ordery  = IIR::ORDER::OD4; // Order (OD1 to OD4)
////////////////////

// Low-pass filter
//Filter fx(cutoff_freqx, sampling_timex, orderx);
//Filter fy(cutoff_freqy, sampling_timey, ordery);

#include <ADS1220_WE.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#include <driver/ledc.h>
#include <Preferences.h>
Preferences preferences;

#define TFT_MOSI 23  // Data out
#define TFT_SCLK 18  // Clock out
#define TFT_CS   22//
#define TFT_DC    21 //
#define TFT_RST   -1  // pin# 2

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
//================================ ADS  =============================
// Pin definitions
#define ADS1220_1_CS_PIN    25   // Chip Select
#define ADS1220_1_DRDY_PIN  34   // Data Ready

#define ADS1220_2_CS_PIN    26   // Chip Select
#define ADS1220_2_DRDY_PIN  35   // Data Ready

#define SPI_INITIALIZED true
#define SPI_NOT_INITIALIZED false
////////

/* Create ADS1220 objects */
ADS1220_WE ads1 = ADS1220_WE(ADS1220_1_CS_PIN, ADS1220_1_DRDY_PIN);
ADS1220_WE ads2 = ADS1220_WE(ADS1220_2_CS_PIN, ADS1220_2_DRDY_PIN);

//===============================  end ADS  ======================
//================================  filters  ====================
//hp
float inputSignalx;
float filteredSignalx;
float previousInputSignalx;
float previousFilteredSignalx = 0;
float alphax = 0.98; // Adjust for cutoff frequency (closer to 1 for higher cutoff)

float inputSignaly;
float filteredSignaly;
float previousInputSignaly;
float previousFilteredSignaly = 0;
float alphay = 0.98;

// Low-pass filter
const float cutoff_freqx   = 10.0;  //Cutoff frequency in Hz
//const float sampling_timex = 0.05; //Sampling time in seconds.
const float sampling_timex = 0.01;
IIR::ORDER  orderx  = IIR::ORDER::OD4; // Order (OD1 to OD4)

const float cutoff_freqy   = 10.0;  //Cutoff frequency in Hz
//const float sampling_timey = 0.05; //Sampling time in seconds.
const float sampling_timey = 0.01; //
IIR::ORDER  ordery  = IIR::ORDER::OD4; // Order (OD1 to OD4)

Filter fx(cutoff_freqx, sampling_timex, orderx);
Filter fy(cutoff_freqy, sampling_timey, ordery);

//================================ end filters  ====================

void setup() {
  Serial.begin(115200);
  //===========================  ADS  =============================
  while (!Serial);

  /* Choose SPI clock speed here. */
  // ads1.setSPIClockSpeed(4000000); // set SPI clock speed, default is 4 MHz
  // ads2.setSPIClockSpeed(4000000);

  digitalWrite(ADS1220_1_CS_PIN, HIGH);
  pinMode(ADS1220_1_CS_PIN, OUTPUT);
  digitalWrite(ADS1220_2_CS_PIN, HIGH);
  pinMode(ADS1220_2_CS_PIN, OUTPUT);

  if (ads1.init()) {
  }
  if (ads2.init()) {
  }

  ads1.setGain(ADS1220_GAIN_1);
  ads1.setDataRate(ADS1220_DR_LVL_2);
  ads1.setConversionMode(ADS1220_CONTINUOUS);

  ads2.setGain(ADS1220_GAIN_1);
  ads2.setDataRate(ADS1220_DR_LVL_2);
  ads2.setConversionMode(ADS1220_CONTINUOUS);

  float vRef1 = ads1.getVRef_V();
  float vRef2 = ads2.getVRef_V();
  //===========================  end ADS  =============================
  //================================  filters  ====================

  //================================ end filters  ====================

  pinMode(22, OUTPUT);

  pinMode(5, INPUT_PULLUP);  //amp ++
  pinMode(17, INPUT_PULLUP);  // amp --
  pinMode(12, INPUT_PULLUP);  //phase ++
  pinMode(14, INPUT_PULLUP);  // phase --
  pinMode(2, INPUT_PULLUP); // sw

  /////////////////
  ledc_timer_config_t timerConfig = {
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .duty_resolution = LEDC_TIMER_10_BIT,
    .timer_num = LEDC_TIMER_0,
    .freq_hz = 15300,
    .clk_cfg = LEDC_AUTO_CLK
  };
  ledc_timer_config(&timerConfig);

  //0°,F1
  ledc_channel_config_t channelConfig1 = {
    .gpio_num = 32,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 0
  };
  ledc_channel_config(&channelConfig1);

  //90°, F2
  ledc_channel_config_t channelConfig2 = {
    .gpio_num = 33,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_1,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 256
  };
  ledc_channel_config(&channelConfig2);
  //==========================================

  //F3 , Tx GB
  ledc_channel_config_t channelConfig3 = {
    .gpio_num = 4,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 0
  };
  ledc_channel_config(&channelConfig3);
  //++++++++++++++++++++++++++++++++++++++++

  // F4 comp
  ledc_channel_config_t channelConfig4 = {
    .gpio_num = 0,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 0
  };
  ledc_channel_config(&channelConfig4);
  //===========================================

  //GB, F4
  ledc_channel_config_t channelConfig5 = {
    //.gpio_num = 32,
    //.gpio_num = 16,
    // .gpio_num = 4,
    .gpio_num = 15,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 0
  };
  ledc_channel_config(&channelConfig5);

}

void loop()
{
  int VDI;
  float Magn ;

  ads1.setCompareChannels(ADS1220_MUX_0_1);
  float Ux = ads1.getVoltage_mV();
  //  Ux = ads1.getVoltage_muV();

  ads2.setCompareChannels(ADS1220_MUX_0_1);
  float Uy = ads2.getVoltage_mV();
  // Uy = ads2.getVoltage_muV();
  //================================  filters  ====================
  // This removes the DC component and lets through changes
  inputSignalx = Ux;
  inputSignaly = Uy;
  filteredSignalx = alphax * (previousFilteredSignalx + inputSignalx - previousInputSignalx);
  previousInputSignalx = inputSignalx;
  previousFilteredSignalx = filteredSignalx;

  filteredSignaly = alphay * (previousFilteredSignaly + inputSignaly - previousInputSignaly);
  previousInputSignaly = inputSignaly;
  previousFilteredSignaly = filteredSignaly;

  //= lp
  //10Hz x y, https://forum.arduino.cc/t/2-channel-filter/1109996/5
  int valuex = filteredSignalx;
  int valuey = filteredSignaly;
  float Uxff = fx.filterIn(valuex);
  float Uyff = fy.filterIn(valuey);
  //================================  end filters  ====================
  //hp
  /*
    Serial.print("  filteredSignalx =  ");
    Serial.print(filteredSignalx);
    Serial.print("  filteredSignaly =  ");
    Serial.print(filteredSignaly);
  */
  //lp
  /////////////////////////////////
  int X = abs(Uxff);
  int Y = abs(Uyff);
  //vdi=round(degrees(atan2(Xa,Ya)));
  /////////////////////////////////////
  // Magn = sqrt (pow(Uxff, 2) + pow( Uyff, 2));
  Magn = sqrt (pow(X, 2) + pow( Y, 2));
  // VDI = degrees(atan2(Uxff, Uyff));
  VDI = degrees(atan2(X, Y));
  //VDI = round(atan2(Uxff, Uyff));


  // Serial.print("   filterx =   "); Serial.print(Uxff);
  //  Serial.print("   filtery =   ");  Serial.print(Uyff);

  Serial.print("   Magn =   ");  Serial.print(Magn);
  Serial.print("  VDI =   ");  Serial.print(VDI);
  /*
    Serial.print("  VDI = "); //gray
    Serial.print(VDI);
    Serial.print("  Magn =  ");// green
    Serial.print(Magn);
  */
  Serial.println();

}