开发环境介绍
本次开发,我尝试使用了Clion+Platformio来进行开发
其实这次活动算是我第一次使用arduino ,之前一直没使用是因为arduino IDE没有一个友好的使用环境,没有代码补全,编译之后再点击上传却又要重新编译,编译只能单线程编译等等..
之前使用的是Clion开发C语言,它具有强大的代码补全、界面风格、各种插件、流畅性等众多优点,毫无疑问这些是能够极大提高开发效率的。而CLion IDE就是专门面向C/C++开发的。
而PlatformIO是一款跨平台的物联网开发的生态环境,它提供跨平台的开发环境和统一的调试器,还支持远程单元测试和固件更新...它基于python进行运行,
而Clion支持PlatformIO,所以本次开发使用了Clion+Platformio进行开发,能够提供友好快速的开发环境。
这个是工程结构
这个是工程的配置文件和build的工作路径:
这里就是用户的include路径和库路径:
src里面就是main文件:
后面就是git和Cmake和platform io 的配置文件
点击编译,在下方的消息里面可以看到编译的信息,以及使用的内存和flash的大小:
安装对应的传感器包
以下是命令
pio lib --global install "arduino-libraries/Arduino_APDS9960@^1.0.3"
pio lib --global install "arduino-libraries/Arduino_LPS22HB @ ^1.0.1"
pio lib --global install "arduino-libraries/Arduino_HTS221@^1.0.0"
安装完库之后需要重新生成一下CMakelist文件
至此开发环境的配置已完成
代码补全功能演示:
至此开发环境的配置已完成
代码实现的功能
使用OLED 12864 显示以下参数
周边环境温度(精度:±0.1°C);
周边环境湿度(精度:±1%);
大气压强(精度:±0.1kPa);
日照强度(用于判断白天/夜晚);
周边平均噪声(精度:±1dB)。
代码说明
使用到的arduino 库
-
Arduino_LPS22HB
-
Arduino_HTS221
-
Arduino_APDS9960
-
U8g2lib
温湿度
通过HTS221传感器获得
temperature = HTS.readTemperature() - 8; //固定误差
humidity = HTS.readHumidity();
大气压强
通过LSP22传感器获得
pressure = BARO.readPressure();
光照强度
通过APDS9960传感器获得
if (APDS.colorAvailable())
{
int r, g, b;
APDS.readColor(r, g, b, light);
}
噪声
通过数字式麦克风MP34DT06JTR获得的PCM数据根据噪声计算公式得到。
脉冲密度调制(Pulse Density Modulation),简称PDM,是一种使用二进制数0,1表示模拟信号的调制方式。在PDM信号中,模拟信号的幅值使用输出脉冲对应区域的密度表示。PWM波是PDM波转换频率固定的一种特例,对于一个使用8位长表示的电压信号而言,峰值的1/2处会高低电平各持续一半,即128个时钟周期。在PDM信号中,会在1,0之间每个时钟周期都切换。两种波形的平均值都是50%,但是PDM波切换的更加频繁。对于100%和0的电平信号,两种方式的输出相同。
我们在主循环里面计算数据的有效值
if (bytesAvailable)
{
long long int sum = 0;
for (int i = 0; i < bytesAvailable / 2; i++)
{
sum += (long long int) sampleBuffer[i] * (long long int) sampleBuffer[i];
}
db = 20 * log10f(sum) - 20 * log10f(bytesAvailable / 2);
bytesAvailable = 0;
}
显示
u8g2.firstPage();
do
{
u8g2_printf(0, 12, "temp = %.2f °C", temperature);
u8g2_printf(0, 24, "RH = %.2f %%", humidity);
u8g2_printf(0, 36, "Press = %.1f kPa", pressure);
u8g2_printf(0, 48, "Noise = %.1f db", db);
u8g2_printf(0, 60, "light = %d", light);
u8g2_printf(88, 60, "%s", light > 1000 ? "Day" : "Night");
} while (u8g2.nextPage());
同时利用串口将数据发送到电脑
Serial1.print("Pressure = ");
Serial1.print(pressure);
Serial1.println(" kPa");
Serial1.print("Temperature = ");
Serial1.print(temperature);
Serial1.println(" °C");
Serial1.print("Humidity = ");
Serial1.print(humidity);
Serial1.println(" %");
Serial1.print("light = ");
Serial1.println(light);
Serial1.print("Sound Noise = ");
Serial1.print(db);
Serial1.println(" db");
演示效果
期望和建议
这次已经是第二次参加硬禾的活动了,Funpack 的活动每一期都是一次惊喜,同时,在本次开发的时候也体会到了arduino的方便,而且,在Clion和platform IO的结合之下,整个开发流程十分的轻松。
总之,感谢硬禾和DigiKey提供了Funpack这一活动平台。希望这种活动能够一直进行下去。