sensor reading extended; persistent lorawan frame counter

This commit is contained in:
xlemmingx 2025-11-05 12:32:11 +01:00
parent 88b017c299
commit a1b9324ecc
7 changed files with 37 additions and 21 deletions

View File

@ -24,7 +24,7 @@ static uint8_t app_key[] = LORAWAN_APP_KEY;
static uint8_t join_eui[] = LORAWAN_APP_EUI;
/* ABP keys and address */
static uint32_t dev_addr = LORAWAN_DEV_ADDR;
static uint8_t dev_addr[] = LORAWAN_DEV_ADDR;
static uint8_t nwks_key[] = LORAWAN_NWKS_KEY;
static uint8_t apps_key[] = LORAWAN_APPS_KEY;
@ -308,14 +308,14 @@ void join_network_otaa()
void join_network_abp()
{
LOG_INF("Starting ABP activation...");
LOG_INF("DevAddr: 0x%08X", dev_addr);
LOG_INF("DevAddr: 0x%02X%02X%02X%02X", dev_addr[0], dev_addr[1], dev_addr[2], dev_addr[3]);
LOG_HEXDUMP_INF(nwks_key, 16, "NwkSKey: ");
LOG_HEXDUMP_INF(apps_key, 16, "AppSKey: ");
/* Configure ABP parameters */
join_cfg.mode = LORAWAN_ACT_ABP;
join_cfg.dev_eui = dev_eui;
join_cfg.abp.dev_addr = dev_addr;
join_cfg.abp.dev_addr = (dev_addr[0] << 24) | (dev_addr[1] << 16) | (dev_addr[2] << 8) | dev_addr[3];
join_cfg.abp.nwk_skey = nwks_key;
join_cfg.abp.app_skey = apps_key;
@ -327,7 +327,7 @@ void join_network_abp()
}
LOG_INF("✓ Successfully activated LoRaWAN network via ABP");
printk("Device 0x%08X activated via ABP\n", dev_addr);
printk("Device 0x%02X%02X%02X%02X activated via ABP\n", dev_addr[0], dev_addr[1], dev_addr[2], dev_addr[3]);
}
void send_data_packet(char *data, uint8_t data_len)
@ -354,7 +354,7 @@ void send_data_packet(char *data, uint8_t data_len)
else
{
LOG_INF("✓ Data packet sent successfully!");
LOG_INF("DevAddr: 0x%08X, Port: %d, Length: %d bytes", dev_addr, LORAWAN_PORT, data_len);
LOG_INF("DevAddr: 0x%02X%02X%02X%02X, Port: %d, Length: %d bytes", dev_addr[0], dev_addr[1], dev_addr[2], dev_addr[3], LORAWAN_PORT, data_len);
break;
}

View File

@ -4,13 +4,13 @@
#define LORAWAN_PORT 2
/* ABP Configuration */
#define LORAWAN_DEV_ADDR {0x01, 0x94, 0xC6, 0x5F}
#define LORAWAN_NWKS_KEY {0x26, 0x8F, 0xDA, 0x93, 0x3F, 0x4C, \
0xAE, 0xBF, 0x96, 0xA3, 0x0F, 0xE7, \
0x60, 0x27, 0xA4, 0x1E}
#define LORAWAN_APPS_KEY {0x40, 0x80, 0x09, 0xCA, 0x1D, 0x9F, \
0xE2, 0xB8, 0x22, 0xF4, 0x68, 0x4D, \
0x76, 0x33, 0x13, 0x00}
#define LORAWAN_DEV_ADDR {0x01, 0x9D, 0x28, 0xDF}
#define LORAWAN_NWKS_KEY {0x4C, 0xF3, 0xD2, 0xF5, 0x6C, 0x5C, \
0x45, 0xA6, 0x78, 0x81, 0xD7, 0xBA, \
0x91, 0x61, 0x65, 0x11}
#define LORAWAN_APPS_KEY {0x41, 0x5F, 0x07, 0xCF, 0x5B, 0xA6, \
0xE6, 0x30, 0xC4, 0xC3, 0xEB, 0x9C, \
0x7E, 0x71, 0x8C, 0x5D}
/* OTAA Configuration (backup) */
#define LORAWAN_APP_KEY {0x71, 0x5A, 0x39, 0xB2, 0x86, 0xC3, \

View File

@ -42,8 +42,20 @@ int main(void)
temp = get_stable_value_sht4x(SENSOR_CHAN_AMBIENT_TEMP);
printk("hum: %d.%02d%%\n", (int)humidity, (int)(humidity * 100) % 100);
printk("temp: %d.%02d °C\n", (int)temp, (int)(temp * 100) % 100);
/* Try MLX sensor with stable measurement (10 samples) */
floor_temp = get_stable_value_mlx90614(MLX90614_IR_TEMP_ADDR);
printk("floor_temp: %d.%02d °C\n", (int)floor_temp, (int)(floor_temp * 100) % 100);
if (mlx90614_sensor_available)
{
LOG_INF("MLX stable measurement: %d.%02d °C", (int)floor_temp, (int)(floor_temp * 100) % 100);
}
else
{
LOG_WRN("MLX sensor not available");
}
printk("floor_temp: %d.%02d °C (available: %s)\n",
(int)floor_temp, (int)(floor_temp * 100) % 100,
mlx90614_sensor_available ? "YES" : "NO");
/* Set relais based on temperature if not manually overridden */
if (!relais_manual_override)

View File

@ -76,9 +76,10 @@ static float read_mlx_object_temp(void)
float get_stable_value_mlx90614(uint8_t target_addr)
{
// Früher Ausstieg wenn Sensor nicht verfügbar
// Test ob Sensor verfügbar ist
request_sensor_data_mlx90614(target_addr);
if (!mlx90614_sensor_available) {
LOG_DBG("MLX90614 not available, returning 0.0");
LOG_INF("MLX90614 not available, returning 0.0");
return 0.0;
}

View File

@ -7,12 +7,12 @@ LOG_MODULE_REGISTER(sensor_utils);
float get_stable_sensor_value(sensor_read_func_t read_func, float outlier_threshold)
{
const int MAX_SAMPLES = 5;
const int MAX_SAMPLES = 10;
float measurements[MAX_SAMPLES];
int valid_count = 0;
// Sammle bis zu 5 Messungen
for (int i = 0; i < MAX_SAMPLES && valid_count < 3; i++) {
// Sammle bis zu 10 Messungen
for (int i = 0; i < MAX_SAMPLES && valid_count < 7; i++) {
if (i > 0) {
k_sleep(K_MSEC(500)); // Pause gegen Selbsterhitzung
}
@ -66,8 +66,8 @@ float get_stable_sensor_value(sensor_read_func_t read_func, float outlier_thresh
if (filtered_count > 0) {
float result = sum / filtered_count;
LOG_INF("Stable sensor value: %.2f (filtered %d/%d samples)",
result, filtered_count, valid_count);
LOG_INF("Stable sensor value: %d.%02d (filtered %d/%d samples)",
(int)result, (int)(result * 100) % 100, filtered_count, valid_count);
return result;
}

View File

@ -50,7 +50,7 @@ float get_value_from_current_sample_sht4x(enum sensor_channel sensor)
if (sensor_channel_get(sht, sensor, &value) == 0) {
result = sensor_value_to_double(&value);
const char* sensor_name = (sensor == SENSOR_CHAN_AMBIENT_TEMP) ? "temperature" : "humidity";
LOG_DBG("SHT4X %s value: %.2f", sensor_name, result);
LOG_DBG("SHT4X %s value: %d.%02d", sensor_name, (int)result, (int)(result * 100) % 100);
} else {
const char* sensor_name = (sensor == SENSOR_CHAN_AMBIENT_TEMP) ? "temperature" : "humidity";
LOG_ERR("Can't read SHT4X %s from sample!", sensor_name);

View File

@ -10,6 +10,9 @@ CONFIG_SHT4X=y
CONFIG_LORA=y
CONFIG_LORAWAN=y
CONFIG_LORAMAC_REGION_EU868=y
# LoRaWAN Frame Counter persistence
CONFIG_LORAWAN_NVM_SETTINGS=y
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
CONFIG_LOG_DEFAULT_LEVEL=3