Hallo zusammen,
ich bin schon länger mit einem Projekt für meine Bienen beschäftigt. Es geht darum einen Arduino Nano 33 BLE Sense in einem Bienenstock zu installieren. Dieser führt Messungen zu Temperatur, Luftfeuchtigkeit und Summ-Frequenz durch und analysiert somit wie es dem Bienenvolk geht. Das Projekt habe ich auf ProjectHub gefunden.
https://create.arduino.cc/projecthub/delfin-ki/beemonitor-96f5d7
Ich hatte zuerst Probleme mit den benötigten Librarys und habe in die Kommentare geschrieben. Weil ich aber 4 Monate später immer noch keine Antwort bekommen habe, versuche ich es mit meinem aktuellen Problem erst gar nicht dort. Das Problem mit den Librarys habe ich inzwischen gelöst. Man kann bei der Projektseite eine .apk Datei herunterladen um alle Daten vom Bienenstock mit Bluetooth direkt aufs Handy geschickt zu bekommen. Ich habe versucht die Datei herunterzuladen, aber ich bekomme immer die Fehlermeldung
"App wurde nicht installiert".
Bei anderen Smartphones bekam ich die Meldung
"Die App wurde nicht installiert, da das Paket offenbar ungültig ist".
Ich habe bereits versucht, die App per Android Studio auf mein Handy zu bekommen. Dort zeigt die App aber nur einen Ladebalken/Kreis an. Der Arduino wird bei mir in den Bluetooth Einstellungen von meinem Handy angezeigt, aber eine Kopplung ist nicht möglich. Ich bekomme die Meldung
"Zur Verwendung dieses Geräts ist eine App erforderlich"
Kurz darauf bekomme ich dann trotzdem eine Kopplungsanforderung. Wenn ich diese jedoch akzeptiere kommt die nächste Fehlermeldung
"Kopplung mit BeeHive nicht möglich. Stellen sie sicher, dass das Gerät für eine Kopplung bereit ist."
(BeeHive ist der Gerätename)
Hier ist noch der Code und die .apk. Man kann beides auch auf der Projektseite finden.
/* Edge Impulse Arduino examples
Copyright (c) 2021 EdgeImpulse Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
// If your target is limited in memory remove this macro to save 10K RAM
#define EIDSP_QUANTIZE_FILTERBANK 0
/* Includes ---------------------------------------------------------------- */
#include <PDM.h>
#include <smartbees_inference.h>
#include <ArduinoBLE.h>
#include <ArduinoJson.h>
#include <Arduino_HTS221.h>
#define BLE_UUID_STRING "1A3AC131-31EF-758B-BC51-54A61958EF82"
#define BLE_UUID_TEST_SERVICE "9A48ECBA-2E92-082F-C079-9E75AAE428B1"
/** Audio buffers, pointers and selectors */
typedef struct {
int16_t *buffer;
uint8_t buf_ready;
uint32_t buf_count;
uint32_t n_samples;
} inference_t;
static inference_t inference;
static signed short sampleBuffer[2048];
static bool debug_nn = false; // Set this to true to see e.g. features generated from the raw signal
BLEDevice central;
BLEService service(BLE_UUID_TEST_SERVICE);
BLEStringCharacteristic serviceOutput(BLE_UUID_STRING, BLERead | BLENotify, 200);
/**
@brief Arduino setup function
*/
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
if (!BLE.begin()) {
Serial.println("starting BLE failed!");
while (1);
}
BLE.setLocalName("BeeHive");
BLE.setAdvertisedService(service);
service.addCharacteristic(serviceOutput);
BLE.addService(service);
BLE.advertise();
Serial.println("Bluetooth device active, waiting for connections...");
if (!HTS.begin()) {
Serial.println("Failed to initialize humidity temperature sensor!");
while (1);
}
if (microphone_inference_start(EI_CLASSIFIER_RAW_SAMPLE_COUNT) == false) {
ei_printf("ERR: Failed to setup audio sampling\r\n");
return;
}
}
/**
@brief Arduino main function. Runs the inferencing loop.
*/
void loop()
{
central = BLE.central();
if (central) {
Serial.print("Connected to central: ");
Serial.println(central.address());
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
ei_printf("Starting inferencing in 2 seconds...\n");
delay(2000);
ei_printf("Recording...\n");
bool m = microphone_inference_record();
if (!m) {
ei_printf("ERR: Failed to record audio...\n");
return;
}
float temperature = HTS.readTemperature();
float humidity = HTS.readHumidity();
StaticJsonDocument<600> doc;
doc["temperature"] = (round(temperature*10)/10.0);
doc["humidity"] = (round(humidity*10)/10.0);
doc["event"] = "";
ei_printf("Recording done\n");
signal_t signal;
signal.total_length = EI_CLASSIFIER_RAW_SAMPLE_COUNT;
signal.get_data = µphone_audio_signal_get_data;
ei_impulse_result_t result = { 0 };
EI_IMPULSE_ERROR r = run_classifier(&signal, &result, debug_nn);
if (r != EI_IMPULSE_OK) {
ei_printf("ERR: Failed to run classifier (%d)\n", r);
return;
}
// print the predictions
ei_printf("Predictions ");
ei_printf("(DSP: %d ms., Classification: %d ms., Anomaly: %d ms.)",
result.timing.dsp, result.timing.classification, result.timing.anomaly);
ei_printf(": \n");
float predictions[3];
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
predictions[ix] = (round(result.classification[ix].value * 10) / 10.0);
//data.add((round(result.classification[ix].value*10)/10.0));
}
int maximal = 0, index = 0;
for (int i = 0; i < 3; i++) {
if (maximal < predictions[i]) {
maximal = predictions[i];
index = i;
}
}
switch (index) {
case (0): doc["event"] = "MATICA"; break;
case (1): doc["event"] = "NIMATICE"; break;
case (2): doc["event"] = "ROJENJE"; break;
default: doc["event"] = "ERROR"; break;
}
String json;
serializeJson(doc, json);
if (central.connected()) serviceOutput.writeValue(json);
#if EI_CLASSIFIER_HAS_ANOMALY == 1
ei_printf(" anomaly score: %.3f\n", result.anomaly);
#endif
Serial.print("Temperature = ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity = ");
Serial.print(humidity);
Serial.println(" %");
}
digitalWrite(LED_BUILTIN, LOW);
Serial.print("Disconnected from central: ");
Serial.println(central.address());
}
}
/**
@brief Printf function uses vsnprintf and output using Arduino Serial
@param[in] format Variable argument list
*/
void ei_printf(const char *format, ...) {
static char print_buf[1024] = { 0 };
va_list args;
va_start(args, format);
int r = vsnprintf(print_buf, sizeof(print_buf), format, args);
va_end(args);
if (r > 0) {
Serial.write(print_buf);
}
}
/**
@brief PDM buffer full callback
Get data and call audio thread callback
*/
static void pdm_data_ready_inference_callback(void)
{
int bytesAvailable = PDM.available();
// read into the sample buffer
int bytesRead = PDM.read((char *)&sampleBuffer[0], bytesAvailable);
if (inference.buf_ready == 0) {
for (int i = 0; i < bytesRead >> 1; i++) {
inference.buffer[inference.buf_count++] = sampleBuffer[i];
if (inference.buf_count >= inference.n_samples) {
inference.buf_count = 0;
inference.buf_ready = 1;
break;
}
}
}
}
/**
@brief Init inferencing struct and setup/start PDM
@param[in] n_samples The n samples
@return { description_of_the_return_value }
*/
static bool microphone_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;
// configure the data receive callback
PDM.onReceive(&pdm_data_ready_inference_callback);
// optionally set the gain, defaults to 20
PDM.setGain(80);
PDM.setBufferSize(4096);
// initialize PDM with:
// - one channel (mono mode)
// - a 16 kHz sample rate
if (!PDM.begin(1, EI_CLASSIFIER_FREQUENCY)) {
ei_printf("Failed to start PDM!");
microphone_inference_end();
return false;
}
return true;
}
/**
@brief Wait on new data
@return True when finished
*/
static bool microphone_inference_record(void)
{
inference.buf_ready = 0;
inference.buf_count = 0;
while (inference.buf_ready == 0) {
//delay(10);
delay(2000);
}
return true;
}
/**
Get raw audio signal data
*/
static int microphone_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 Stop PDM and release buffers
*/
static void microphone_inference_end(void)
{
PDM.end();
free(inference.buffer);
}
#if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_MICROPHONE
#error "Invalid model for current sensor."
#endif
TCodingB-BeeMonitor-066d3ea(2).zip (6,7 MB)
Ich würde mich sehr über Hilfe freuen, besonders, da ich sehr viel Zeit in das Projekt investiert habe und nicht einfach aufgeben möchte.
Viele Grüße Mika