简介:

​ 该设备是一款基于《ShineBlink 低代码核心模组》开发的《4G智慧养殖盒子》设备,可以采集智慧养殖场景中的各种重要传感数据(环境温湿度,环境二氧化碳浓度、环境光照强度,甲烷气体浓度,氨气气体浓度),以及GPS定位信息获取、UTC时间获取,并可以将这些结果通过4G发送给远端云服务器。

FSB02

功能
  1. 环境温湿度监测
  2. 二氧化碳浓度监测
  3. 光照强度监测
  4. 甲烷检测
  5. 氨气监测
特点
  1. 支持4G cat1通信
  2. 支持TCP/MQTT接入云端
  3. 支持周期休眠和定时上传云端
  4. 可电池供电超低功耗(休眠低至3uA)
  5. 可GPS定位和UTC时间获取
  6. 可TF卡存储200万条excel记录
  7. 可微信小程序远程查看数据(调试用)
  8. 可手机蓝牙App实时查看数据(调试用)
开源资料地址:

FlexLua SmartBox: 包含智慧农业盒子,智慧养殖盒子,智慧气象盒子,智慧机房环境监测盒子项目

源代码
----------------------配置信息开始----------------------
--Part1: 系统配置
SysMode = 0 --0:4G_TCP, 1:4G_Mqtt, 2:4G_ShineBlinkCloud
SysGpsUse = "AUTO_AGPS" --NO_GPS: 不带GPS功能, AUTO_AGPS:带GPS功能
SysWorkInterval = 60 --单位秒,系统采集传感器并发送数据的间隔周期。
--如果SysSleepEn=1,则SysWorkInterval周期间隔内会断电进入低功耗状态
SysSleepEn = 1 --0:不使用低功耗休眠 1:使用。
--SysMyID可任意设定,用作设备的唯一标识,
--也可以用LIB_GetSysUniID()函数获取的芯片唯一ID,形如"761A6617E803F78402"
SysMyID = "Box01" -- SysMyID = LIB_GetSysUniID()
--定义magic number,每次修改将触发序号计数器清零
MagicNumber = 125 --改成任意值即会触发 

--Part2: Tcp参数(SysMode=0时才有用)
TcpServerIp = "122.114.122.174" --需要连接的服务器IP地址
TcpServerPort = 40581 --需要连接的服务器端口号

--Part3: MQTT参数(SysMode=1时才有用)
MqttServerAddr = "mqtt.ctwing.cn" --天翼云MQTT服务器ip地址或域名
MqttServerPort = 1883 --MQTT服务器端口号
MqttClientID = "15589964DTU01" --产品ID"15589964" + 设备编号"DTU01"
MqttUserName = "ShineBlink" --建议填写为用户自己的天翼物联网平台(AIoT)用户名
MqttPassword = "lMmugH2yURmY2uJqkNby-zQHGJ67ngjMAYR6kkGQmko" --采用的一型一密,特征串
MqttSubTopic = "device_control"--订阅用,用于接收服务器下发的数据
MqttPubTopic = "$device_send" --发布用,用于向服务器发送数据(请尽量短一些)

--Part4: Modbus RS485传感器配置
--所有传感器的485通信波特率应统一设置成4800
MbBaudRate = "BAUDRATE_4800" 

--Part5: 通道配置
--ChnEnable用于使能通道n上的传感器供电及运行
Ch1Enable = 1 --0:禁止,1:使能
Ch2Enable = 1 --0:禁止,1:使能
Ch3Enable = 1 --0:禁止,1:使能
Ch4Enable = 1 --0:禁止,1:使能
Ch5Enable = 1 --0:禁止,1:使能
--ChnHeatTime用于设置通道n上的传感器采集数据前的预热时间(单位:秒)
Ch1HeatTime = 3 --当前传感器:温湿度传感器
Ch2HeatTime = 5 --当前传感器:甲烷传感器(上电需预热300秒以上,这里设置成5只是为了方便测试)
Ch3HeatTime = 5 --当前传感器:氨气传感器(上电需预热300秒以上,这里设置成5只是为了方便测试)
Ch4HeatTime = 5--当前传感器:二氧化碳传感器(上电需预热120秒以上,这里设置成5只是为了方便测试)
Ch5HeatTime = 5 --当前传感器:光照传感器

--Part6: 蓝牙配置
BleEn = 1 --0:不使用蓝牙,1:使用。
BleBroadCastName = "Core666" --蓝牙广播名称,只能叫Corexxx,才能被免开发蓝牙App发现

----------------------配置信息结束----------------------

--Modbus读取温湿度传感器数值函数
function GetTempHumi()
	local res = 0
	local temp = 0
	local humi = 0
	local MbAddr = 0x01 --该传感器出厂默认是0x01

	print("Tx:"..LIB_HexTabToHexStr(LIB_MbRtuMasterSendTrans("03", MbAddr, 0x0000, 2)))
	--下发读保持寄存器命令(设备地址=MbAddr,起始地址=0x0000,个数=2)
	--寄存器地址0x0000~0x0001分别为湿度、温度,16位补码形式
	LIB_Uart1BlockSend(LIB_MbRtuMasterSendTrans("03", MbAddr, 0x0000, 2))
	--等待0.2秒的应答时间
    LIB_DelayMs(200)
	--判断刚刚的命令是否收到应答数据
    recv_flag,recv_tab = LIB_Uart1Recv()
    if recv_flag == 1 then
       --解析从机发来的应答数据
		result,r = LIB_MbRtuMasterRecvTrans("03",recv_tab)
		print("Rx:"..LIB_HexTabToHexStr(recv_tab))
		if result > 0 then --获取传感器结果
			res = 1
			humi = LIB_BC("BYTE16_I16", r[1]) --湿度,单位:0.1%
			temp = LIB_BC("BYTE16_I16", r[2]) --温度,单位:0.1℃
		else--打印modbus应答错误码以及应答数据的Hex形式
			err_code = -128 - result 
			print(string.format("err=%d, data=%s",err_code, LIB_HexTabToHexStr(recv_tab)))
		end
	else
		print("TempHumi Sensor unconnected!")
	end
	return res,temp,humi
end

--Modbus读取甲烷传感器数值
function GetCh4()
	local res = 0
	local ch4 = 0
	local MbAddr = 0x01 --该传感器出厂默认是0x01
	
	print("Tx:"..LIB_HexTabToHexStr(LIB_MbRtuMasterSendTrans("03", MbAddr, 2, 1)))
	--下发读保持寄存器命令(设备地址=MbAddr,起始地址=2,读取的寄存器个数=1)
	--CH4传感器寄存器地址0002H为:甲烷值
	LIB_Uart1BlockSend(LIB_MbRtuMasterSendTrans("03", MbAddr, 2, 1))
	--等待0.2秒的应答时间
    LIB_DelayMs(200)
	--判断刚刚的命令是否收到应答数据
    recv_flag,recv_tab = LIB_Uart1Recv()
    if recv_flag == 1 then
		--解析从机发来的应答数据
		result,r = LIB_MbRtuMasterRecvTrans("03",recv_tab)
		print("Rx:"..LIB_HexTabToHexStr(recv_tab))
		if result > 0 then --获取传感器结果
			res = 1
			ch4 = r[1] --单位:1% LEL,范围0-100
		else
			err_code = -128 - result 
			print(string.format("err=%d, data=%s",err_code, LIB_HexTabToHexStr(recv_tab)))
		end
	else
		print("Ch4 Sensor unconnected!")
	end
	return res,ch4
end

--Modbus读取氨气传感器数值
function GetNH3()
	local res = 0
	local nh3
	local MbAddr = 0x01 --该传感器出厂默认是0x01
	
	print("Tx:"..LIB_HexTabToHexStr(LIB_MbRtuMasterSendTrans("03", MbAddr, 2, 1)))
	--下发读保持寄存器命令(设备地址=MbAddr,起始地址=2,读取的寄存器个数=1)
	--NH3传感器寄存器地址0002H为:氨气浓度值
	LIB_Uart1BlockSend(LIB_MbRtuMasterSendTrans("03", MbAddr, 2, 1))
	--等待0.2秒的应答时间
    LIB_DelayMs(200)
	--判断刚刚的命令是否收到应答数据
    recv_flag,recv_tab = LIB_Uart1Recv()
    if recv_flag == 1 then
		--解析从机发来的应答数据
		result,r = LIB_MbRtuMasterRecvTrans("03",recv_tab)
		print("Rx:"..LIB_HexTabToHexStr(recv_tab))
		if result > 0 then --获取传感器结果
			res = 1
			nh3 = r[1] --单位:ppm,范围0-500
		else
			err_code = -128 - result 
			print(string.format("err=%d, data=%s",err_code, LIB_HexTabToHexStr(recv_tab)))
		end
	else
		print("NH3 Sensor unconnected!")
	end
	return res,nh3
end

--Modbus读取二氧化碳传感器数值
function GetCO2()
	local res = 0
	local co2 = 0
	local MbAddr = 0x01 --该传感器出厂默认是0x01
	
	print("Tx:"..LIB_HexTabToHexStr(LIB_MbRtuMasterSendTrans("03", MbAddr, 2, 1)))
	--下发读保持寄存器命令(设备地址=MbAddr,起始地址=2,读取的寄存器个数=1)
	--CO2传感器寄存器地址0002H为:二氧化碳浓度值
	LIB_Uart1BlockSend(LIB_MbRtuMasterSendTrans("03", MbAddr, 2, 1))
	--等待0.2秒的应答时间
    LIB_DelayMs(200)
	--判断刚刚的命令是否收到应答数据
    recv_flag,recv_tab = LIB_Uart1Recv()
    if recv_flag == 1 then
		--解析从机发来的应答数据
		result,r = LIB_MbRtuMasterRecvTrans("03",recv_tab)
		print("Rx:"..LIB_HexTabToHexStr(recv_tab))
		if result > 0 then --获取传感器结果
			res = 1
			co2 = r[1] --单位:ppm
		else
			err_code = -128 - result 
			print(string.format("err=%d, data=%s",err_code, LIB_HexTabToHexStr(recv_tab)))
		end
	else
		print("CO2 Sensor unconnected!")
	end
	return res,co2
end

--Modbus读取光照强度传感器数值
function GetIllu()
	local res = 0
	local lu = 0
	local MbAddr = 0x01 --该传感器出厂默认是0x01

	print("Tx:"..LIB_HexTabToHexStr(LIB_MbRtuMasterSendTrans("03", MbAddr, 6, 1)))
	--下发读保持寄存器命令(设备地址=MbAddr,起始地址=6,读取的寄存器个数=1)
	--光照传感器寄存器地址0006H为:光照强度值
	LIB_Uart1BlockSend(LIB_MbRtuMasterSendTrans("03", MbAddr, 6, 1))
	--等待0.2秒的应答时间
    LIB_DelayMs(200)
	--判断刚刚的命令是否收到应答数据
    recv_flag,recv_tab = LIB_Uart1Recv()
    if recv_flag == 1 then
		--解析从机发来的应答数据
		result,r = LIB_MbRtuMasterRecvTrans("03",recv_tab)
		print("Rx:"..LIB_HexTabToHexStr(recv_tab))
		if result > 0 then --获取传感器结果
			res = 1
			lu = r[1] --单位:100Lux
		else
			err_code = -128 - result 
			print(string.format("err=%d, data=%s",err_code, LIB_HexTabToHexStr(recv_tab)))
		end
	else
		print("Illu Sensor unconnected!")
	end
	return res,lu
end

--采集电池电压
function GetBatteryVoltage()
	local bat_vol
	--获取A0通道的20个点电池电压并求平均值(1秒范围)
    An_full_flag, An_tab = LIB_ADCheckBufFull("A0")
    if An_full_flag == 1 then
        SUM = 0
        for i = 1, #An_tab do --此处#An_tab的值是20,表示An_tab表内的元素个数
            SUM = SUM + An_tab[i]
        end
        AVER = SUM / #An_tab
        bat_vol = AVER*3.6/4096.0 --求20个点的平均值以及对应的实际电压值
		bat_vol = bat_vol*6.1 --(510K+100K)/100K
    end
	return bat_vol
end

--获取设备上电采集数据的次数(这里使用了磨损平衡策略,避免了一直写同一个flash地址)
--用1~20这20地址的flash存储区域来写次数,既一共可以写200万+次(20*100000)
CountNum = 0
function GetCountNum()
	local tmp,Count,Addr
	--判断需不需从零开始计数
	tmp = LIB_FlashGetNumber("63")
	if tmp ~= MagicNumber then
		LIB_FlashWriteNumber("63", MagicNumber) --63用来存magic number
		for i=1,20 do --清零1~20这20个计数器
			LIB_FlashWriteNumber(tostring(i), 0)
		end
	end
	--开始遍历1~20这20地址的存储的计数值Count,找到正确的写入地址Addr,并计算累积计数值Count
	Addr = 0
	Count = 0
	for i=1,20 do
		tmp = LIB_FlashGetNumber(tostring(i))
		if tmp >= 100100 then --除非Flash坏了或者20个地址都写满了,不然该值不可能大于10万
			for j=1,20 do --清零1~20这20个计数器
				LIB_FlashWriteNumber(tostring(j), 0)
			end
			Count = 0
			Addr = 1
			break
		elseif tmp >= 100000 and tmp < 100100 then --该地址已写超过10万次,累积加上吧
			Count = Count + tmp
			Addr = i
		else --tmp < 100000
			Count = Count + tmp
			Addr = i
			break
		end
	end
	--记录计数器值并返回该值
	Count = Count + 1
	LIB_FlashWriteNumber(tostring(Addr), Count)
	return Count
end

--蓝牙向手机发送数据
function BleSendStr(str)
	tab = LIB_StrToTab(str)
	LIB_NrfBleSend(tab)
end

--定义10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallback
function LIB_10msTimerCallback()
    timer_ms = timer_ms + 10
	timer1_ms = timer1_ms + 10
	timer_cnt = timer_cnt + 10
	LIB_WatchDogFeed() --喂软件看门狗
	--每隔0.5秒根据4G模状态更新LED灯颜色
	if timer_ms >= 500 then
		timer_ms = 0
		State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
		if State == "PowerOn" then --4G模块已上电但没发现sim卡
			RGB(0,0,0) --白
		elseif State == "SimOK" then --4G模块发现sim卡
			RGB(0,1,1) --红
		elseif State == "Attached" then --4G模块已连上附近的基站
			RGB(1,1,0) --蓝
		elseif State == "Connected" then --4G模块已和服务器连结
			RGB(1,0,1) --绿
		else --4G模块还未开始工作
			RGB(1,1,1) --全灭
		end
	end
end

--延时N秒函数
function DelayS(N)
	timer1_ms = 0
	target_ms = N*1000
	while timer1_ms <= target_ms do
		
	end
end

--RGB三色灯控制函数
function RGB(R,G,B)
	LIB_GpioWrite("D11",R)
	LIB_GpioWrite("D10",G)
	LIB_GpioWrite("D9",B)
end

--电源控制IO口初始化
function PowerCtrlIoInit()
	--配置D0为普通输出,控制CH3端口座子的电源
	LIB_GpioOutputConfig("D0","STANDARD")
	LIB_GpioWrite("D0",0) --默认不供电 
	--配置D1为普通输出,控制CH5端口座子的电源
	LIB_GpioOutputConfig("D1","STANDARD")
	LIB_GpioWrite("D1",0) --默认不供电 
	--配置D2为普通输出,控制CH4端口座子的电源
	LIB_GpioOutputConfig("D2","STANDARD")
	LIB_GpioWrite("D2",0) --默认不供电
	--配置D4为普通输出,控制CH2端口座子的电源
	LIB_GpioOutputConfig("D4","STANDARD")
	LIB_GpioWrite("D4",0) --默认不供电
	--配置D7为普通输出,控制CH1端口座子的电源
	LIB_GpioOutputConfig("D7","STANDARD")
	LIB_GpioWrite("D7",0) --默认不供电
	--配置D3为普通输出,控制电池电压检测通路的电源
	LIB_GpioOutputConfig("D3","STANDARD")
	LIB_GpioWrite("D3",0) --默认不导通
end

Chn = {"D7","D4","D0","D2","D1"}
--Chn通道(CH1~CH5)打开供电 
function ChNPowerOn(N)
	LIB_GpioWrite(Chn[N],1)
end
--Chn通道(CH1~CH5)关闭供电 
function ChNPowerOff(N)
	LIB_GpioWrite(Chn[N],0)
end

---------------------系统初始化开始-----------------------
--LIB_SystemLogEnable() --需要看详细log.txt日志时才用
--打印UID,用于生成二维码
print("UID:"..LIB_GetSysUniID())
--配置D11,D10,D9为普通GPIO输出,控制LED_R,LED_G,LED_B
LIB_GpioOutputConfig("D11","STANDARD")
LIB_GpioOutputConfig("D10","STANDARD")
LIB_GpioOutputConfig("D9","STANDARD")
RGB(1,1,1) --一上电Led三色灯默认都不亮
--打开看门狗
LIB_WatchDogConfig("30S")
--获取设备上电采集数据的次数
CountNum = GetCountNum()
--配置AM1805连接Core的SDA0和SCL0引脚
LIB_AM1805Config("IIC0")
--配置A0-A3这四个通道同时开始工作,当每个通道采集满20个点时缓存满,每个点的采集时间间隔为50ms
LIB_ADConfig(20,50000)
--配置Uart1开始工作,并且D8引脚作为自动切换485收发芯片的引脚
--当用LIB_Uart1BlockSend发送时,D8会自动变成低电平,发送完后会立刻变成高电平
LIB_Uart1Rs485Config(MbBaudRate,"D8")
--初始化各个传感器的电源控制端口
PowerCtrlIoInit()
if BleEn == 1 then
	--打开蓝牙,广播名字例如:"Core222"
	LIB_NrfBleDefaultConfig(BleBroadCastName)
end
if SysMode == 0 then --4G_TCP
	--配置4G模组需要连接的tcp服务器IP,端口号,心跳包间隔时间0秒(不使用心跳机制)。
	LIB_Cat1TcpUdpEC800Config("UART0","D5","HIGH","D6","HIGH",TcpServerIp,TcpServerPort,0,"TCP",SysGpsUse)
elseif SysMode == 1 then --4G Mqtt
	--设置4G模块占用TX0、RX0、D5、D6引脚,MQTT模式,KeepAlive周期180秒,
	LIB_Cat1MqttEC800Config("UART0","D5","HIGH","D6","HIGH",MqttServerAddr,MqttServerPort,MqttClientID,MqttUserName,MqttPassword,180,MqttSubTopic,"QOS0",SysGpsUse)
elseif SysMode == 2  then --4G ShineBlink Cloud
	--设置外部4G模块连接云
	UI = "[0_RecvData]"
	LIB_CloudConfig("S0", "4G_EC800", 0, "SBK_01", UI, SysGpsUse)
else

end
--使能系统10毫秒定时器开始工作
timer_ms = 0
timer1_ms = 0
timer_cnt = 0
LIB_10msTimerConfig("ENABLE")
---------------------系统初始化结束-----------------------

--开始大循环
while(GC(1) == true)
do
	--------------步骤(一)读取CH1端口上的传感器[温湿度]的值-----------------
	ChNPowerOn(1)--CH1端口供电打开
	Ch1JsonItemStr = nil
	Ch1DataItemStr = nil
	excel_strCH1 = ",,"
	excel_title_strCH1 = ",Temperature,Humidity"
	if Ch1Enable == 1 then
		DelayS(Ch1HeatTime) --读取传感器前预热时间(秒)
		result,temp,humi = GetTempHumi()
		if result == 1 then
			--生成所需的Json对象字符串
			Ch1JsonItemStr = string.format(",\"Te\":%d,\"Hu\":%d", temp,humi)
			--生成所需的ShineBlink免开发云字符串
			Ch1DataItemStr = string.format(" Te=%d Hu=%d", temp,humi)
			BleSendStr(Ch1DataItemStr)--蓝牙发送给手机App
			--生成所需的excel字符串
			excel_strCH1 = string.format(",%d,%d", temp,humi)
		end
	end
	ChNPowerOff(1)--CH1端口供电关闭
	
	--------------步骤(二)读取CH2端口上的传感器[甲烷浓度]的值-----------------
	ChNPowerOn(2)--CH2端口供电打开
	Ch2JsonItemStr = nil
	Ch2DataItemStr = nil
	excel_strCH2 = ","
	excel_title_strCH2 = ",Ch4"
	if Ch2Enable == 1 then
		DelayS(Ch2HeatTime) --读取传感器前预热时间(秒)
		result,ch4 = GetCh4()
		if result == 1 then
			--生成所需的Json对象字符串
			Ch2JsonItemStr = string.format(",\"Ch\":%d", ch4)
			--生成所需的ShineBlink免开发云字符串
			Ch2DataItemStr = string.format(" Ch=%d", ch4)
			BleSendStr(Ch2DataItemStr)--蓝牙发送给手机App
			--生成所需的excel字符串
			excel_strCH2 = string.format(",%d", ch4)
		end
	end
	ChNPowerOff(2)--CH2端口供电关闭
	
	--------------步骤(三)读取CH3端口上的传感器[氨气浓度]的值-----------------
	ChNPowerOn(3)--CH3端口供电打开
	Ch3JsonItemStr = nil
	Ch3DataItemStr = nil
	excel_strCH3 = ","
	excel_title_strCH3 = ",Nh3"
	if Ch3Enable == 1 then
		DelayS(Ch3HeatTime) --读取传感器前预热时间(秒)
		result,nh3 = GetNH3()
		if result == 1 then
			--生成所需的Json对象字符串
			Ch3JsonItemStr = string.format(",\"Nh\":%d", nh3)
			--生成所需的ShineBlink免开发云字符串
			Ch3DataItemStr = string.format(" Nh=%d", nh3)
			BleSendStr(Ch3DataItemStr)--蓝牙发送给手机App
			--生成所需的excel字符串
			excel_strCH3 = string.format(",%d", nh3)
		end
	end
	ChNPowerOff(3)--CH3端口供电关闭
	
	--------------步骤(四)读取CH4端口上的传感器[二氧化碳]的值-----------------
	ChNPowerOn(4)--CH4端口供电打开
	Ch4JsonItemStr = nil
	Ch4DataItemStr = nil
	excel_strCH4 = ","
	excel_title_strCH4 = ",Co2"
	if Ch4Enable == 1 then
		DelayS(Ch4HeatTime) --读取传感器前预热时间(秒)
		result,co2 = GetCO2()
		if result == 1 then
			--生成所需的Json对象字符串
			Ch4JsonItemStr = string.format(",\"Co\":%d", co2)
			--生成所需的ShineBlink免开发云字符串
			Ch4DataItemStr = string.format(" Co=%d", co2)
			BleSendStr(Ch4DataItemStr)--蓝牙发送给手机App
			--生成所需的excel字符串
			excel_strCH4 = string.format(",%d", co2)
		end
	end
	ChNPowerOff(4)--CH4端口供电关闭
	
	--------------步骤(五)读取CH5端口上的传感器[光照强度]的值-----------------
	ChNPowerOn(5)--CH5端口供电打开
	Ch5JsonItemStr = nil
	Ch5DataItemStr = nil
	excel_strCH5 = ","
	excel_title_strCH5 = ",Illumination"
	if Ch5Enable == 1 then
		DelayS(Ch5HeatTime) --读取传感器前预热时间(秒)
		result,lu = GetIllu()
		if result == 1 then
			--生成所需的Json对象字符串
			Ch5JsonItemStr = string.format(",\"Lu\":%d", lu)
			--生成所需的ShineBlink免开发云字符串
			Ch5DataItemStr = string.format(" Lu=%d", lu)
			BleSendStr(Ch5DataItemStr)--蓝牙发送给手机App
			--生成所需的excel字符串
			excel_strCH5 = string.format(",%d", lu)
		end
	end
	ChNPowerOff(5)--CH5端口供电关闭
	
	--------------步骤(六)采集电池电压----------------------------------------
	LIB_GpioWrite("D3",1) --电池电压检测通路导通
	DelayS(2) --电压采集2秒
	battery_vol = GetBatteryVoltage()
	--生成所需的Json对象字符串
    BatJsonItemStr = string.format(",\"B\":%.1f", battery_vol)
	--生成所需的ShineBlink免开发云字符串
	BatDataItemStr = string.format(" B=%.1f", battery_vol)
	BleSendStr(BatDataItemStr)
	--生成所需excel字符串
	excel_title_strBat = ",BatVoltage"
	excel_strBat = string.format(",%.1f", battery_vol)
	LIB_GpioWrite("D3",0) --电池电压检测通路关闭
	
	-----------------步骤(七)获取GPS和UTC时间信息-----------------------------
	GpsJsonItemStr = nil
	GpsDataItemStr = nil
	excel_strGpsAndTime = ",,"
	excel_title_strGpsAndTime = ",Locate,Time"
	if SysGpsUse == "AUTO_AGPS" then
		timer_cnt = 0
		LIB_WatchDogFeed()
		while(timer_cnt < 70000)--最多等待70秒给GPS搜星定位时间
		do
			result,lo_f,la_f,al_f,utc,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16 = LIB_Cat1GpsQuery()
			if result == 1 then
				--生成所需的Json对象字符串
				GpsJsonItemStr = string.format(",\"Lo\":%.3f,\"La\":%.3f", lo_f,la_f)
				--生成所需的ShineBlink免开发云字符串
				GpsDataItemStr = string.format(" Lo=%.3f La=%.3f", lo_f,la_f )
				BleSendStr(GpsDataItemStr)--蓝牙发送给手机App
				--生成所需excel字符串
				str1 = string.format("LO=%.3f LA=%.3f" ,lo_f,la_f)--构造GPS信息
				LIB_SetUtcTime(utc+28800)--根据GPS获取的国际UTC时间计算出北京时间
				y,mo,d,h,mi,s,ms = LIB_GetDateTime()
				str2 = string.format("[%02d-%02d-%02d %02d-%02d-%02d]",y,mo,d,h,mi,s)--构造时间信息
				excel_strGpsAndTime = string.format(",%s,%s", str1, str2)
				
				timer_cnt = 70000 --既然可以读取到GPS数据了,就赶紧退出
			end
		end
	end
	
	-------------------步骤(八)构造需要4G发送的字符串数据--------------------------------------
	JsonStr = string.format("{\"Id\":\"%s\"", SysMyID)
	DataStr = string.format("Id=%s", SysMyID)
	
	if GpsJsonItemStr ~= nil then
		JsonStr = JsonStr..GpsJsonItemStr
		DataStr = DataStr..GpsDataItemStr
	end
	if Ch1JsonItemStr~= nil then
		JsonStr = JsonStr..Ch1JsonItemStr
		DataStr = DataStr..Ch1DataItemStr
	end
	if Ch2JsonItemStr~= nil then
		JsonStr = JsonStr..Ch2JsonItemStr
		DataStr = DataStr..Ch2DataItemStr
	end
	if Ch3JsonItemStr~= nil then
		JsonStr = JsonStr..Ch3JsonItemStr
		DataStr = DataStr..Ch3DataItemStr
	end
	if Ch4JsonItemStr~= nil then
		JsonStr = JsonStr..Ch4JsonItemStr
		DataStr = DataStr..Ch4DataItemStr
	end
	if Ch5JsonItemStr~= nil then
		JsonStr = JsonStr..Ch5JsonItemStr
		DataStr = DataStr..Ch5DataItemStr
	end
	if BatJsonItemStr ~= nil then
		JsonStr = JsonStr..BatJsonItemStr
		DataStr = DataStr..BatDataItemStr
	end
	
	JsonStr = JsonStr.."}"
	print(JsonStr)--打印最终的数据形式
	
	--------------步骤(九)通过4G向远端服务器发送数据-----------------
	Connect = 0
	--需要判断4G模组和服务器建立连接后才能发送
	if SysMode <= 2 then 
		timer_cnt = 0 
		while(timer_cnt < 60000)--最多等待60秒
		do
			State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
			if State == "Connected" then
				timer_cnt = 60000 --既然可以发送4G数据了,就赶紧退出循环
				Connect = 1
			end
		end
	end
	if Connect ==  1 then
		if SysMode == 0 then --4G TCP 发送Json传感器数据
			LIB_Cat1TcpUdpEC800Send(LIB_StrToTab(JsonStr))
		elseif SysMode == 1 then --4G Mqtt 发送Json传感器数据
			LIB_Cat1MqttEC800SendPub("QOS0", MqttPubTopic, JsonStr)
		elseif SysMode == 2 then --4G 向ShineBlink云发送Json传感器数据
			LIB_CloudSend(DataStr)
			--print(DataStr)
		else
			
		end
		DelayS(2) --等待2秒让消息发送出去
	end
	
	-------------------步骤(十)在tf卡上存储excel文件---------------------
	--首先判断record.scv文件是否存在
	read_number, read_content = LIB_Fread("record.csv",0)
	if read_number == 0 then --文件不存在
		--需要生成Excel文件首行标题
		excel_title = "No"..excel_title_strGpsAndTime..excel_title_strCH1..excel_title_strCH2..excel_title_strCH3..excel_title_strCH4..excel_title_strCH5..excel_title_strBat.."\n"
		LIB_Fwrite("record.csv", LIB_StrToTab(excel_title))
	else--文件存在
		if string.find(LIB_TabToStr(read_content), "No,") == nil then --文件内容非法
			LIB_Fdelete("record.csv")
			--需要生成Excel文件首行标题
			excel_title = "No"..excel_title_strGpsAndTime..excel_title_strCH1..excel_title_strCH2..excel_title_strCH3..excel_title_strCH4..excel_title_strCH5..excel_title_strBat.."\n"
			LIB_Fwrite("record.csv", LIB_StrToTab(excel_title))
		end
	end
	--其次还需要考虑无法收到GPS信号的情况下,为GPS生成默认excel信息(包含从1970年1月1日0时0分上电后的运行时间)
	if GpsJsonItemStr == nil then
		str1 = "LO=0.000 LA=0.000"--构造GPS信息
		y,mo,d,h,mi,s,ms = LIB_GetDateTime()
		str2 = string.format("[%02d-%02d-%02d %02d-%02d-%02d]",y,mo,d,h,mi,s)--构造时间信息
		--生成所需excel字符串
		excel_strGpsAndTime = string.format(",%s,%s", str1, str2)
	end
	--最后记录一行excel信息,包含本次采集的所有数据
	excel_oneline_info = tostring(CountNum)..excel_strGpsAndTime..excel_strCH1..excel_strCH2..excel_strCH3..excel_strCH4..excel_strCH5..excel_strBat.."\n"
	LIB_Fwrite("record.csv", LIB_StrToTab(excel_oneline_info))
	DelayS(1)
	
	--------------步骤(十一)判断是否需要进入低功耗休眠---------------------
	if SysSleepEn == 1 then		
		--进入低功耗状态
		--设置系统开始休眠,并在SysWorkInterval秒后唤醒,
		if LIB_NrfBleConnectQuery() == 0 then --蓝牙没连接时才进入低功耗
			LIB_AM1805Sleep(SysWorkInterval, "NONE")--此时系统将掉电,后面的代码都不再有效了
		end
	end
	--如果上面没有成功进入低功耗休眠掉电
	--则延时SysWorkInterval秒后重新执行本循环
	DelayS(SysWorkInterval)
end

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐