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

40
node1.c
View file

@ -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;
}

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;