一、任务要求
基于温湿度传感节点代码,开发Lora光敏节点应用程序,要求采集数据,当收到网关读取传感器指令后,将传感数据响应网关。
(1)修改设备地址,定义传感变量。
//定义网络编号和设备地址
#define MY_NET_ID 0xD0C2 //网络ID
#define MY_ADDR 0x02 //设备地址
/*全局变量*/
uint16_t LightLux = 200; //光照传感器采集到的光照度,单位:lux
(2)响应发送代码,在字符串格式化输出时,将LightLux传感器标识名加入。
uint8_t RspBuf[BUFFER_SIZE]= {0};
memset(RspBuf, '\0', BUFFER_SIZE);
RspBuf[0]=START_HEAD;
RspBuf[1]=CMD_READ;
RspBuf[2]=(uint8_t)(MY_NET_ID>>8);
RspBuf[3]=(uint8_t)MY_NET_ID;
RspBuf[4]=MY_ADDR;
RspBuf[5]=ACK_OK;
sprintf((char *)(RspBuf+7),"LightLux(lux):%d", LightLux);//数据域,sprintf中,两个“%”表示输出“%”。ADC采集后将值传递LightLux发送。
RspBuf[6]=strlen((const char *)(RspBuf+7))+1;//数据域长度
RspBuf[6+RspBuf[6]]=CheckSum((uint8_t *)RspBuf, 6+RspBuf[6]);
Radio.Send( RspBuf, 7+RspBuf[6]);//发送响应数据
GpioToggle( &Led1 );//发送数据切换亮灯指示
(3) 初始化ADC:void AdcInit( Adc_t *obj, PinNames adcInput )定义在adc.c中,用户可以直接调用,board.c中定义了Adc_t Adc; board.h定义了#define ADC_0 PA_0。
void PlatformInit(void)
{
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
// 开发板设备初始化
OLED_Init();//液晶初始化
USART1_Init(115200);//串口1初始化
OLED_Clear();
OLED_InitView();//OLED屏幕显示初始信息
printf("新大陆教育 LoRa \r\n");
//Lora模块初始化
NS_RadioInit( (uint32_t) RF_PING_PONG_FREQUENCY, (int8_t) TX_OUTPUT_POWER, (uint32_t) TX_TIMEOUT_VALUE, (uint32_t) RX_TIMEOUT_VALUE );
//请在下方添加用户初始化代码
printf("LoRa Light\r\n");
AdcInit( &Adc, ADC_0);//ADC初始化通道0
Tim3McuInit(1);//定时器初始化,设置定时中断1ms中断一次
//IWDG_PrmInit(2048);//独立看门狗初始化,超时设置为2048ms
}
(4)ADC数据采集转换上报
void LoRa_GetSensorDataProcess(void)
{
const uint16_t time = 1000;
if(User0Timer_MS > time)
{
User0Timer_MS = 0;
uint16_t AdcNum,voltage;
AdcNum = AdcReadChannel( &Adc, ADC_CHANNEL_0 );//ADC精度12位,参考电压3.3V
//在adc.c中定义读取ADC0通道值
voltage = AdcNum*3300/(4096-1.0);//传感器电压值,单位:mV
LightLux = (5/2.0)*(voltage/10.0);
char StrBuf[64]={0};
memset(StrBuf, '\0', 64);
sprintf(StrBuf, " %d lux",LightLux);
OLED_ShowString(0,4,(uint8_t *)StrBuf);
}
}
(5)本实验在温湿度传感节点实验中改进的来,详细内容请参照以下连接!https://blog.csdn.net/qq_41742056/article/details/125515371?spm=1001.2014.3001.5501