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

功能
- 环境温湿度监测
- 二氧化碳浓度监测
- 光照强度监测
- 甲烷检测
- 氨气监测
特点
- 支持4G cat1通信
- 支持TCP/MQTT接入云端
- 支持周期休眠和定时上传云端
- 可电池供电超低功耗(休眠低至3uA)
- 可GPS定位和UTC时间获取
- 可TF卡存储200万条excel记录
- 可微信小程序远程查看数据(调试用)
- 可手机蓝牙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
更多推荐

所有评论(0)