Это их стандартная "отмазка" на нестандартное поведение банок. Плюс до кучи некоторые еще и предохранитель пережигают, что бы не заряжалась больше батарея.
Это их стандартная "отмазка" на нестандартное поведение банок. Плюс до кучи некоторые еще и предохранитель пережигают, что бы не заряжалась больше батарея.
Подскажите пожалуйста, этот скетч на node mcu v3 будет работать? (контроллер на батарее bq20z75)
Спасибо
у меня работает, ядро 3.0.2, да, периодически валится стек, но работает, как работает описал выше, подключал дюпонами, штыри-гнёзда
Немного правленый код под ESP8266:
/*
* SmartBattery.ino https://github.com/dsa-a/Arduino-Smart-Battery
* Copyright (C) 2021, Andrei Egorov
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see href="http://www.gnu.org/licenses/
*/
// http://arduino.ru/forum/proekty/obshchenie-s-batareyami-ot-noutbuka
// Версия для ESP8266 ядро 3.0.2
// распиновка
// GND - p- (G)
// SDA - CLK (D1)
// SCL - DAT (D2)
//
#define CLOCK_I2C 50000 // подобрать частоту I2C для безошибочного чтения
#ifndef CLOCK_I2C
#define CLOCK_I2C 100000
#endif
#define ERROR_I2C // пропускаем или выводим нечитаемые блоки (участки кода)
#include <Wire.h> // для AVR !!! The WIRE library must be edited to increase the buffer to 34 (0x22) bytes !!!
//#define debug
#define addr 0x0B
#define new_capacity 4400
#define unseal_key_1 0x0414
#define unseal_key_2 0x3672
#define full_access_key_1 0xFFFF
#define full_access_key_2 0xFFFF
#define pf_clear_key_1 0x2673
#define pf_clear_key_2 0x1712
#define year (__DATE__[7]-'0')*1000+(__DATE__[8]-'0')*100+(__DATE__[9]-'0')*10+(__DATE__[10]-'0')
#define month (__DATE__[0] == 'J' && __DATE__[1] == 'a') ? 1 : \
(__DATE__[0] == 'F') ? 2 : \
(__DATE__[0] == 'M' && __DATE__[2] == 'r') ? 3 : \
(__DATE__[0] == 'A' && __DATE__[1] == 'p') ? 4 : \
(__DATE__[0] == 'M' && __DATE__[2] == 'y') ? 5 : \
(__DATE__[0] == 'J' && __DATE__[2] == 'n') ? 6 : \
(__DATE__[0] == 'J' && __DATE__[2] == 'l') ? 7 : \
(__DATE__[0] == 'A' && __DATE__[1] == 'u') ? 8 : \
(__DATE__[0] == 'S') ? 9 : \
(__DATE__[0] == 'O') ? 10 : \
(__DATE__[0] == 'N') ? 11 : \
(__DATE__[0] == 'D') ? 12 : 0
#define day (((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')-'0')*10+(__DATE__[5]-'0')
byte buff[34];
#if defined (debug)
byte sp;
byte PEC(byte p, byte b) {
b^=p;
for (byte i=0; i<8; i++ ) {
byte t=b&0x80;
b<<=1;
if (t!=0) b^=0x07;
}
return b;
}
#endif
void CheckWireStatus(byte wire_status) {
if (wire_status!=0) {
Serial.print(F("Wire error - "));
Serial.println(wire_status);
while (true) ;
}
}
void SMBCommand(byte comm) {
Wire.beginTransmission(addr);
Wire.write(comm);
CheckWireStatus(Wire.endTransmission(false));
}
void Read(byte n) {
Wire.requestFrom(addr,n+1);
#if defined (debug)
byte p=PEC(sp, (addr<<1)+1);
#endif
byte b=Wire.available();
for (byte i=0; i<b; i++) {
buff[i]=Wire.read();
#if defined (debug)
if (i<(b-1)) p=PEC(p, buff[i]);
printHEX(buff[i]);
Serial.print(",");
#endif
}
#if defined (debug)
printHEX(p);
Serial.println();
#endif
}
void ReadSMB(byte comm) {
SMBCommand(comm);
#if defined (debug)
sp=PEC(PEC(0, addr<<1), comm);
#endif
Read(2);
}
void ReadSMB(word comm) {
Wire.beginTransmission(addr);
Wire.write(00);
Wire.write(lowByte(comm));
Wire.write(highByte(comm));
CheckWireStatus(Wire.endTransmission());
ReadSMB(byte(0x00));
}
void ReadBlockSMB(byte comm) {
SMBCommand(comm);
Wire.requestFrom(addr,1);
byte b=Wire.read();
SMBCommand(comm);
#if defined (debug)
sp=PEC(PEC(0, addr<<1), comm);
#endif
Read(b+1);
}
void WriteSMBWord(byte comm, word data) {
Wire.beginTransmission(addr);
Wire.write(comm);
Wire.write(lowByte(data));
Wire.write(highByte(data));
CheckWireStatus(Wire.endTransmission());
}
void ReadSMBSubclass(byte id, byte page) {
WriteSMBWord(0x77, word(id));
delay(100);
ReadBlockSMB(page);
}
void WriteSMBSubclass(byte id, byte page) {
WriteSMBWord(0x77, word(id));
delay(100);
Wire.beginTransmission(addr);
Wire.write(page);
for (byte i=0;i<=buff[0];i++) Wire.write(buff[i]);
CheckWireStatus(Wire.endTransmission());
delay(100);
}
void printHEX(byte b) {
if (b<16) Serial.print("0");
Serial.print(b,HEX);
}
void printBlock() {
for (byte i=1; i<=buff[0]; i++) Serial.print(char(buff[i]));
Serial.println();
}
void Read123() {
ReadSMB(word(0x0001)); Serial.print(F("Device Type: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
ReadSMB(word(0x0002)); Serial.print(F("Firmware Version: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
ReadSMB(word(0x0003)); Serial.print(F("Hardware Version: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
}
void info() {
ReadSMB(byte(0x18)); Serial.print(F("DesignCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh");
ReadSMB(byte(0x10)); Serial.print(F("FullChargeCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh");
ReadSMB(byte(0x17)); Serial.print(F("CycleCount: ")); Serial.println(buff[1]*256+buff[0]);
ReadSMB(byte(0x1B)); Serial.print(F("Date: ")); Serial.print(1980+(buff[1]>>1)); Serial.print("."); Serial.print(((buff[1]&0b00000001)<<3)+(buff[0]>>5));Serial.print("."); Serial.println(buff[0]&0b00011111);
ReadSMB(byte(0x19)); Serial.print(F("DesignVoltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadBlockSMB(0x20); Serial.print(F("ManufName: ")); printBlock();
ReadBlockSMB(0x21); Serial.print(F("DeviceName: ")); printBlock();
ReadSMB(byte(0x1C)); Serial.print(F("SerialNumber: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
ReadSMB(byte(0x14)); Serial.print(F("ChargingCurrent: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mA");
ReadSMB(byte(0x15)); Serial.print(F("ChargingVoltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadBlockSMB(0x22); Serial.print(F("DeviceChemistry: ")); printBlock();
ReadSMB(byte(0x08)); Serial.print(F("Temperature: ")); Serial.print(float(buff[1]*256+buff[0])/10-273); Serial.println(" C");
ReadSMB(byte(0x09)); Serial.print(F("Voltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadSMB(byte(0x0A)); Serial.print(F("Current: ")); Serial.print(int(buff[1]*256+buff[0])); Serial.println(" mA");
ReadSMB(byte(0x0D)); Serial.print(F("RelativeSOC: ")); Serial.print(buff[0]); Serial.println(" %");
ReadSMB(byte(0x0E)); Serial.print(F("AbsoluteSOC: ")); Serial.print(buff[0]); Serial.println(" %");
ReadSMB(byte(0x0F)); Serial.print(F("RemainingCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh");
#ifndef ERROR_I2C
ReadSMB(byte(0x3C)); Serial.print(F("VCELL4: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadSMB(byte(0x3D)); Serial.print(F("VCELL3: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadSMB(byte(0x3E)); Serial.print(F("VCELL2: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadSMB(byte(0x3F)); Serial.print(F("VCELL1: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
#endif
// ReadSMB(byte(0x3C)); Serial.print(F("VCELL4: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
// ReadSMB(byte(0x3D)); Serial.print(F("VCELL3: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
// ReadSMB(byte(0x3E)); Serial.print(F("VCELL2: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
// ReadSMB(byte(0x3F)); Serial.print(F("VCELL1: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
ReadSMB(byte(0x1A)); Serial.print(F("SpecificationInfo: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
ReadSMB(byte(0x16)); Serial.print(F("Battery Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("OCA|");
if (buff[1]&0b01000000) Serial.print("TCA|");
if (buff[1]&0b00010000) Serial.print("OTA|");
if (buff[1]&0b00001000) Serial.print("TDA|");
if (buff[1]&0b00000010) Serial.print("RCA|");
if (buff[1]&0b00000001) Serial.print("RTA|");
if (buff[0]&0b10000000) Serial.print("INIT|");
if (buff[0]&0b01000000) Serial.print("DSG|");
if (buff[0]&0b00100000) Serial.print("FC|");
if (buff[0]&0b00010000) Serial.print("FD|");
if (buff[0]&0b00001000) Serial.print("EC3|");
if (buff[0]&0b00000100) Serial.print("EC2|");
if (buff[0]&0b00000010) Serial.print("EC1|");
if (buff[0]&0b00000001) Serial.print("EC0|");
Serial.println();
ReadSMB(word(0x0054)); Serial.print(F("Operation Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("PRES|");
if (buff[1]&0b01000000) Serial.print("FAS|");
if (buff[1]&0b00100000) Serial.print("SS|");
if (buff[1]&0b00010000) Serial.print("CSV|");
if (buff[1]&0b00000100) Serial.print("LDMD|");
if (buff[0]&0b10000000) Serial.print("WAKE|");
if (buff[0]&0b01000000) Serial.print("DSG|");
if (buff[0]&0b00100000) Serial.print("XDSG|");
if (buff[0]&0b00010000) Serial.print("XDSGI|");
if (buff[0]&0b00000100) Serial.print("R_DIS|");
if (buff[0]&0b00000010) Serial.print("VOK|");
if (buff[0]&0b00000001) Serial.print("QEN|");
Serial.println();
if (buff[1]&0b00100000) {
Serial.println(F("Sealed"));
Read123();
} else {
Serial.println(F("Unsealed"));
ReadSMB(byte(0x0C)); Serial.print(F("MaxError: ")); Serial.print(buff[0]); Serial.println(" %");
ReadSMB(word(0x0051)); Serial.print(F("SafetyStatus: "));
if ((buff[1]==0)&&(buff[0]==0)) {
Serial.println("OK");
} else {
printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("OTD|");
if (buff[1]&0b01000000) Serial.print("OTC|");
if (buff[1]&0b00100000) Serial.print("OCD|");
if (buff[1]&0b00010000) Serial.print("OCC|");
if (buff[1]&0b00001000) Serial.print("OCD2|");
if (buff[1]&0b00000100) Serial.print("OCC2|");
if (buff[1]&0b00000010) Serial.print("PUV|");
if (buff[1]&0b00000001) Serial.print("POV|");
if (buff[0]&0b10000000) Serial.print("CUV|");
if (buff[0]&0b01000000) Serial.print("COV|");
if (buff[0]&0b00100000) Serial.print("PF|");
if (buff[0]&0b00010000) Serial.print("HWDG|");
if (buff[0]&0b00001000) Serial.print("WDF|");
if (buff[0]&0b00000100) Serial.print("AOCD|");
if (buff[0]&0b00000010) Serial.print("SCC|");
if (buff[0]&0b00000001) Serial.print("SCD|");
Serial.println();
};
ReadSMB(word(0x0053)); Serial.print(F("PFStatus: "));
if ((buff[1]==0)&&(buff[0]==0)) {
Serial.println("OK");
} else {
printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("FBF|");
if (buff[1]&0b00010000) Serial.print("SOPT|");
if (buff[1]&0b00001000) Serial.print("SOCD|");
if (buff[1]&0b00000100) Serial.print("SOCC|");
if (buff[1]&0b00000010) Serial.print("AFE_P|");
if (buff[1]&0b00000001) Serial.print("AFE_C|");
if (buff[0]&0b10000000) Serial.print("DFF|");
if (buff[0]&0b01000000) Serial.print("DFETF|");
if (buff[0]&0b00100000) Serial.print("CFETF|");
if (buff[0]&0b00010000) Serial.print("CIM|");
if (buff[0]&0b00001000) Serial.print("SOTD|");
if (buff[0]&0b00000100) Serial.print("SOTC|");
if (buff[0]&0b00000010) Serial.print("SOV|");
if (buff[0]&0b00000001) Serial.print("PFIN|");
Serial.println();
};
ReadSMB(word(0x0055)); Serial.print(F("Charging Status: "));
if ((buff[1]==0)&&(buff[0]==0)) {
Serial.println("OK");
} else {
printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("XCHG|");
if (buff[1]&0b01000000) Serial.print("CHGSUSP|");
if (buff[1]&0b00100000) Serial.print("PCHG|");
if (buff[1]&0b00010000) Serial.print("MCHG|");
if (buff[1]&0b00001000) Serial.print("TCHG1|");
if (buff[1]&0b00000100) Serial.print("TCHG2|");
if (buff[1]&0b00000010) Serial.print("FCHG|");
if (buff[1]&0b00000001) Serial.print("PULSE|");
if (buff[0]&0b10000000) Serial.print("PLSOFF|");
if (buff[0]&0b01000000) Serial.print("CB|");
if (buff[0]&0b00100000) Serial.print("PCMTO|");
if (buff[0]&0b00010000) Serial.print("FCMTO|");
if (buff[0]&0b00001000) Serial.print("OCHGV|");
if (buff[0]&0b00000100) Serial.print("OCHGI|");
if (buff[0]&0b00000010) Serial.print("OC|");
if (buff[0]&0b00000001) Serial.print("XCHGLV|");
Serial.println();
};
/*
ReadSMB(byte(0x46)); Serial.print(F("FETControl: "));
if (buff[0]==0) {
Serial.println("OK");
} else {
printHEX(buff[0]); Serial.println(" Hex");
if (buff[0]&0b00010000) Serial.print("OD|");
if (buff[0]&0b00001000) Serial.print("ZVCHG|");
if (buff[0]&0b00000100) Serial.print("CHG|");
if (buff[0]&0b00000010) Serial.print("DSG|");
Serial.println();
};
/* *
ReadSMBSubclass(82,0x78);
Serial.print(F("Update Status: ")); Serial.println(buff[13]);
Serial.print(F("Qmax Cell0: ")); Serial.println(buff[1]*256+buff[2]);
Serial.print(F("Qmax Cell1: ")); Serial.println(buff[3]*256+buff[4]);
Serial.print(F("Qmax Cell2: ")); Serial.println(buff[5]*256+buff[6]);
Serial.print(F("Qmax Cell3: ")); Serial.println(buff[7]*256+buff[8]);
Serial.print(F("Qmax Pack : ")); Serial.println(buff[9]*256+buff[10]);
for (byte i=88; i<=91; i++) {
ReadSMBSubclass(i,0x78);
Serial.print("Cell");
Serial.print(i-88);
Serial.print(" R_a flag: "); printHEX(buff[1]); printHEX(buff[2]); Serial.println();
}
*/
Read123();
ReadSMB(word(0x0006)); Serial.print(F("Manufacturer Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("FET1|");
if (buff[1]&0b01000000) Serial.print("FET0|");
if (buff[1]&0b00100000) Serial.print("PF1|");
if (buff[1]&0b00010000) Serial.print("PF0|");
if (buff[1]&0b00001000) Serial.print("STATE3|");
if (buff[1]&0b00000100) Serial.print("STATE2|");
if (buff[1]&0b00000010) Serial.print("STATE1|");
if (buff[1]&0b00000001) Serial.print("STATE0|");
Serial.println();
ReadSMB(word(0x0008)); Serial.print(F("Chemistry ID: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
delay(100);
ReadSMB(byte(0x03)); Serial.print(F("BatteryMode: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
if (buff[1]&0b10000000) Serial.print("CapM|");
if (buff[1]&0b01000000) Serial.print("ChgM|");
if (buff[1]&0b00100000) Serial.print("AM|");
if (buff[1]&0b00000010) Serial.print("PB|");
if (buff[1]&0b00000001) Serial.print("CC|");
if (buff[0]&0b10000000) Serial.print("CF|");
if (buff[0]&0b00000010) Serial.print("PBS|");
if (buff[0]&0b00000001) Serial.print("ICC|");
Serial.println();
};
}
void setup() {
Wire.begin();
Wire.setClock(CLOCK_I2C);
Serial.begin(9600);
Serial.println();
Serial.println(F("Arduino Smart Battery"));
Serial.println(F("Several utilities for working with TI bq20z... IC"));
Serial.println(F("Press Enter..."));
while (Serial.available()==0);
Serial.print(F("Checking communication with the device at address 0x"));
printHEX(addr);
Serial.println("...");
byte st;
do {
Wire.beginTransmission(addr);
st=Wire.endTransmission();
if (st!=0) Serial.println(F("The device is not responding.")); delay(1000);
} while (st!=0);
Serial.println(F("The device was found !!!"));
}
void loop() {
delay(1);
if (Serial.available()==0) {
Serial.println(F("--------------------"));
Serial.println(F("Select operation:"));
Serial.println(F("1. Read pack info."));
Serial.println(F("2. Pack Reset."));
Serial.println(F("3. Unsealing a pack."));
Serial.println(F("4. Move pack to Full Access mode."));
Serial.println(F("5. Clearing a Permanent Failure."));
Serial.println(F("6. Clearing CycleCount."));
Serial.println(F("7. Setting current date."));
Serial.println(F("8. Writing DesignCapacity, QMAX, Update status, Ra_table."));
Serial.println(F("9. Begin the Impedance Track algorithm."));
while (Serial.available()==0);
Serial.println();
Serial.println();
Serial.println(F("**************************************"));
switch (Serial.read()) {
case 0x31:
Serial.println(F("Pack Info..."));
info();
break;
case 0x32:
WriteSMBWord(0x00,0x0041);
Serial.println(F("Reseting..."));
delay(1000);
break;
case 0x33:
WriteSMBWord(0x00,unseal_key_1);
WriteSMBWord(0x00,unseal_key_2);
Serial.println(F("Unsealing..."));
break;
case 0x34:
WriteSMBWord(0x00,full_access_key_1);
WriteSMBWord(0x00,full_access_key_2);
Serial.println(F("Move to Full Access mode..."));
break;
case 0x35:
WriteSMBWord(0x00,pf_clear_key_1);
WriteSMBWord(0x00,pf_clear_key_2);
Serial.println(F("Clearing a Permanent Failure..."));
break;
case 0x36:
WriteSMBWord(0x17,0x0000);
Serial.println(F("Clearing CycleCount..."));
break;
case 0x37:
WriteSMBWord(0x1B,(year-1980)*512+int(month)*32+day);
Serial.println(F("Setting current date..."));
break;
case 0x38:
Serial.println(F("Writing DesignCapacity, QMAX, Update status, Ra_table..."));
WriteSMBWord(0x18,new_capacity);
delay(100);
ReadSMBSubclass(82,0x78);
buff[1]=highByte(new_capacity);
buff[2]=lowByte(new_capacity);
buff[3]=highByte(new_capacity);
buff[4]=lowByte(new_capacity);
buff[5]=highByte(new_capacity);
buff[6]=lowByte(new_capacity);
buff[7]=highByte(new_capacity);
buff[8]=lowByte(new_capacity);
buff[9]=highByte(new_capacity);
buff[10]=lowByte(new_capacity);
buff[13]=0x00;
WriteSMBSubclass(82,0x78);
for (byte i=88; i<=95; i++) {
buff[0]=0x20;
buff[1]=0xFF;
buff[2]=(i<92) ? 0x55 : 0xFF;
buff[3]=0x00;
buff[4]=0xA0;
buff[5]=0x00;
buff[6]=0xA6;
buff[7]=0x00;
buff[8]=0x99;
buff[9]=0x00;
buff[10]=0x97;
buff[11]=0x00;
buff[12]=0x91;
buff[13]=0x00;
buff[14]=0x98;
buff[15]=0x00;
buff[16]=0xB0;
buff[17]=0x00;
buff[18]=0xCC;
buff[19]=0x00;
buff[20]=0xDE;
buff[21]=0x00;
buff[22]=0xFE;
buff[23]=0x01;
buff[24]=0x3B;
buff[25]=0x01;
buff[26]=0xB5;
buff[27]=0x02;
buff[28]=0x8B;
buff[29]=0x03;
buff[30]=0xE9;
buff[31]=0x05;
buff[32]=0xB2;
WriteSMBSubclass(i,0x78);
}
break;
case 0x39:
WriteSMBWord(0x00,0x0021);
Serial.println(F("Begin the Impedance Track algorithm..."));
break;
}
} else Serial.read();
}
Это всё, что смог считать из своей батареи, я так понял некоторые ячейки не читаются:
Подскажите,я правильно понял,что сами батареи отпаивать не нужно?ещё вопрос,если отпаять Батареи на время прошивки,резисторы тоже уже не потребуются? Найти нужные резисторы в закромах сложнее чем Ардуино оказалось)).
Тогда в начале скетча указываем нужную длину буфера:
// Настройка длины буфера Wire.h и twi.h
#define BUFFER_LENGTH 34
#define TWI_BUFFER_LENGTH BUFFER_LENGTH //34
#include <Wire.h> //!!! The WIRE library must be edited to increase the buffer to 34 (0x22) bytes !!!
#include <utility/twi.h>
Наконец дошли руки и у меня посмотреть батарею, плата NODE MCU LOLIN ESP8266
Подключение прямое -
// Версия для ESP8266 ядро 3.0.2
// распиновка
// GND - p-
// SDA - CLK (D1)
// SCL - DAT (D2)
Pack Info...
DesignCapacity: 4400 mAh
FullChargeCapacity: 631 mAh
CycleCount: 140
Date: 2009.6.1
DesignVoltage: 11100 mV
ManufName: SMP-LGC2.2
DeviceName: DELL Y823G961
SerialNumber: 0DD9 Hex
ChargingCurrent: 0 mA
ChargingVoltage: 12600 mV
DeviceChemistry: LION
Temperature: 28.10 C
Voltage: 10223 mV
Current: 0 mA
RelativeSOC: 0 %
AbsoluteSOC: 0 %
RemainingCapacity: 0 mAh
Wire error - 3
В схеме подключения для node MCU нужно с подключать
d1,d2 к 3.3v через резисторы?
All digital IO pins are protected from over-voltage with a snap-back circuit connected between
the pad and ground. The snap back voltage is typically about 6V, and the holding voltage is 5.8V.
This provides protection from over-voltages and ESD. The output devices are also protected
from reversed voltages with diodes.
Хорошо, что есть защита, но это не даёт ответа , какое напряжение на SDA и SCL может быть у батареи HP, не просто же так в схеме на первой страничке этой ветки схема с резисторами.
Кстати, тоже никак не найду точного ответа, к каким контактам на батарее HP подключать SDA и SCL. Вижу подписи: P+, D, C, ID, B/I, P-
Намедни внезапно умер аккумулятор от ноута Samsung, что и побудило его поковырять. Опишу свои приключения - может кому полезным будет.
Умер аккум следующим образом - при стопроцентном заряде отключил от сетевого питания и работал от батареи, буквально пару минут поработал и ноут просто вырубился без каких либо предупреждений и включаться не желал. При подключении сетевого питания ноут начинал работать, в трее значок батарее показывал уровень заряда 94%, "подключена, не заряжается". Отключение от сети приводило к мгновенному отрубанию ноута, как будто батареи и не было.
Коллега с работы отдал контроллер от такого же аккумулятора, уже выпаянный, но только немного постарее (ревизия его аккумулятора 1.0, моего 1.2), типа может получится из двух один собрать.
Итак имеем: аккумулятор Samsung, ID: AA-PB9NC6B, на 11,1V и 4400 mAh
Распиновку гребёнки в инете не нашёл, она на 7 контактов. Прозвонкой удалось выяснить - крайние с обеих сторон это сдвоенные + и -, по информации из инетов так же стало понятно, что ближайший к минусу это контакт указывающий на то, что батарея вставлена в ноут, не знаю как точно называется контакт, где-то в инете проскакивало BAT_IN, пусть будет такой. Оставшиеся два это как раз необходимые SDA и SCL. Ниже картинка с полученной распиновкой.
При подключении ардуинки по схеме с первой страницы этой ветки, контроллер не отвечал (для таких "специалистов" как я - для arduino nano SDA это вывод А4, SCL - А5). Причём не отвечал ни мой, ни тот который коллега отдал (к нему я подключил три банки лития, от плюса к минусу - как где-то советовали). Чип на обоих контроллерах одинаковый - bq20z453. Запустить свой контроллер (ревизия 1.2) удалось кратковременным подключением + с крайней банки на + гребёнки. А контроллер коллеги (ревизия 1.0), кратковременным подключением GND на BAT_IN.
Ну а теперь результаты:
Свой контроллер удалось оживить и последовательность 1,2,3,4,5,6,7,8,1,2,3,4,9 отработала корректно. Ноут аккум видит, заряжает, но при отключении от сети проходит немного времени и ноут вырубается без предупреждений. Последующее включение сетевого адаптера опять всё нормализует - видит, заряжает. Тут я думаю одна банка умирает похоже, потому что на ней напряжение ниже чем на остальных двух на 4 десятых вольта. Надо подключить вольтметр и посмотреть как падает напряжение на ней. Но странно почему, в винде не отображается снижение процентов заряда аккумулятора? Вернее оно конечно есть, но плавное снижение до около 78% и затем выключение. На сколько я понимаю проценты должны быстро падать и только потом отрубаться. Но это ладно, тут я ещё поковыряю.
Меня больше интересует вот что - на контроллере коллеги с 1 по 5 отрабатывает, дальше Wire error-3. Если сделать с 1 по 5 затем опять 1, то статус остаётся Sealed. Я так понял что здесь нестандартные ключи. Потому что на моём контроллере Sealed поменялся на Unsealed.
Ну и вопрос к Komandir-у: можно победить этот контроллер? Вы ранее писали чтоб обратились к Вам при подобных ситуациях. Сможете помочь? Повторюсь - чип bq20z453
Вот такое выдал по 1 , насколько я понимаю, sealed это нестандартные ключи, где их откопать?
Тут я не специалист, просто как я понял - если после п.1 пишет Sealed, это ещё не значит что ключи не стандартные. Если после 1,2,3,4,5 опять сделать 1 и остаётся Sealed, то тогда нестандартные.
Как я понял Вы как раз делали с 1 по 5. Так что у Вас не стандартные. У меня такая же проблема.
Батарея на контроллере BQ30Z55, после отсоединения и подсоединения обратно банок, запустил скетч для ESP8266, без ошибок выполнялись пункты 1,2,3,4,5 и 9. Батарея после установки в ноутбук заработала. Решил перепаять провода и опять отключил банки, теперь после установки сбросились на 0 FullChargeCapacity, RemainingCapacity и AbsoluteSOC. Запись в первые два параметра заканчивается ошибкой. Похоже не удается войти в Unseal или Full Access Mode.
Использую ключи
#define unseal_key_1 0x0414
#define unseal_key_2 0x3672
#define full_access_key_1 0xFFFF
#define full_access_key_2 0xFFFF
#define pf_clear_key_1 0x2673
#define pf_clear_key_2 0x1712.
Самое главное не понятно, почему первый раз при отсоединении банок удалось запустить батарею, а во второй раз не получается.
Komandir, Всё, удалось добиться RemainingCapacity: 0 mAh. Как можно связаться с Вами? на почту__ скиньте контакт. Там договоримся о времени. Вы кстати в каком часовом поясе живёте?
Я-то сам врятли осилю)) Такие слова как "сниферить" для меня в диковинку)) Может на досуге и попробую разобрать что к чему, но иллюзий особых не питаю.
Как я понял: У Komandir-а был отработанный на другом чипе алгоритм по вытаскиванию ключа. Конкретно мой чип (с тремя знаками после буквы Z) под этот алгоритм не подошёл. Чтобы разобраться необходимо через отдельную софтину подключаться, смотреть что чип шлёт в ответ на определённые команды, анализировать и пытаться вытянут от-туда ключ. Как я уже сказал - для меня это практически тёмный лес. А делать это удалённо - это тоже так себе занятие ))
Возможно в Вашем случае всё по другому - у Вас вон и чип двузначный))
Я-то сам врятли осилю)) Такие слова как "сниферить" для меня в диковинку)) Может на досуге и попробую разобрать что к чему, но иллюзий особых не питаю.
Как я понял: У Komandir-а был отработанный на другом чипе алгоритм по вытаскиванию ключа. Конкретно мой чип (с тремя знаками после буквы Z) под этот алгоритм не подошёл. Чтобы разобраться необходимо через отдельную софтину подключаться, смотреть что чип шлёт в ответ на определённые команды, анализировать и пытаться вытянут от-туда ключ. Как я уже сказал - для меня это практически тёмный лес. А делать это удалённо - это тоже так себе занятие ))
Возможно в Вашем случае всё по другому - у Вас вон и чип двузначный))
А не wireshark-ком ли сниферили и куда потом подставляли ключи, есть наводка?
ps. Сниферил я раньше много, но в телефонии.Похоже, тут подобное),дайте наводку
Это их стандартная "отмазка" на нестандартное поведение банок. Плюс до кучи некоторые еще и предохранитель пережигают, что бы не заряжалась больше батарея.
Это их стандартная "отмазка" на нестандартное поведение банок. Плюс до кучи некоторые еще и предохранитель пережигают, что бы не заряжалась больше батарея.
ответил выше, на банках напряжение есть
Подскажите пожалуйста, этот скетч на node mcu v3 будет работать? (контроллер на батарее bq20z75)
Спасибо
Подскажите пожалуйста, этот скетч на node mcu v3 будет работать? (контроллер на батарее bq20z75)
Спасибо
у меня работает, ядро 3.0.2, да, периодически валится стек, но работает, как работает описал выше, подключал дюпонами, штыри-гнёзда
Немного правленый код под ESP8266:
Это всё, что смог считать из своей батареи, я так понял некоторые ячейки не читаются:
ua6em начиная с 21 строки результаты одинаковы 8E00 я бы на них не полагался.
Вам надо изучить даташит на свой чип и по нему уже смотреть что какие биты означают.
Я делал по даташиту bq20z95 и далеко не факт что флаги на вашем чипе находятся в тех же битах.
ua6em начиная с 21 строки результаты одинаковы 8E00 я бы на них не полагался.
Вам надо изучить даташит на свой чип и по нему уже смотреть что какие биты означают.
Я делал по даташиту bq20z95 и далеко не факт что флаги на вашем чипе находятся в тех же битах.
я догадывался, что что-то не так )))
.
..
Подскажите,я правильно понял,что сами батареи отпаивать не нужно?ещё вопрос,если отпаять Батареи на время прошивки,резисторы тоже уже не потребуются? Найти нужные резисторы в закромах сложнее чем Ардуино оказалось)).
.
Кстати, если править библиотеку Wire.h может лучше так?
Тогда в начале скетча указываем нужную длину буфера:
Наконец дошли руки и у меня посмотреть батарею, плата NODE MCU LOLIN ESP8266
Подключение прямое -
// Версия для ESP8266 ядро 3.0.2
// распиновка
// GND - p-
// SDA - CLK (D1)
// SCL - DAT (D2)
Pack Info...
DesignCapacity: 4400 mAh
FullChargeCapacity: 631 mAh
CycleCount: 140
Date: 2009.6.1
DesignVoltage: 11100 mV
ManufName: SMP-LGC2.2
DeviceName: DELL Y823G961
SerialNumber: 0DD9 Hex
ChargingCurrent: 0 mA
ChargingVoltage: 12600 mV
DeviceChemistry: LION
Temperature: 28.10 C
Voltage: 10223 mV
Current: 0 mA
RelativeSOC: 0 %
AbsoluteSOC: 0 %
RemainingCapacity: 0 mAh
Wire error - 3
В схеме подключения для node MCU нужно с подключать
d1,d2 к 3.3v через резисторы?
В схеме подключения для node MCU нужно с подключать d1,d2 к 3.3v через резисторы?
не 3.3 вольтам а к GND (G), без резисторов, напрямую, скетч поправил, теперь в стеке не сыпется
В схеме подключения для node MCU нужно с подключать d1,d2 к 3.3v через резисторы?
не 3.3 вольтам а к GND (G), без резисторов, напрямую, скетч поправил, теперь в стеке не сыпется
В случае с NodeMCU в это схеме какие резисторы вообще нужны?
grigory.dm http://arduino.ru/forum/proekty/obshchenie-s-batareyami-ot-noutbuka#comment-588931
grigory.dm http://arduino.ru/forum/proekty/obshchenie-s-batareyami-ot-noutbuka#comment-588931
по ESP8266 -
from reversed voltages with diodes.
ua6em когда человек не знает где что на выводах батареи - можно и +-12 получить в зависимости от "везения"
grigory.dm http://arduino.ru/forum/proekty/obshchenie-s-batareyami-ot-noutbuka#comment-588931
по ESP8266 -
from reversed voltages with diodes.
Хорошо, что есть защита, но это не даёт ответа , какое напряжение на SDA и SCL может быть у батареи HP, не просто же так в схеме на первой страничке этой ветки схема с резисторами.
Кстати, тоже никак не найду точного ответа, к каким контактам на батарее HP подключать SDA и SCL. Вижу подписи: P+, D, C, ID, B/I, P-
Помогите пожалуйста
Кстати, тоже никак не найду точного ответа, к каким контактам на батарее HP подключать SDA и SCL. Вижу подписи: P+, D, C, ID, B/I, P-
Помогите пожалуйста
может так:
P- - GND
D - SCL (D2)
C - SDA (D1)
D1 и D2 можно менять местами, я заливал сначала сканер I2C и подобрал пины I2C по ответу контроллера батареи
grigory.dm будет очень правильным - схему ноутбука изучить.
Можно загуглить распиновку по маркировке батареи или модели ноута.
Ну и вскрытие - там сразу можно найти GND +BATT
Кстати, тоже никак не найду точного ответа, к каким контактам на батарее HP подключать SDA и SCL. Вижу подписи: P+, D, C, ID, B/I, P-
Помогите пожалуйста
может так:
P- - GND
D - SCL (D2)
C - SDA (D1)
D1 и D2 можно менять местами, я заливал сначала сканер I2C и подобрал пины I2C по ответу контроллера батареи
Только таким методом получилось понять:
SDA - Data(D)
SCL - CLOCK(C)
Хапешники не стали выбумывать)
ЩАс попробую законнектиться
Парни, может что-то не то делаю, но где смотреть вывод с данными ?В мониторе пусто , в консоли только отчёт о аплоаде:
открыть монитор порта после загрузки, нажать кнопку RESET
Тут я не специалист, просто как я понял - если после п.1 пишет Sealed, это ещё не значит что ключи не стандартные. Если после 1,2,3,4,5 опять сделать 1 и остаётся Sealed, то тогда нестандартные.
Как я понял Вы как раз делали с 1 по 5. Так что у Вас не стандартные. У меня такая же проблема.
Сomandir помоги пожалуйста, вроде выше кому эту проблему решили
grigory.dm после 3 4 что в первом что про состояние Sealed/Unsealed ?
grigory.dm после 3 4 что в первом что про состояние Sealed/Unsealed ?
После 3:
Мне было лень менять банки на резисторы - и меня не доставали TCA TDA.
Резисторы нужны что бы RemainCapacity был 0 и можно было делать сброс пароля обходным путем.
Но если батарея ещё дышит - RemainCapacity=0 можно получить нагрузив батарею лампой или мощными резисторами.
До нуля нагрузить может?
Sealed - У Вас ключи не дефолтные !
Можем испытать "раскуренный" алгоритм, если Вы готовы.
Komandir, можете уточнить про это?у меня как раз такая история
Батарея на контроллере BQ30Z55, после отсоединения и подсоединения обратно банок, запустил скетч для ESP8266, без ошибок выполнялись пункты 1,2,3,4,5 и 9. Батарея после установки в ноутбук заработала. Решил перепаять провода и опять отключил банки, теперь после установки сбросились на 0 FullChargeCapacity, RemainingCapacity и AbsoluteSOC. Запись в первые два параметра заканчивается ошибкой. Похоже не удается войти в Unseal или Full Access Mode.
Использую ключи
#define unseal_key_1 0x0414
#define unseal_key_2 0x3672
Andrey_2000 BQ30Z55 - это совсем другой контроллер !!!
grigory.dm в том случае не все получилось ... можем у вас попробовать
Andrey_2000 BQ30Z55 - это совсем другой контроллер !!!
grigory.dm в том случае не все получилось ... можем у вас попробовать
Там сгорело или просто не получилось?)
Так то готов.
У меня еще вопрос, нельзя ли на ардуино написать прокси для доступа по I2C программы be2works?в том проекте кажется решен вопрос с обходом блокировки.
grigory.dm в том случае не все получилось ... можем у вас попробовать
Komandir можно и мне поучаствовать в этом мероприятии?
grigory.dm ничего не сгорело, но и блокировка не снялась. Там был чип с прошивкой не от TI видимо.
Для теста надо разрядить до RemainingCapacity = 0 (или резисторы вместо банок + внешнее питание).
Ну и доступ через Anydesk или TeamViewer ...
Резисторы - какое сопротивление? мощность?
Внешнее питание - какое напряжение? куда цеплять?
Все берут резисторы по 470 ом и источник 9 - 10 вольт (включать на крайние - и + сборки)
Hy6yk я нигде не видел что у вас по 1 выдаёт - может там и так RemainingCapacity = 0
У меня еще вопрос, нельзя ли на ардуино написать прокси для доступа по I2C программы be2works?в том проекте кажется решен вопрос с обходом блокировки.
Видел что вроде кто то сделал для stm32, но я не пользовал и код не открытый
Hy6yk я нигде не видел что у вас по 1 выдаёт - может там и так RemainingCapacity = 0
Писал RemainingCapacity: 1139 mAh.
Но это когда я цеплял живые банки. Правильно ли я понимаю, что можно подпаять три дохлые 18650 у которых напряжение 0 вольт или близкое к тому?
Ниже вся информация которая выдавалась по 1
Можно и с этими - разрядите батарею через автомобильную лампочку до ~3 вольт на банку
Komandir, Всё, удалось добиться RemainingCapacity: 0 mAh. Как можно связаться с Вами? на почту__ скиньте контакт. Там договоримся о времени. Вы кстати в каком часовом поясе живёте?
nubuc@YANDEX.ru и nubuk@YANDEX.ru не приняли почту
Для интересующихся: Фокус не удался. Контроллер аккумулятора Samsung (Rev 1.0) на чипе bq20z453 дистанционно разлочить не удалось.
Для интересующихся: Фокус не удался. Контроллер аккумулятора Samsung (Rev 1.0) на чипе bq20z453 дистанционно разлочить не удалось.
Я так понимаю, ждём следующих попыток?)
Comandir, есть желание попробовать на bq20z75 от HP или сначала нужно проанализировать что не так?
Проверить можно. Если бы у меня были платы для статистики, то может родился бы и общий алгоритм ... На моих 2 платах работает.
Я так понимаю, ждём следующих попыток?)
Я-то сам врятли осилю)) Такие слова как "сниферить" для меня в диковинку)) Может на досуге и попробую разобрать что к чему, но иллюзий особых не питаю.
Как я понял: У Komandir-а был отработанный на другом чипе алгоритм по вытаскиванию ключа. Конкретно мой чип (с тремя знаками после буквы Z) под этот алгоритм не подошёл. Чтобы разобраться необходимо через отдельную софтину подключаться, смотреть что чип шлёт в ответ на определённые команды, анализировать и пытаться вытянут от-туда ключ. Как я уже сказал - для меня это практически тёмный лес. А делать это удалённо - это тоже так себе занятие ))
Возможно в Вашем случае всё по другому - у Вас вон и чип двузначный))
Я так понимаю, ждём следующих попыток?)
Я-то сам врятли осилю)) Такие слова как "сниферить" для меня в диковинку)) Может на досуге и попробую разобрать что к чему, но иллюзий особых не питаю.
Как я понял: У Komandir-а был отработанный на другом чипе алгоритм по вытаскиванию ключа. Конкретно мой чип (с тремя знаками после буквы Z) под этот алгоритм не подошёл. Чтобы разобраться необходимо через отдельную софтину подключаться, смотреть что чип шлёт в ответ на определённые команды, анализировать и пытаться вытянут от-туда ключ. Как я уже сказал - для меня это практически тёмный лес. А делать это удалённо - это тоже так себе занятие ))
Возможно в Вашем случае всё по другому - у Вас вон и чип двузначный))
А не wireshark-ком ли сниферили и куда потом подставляли ключи, есть наводка?
ps. Сниферил я раньше много, но в телефонии.Похоже, тут подобное),дайте наводку
Проверить можно. Если бы у меня были платы для статистики, то может родился бы и общий алгоритм ... На моих 2 платах работает.
на каких платах работает?
Снифер это что то типа Saleae Logic
Я сохранил весь протокол обмена по i2c между be2works и bq20z955 в момент снятия разлочки.
Разобрался что к чему и повторил на ардуино. У меня сейчас две платы bq20z955 и на обеих это срабатывает.