这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » [Let'sDo第3期]DIY一个电子测光表成果贴

共2条 1/1 1 跳转至

[Let'sDo第3期]DIY一个电子测光表成果贴

菜鸟
2024-12-03 16:50:14     打赏

成果帖,回详细的解析代码、以及为什么这么做的原因

 

一、基础任务

1、按键状态的识别

代码

#de
fine key_Pin0  1  
#define key_Pin1  2
  
int key_Pin0_state = 1;  
int key_Pin1_state = 1;  
  
oid setup() {  
  pinMode(key_Pin0, INPUT_PULLDOWN);  
  pinMode(key_Pin1, INPUT_PULLDOWN);  
 
  Serial.begin(115200);  
}  
  
void loop() {  
  key_Pin0_state = digitalRead(key_Pin0);  
  key_Pin1_state = digitalRead(key_Pin1);  
 
  if (key_Pin0_state == 1) {  
    Serial.println("key0 Down");  
  } 
  if(key_Pin1_state == 1){  
    Serial.println("key1 Down");  
  }  
 
  delay(100);  
}


硬件原理图

 image.png

 

解析:

按键按下拉高,并且没有下拉电阻,稳定电平,会有误识别,所以需要配置输入下拉,确保空闲电平为低,工作电平为高。

接着就是在loop里面,不断的读取电平即可,延时100ms是简易的消抖防止误触。

 

2BH1750传感器数据读取

代码:

#include <BH1750.h>
#include <Wire.h>
 
BH1750 lightMeter;
 
void setup() {
  Serial.begin(9600);
 
  Wire.begin();
  
  lightMeter.begin();
}
 
void loop() {
  float lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(1000);
}


硬件接线图:

image.png

查阅驱动库代码,发现驱动库配置的地址是0X23 

image.png

查阅BH1750的规格书发现:

IIC地址线,接GND时器件地址为01000110x23) ,接VCC时器件地址为10111000x5c

所以ADDR需要选择的是接地,如下图。

image.png


代码解析:

1Wire.begin(); 使能I2C

2lightMeter.begin(); 使能传感器的库

紧接着在loop里面不断的读取亮度值,使用delay延时1秒,降低传感器采样的频率。

 

3、屏幕实现字符显示

#include <TFT_eSPI.h>
#include <SPI.h>
 
TFT_eSPI tft = TFT_eSPI(); 
 
void tftInit()  
{  
  tft.init();                             
  tft.setRotation(2);                     
  tft.fillScreen(TFT_RED);           
  tft.setTextColor(TFT_WHITE, TFT_BLACK); 
  tft.setTextSize(2);  
} 
 
void setup(void) {
  Serial.begin(115200);  
  tftInit();  
  tft.setCursor(0, 10); 
  tft.println("Hello EEPW & DigiKey");  
}


代码解析

1、因为我的屏幕损坏了,所以特别的修改了屏幕显示的方向“  tft.setRotation(2)”,这个API可以填0-3,分别对应着不同的显示方向。

2、屏幕初始化后,是黑白马赛克,需要全屏刷新一下颜色,清除掉黑白马赛克,使用的是:tft.fillScreen(TFT_RED)

3tft.setTextColor(TFT_WHITE, TFT_BLACK)设置显示文本的颜色,两个颜色分贝代表着黑底白字。

4 tft.setCursor(0, 10)  设置文本显示的起始坐标,xy

 

4、屏幕显示光强信息

#include <TFT_eSPI.h> 
#include <SPI.h>
#include <BH1750.h>
#include <Wire.h>
 
TFT_eSPI tft = TFT_eSPI();  
BH1750 lightMeter;
char buff[20]={0};
 
void tftInit()  
{   
  tft.init();                            
  tft.setRotation(2);                  
  tft.fillScreen(TFT_RED); 
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setTextSize(2);  
} 
 
void setup(void) {
  Serial.begin(115200);  
  tftInit();  
 
  Wire.begin();
  lightMeter.begin();
 
  tft.setCursor(0, 0);
  tft.println("Hello EEPW & DigiKey");  
}
 
void loop() {
 
  float lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
 
  snprintf(buff, sizeof(buff), "Light: %.1f lx", lux);  
  tft.setCursor(40, 30);  
  tft.print(buff);    
  delay(1000);
}


代码解析:

主要就是把任务二+任务三合并起来就可以的得到全新的任务四。相关的要点还是一样的。

就是要在任务三的基础上,设置显示亮度的显示窗口不要与Hello EEPW & DigiKey”重叠。


运行结果照片

image.png

流程图

image.png

二、

照度(lx)是衡量光源亮度的单位,表示单位面积上接收到的光通量。它通常用于描述环境光的强度,比如室内或室外的光照条件。照度的单位是勒克斯(lx),1勒克斯等于1流明/平方米。

 

曝光是摄影中的一个核心概念,它涉及到光圈、快门和感光度(ISO)这三个参数的协调。这三个参数共同决定了相机感光元件接收到的光量,进而影响照片的亮度和质量。

 

1. 光圈(Aperture):光圈是相机镜头中控制进光量的开口大小,通常用f值表示。f值越小,光圈开口越大,进光量越多,景深越浅;f值越大,光圈开口越小,进光量越少,景深越深。

 

2. 快门(Shutter):快门速度决定了感光元件暴露在光线下的时间长度。快门速度越快,曝光时间越短,进光量越少,适合捕捉快速移动的对象;快门速度越慢,曝光时间越长,进光量越多,适合在光线不足的环境下拍摄。

 

3. 感光度(ISO):感光度是衡量相机感光元件对光线敏感度的指标。ISO值越高,感光元件对光线的敏感度越高,可以在光线较弱的环境下拍摄,但同时会增加图像的噪点;ISO值越低,感光元件对光线的敏感度越低,图像噪点越少,但需要更多的光线来获得正确曝光。

 

三、视频

https://v.youku.com/v_show/id_XNjQ0MjAxMTY3Ng

 





关键词: 电子测光    

高工
2024-12-03 19:25:55     打赏
2楼

我怎么感觉您的代码写错了呢!


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]