SmartMon v2.7ex Board is a extension board fully compatible with Arduino, ESP8266, ARM, PIC & other available MCu's out there. As long as your MCU/Dev Board has I2C Bus capabilities you are good to go!
It is probably one of the easiest ways to create your own Voltage/Current and Power consumption monitoring system for your Projects, devices, batteries, power supplies and many more!
UPDATE !! SmartMon v2.7Ex is available also on Tindie Store !
Previous Articles:
What we will need:
- ESP8266 nEXT EVO Board
- SmartMon v2.7Ex Board
- For programming and uploading the driver and the software we will continue to use the LuaUploader as before.
Software implementation:
1. INIT Data
id = 0
sda = 2
scl = 1
devaddr = 0x40 -- A0,A1 = GND
voltage = 0
current = 0
power = 0
peng = 0
eng = 0
2. I2C Init function
function init_i2c()
i2c.setup(id, sda, scl, i2c.SLOW)
end
3. INA219 Reset function
function reset()
write_reg(0x00, 0xFFFF)
end
4. Read register function
--read from reg_addr content of dev_addr
function read_reg_str(reg_addr)
i2c.start(id)
i2c.address(id, devaddr, i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.stop(id)
tmr.delay(1)
i2c.start(id)
i2c.address(id, devaddr, i2c.RECEIVER)
c=i2c.read(id, 16) -- read 16bit val
i2c.stop(id)
return c
end
5. Read register function - 16bit--returns 16 bit int
function read_reg_int(reg_addr)
i2c.start(id)
i2c.address(id, devaddr, i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.stop(id)
tmr.delay(1)
i2c.start(id)
i2c.address(id, devaddr, i2c.RECEIVER)
local c = i2c.read(id, 16) -- read 16bit val
i2c.stop(id)
--convert to 16 bit int
local val = bit.lshift(string.byte(c, 1), 8)
local val2 = bit.bor(val, string.byte(c, 2))
return val2
end
6. Write register function
function write_reg(reg_addr, reg_val)
print("writing reg:" .. reg_addr .. ", reg_val:" .. reg_val)
i2c.start(id)
i2c.address(id, devaddr, i2c.TRANSMITTER)
local bw = i2c.write(id, reg_addr)
local bw2 = i2c.write(id, bit.rshift(reg_val, 8))
local bw3 = i2c.write(id, bit.band(reg_val, 0xFF))
i2c.stop(id)
end
7. Calibration / settings function
function setCAL_reg()
maxVoltage = 32
maxCurrentmA = 10000
write_reg(0x05,3950) --CALIBRATE FOR YOUR rshunt & stuff
local config = 15391
write_reg(0x00, config)
end
8. Read Current values (mA)
function getCurrent_mA()
local valueInt = read_reg_int(0x04)
return valueInt
end
9. Read Bus Voltage (V)
function getBusVoltage_V()
local valueInt = read_reg_int(0x02)
-- Shift to the right 3 to drop CNVR and OVF and multiply by LSB = 4
local val2 = bit.rshift(valueInt, 3)
local val2 = val2 * 4
return val2 * 0.001
end
10. Read Shunt resistor voltage drop (mV)
function getShuntVoltage_mV()
-- Gets the raw shunt voltage (16-bit signed integer, so +-32767)
local valueInt = read_reg_int(0x01)
return valueInt * 0.01
end
11. Read Bus Power (W)
function getBusPowerWatts()
local valueInt = read_reg_int(0x03)
return valueInt*20*0.001
end
12. Print read values
function print_values()
volt = getBusVoltage_V()
print("\nVoltage : " .. volt.." V")
current = getCurrent_mA()/1000
power = getBusPowerWatts()
if (current > 65 ) then
print("ERR 00.23")
current = 0
power = 0
end
eng = eng + power/60
print("Current : " .. string.format("%6.3f",current) .." A")
print("Power : " .. power .." W\n")
print("Energy : " .. string.format("%6.3f",eng) .." Wh\n")
end
MAIN Program
---- INA216 Module TEST
init_i2c()
setCAL_reg()
print_values()
If you want to read and update values every minute add function from below:
tmr.alarm( 1, 60000, 1, function()You can stop your running timer anytime with:
print_values()
sendDataTh()
end)
tmr.stop(1)
That's all for today, next time we will more further and we will go thru a full SmartMon Battery Monitor System + Thinkspeak data upload example.
All schematics, boards, software and articles released by ESP8266-Projects.com are licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
No comments:
Post a Comment