ROLE = {0x00}
SRCPORT = {0x41,0x9c}
DHCP = {0x00}
SRCIP = {192,168,0,35}
GATEWAY = {192,168,0,1}
SUBNET = {255,255,255,0}
DESPORT = {0,0}
DESIP = {0,0,0,0}
SysSensorHeatTime = 5
CH9121_RSTI = "D6"
CH9121_CFG = "D5"
RedLedTimeMsCnt = 0
GreenLedTimeMsCnt = 0
DelayTimeMsCnt = 0
EthLostContactTimeMsCnt = 0
function ModbusToJson()
LIB_ModbusToJsonConfig(150)
LIB_ModbusToJsonAdd(0x0000,"S_AB",1,"Humi")
LIB_ModbusToJsonAdd(0x0001,"S_AB",1,"Temp")
LIB_ModbusToJsonSend("BAUDRATE_4800","NoneParity","StopBit_1","03",0x01,1000,100)
end
function WaitAndEthSend(dev)
while true do
Finish,Data,Err = LIB_ModbusToJsonFinishCheck()
if Finish == 1 then
if Data ~= "null" then
RedLedTimeMsCnt = 100
end
MbToJsonStr = string.format("{\"Dev\":\"%s\",\"Data\":%s,\"Err\":%s}", dev, Data, Err)
LIB_Uart0Send(LIB_StrToTab(MbToJsonStr))
break
end
end
end
function Ch9121Write(cmd, data)
LIB_GpioToggle("D11")
SendData = {0x57,0xab}
SendData[#SendData+1] = cmd
for i=1,#data do
SendData[#SendData+1] = data[i]
end
LIB_Uart0Send(SendData)
LIB_DelayMs(100)
u0_flag,u0_tab = LIB_Uart0Recv()
if u0_flag == 1 and u0_tab[1] == 0xaa then
print(string.format("Ch9121 0x%02x wr ok, Send=",cmd)..LIB_HexTabToHexStr(SendData).."\r\n")
else
print(string.format("Ch9121 0x%02x wr fail, Send=",cmd)..LIB_HexTabToHexStr(SendData).."\r\n")
end
end
function Ch9121Read(cmd)
LIB_GpioToggle("D11")
SendData = {0x57,0xab}
SendData[#SendData+1] = cmd
LIB_Uart0Send(SendData)
LIB_DelayMs(100)
u0_flag,u0_tab = LIB_Uart0Recv()
if u0_flag == 1 then
print(string.format("Ch9121 0x%02x rd ok, Recv=",cmd)..LIB_HexTabToHexStr(u0_tab).."\r\n")
else
print(string.format("Ch9121 0x%02x rd fail, Send=",cmd)..LIB_HexTabToHexStr(SendData).."\r\n")
end
end
function Ch9121Init()
LIB_GpioOutputConfig(CH9121_RSTI,"STANDARD")
LIB_GpioOutputConfig(CH9121_CFG,"STANDARD")
LIB_GpioWrite(CH9121_RSTI,0)
LIB_DelayMs(100)
LIB_GpioWrite(CH9121_RSTI,1)
LIB_DelayMs(200)
LIB_GpioToggle("D11")
LIB_GpioWrite(CH9121_CFG,0)
LIB_DelayMs(100)
LIB_DelayMs(500)
SendData = {0x55,0xaa,0x5a}
LIB_Uart0Send(SendData)
cnt = 0
while cnt < 500 do
LIB_DelayMs(1)
LIB_GpioToggle("D11")
cnt = cnt + 1
u0_flag,u0_tab = LIB_Uart0Recv()
if u0_flag == 1 and u0_tab[1] == 0xa5 then
break
end
end
if cnt >= 500 then
print("Ch9121 init fail, system reset!")
LIB_GpioWrite("D3",0)
LIB_GpioToggle("D11")
LIB_DelayMs(3000)
LIB_SystemReset()
end
SendData = {0xa5}
LIB_Uart0Send(SendData)
cnt = 0
while cnt < 500 do
LIB_DelayMs(1)
LIB_GpioToggle("D11")
cnt = cnt + 1
u0_flag,u0_tab = LIB_Uart0Recv()
if u0_flag == 1 and u0_tab[1] == 0xa5 then
break
end
end
if cnt >= 500 then
print("Ch9121 init fail, system reset!")
LIB_GpioWrite("D3",0)
LIB_GpioToggle("D11")
LIB_DelayMs(3000)
LIB_SystemReset()
end
LIB_DelayMs(20)
mac_ok,mac = Ch9121Read(0x81)
if mac_ok == 1 and #mac == 6 then
print("Mac:"..LIB_HexTabToHexStr(mac))
end
Ch9121Write(0x10,ROLE)
if ROLE[1] == 0x01 or ROLE[1] == 0x03then
Ch9121Write(0x15,DESIP)
Ch9121Write(0x16,DESPORT)
end
if DHCP[1] ~= 0x01 then
Ch9121Write(0x11,SRCIP)
Ch9121Write(0x12,SUBNET)
Ch9121Write(0x13,GATEWAY)
end
Ch9121Write(0x14,SRCPORT)
Ch9121Write(0x23,{0x01,0x00,0x00,0x00})
Ch9121Write(0x24,{0x00})
Ch9121Write(0x25,{0x00,0x02,0x00,0x00})
Ch9121Write(0x26,{0x01})
Ch9121Write(0x33,DHCP)
Ch9121Write(0x0d,{})
Ch9121Write(0x0e,{})
LIB_GpioToggle("D11")
LIB_DelayMs(200)
LIB_GpioWrite(CH9121_CFG,1)
Ch9121Write(0x5e,{})
LIB_DelayMs(50)
end
function EthProcess()
u0_flag,u0_tab = LIB_Uart0Recv()
if u0_flag == 1 then
GreenLedTimeMsCnt = 100
EthLostContactTimeMsCnt = 0
if u0_tab[1] == 0x7B and u0_tab[#u0_tab] == 0x7D then
JsStr = LIB_TabToStr(u0_tab)
dev = LIB_JsonParse(JsStr, "$.Dev", "String")
if dev == "TH" then
ModbusToJson()
WaitAndEthSend("TH")
end
else
print("Eth recv data format error!")
end
end
end
function EthKeepAlive()
if EthLostContactTimeMsCnt >= 1800000 then
LIB_SystemReset()
end
end
function DelayS(N)
DelayTimeMsCnt = 0
target_ms = N*1000
while DelayTimeMsCnt <= target_ms do
GC(1)
end
end
function LIB_10msTimerCallback()
DelayTimeMsCnt = DelayTimeMsCnt + 10
EthLostContactTimeMsCnt = EthLostContactTimeMsCnt + 10
LIB_GpioToggle("D11")
if GreenLedTimeMsCnt >= 10 then
GreenLedTimeMsCnt = GreenLedTimeMsCnt - 10
LIB_GpioWrite("D1",0)
else
LIB_GpioWrite("D1",1)
end
if RedLedTimeMsCnt > 10 then
RedLedTimeMsCnt = RedLedTimeMsCnt - 10
LIB_GpioWrite("D0",0)
else
LIB_GpioWrite("D0",1)
end
end
function Init()
LIB_Uart0Config("BAUDRATE_9600")
LIB_GpioOutputConfig("D0","STANDARD")
LIB_GpioOutputConfig("D1","STANDARD")
LIB_GpioOutputConfig("D3","STANDARD")
LIB_GpioWrite("D0",1)
LIB_GpioWrite("D1",1)
LIB_GpioWrite("D3",1)
LIB_GpioOutputConfig("D11","STANDARD")
Ch9121Init()
LIB_Uart1Rs485Config("BAUDRATE_4800","D8")
LIB_10msTimerConfig("ENABLE")
end
Init()
DelayS(SysSensorHeatTime)
while(GC(1) == true)
do
EthProcess()
EthKeepAlive()
end