get pms5003 working

", readings_index);
");
");
");
");
",
");
",
");
");
");
");
");
");
");
");
");
");
");
", link_status);
", link_status);
");
", readings[reading_i].pm1, readings[reading_i].pm2_5, readings[reading_i].pm10);
", reading_i);
This commit is contained in:
Travis Shears 2026-02-22 11:14:48 +01:00
parent 9dd4ee4163
commit 0e513dc79a
Signed by: travisshears
GPG key ID: CB9BF1910F3F7469
2 changed files with 34 additions and 24 deletions

View file

@ -5,6 +5,7 @@
#include <hardware/regs/intctrl.h>
#include <stdint.h>
#include <stdio.h>
#include <hardware/watchdog.h>
/**
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;