But in oled:write_reg, it does not know self, so I cannot use self.id (I put 0 manually)
Can you help solve this last issue?
btw
I took out spi in my work, I guess it can return since I needed to see it work cleanly, and I am guessing you checked it out before adding it.
Attachments
(6.59 KiB) Downloaded 342 times
function oled:command_i2c(...)
for i,cmd in ipairs(arg) do
-- print ('in command='..self.id..",".. self.addr..",0,"..cmd)
self.write_reg(self.id, self.addr, 0, cmd)
end
end
Should be:
function oled:command_i2c(...)
for i,cmd in ipairs(arg) do
-- print ('in command='..self.id..",".. self.addr..",0,"..cmd)
self:write_reg(self.addr, 0, cmd)
end
end
You have to have the colon on both the call and the definition, or pass the table explicitly, like this:
function oled:command_i2c(...)
for i,cmd in ipairs(arg) do
-- print ('in command='..self.id..",".. self.addr..",0,"..cmd)
self.write_reg(self, self.addr, 0, cmd)
end
end
Sorry, it looks like I left that mistake in there, proving the maxim "All code is broken until proven otherwise".
Can anyone help to realease some memory when require module to interface TCS34725 color sensor with this memory optimization technik?
tcs34725.lc 3548 bytes
> = node.heap()
22328
> require("tcs34725")
> = node.heap()
13640
This module is consuming about 9kB of memory
Any way to do some memory optimization?
Have done complile and also saved some memory instead of dofile
The code for tcs34725 is here:
--TCS34725 Color Sensor Example using Lua on Esp8266 by Craig Scott cjscottcjscott@gmail.com
-- Based on work by zeroday & sancho among many other open source authors
id=0 -- need this to identify (software) IC2 bus?
io_pin= {[0]=3,[2]=4,[4]=2,[5]=1,[12]=6,[13]=7,[14]=5} -- this maps GPIO numbers to internal IO references
sda=io_pin[0]-- connect to pin GPIO0
scl=io_pin[2] -- connect to pin GPIO2
addr=0x29 -- the I2C address of our device
CDATAL=0x14 -- Clear channel data
CDATAH=0x15
RDATAL=0x16 -- Red channel data
RDATAH=0x17
GDATAL=0x18 -- Green channel data
GDATAH=0x19
BDATAL=0x1A -- Blue channel data
BDATAH=0x1B
ENABLE=0x00
ENABLE_AEN=0x02 --RGBC Enable - Writing 1 actives the ADC, 0 disables it
ENABLE_PON=0x01 -- Power on - Writing 1 activates the internal oscillator, 0 disables it
INTEGRATIONTIME_2MS=0xFF --< 2.4ms - 1 cycle - Max Count: 1024
INTEGRATIONTIME_24MS=0xF6 --< 24ms - 10 cycles - Max Count: 10240
INTEGRATIONTIME_50MS=0xEB --< 50ms - 20 cycles - Max Count: 20480
INTEGRATIONTIME_101MS=0xD5 --< 101ms - 42 cycles - Max Count: 43008
INTEGRATIONTIME_154MS=0xC0 --< 154ms - 64 cycles - Max Count: 65535
INTEGRATIONTIME_700MS=0x00 --< 700ms - 256 cycles - Max Count: 65535
GAIN_1X=0x00 --< No gain
GAIN_4X=0x01 --< 2x gain
GAIN_16X=0x02 --< 16x gain
GAIN_60X=0x03 --< 60x gain
ATIME=0x01 --< Set the Integration Time
CONTROL=0x0F --< Set the gain level
REGISTER_ID=0x12 -- register for Device ID 0x44 for TCS34725
COMMAND_BIT=0x80 -- Used for reads and writes
function initialise(addr)
-- initialize i2c with our id and pins in slow mode
i2c.setup(id,sda,scl,i2c.SLOW)
result=read_reg(addr,REGISTER_ID)
if (string.byte(result)==0x44) then
print("Found TCS34725")
end
end
-- user defined function: read from reg_addr content of dev_addr
function read_reg(dev_addr, reg_addr)
reg_addr=bit.bor(COMMAND_BIT,reg_addr)
i2c.start(id)
i2c.address(id, dev_addr ,i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.stop(id)
i2c.start(id)
i2c.address(id, dev_addr,i2c.RECEIVER)
c=i2c.read(id,1)
i2c.stop(id)
return c
end
function write_reg(dev_addr, reg_addr, reg_val)
reg_addr=bit.bor(COMMAND_BIT,reg_addr)
i2c.start(id)
i2c.address(id, dev_addr, i2c.TRANSMITTER)
i2c.write(id, reg_addr)
i2c.write(id, reg_val)
i2c.stop(id)
end
function getRawData ()
clear_l = string.byte(read_reg(addr,CDATAL))
clear_h = string.byte(read_reg(addr,CDATAH))
red_l = string.byte(read_reg(addr,RDATAL))
red_h = string.byte(read_reg(addr,RDATAH))
green_l = string.byte(read_reg(addr,GDATAL))
green_h = string.byte(read_reg(addr,GDATAH))
blue_l = string.byte(read_reg(addr,BDATAL))
blue_h = string.byte(read_reg(addr,BDATAH))
clear =bit.bor(bit.lshift(clear_h,8),clear_l)
red=bit.bor(bit.lshift(red_h,8),red_l)
green=bit.bor(bit.lshift(green_h,8),green_l)
blue=bit.bor(bit.lshift(blue_h,8),blue_l)
-- Set a delay for the worst case integration time
tmr.delay(700)
return clear,red,green,blue
end
function enable()
write_reg(addr,ENABLE,ENABLE_PON)
tmr.delay(30)
write_reg(addr, ENABLE, bit.bor(ENABLE_PON,ENABLE_AEN))
end
function disable()
reg=0
reg=read_reg(addr,ENABLE)
tmr.delay(3)
write_reg(ENABLE, bit.band(reg, bit.bnot(bit.bor(ENABLE_PON,ENABLE_AEN))))
end
Interaction with module after require("tcs34725") is:
initialise(addr)
write_reg(addr,ATIME, INTEGRATIONTIME_50MS)
write_reg(addr,CONTROL, GAIN_1X)
enable()
getRawData()
print(red,green,blue,clear)
Regards,Vito