基于hal庫下LoRa模塊獲取光照值
傳感器資料讀取與控制功能開發
- 基于hal庫下LoRa模塊獲取光照值
- 一、問題要求:
- 二、邏輯分析:
- 三、主要代碼實作:
- 1.主函式main
- 2.OLED顯示初始化資訊函式:OLED_InitView()
- 3.獲取光照值函式LoRa_Get_SensorDataProcess();
- 4.控制LED2亮滅函式Light_up();
- 四、注意事項與實作難點:
- 1.注意事項
- 2.實作難點
一、問題要求:
使用一個 LoRa 模塊、一個光照傳感器模塊完成一個光環境的監控,
任務要求:
–> 使用提供的未完成的工程進行開發,
–> 設備上電后,板上的 LED1 亮,LED2 滅,
–> 液晶屏上實時顯示當前光照值,效果如下:

–> 當光照低于某一 設定值時(可用手遮住),板上的 LED2 燈亮起,高于
這一值(手拿開)時 LED2 滅
二、邏輯分析:
使用Visio畫出流程圖:

三、主要代碼實作:
1.主函式main
對液晶初始化OLED_Init(),串口1初始化USART1_Init(115200),清空液晶屏的內容OLED_Clear(),顯示初始化資訊OLED_InitView(),ADC初始化ADCS_Init(),串口答應資訊printf(),打開LED1,關閉LED2,然后不斷獲取關照強度,并對LED2進行控制
int main( void )
{
Init();
//開發板設備初始化
OLED_Init(); //液晶初始化
USART1_Init(115200); //串口1初始化
OLED_Clear();
OLED_InitView(); //OLED螢屏顯示初始化資訊
ADCS_Init(); //ADC初始化
printf("LoRa Light\r\n"); //串口輸出資訊
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //打開LED1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); //關閉LED2
while( 1 )
{
LoRa_GetSensorDataProcess(); //獲取光照值
Light_up(); //設定閾值為80Lux,如果光照強度小于80Lux,打開LED2,否則關閉LED2
handlerPre10Ms();
}
}
2.OLED顯示初始化資訊函式:OLED_InitView()
OLED顯示“光照值:”,具體oled顯示中文漢字的方法,在之前的文章有寫過,有不懂可以查閱之前的博文
void OLED_InitView()
{
OLED_Clear();
OLED_ShowCHinese(0*16+10,3,29);//光
OLED_ShowCHinese(1*16+10,3,30);//照
OLED_ShowCHinese(2*16+10,3,52);//值
OLED_ShowChar(3*16+10,3,':');//:
}
3.獲取光照值函式LoRa_Get_SensorDataProcess();
獲取ADC0的值,并將其轉化為光照值顯示
void LoRa_GetSensorDataProcess(void)
{
float voltage;
AdcScanChannel(); //轉換ADC雙信道暫存器資料為電壓值
voltage = AdcReadCh0(); //獲得ADC0獲得電壓值
LightLux = (uint16_t)(5/2.0)*(voltage*100); //轉化為光照強度
printf("光照值:%d",LightLux); //把光照強度列印到串口
char StrBuf[64]={0};
memset(StrBuf, '\0', 64);
sprintf(StrBuf, " %d Lx",LightLux);
OLED_ShowString(4*16,3,(uint8_t *)StrBuf); //oled顯示光照值
}
4.控制LED2亮滅函式Light_up();
光照值小于80Lux時,打開LED2,否則關閉LED2
void Light_up(void)
{
if(LightLux <= 80)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); //光照值小于80Lux時,開啟LED2
}
else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); //光照值大于80Lux時,關閉LED2
}
}
四、注意事項與實作難點:
1.注意事項
(1)使用某個GPIO或其它外設前,得初始化!
(2)注意光照傳感器的AD值靠ADC0獲取;
(3)獲取到的ADC值還需要進行轉化為傳感器電壓值,再轉化為光照值;
2.實作難點
(1) 初始化ADC通道0 --> 轉換ADC雙信道暫存器資料為電壓值 --> 獲得ADC0獲得電壓值;
(2) (電壓值)voltage = (ADC0Value/4096.0) * 3300 , 單位為mV;
(3)(光照強度值)LightLux = (5/2.0) * (voltage /10.0) ,單位為Lux;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297914.html
標籤:其他
上一篇:2021-09-04
