給GY-30數字光強測量傳感器寫了一個驅動,根據IIC通信協議和GY-30的數據手冊編寫,期間一個問題纏繞我許久:每次接收完數據時,主機向從機發送一個ACK,很必要,要不然測出的數據不準確。我把測出的數據顯示在了LCD1602上,并且可以根據光強值來控制燈的開關。后續我會推出控制燈的亮度的設計。數據手冊和代碼獻上。
單片機源程序如下:
- #include "lcd.h"
- #include "BH1750FVI.h"
- uchar brach[] = {"Lighty Intensity"};
- uchar str[] = {"Lx"};
- uint dat;
- float Light_intensity = 0.0f;
- uchar Wr, Qr, Br, Sr, Gr; //光強值的萬位,千位,百位,十位,個位
- //uchar respond =0; //IIC調試用
- sbit Light = P2^2;
- void delay_ms(unsigned int k)
- {
- unsigned int i, j;
- for(i = 0; i < k; i++)
- {
- for(j = 0; j < 121; j++);
- }
- }
- void Sys_Init(void)
- {
- Light = 1;
- LcdInit();
- BH1750_Init();
- }
- void Set_BH1750(void)
- {
- WriteData_to_BH1750(0x01);
- // respond = c;
- WriteData_to_BH1750(0x10); //設置為高分辨率模式
- // respond += 0x30;
- delay_ms(180);
- }
- void datapros(uint Light_intensity)
- {
- Wr = Light_intensity / 10000;
- Wr = Wr + 0x30;
- Qr = Light_intensity % 10000 / 1000;
- Qr = Qr + 0x30;
- Br = Light_intensity % 1000 / 100;
- Br = Br + 0x30;
- Sr = Light_intensity % 100 / 10;
- Sr = Sr + 0x30;
- Gr = Light_intensity % 10;
- Gr = Gr + 0x30;
- }
- void main(void)
- {
- Sys_Init();
- while(1)
- {
- LcdShowStr(0,0,brach);
- Set_BH1750();
- // DisplayOneChar(12,1,respond); IIC調試用
- RecvData_f_BH1750(); //連續讀數據
- dat = buff[0];
- dat = (dat << 8) | buff[1];
- Light_intensity = (float)dat / 1.2;
- datapros(Light_intensity); //數據處理
- DisplayOneChar(3,1,Wr);
- DisplayOneChar(4,1,Qr);
- DisplayOneChar(5,1,Br);
- DisplayOneChar(6,1,Sr);
- DisplayOneChar(7,1,Gr);
- LcdShowStr(9,1,str);
- if(Light_intensity <= 20)
- Light = 0;
- else
- Light = 1;
- }
- }
復制代碼
所有資料51hei提供下載:
數字光強測量計.rar
(40.75 KB, 下載次數: 28)
|