成果帖,回详细的解析代码、以及为什么这么做的原因
一、基础任务
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); }
硬件原理图
解析:
按键按下拉高,并且没有下拉电阻,稳定电平,会有误识别,所以需要配置输入下拉,确保空闲电平为低,工作电平为高。
接着就是在loop里面,不断的读取电平即可,延时100ms是简易的消抖防止误触。
2、BH1750传感器数据读取
代码:
#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); }
硬件接线图:
查阅驱动库代码,发现驱动库配置的地址是0X23
查阅BH1750的规格书发现:
IIC地址线,接GND时器件地址为0100011(0x23) ,接VCC时器件地址为1011100(0x5c)
所以ADDR需要选择的是接地,如下图。
代码解析:
1、Wire.begin(); 使能I2C
2、lightMeter.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)
3、tft.setTextColor(TFT_WHITE, TFT_BLACK)设置显示文本的颜色,两个颜色分贝代表着黑底白字。
4、 tft.setCursor(0, 10) 设置文本显示的起始坐标,x,y
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”重叠。
运行结果照片
流程图
二、
照度(lx)是衡量光源亮度的单位,表示单位面积上接收到的光通量。它通常用于描述环境光的强度,比如室内或室外的光照条件。照度的单位是勒克斯(lx),1勒克斯等于1流明/平方米。
曝光是摄影中的一个核心概念,它涉及到光圈、快门和感光度(ISO)这三个参数的协调。这三个参数共同决定了相机感光元件接收到的光量,进而影响照片的亮度和质量。
1. 光圈(Aperture):光圈是相机镜头中控制进光量的开口大小,通常用f值表示。f值越小,光圈开口越大,进光量越多,景深越浅;f值越大,光圈开口越小,进光量越少,景深越深。
2. 快门(Shutter):快门速度决定了感光元件暴露在光线下的时间长度。快门速度越快,曝光时间越短,进光量越少,适合捕捉快速移动的对象;快门速度越慢,曝光时间越长,进光量越多,适合在光线不足的环境下拍摄。
3. 感光度(ISO):感光度是衡量相机感光元件对光线敏感度的指标。ISO值越高,感光元件对光线的敏感度越高,可以在光线较弱的环境下拍摄,但同时会增加图像的噪点;ISO值越低,感光元件对光线的敏感度越低,图像噪点越少,但需要更多的光线来获得正确曝光。
三、视频
https://v.youku.com/v_show/id_XNjQ0MjAxMTY3Ng