From 0e513dc79a3e6cfae082ae387d591572de8ab316 Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Sun, 22 Feb 2026 11:14:48 +0100 Subject: [PATCH] get pms5003 working ", readings_index); "); "); "); "); ", "); ", "); "); "); "); "); "); "); "); "); "); "); ", link_status); ", link_status); "); ", readings[reading_i].pm1, readings[reading_i].pm2_5, readings[reading_i].pm10); ", reading_i); --- node1.c | 40 ++++++++++++++++++++++------------------ pms5003.c | 18 ++++++++++++------ 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/node1.c b/node1.c index 306fd36..f5e0d4f 100644 --- a/node1.c +++ b/node1.c @@ -101,6 +101,7 @@ int main() { if (absolute_time_diff_us(last_sensor_reading, now) >= SENSOR_READING_INTERVAL_US) { + printf("Sensor reading: %d\n", readings_index); last_sensor_reading = now; printf("Making BME280 Reading\n"); current_bem280_reading = bme280_read(&bem_config); @@ -117,18 +118,21 @@ int main() { pms5003_warmup(&pms_config); } - // if (readings_index == 4) { - // printf("Starting reads on PMSS5003\n"); - // pms5003_start_reading(&pms_config); - // } + if (readings_index == 4) { + printf("Starting reads on PMSS5003\n"); + pms5003_start_reading(&pms_config); + } - // if (readings_index == 6) { - // printf("Finished reading PMSS5003\n"); - // current_pms5003_reading = pms5003_finish_reading(&pms_config); - // snprintf(msg_to_send, sizeof(msg_to_send), "M02,%.2f,%.2f,%2f\n", - // current_pms5003_reading.pm1, current_pms5003_reading.pm2_5, - // current_pms5003_reading.pm10); - // } + if (readings_index == 6) { + printf("Finished reading PMSS5003\n"); + current_pms5003_reading = pms5003_finish_reading(&pms_config); + snprintf(msg_to_send, sizeof(msg_to_send), "M02,%.2f,%.2f,%2f\n", + current_pms5003_reading.pm1, current_pms5003_reading.pm2_5, + current_pms5003_reading.pm10); + printf( + "Sending particle matter readings to backend server...\n"); + send_msg(msg_to_send); + } readings_index++; if (readings_index >= 10) { @@ -142,27 +146,27 @@ int main() { // Check connection status int link_status = cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA); - printf("[WiFi Status Check]\n"); - printf(" Link Status: "); + // printf("[WiFi Status Check]\n"); + // printf(" Link Status: "); switch (link_status) { case CYW43_LINK_DOWN: - printf("DOWN\n"); + // printf("DOWN\n"); gpio_put(WIFI_STATUS_LED_PIN, false); break; case CYW43_LINK_JOIN: - printf("JOINING\n"); + // printf("JOINING\n"); gpio_put(WIFI_STATUS_LED_PIN, false); break; case CYW43_LINK_NOIP: - printf("NO IP\n"); + // printf("NO IP\n"); gpio_put(WIFI_STATUS_LED_PIN, false); break; case CYW43_LINK_UP: - printf("UP\n"); + // printf("UP\n"); gpio_put(WIFI_STATUS_LED_PIN, true); break; default: - printf("UNKNOWN (%d)\n", link_status); + // printf("UNKNOWN (%d)\n", link_status); gpio_put(WIFI_STATUS_LED_PIN, false); break; } diff --git a/pms5003.c b/pms5003.c index f2813b8..c7a9dd5 100644 --- a/pms5003.c +++ b/pms5003.c @@ -5,6 +5,7 @@ #include #include #include +#include /** Lib for Plantower PMS5003 Particulate Matter (PM) Sensor @@ -50,6 +51,7 @@ static pms5003_reading extract_pm_values_from_rx_buf() { static void on_uart_rx() { // TODO: make the uart1 dynamic + watchdog_update(); while (read && reading_i < MAX_READINGS && uart_is_readable(uart1)) { uint8_t ch = uart_getc(uart1); // start of a message @@ -57,6 +59,13 @@ static void on_uart_rx() { printf("pms5003 reading received\n"); rx_i = 0; } + + // Bounds check before accessing array + if (rx_i >= 32) { + rx_i = 0; + continue; + } + rx_buf[rx_i] = ch; rx_i++; // end of message @@ -65,11 +74,6 @@ static void on_uart_rx() { printf("pm1: %f, pm2.5: %f, pm10: %f\n", readings[reading_i].pm1, readings[reading_i].pm2_5, readings[reading_i].pm10); reading_i++; } - - // guard - if (rx_i > 32) { - rx_i = 0; - } } } @@ -82,7 +86,7 @@ void pms5003_init(pms5003_config *new_config, uart_inst_t *uart, uint8_t tx_pin, uart_set_format(uart, 8, 1, UART_PARITY_NONE); irq_set_exclusive_handler(UART1_IRQ, on_uart_rx); irq_set_enabled(UART1_IRQ, true); - uart_set_irq_enables(uart, true, false); + uart_set_irq_enables(uart, false, false); // high level or suspending is normal working status, while low level is // sleeping mode. @@ -126,11 +130,13 @@ void pms5003_warmup(pms5003_config *config) { gpio_put(config->enable_pin, 1); } void pms5003_start_reading(pms5003_config *config) { reading_i = 0; read = true; + uart_set_irq_enables(config->uart, true, false); } pms5003_reading pms5003_finish_reading(pms5003_config *config) { printf("readings_i: %d\n", reading_i); read = false; + uart_set_irq_enables(config->uart, false, false); gpio_put(config->enable_pin, 0); pms5003_reading average_reading = compute_avarage_reading(); reading_i = 0;