راه اندازی ماژول max1704x برای اندازه گیری درصد شارژ باطری

2 سال قبل
649 بازدید

0

 

با سلام و احترام

لطفا در صورت امکان ماژول max1704x رو تست کنید و آموزش راه اندازی رو بذارید. من قصد دارم یا ماژول esp8266 راه اندازی کنم برای اندازه گیری سطح ولتاژ باطری.

 

باتشکر

20 اردیبهشت 01 در 07:08
آرش شیخله
1

افزودن دیدگاه

1 پاسخ ثبت شده است
0

با سلام

بررسی شد

مشکل این ماژول ها در کتابخانه می باشد در صورتی که از کتابخانه LiFuelGauge استفاده میکنید نیاز به تغییراتی در کد کتابخانه دارید که این سنسور راه‌اندازی بشود.

مورد اول :

آدرس I2C سنسور با کتابخانه متفاوت می باشد. در کتابخانه فایل LiFuelGauge.h را باز کنید و خط 

const uint8_t MAX1704X_ADDR = 0x36;

به 

const uint8_t MAX1704X_ADDR = 0x32;

تغییر بدهید. تا میکروکنترلر ماژول را شناسایی بکند.

در صورتی که باز هم شناسایی نشد از برنامه I2C Scanner استفاده کنید تا آدرس ماژول خود را پیدا کنید و در خط بالا قرار بدهید.

در این مرحله امکان دارد اطلاعات دریاف شده دارای خطا باشد و مقداری Offset داشته باشد. برای حل این مشکل فایل LiFuelGauge.cpp را باز کنید.

در بخش 

double LiFuelGauge::getVoltage()
{
	Wire.beginTransmission(MAX1704X_ADDR);
	Wire.write(MAX1704X_VCELL_ADDR);
	Wire.endTransmission(false);
	Wire.requestFrom(MAX1704X_ADDR, (uint8_t)2);
	return ( (Wire.read() << 4) + (Wire.read() >> 4) ) * 0.00125 * _ic;
}

به

double LiFuelGauge::getVoltage()
{
	digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
	delay(10);		   // wait for a second
	digitalWrite(2, LOW);  // turn the LED off by making the voltage LOW
	delay(10);
	Wire.beginTransmission(MAX1704X_ADDR);
	Wire.write(MAX1704X_VCELL_ADDR);
	Wire.endTransmission(false);
	Wire.requestFrom(MAX1704X_ADDR, (uint8_t)2);
	float value = ((Wire.read() << 4) + (Wire.read() >> 4)) * 0.00107 * _ic;
	Wire.endTransmission();
	return value;
}

تغییر بدهید (مقدار 0.00125 به 0.00107 تغییر میکند) بسته به ماژول خود این مقدار امکان دارد مقداری بالا یا پایین بشود بهتر هست مقداری که مولتی متر شما اندازه گیری می کند را با خروجی بررسی کنید و در صورت مغایرات با تغییر این ضریب این 2 مقدار را یکی کنید.

یک نکته دیگر که باید توجه کنید یک پایه QST را به یکی از پایه ها وصل کنید و در کد Setup خود pinMode(2, OUTPUT); را قرار بدهید که آن پایه را به صورت خروجی تعریف کنید و شماره پایه مورد نظر خود را نیز در کد قرار بدهید چون برای چند لحظه باید این پایه HIGH و LOW بشود تا اطلاعات مربوط به ولتاژ اندازه گیری بشود.

سپس 

double LiFuelGauge::getSOC()
{
	Wire.beginTransmission(MAX1704X_ADDR);
	Wire.write(MAX1704X_SOC_ADDR);
	Wire.endTransmission(false);
	Wire.requestFrom(MAX1704X_ADDR, (uint8_t)2);
	return Wire.read() + (double) Wire.read() / 256;
}

به

double LiFuelGauge::getSOC()
{
	Wire.beginTransmission(MAX1704X_ADDR);
	Wire.write(MAX1704X_SOC_ADDR);
	Wire.endTransmission(false);
	Wire.requestFrom(MAX1704X_ADDR, (uint8_t)2);
	return (Wire.read() + (double)Wire.read() / 256)*0.5;
}

در این بخش مقدار SOC امکان دارد نسبت به حالت عادی دارای ضریب باشد که در این جا با ضرب کل خروجی در 0.5 مقدار را نزدیک به واقعیت کرده ام.

کد اصلی مورد استفاده این کتابخانه به صورت زیر می باشد و از ESP32 برای راه اندازی استفاده شده است.

#include <Wire.h>
#include <LiFuelGauge.h>

// LiFuelGauge constructor parameters
// 1. IC type, MAX17043 or MAX17044
// 2. Number of interrupt to which the alert pin is associated (Optional)
// 3. ISR to call when an alert interrupt is generated (Optional)
//
// Creates a LiFuelGauge instance for the MAX17043 IC
// and attaches lowPower to INT0 (PIN2 on most boards, PIN3 on Leonardo)
LiFuelGauge gauge(MAX17043);

// A flag to indicate a generated alert interrupt
volatile boolean alert = false;


void setup()
{
  Serial.begin(9600); // Initializes serial port
  // Waits for serial port to connect. Needed for Leonardo only
  while ( !Serial ) ;

  gauge.reset();  // Resets MAX17043
  pinMode(2, OUTPUT);
  delay(200);  // Waits for the initial measurements to be made
}

void loop()
{

  Serial.print("SOC: ");
  Serial.print(gauge.getSOC());  // Gets the battery's state of charge
  Serial.print("%, VCELL: ");
  Serial.print(gauge.getVoltage());  // Gets the battery voltage
  Serial.println('V');
  
  delay(200);
}

توجه:

پایه VCC روی ماژول را به تغذیه 3.3 یا 5 ولت میکرو خود وصل نکنید چون این پایه با مثبت باتری مشترک می باشد و در برد های NodeMCU یا ESP32 می توانید به VIN وصل کنید اما برای برد های آردوینو که با 5 ولت کار میکنند دچار مشکل می شوید و باید به یک ماژول بوستر وصل کنید و سپس به VIN آردوینو وصل کنید. در برد های NodeMCU و ESP32 هم پیشنهاد می کنم از یک دیود به سمت میکرو استفاده کنید (این نکته را نیز در نظر بگیرید که رگوراتور داخلی NodeMCU و ESP32 از نوع AMS1117 می باشد و ولتاژ پایین‌تر از 3.9 الی 3.8 را نمی تواند به 3.3 تبدیل کند و به زیر 3.3 ولت می رسد از این رو میکرو شما را خاموش میکند برای این مورد نیز پیشنهاد میکنم از بوستر استفاده کنید. یا از رگوراتور های LDO استفاده کنید کاهش ضریب پایین دارند.

21 خرداد 01 در 07:51
محمد دمیرچی
3630

با سلام. ممنون از شما بابت راهنمایی مفصلی که زحمت کشیدید. ایشالا تست میکنم و نتیجه رو همینجا اعلام میکنم  – آرش شیخله 01-03-22 در 11:01

خواهش میکنم  – محمد دمیرچی 01-03-29 در 10:41

افزودن دیدگاه


انجمن کافه‌ربات © 1400