内容介绍
内容介绍
硬件介绍
这次活动使用的硬件是Arduino Nano 33 BLE Sense 开发板,使用到的传感器及其功能:
- 温湿度传感器 - 检测温湿度
- 压力传感器 - 检测大气压强
- 距离颜色传感器 - 检测手势动作切换OLED画面(检测环境光改为用BH1750)
- 麦克风 - 检测噪音
- 0.96寸OLED - 显示数据
- BH1750光照检测 - 判断白天黑夜
代码解析
注意:为了数值更加平稳,部分代码使用了平均值
检测温湿度
/*
* @brief 查询湿度温度函数
* @param[out] {humidity} 存放湿度值
* @param[out] {temperature} 存放温度值
*/
void chackHT(int & humidity,float & temperature) {
float hum= HTS.readHumidity(), temp = HTS.readTemperature();//读取温湿度
avgHT(hum, temp);
int h = hum + 0.5; //湿度转换为整型数
humidity = h;
temperature = temp;
}
检测大气压强
/*
* @brief 计算大气压
* @param[out] {pressure} 存放气压值
* @note 检测气压值,
*/
void chackBP(float& pressure) {
float p = BARO.readPressure();//读取气压值
avgBP(p);
pressure = p;
}
检测手势动作切换OLED画面
提示:由于开发板和显示屏是逆时针旋转90度安装的,所以实际的手势上下左右,也变成了右左上下
/**
* @brief 检查手势
* @return int 手势方向 GESTURE_UP,GESTURE_DOWN,GESTURE_LEFT,GESTURE_RIGHT
*/
int chackGesture() {
int gesture;
gesture = APDS.readGesture();//读取手势
return gesture;
}
/**
* @brief 根据手势进行页面切换
* @param[in] {gesture} 手势值
* @return - UP 返回主页面
- LEFT/Right 页面切换
*/
int gestureAction(int gesture,int page) {
int i;
switch (gesture) {
case GESTURE_RIGHT:
i = 0;
break;
case GESTURE_UP:
i = page+1;
if (i > 3) {
i = 0;
}
break;
case GESTURE_DOWN:
i = page - 1;
if (i < 0) {
i = 3;
}
break;
default:
i = 0;
break;
}
return i;
}
检测噪音
/**
* @brief 获取mic的PDM数据,转换为16bit长度的数据量
*/
void onPDMdata() {
// 获取可读数据字节数
int bytesAvailable = PDM.available();
//读取数据到sampleBuffer[]
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
/**
* @brief 把PDM值按照公式计算分贝值
* @return 分贝值
* @note 使用保存的全局变量值
*/
int cal_DB( ){
long sum = 0;
float db;
for (int i = 0; i < samplesRead; i++) {
sum += sq(sampleBuffer[i]);//平方累加
}
sum = sqrt(sum / samplesRead);//均方根
db = 20 * log10(sum * 5); //计算公式
avgDB(db);
int b = db + 0.5; //转换为整型数
// 可读字节数清零
samplesRead = 0;
return b;
}
判断白天黑夜
读取光照度值,(当光照度小于20就判定为黑夜,判断在显示函数中实现)
/*
光照检测函数
返回值:光照度LUX
*/
uint16_t BH1750() { //BH1750设备操作
byte buff[2];
int i = 0;
uint16_t val = 0;
byte err = 0;
//开始i2c读写操作
Wire.beginTransmission(BH1750address);
Wire.write(0x10); //1LX reolution 120ms //发送命令
err = Wire.endTransmission();
//错误检测
if (2 == err) {
Serial.print("ERR BH1750:");
Serial.println(err);
return -1;
}
delay(200);
//读取数据
Wire.beginTransmission(BH1750address);
Wire.requestFrom(BH1750address, 2); //读取2字节
while (Wire.available()) {
buff[i] = Wire.read(); //接收1个字节
i++;
}
Wire.endTransmission();
if (2 == i) {
val = ((buff[0] << 8) | buff[1]) / 1.2;
}
return val;
}
显示数据
显示使用的是u8g2的库
根据传入的参数显示数值,判断白天黑夜,显示那一页
/*
* @brief 显示
* @param[in] {hum} 湿度
* @param[in] {temp} 温度
* @param[in] {presure} 大气压
* @param[in] {c} 光照
* @param[in] {db} 噪音
* @param[in] {page} 页面位置 0-主页,1-3副页
* @return Null
* @note
*/
void display(int hum,float temp,float pressure,uint16_t c,int db,int page) {
unsigned char* pbits;
static ulong t0 = 0;
ulong t1 = millis();
if (c > 20) { //根据光照度判断白天黑夜
pbits = sum_30_bits;
}
else {
pbits = moon_30_bits;
}
if (t1 - 500 > t0) {//ms刷新时间
t0 = t1;
u8g2.setFont(u8g2_font_fub17_tf);//设置字体
switch (page)
{
case 0:
u8g2.setFont(u8g2_font_wqy16_t_chinese1);
u8g2.firstPage(); //按页刷新的u8g2写入数据方式
do {
u8g2.setCursor(0, 20);
u8g2.print(temp,1);
u8g2.drawXBMP(37,4,16,16,temp_16_bits); //画图
// u8g2.print("°C");
u8g2.setCursor(65, 20);
u8g2.print(hum);
u8g2.println("%");
u8g2.setCursor(0, 40);
u8g2.print(db);
u8g2.print("dB ");
u8g2.setCursor(0, 60);
u8g2.print(pressure,1);
u8g2.println("kPa");
u8g2.drawXBMP(70, 30, 30, 30, pbits);
} while (u8g2.nextPage());
break;
case 1:
u8g2.firstPage();
do {
u8g2.setCursor(0, 30);
u8g2.print(temp, 1);
u8g2.drawXBMP(50, 10, 20, 20, temp_20_bits);
u8g2.setCursor(0, 60);
u8g2.print(hum);
u8g2.println("%");
u8g2.setCursor(0, 60);
u8g2.drawXBMP(70, 30, 30, 30, pbits);
} while (u8g2.nextPage());
break;
case 2:
u8g2.firstPage();
do {
u8g2.drawXBMP(0, 20, 30, 30, speak_30_bits);
u8g2.setCursor(40, 40);
u8g2.print(db);
u8g2.print("dB");
} while (u8g2.nextPage());
break;
case 3:
u8g2.firstPage();
do {
u8g2.setCursor(20, 40);
u8g2.print(pressure, 1);
u8g2.println("kPa");
} while (u8g2.nextPage());
default:
break;
}
}
}
图案制作
案例中有使用到图案,制作方法也很简单,用画图软件画出黑白的点阵图
然后用GIMP软件打开,导出为XBM格式文件,然后用文本打开XBM文件就会见到这样的代码
主要就是那个数组,改好名字复制进代码里面就行了。
像这样就能用u8g2.drawXBMP调用了。
心得体会
最大的感受就是只有亲手把它制作出来才会知道在制作过程中的不顺利。
团队介绍
评论
0 / 100
查看更多