Funpack第八期 arduino nano 33 ble sense实现环境检测
利用arduino nano 33 ble sense实现环境检测
标签
嵌入式系统
Arduino
吴童鞋
更新2021-05-14
1043

任务

本期任务需要利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。待监测的参数包括:

  • 周边环境温度(精度:±0.1°C, ±0.1°F)

  • 周边环境湿度(精度:±1%)

  • 大气压强(精度:±0.1kPa, ±0.1psi)

  • 日照强度(用于判断白天/夜晚)

  • 周边平均噪声(精度:±1dB)

开发板传感器丰富

NANO-33 BLE是一颗很强大的开发板,包括以下传感器:

  • APDS9960 距离颜色姿势传感器 用来判断白天/夜晚

  • LSM9DS1 九轴加速度重力传感器

  • HTS221 温湿度传感器 用来测量环境温湿度

  • LPS22HB 压力传感器 用来测量大气压强

  • MP334DT05- A 麦克风 用来判断噪音

库支持

Arduino的强大之处是能安装各种库,来扩展开发板的功能.本次实验需要依赖一些库,如下所示. 在项目-加载库-管理库搜索以下关键字,并安装. (可能需要科学上网)

Arduino_LPS22HB 传感器库

Arduino_HTS221 传感器库

Arduino_APDS9960 传感器库

Adafruit_GFX 这个库是为了支持显示

Adafruit_SSD1306 这个库是为了支持SSD1306屏的显示

中文显示

中文显示可以用字库支持 或者自制字模的方式. 我们采用后者. 使用pctolcdelle 软件(附件提供) 按照 PCtoLCD2002 ,阴码,逐列式,顺向,C51 的配置 如下图

FtYjMLhUQlpsCj5-M7cIOdE9JxYA

生成如下字模数组

//取16X16汉字字模 逐行式 顺向高位在前
static const unsigned char PROGMEM str_wen[] =
{
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
};

static const unsigned char PROGMEM str_du[] =
{
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",1*/
};

以此类推 生成 需要的文字.

 

核心代码

void loop() {
  int r, g, b, a;
  float pressure,f_temperature,c_temperature,humidity;
  uint32_t sample;

   //读取大气压
   pressure = BARO.readPressure();
   //读取温度
   c_temperature = HTS.readTemperature();
  //读取湿度
   humidity    = HTS.readHumidity();
   
  //读取亮度
  while ( APDS.colorAvailable()) {
    APDS.readColor(r, g, b, a);
    Serial.println("a:");
    Serial.println(a);
  }
  
  //读取声音 并计算分贝
  while (!samplesRead);
  {
  uint32_t sample_max = 0;
  for (int i = 0; i < samplesRead; i++) {
    if(sampleBuffer[i] < 0)
      sampleBuffer[i] = -sampleBuffer[i];
    if(sampleBuffer[i] > sample_max) 
      sample_max= sampleBuffer[i];
  }
   sample = 24*log10(sample_max*5);  
  }
  samplesRead = 0;

  //display  数据显示部分
  display.clearDisplay();  
  display.setCursor(0,0);  
  display.setTextSize(2);  
  display.setTextColor(SSD1306_WHITE); 

  display.setCursor(0, 0);//设置显示位置

  display.drawBitmap(0, 0, str_wen, 16, 16, 1); //画出字符对应点阵数据
  display.drawBitmap(16, 0, str_du, 16, 16, 1); //画出字符对应点阵数据
  display.setCursor(32,0);    
  display.print(c_temperature);
  display.println(F("C")); 
  
  display.drawBitmap(0, 16, str_shi, 16, 16, 1); //画出字符对应点阵数据
  display.drawBitmap(16, 16, str_du, 16, 16, 1); //画出字符对应点阵数据
  display.setCursor(32,16);
  display.print(humidity);
  display.println(F("%"));  

  display.drawBitmap(0, 32, str_qi, 16, 16, 1); //画出字符对应点阵数据
  display.drawBitmap(16, 32, str_ya, 16, 16, 1); //画出字符对应点阵数据
  display.setCursor(32,32);    
  display.print(pressure);
  display.println(F("kP")); 

  if(a >= 5){
  display.drawBitmap(0, 48, str_bai, 16, 16, 1); //画出字符对应点阵数据
  display.drawBitmap(16, 48, str_tian, 16, 16, 1); //画出字符对应点阵数据
  }else{
  display.drawBitmap(0, 48, str_wan, 16, 16, 1); //画出字符对应点阵数据
  display.drawBitmap(16, 48, str_shang, 16, 16, 1); //画出字符对应点阵数据
  }
  display.setCursor(32,48);
  display.print(sample);
  display.println(F("dB")); 
  
  display.display();//开显示    
}

 

功能展示

一屏以此显示温度 湿度 气压 白天/晚上 噪音分贝信息:

如下图

FpsbRIzLtespMmBDbAdmfXy2tcIb

体会感受

挺感谢主办方. 朋友介绍参与这次活动 受益很多.

Arduino 也挺好玩 ,这是一个起点 ,后续会学习更多玩法.

 

附录

https://store.arduino.cc/usa/nano-33-ble-sense

 

附件下载
arduino.ino
pctolcdelle.rar
转化汉字字模
团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号