BeeMonitor
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 |
应用和在线服务
![]() |
| |||
![]() |
| |||
![]() |
|
关于这个项目
简介
我们将介绍蜜蜂控制应用程序的开发,该应用程序可帮助养蜂人高效生产蜂蜜和其他产品。该应用程序涵盖养蜂领域。我们看到了帮助养蜂人控制蜜蜂并尽可能有效的动机。这将使养蜂人更容易在单个蜂箱上长时间工作。这个想法是,基于温度和湿度,该应用程序可以洞察特定蜂巢中蜜蜂家族的状态,并检测称为蜂群的特殊事件。这是一个蜜蜂家族分为两个部分的事件。一部分留在蜂巢中,另一部分离开蜂巢并找到新家。第一部分留在蜂巢中等待新蜂王孵化,而第二部分则与旧蜂王一起离开蜂巢。养蜂人及时采取行动很重要。蜜蜂控制应用程序可以帮助他做到这一点,该应用程序根据蜜蜂嗡嗡声的声音处理识别此类事件。
解决方案
由于单个养蜂人通常有大量蜂箱,因此也有许多蜂箱,手动检查单个蜂箱需要大量时间。在我们的应用程序的帮助下,养蜂人通过移动终端和蓝牙连接连接到各个蜂箱,在那里他可以查看蜜蜂家族的健康状况。此外,该应用程序会在蜂群情况下警告养蜂人,他将能够及时采取行动,蜜蜂不会逃到大自然中,从而减少蜂蜜产量。
说明
该系统由一个 Arduino Nano BLE 33 Sense 微控制器组成,该微控制器的印刷电路板上还包含一个麦克风。在微控制器上运行的算法的帮助下,控制器聆听蜜蜂的嗡嗡声,并在学习模型的帮助下识别蜜蜂的嗡嗡声、蜂王何时出现在蜂巢中以及何时它不是。除了出生检测,Arduino 还包括一个温度和湿度传感器。借助这些数据,我们可以确定蜂巢中蜜蜂家族的状况或健康状况。由于目标是低能耗,系统每天只测量几次情况,或者在上午 10 点到下午 1 点之间的时间段内测量,这是警告的可能性最大的时间段。其余时间,设备大部分时间处于空闲状态,不消耗能量。
机器学习模型
描述 EdgeImpulse 程序
- 使用麦克风捕获数据
首先,我们使用麦克风捕捉蜜蜂的嗡嗡声,以收集构成学习模型基础的数据。

- 声音的频谱分析
然后使用光谱图处理数据。
- 使用神经网络构建模型
频谱图是神经网络的输入,用于训练模型。经过长时间的重新计算,我们得到了结果,以矩阵形式给出了模型的识别性能。

下图显示了模型如何根据捕获的数据执行。

- 创建一个库并上传到 Arduino
最后,我们创建了一个要上传到 Arduino 板的库。

硬件
- Arduino Nano BLE 33 感应

- 电池电量

- 安卓手机端
连通性
为了从 Arduino 接收数据到 Android 手机上的应用程序,我们使用了蓝牙连接选项。 Arduino Nano BLE 33 Sense 在其电路板上提供蓝牙模块。这种通信允许您连接到蜂巢内的 Arduino,并与蜂巢保持距离,没有蜜蜂蜇伤的风险。

安卓应用
接下来,我们设计了我们需要连接到 Arduino Nano BLE 33 Sense 并开始下载有关蜜蜂家族状态的数据和警报的 Android 应用程序。
1. 连接hive中的设备

2. 主屏显示温湿度数据和事件提醒。

您可以在下方看到 Arduino 设备发送到 Android 应用程序的警报。

经营理念

自己动手!
测试我们系统的说明。
第 1 步 下载.ino 程序环境,用于对Arduino ble 33 sense 进行编程。编译代码并发送给Arduino开发板

https://www.arduino.cc/en/software
第 2 步 将应用下载到您的 Android 设备(附件中的 .apk 文件)
第 3 步 在蜂巢中安装 Arduino 设备。
第 4 步 通过蓝牙连接到设备

改进
- 通过增加蜜蜂嗡嗡声的数据库来改进机器学习模型。
- 为 Android 应用添加额外功能
- 我们看到在 LoraWan 网络上构建蜂巢信息数据库方面的改进,数据可以发送到服务器并随时随地访问。

结论
我们很高兴展示我们的想法并与您分享一个您可以在自己的环境中尝试的项目。我们相信,我们正走在通过进一步改进使养蜂人的工作更轻松的正确轨道上。您还可以通过增加蜜蜂嗡嗡声录音的数据库来改进模型。这将使系统更准确,对干扰更不敏感。谢谢!
代码
- Arduino Nano ble 33 感
- ei-smartbees-arduino-1.0.6.zip
Arduino Nano ble 33 senseC/C++
/* Edge Impulse Arduino 示例 版权所有 (c) 2021 EdgeImpulse Inc. 特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人的许可,以处理软件不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向其提供软件的人这样做,但须遵守下列条件: 上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。该软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或使用或其他原因引起的或与之相关的SOFTWARE.*/// 如果您的目标内存有限,请删除此宏以节省 10K RAM#define EIDSP_QUANTIZE_FILTERBANK 0/* Includes --------------- ----------------------------------------- */#include#include #include #include #include #define BLE_UUID_STRING "1A3AC131-31EF-758B-BC51-54A61958EF82"#define BLESERVICE_U9A2E_2E 082F-C079-9E75AAE428B1"/** 音频缓冲区、指针和选择器 */typedef struct { int16_t *buffer; uint8_t buf_ready; uint32_t buf_count; uint32_t n_samples;} inference_t;static inference_t inference;静态签名的short sampleBuffer[2048];static bool debug_nn =false; // 将此设置为 true 以查看例如从原始信号BLEDevice central生成的功能;BLEService service(BLE_UUID_TEST_SERVICE);BLEStringCharacteristic serviceOutput(BLE_UUID_STRING, BLERead | BLENotify, 200);/** @brief Arduino setup function*/void setup(){ // 把你的设置代码放在这里,运行一次:Serial.begin(115200);而(!串行); pinMode(LED_BUILTIN,输出); if (!BLE.begin()) { Serial.println("启动BLE失败!");而 (1); BLE.setLocalName("BeeHive"); BLE.setAdvertisedService(服务); service.addCharacteristic(serviceOutput); BLE.addService(服务); BLE.advertise(); Serial.println("蓝牙设备激活,等待连接..."); if (!HTS.begin()) { Serial.println("温湿度传感器初始化失败!");而 (1); } if (microphone_inference_start(EI_CLASSIFIER_RAW_SAMPLE_COUNT) ==false) { ei_printf("ERR:设置音频采样失败\r\n");返回; }}/** @brief Arduino 主函数。运行推理循环。*/void loop(){ central =BLE.central(); if (central) { Serial.print("连接到中央:"); Serial.println(central.address());数字写入(LED_BUILTIN,高); while (central.connected()) { ei_printf("2 秒后开始推理...\n");延迟(2000); ei_printf("正在录音...\n"); bool m =mic_inference_record(); if (!m) { ei_printf("ERR:无法录制音频...\n");返回;浮动温度 =HTS.readTemperature();浮动湿度 =HTS.readHumidity(); StaticJsonDocument<600> 文档; doc["温度"] =(round(温度*10)/10.0);文档[“湿度”] =(圆形(湿度*10)/10.0);文档[“事件”] =“”; ei_printf("录音完成\n");信号_t信号; signal.total_length =EI_CLASSIFIER_RAW_SAMPLE_COUNT; signal.get_data =µphone_audio_signal_get_data; ei_impulse_result_t 结果 ={ 0 }; EI_IMPULSE_ERROR r =run_classifier(&signal, &result, debug_nn); if (r !=EI_IMPULSE_OK) { ei_printf("ERR:无法运行分类器 (%d)\n", r);返回; } // 打印预测 ei_printf("Predictions "); ei_printf("(DSP:%d ms., 分类:%d ms., 异常:%d ms.)", result.timing.dsp, result.timing.classification, result.timing.anomaly); ei_printf(":\n");浮动预测[3]; for (size_t ix =0; ix 0) { Serial.write(print_buf); }}/** @brief PDM 缓冲区满回调获取数据并调用音频线程回调*/static void pdm_data_ready_inference_callback(void){ int bytesAvailable =PDM.available(); // 读入样本缓冲区 int bytesRead =PDM.read((char *)&sampleBuffer[0], bytesAvailable); if (inference.buf_ready ==0) { for (int i =0; i > 1; i++) { inference.buffer[inference.buf_count++] =sampleBuffer[i]; if (inference.buf_count>=inference.n_samples) { inference.buf_count =0; inference.buf_ready =1;休息; } } }/** @brief 初始化推理结构和设置/启动 PDM @param[in] n_samples n 个样本 @return { description_of_the_return_value }*/static boolmic_inference_start(uint32_t n_samples){ inference.buffer =(int16_t *)malloc (n_samples * sizeof(int16_t)); if (inference.buffer ==NULL) { return false; } inference.buf_count =0; inference.n_samples =n_samples; inference.buf_ready =0; // 配置数据接收回调 PDM.onReceive(&pdm_data_ready_inference_callback); // 可选设置增益,默认为 20 PDM.setGain(80); PDM.setBufferSize(4096); // 初始化 PDM: // - 一个通道(单声道模式) // - 16 kHz 采样率 if (!PDM.begin(1, EI_CLASSIFIER_FREQUENCY)) { ei_printf("无法启动 PDM!");麦克风推理结束();返回假; } return true;}/** @brief 等待新数据@return True 当完成*/static boolmic_inference_record(void){ inference.buf_ready =0; inference.buf_count =0; while (inference.buf_ready ==0) { //delay(10);延迟(2000); } return true;}/** 获取原始音频信号数据*/static intmic_audio_signal_get_data(size_t offset, size_t length, float *out_ptr){ numpy::int16_to_float(&inference.buffer[offset], out_ptr, length); return 0;}/** @brief 停止 PDM 并释放缓冲区*/static voidmic_inference_end(void){ PDM.end();自由(推理。缓冲区);}#if !defined(EI_CLASSIFIER_SENSOR)|| EI_CLASSIFIER_SENSOR !=EI_CLASSIFIER_SENSOR_MICROPHONE#error "电流传感器的型号无效。"#endif
ei-smartbees-arduino-1.0.6.zipC/C++
具有机器学习模型的库无预览(仅限下载)。
安卓应用
https://github.com/TCodingB/BeeMonitor.gitAndroid 设备的 Apk 文件
https://github.com/TCodingB/BeeMonitor/tree/main/apk/debug制造工艺