Я работаю над проектом, используя массив обонятельных датчиков Bosch BME688 и перьевую доску Adafruit ESP32 Huzzah Featherboard (комплект разработчика Bosch BME688). В настоящее время я написал программу, которая использует датчик для записи данных в реальном времени, а затем передает эти данные MQTT-брокеру Mosquitto. Эта программа работает правильно, и когда я подписываюсь на эту тему в своем терминале Mac, я получаю данные с датчиков в реальном времени. Итак, теперь, когда это сработало, я хотел попытаться построить график этих точек данных. В Jupyter Notebook я написал скрипт, который подписывается на брокера MQTT и отображает данные в режиме реального времени. Но он не работает, и когда я запускаю скрипт, ничего не происходит, а просто запрашивает следующую ячейку. И это несмотря на то, что датчик записывает данные правильно, а открытое окно терминала показывает, что данные действительно записываются правильно.
Это код, который я использовал для создания MQTT-брокера, и затем начните обработку данных. Как я упоминал ранее, это работало правильно, и я мог правильно видеть выходные данные как в терминале (подписавшись на тему MQTT), так и через последовательный монитор Arduino (я использовал Arduino IDE для написания программы и загрузки в датчик). ).
Выходные данные BSEC — это выходные данные одного из датчиков, а массив — это полный массив выходных данных всех датчиков. Кстати, массив — единственный, который отправляется MQTT-брокеру, и он не содержит всех каналов данных. У него есть только идентификатор датчика, метка времени, давление, температура, давление, влажность и газовое сопротивление.
Итак, хотя это работает правильно, графический код, который я написал и запустил в Jupyter Notebook нет. Как я уже упоминал, когда я запускаю его, ничего не отображается на графике, фактически вывода вообще нет, и он сразу же предлагает мне перейти к следующей ячейке в блокноте. Это указывает на то, что код завершился. Но я не уверен, почему это происходит. Вот код, который у меня есть для этого:
import paho.mqtt.client as mqtt
import matplotlib.pyplot as plt
import numpy as np
import time
import json
mqtt_server = "MyMQTTServerAddress"
mqtt_port = "MySensorsPort"
mqtt_topic = "sensorData"
data = {}
plt.ion()
fig, ax = plt.subplots(figsize=(12, 6))
lines = [ax.plot([], [], label=f'Sensor {i}') for i in range(8)]
ax.set_title('Olfactory Sensor Readings: Gas Resistance')
ax.set_xlabel('Time (seconds)')
ax.set_ylabel('Gas Resistance (Ohms)')
plt.legend()
plt.tight_layout()
last_message_time = time.time()
no_data_timeout = 60
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {str(rc)}")
client.subscribe(mqtt_topic)
def on_message(client, userdata, msg):
global last_message_time
try:
received_data = json.loads(msg.payload.decode())
datapoints = received_data["datapoints"]
for point in datapoints:
sensor_id = point[0]
timestamp = point[1]
gas_resistance = point[5]
if sensor_id not in data:
data[sensor_id] = {'timestamp': [], 'gas_resistance': []}
data[sensor_id]['timestamp'].append(timestamp)
data[sensor_id]['gas_resistance'].append(gas_resistance)
latest_timestamp = max([max(d['timestamp']) for d in data.values() if d['timestamp']])
for i in range(8):
if i in data:
closest_index = np.argmin(np.abs(np.array(data[i ['timestamp']) - latest_timestamp))
lines[i][0].set_data(latest_timestamp, data[i]['gas_resistance'][closest_index])
ax.set_xlim(min([min(d['timestamp']) for d in data.values() if d['timestamp']]), latest_timestamp + 10)
ax.relim()
ax.autoscale_view()
plt.draw()
plt.pause(0.01)
except Exception as e:
print(f"Error processing message: {e}")
last_message_time = time.time()
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(mqtt_server, mqtt_port, 60)
client.loop_start()
while True:
if time.time() - last_message_time > no_data_timeout:
print(f"No data received for {no_data_timeout} seconds. Exiting.")
client.loop_stop()
client.disconnect()
break
time.sleep(1)
Имейте в виду, что я это делаю именно так. Сначала я запускаю брокер, а затем подключаю датчик. Датчик записывает данные, как только он включается, и останавливается, как только он отключается. Датчик начинает записывать данные, и я могу сказать, что это правильно, потому что могу подписаться на эту тему и проверить точки данных. Я думаю запустить код Jupyter Notebook, и именно здесь возникает моя ошибка. Что странно, программа завершает работу автоматически, без кода ошибки.
Я работаю над проектом, используя массив обонятельных датчиков Bosch BME688 и перьевую доску Adafruit ESP32 Huzzah Featherboard (комплект разработчика Bosch BME688). В настоящее время я написал программу, которая использует датчик для записи данных в реальном времени, а затем передает эти данные MQTT-брокеру Mosquitto. Эта программа работает правильно, и когда я подписываюсь на эту тему в своем терминале Mac, я получаю данные с датчиков в реальном времени. Итак, теперь, когда это сработало, я хотел попытаться построить график этих точек данных. В Jupyter Notebook я написал скрипт, который подписывается на брокера MQTT и отображает данные в режиме реального времени. Но он не работает, и когда я запускаю скрипт, ничего не происходит, а просто запрашивает следующую ячейку. И это несмотря на то, что датчик записывает данные правильно, а открытое окно терминала показывает, что данные действительно записываются правильно. Это код, который я использовал для создания MQTT-брокера, и затем начните обработку данных. Как я упоминал ранее, это работало правильно, и я мог правильно видеть выходные данные как в терминале (подписавшись на тему MQTT), так и через последовательный монитор Arduino (я использовал Arduino IDE для написания программы и загрузки в датчик). ). [code]#include #include "commMux.h"
logger.beginSensorData(); for (uint8_t i = 0; i < NUM_OF_SENS; i++) { communicationSetup[i] = comm_mux_set_config(Wire, SPI, i, communicationSetup[i]);
envSensor[i].allocateMemory(bsecMemBlock[i]);
if (!envSensor[i].begin(BME68X_SPI_INTF, comm_mux_read, comm_mux_write, comm_mux_delay, &communicationSetup[i])) { checkBsecStatus (envSensor[i]); }
if (!envSensor[i].updateSubscription(sensorList, ARRAY_LEN(sensorList), BSEC_SAMPLE_RATE_LP)) { checkBsecStatus (envSensor[i]); }
00:00:55.428 -> BSEC outputs: 00:00:55.428 -> sensor num = 0 00:00:55.428 -> timestamp = 40256 00:00:55.428 -> iaq = 50.00 00:00:55.428 -> iaq accuracy = 0 00:00:55.428 -> temperature = 21.80 00:00:55.428 -> pressure = 993.45 00:00:55.428 -> humidity = 32.74 00:00:55.428 -> gas resistance = 73478.76 00:00:55.428 -> stabilization status = 1.00 00:00:55.460 -> run in status = 0.00 [/code] Выходные данные BSEC — это выходные данные одного из датчиков, а массив — это полный массив выходных данных всех датчиков. Кстати, массив — единственный, который отправляется MQTT-брокеру, и он не содержит всех каналов данных. У него есть только идентификатор датчика, метка времени, давление, температура, давление, влажность и газовое сопротивление. Итак, хотя это работает правильно, графический код, который я написал и запустил в Jupyter Notebook нет. Как я уже упоминал, когда я запускаю его, ничего не отображается на графике, фактически вывода вообще нет, и он сразу же предлагает мне перейти к следующей ячейке в блокноте. Это указывает на то, что код завершился. Но я не уверен, почему это происходит. Вот код, который у меня есть для этого: [code]import paho.mqtt.client as mqtt import matplotlib.pyplot as plt import numpy as np import time import json
latest_timestamp = max([max(d['timestamp']) for d in data.values() if d['timestamp']])
for i in range(8): if i in data: closest_index = np.argmin(np.abs(np.array(data[i ['timestamp']) - latest_timestamp)) lines[i][0].set_data(latest_timestamp, data[i]['gas_resistance'][closest_index])
ax.set_xlim(min([min(d['timestamp']) for d in data.values() if d['timestamp']]), latest_timestamp + 10)
ax.relim() ax.autoscale_view()
plt.draw() plt.pause(0.01)
except Exception as e: print(f"Error processing message: {e}")
while True: if time.time() - last_message_time > no_data_timeout: print(f"No data received for {no_data_timeout} seconds. Exiting.") client.loop_stop() client.disconnect() break
time.sleep(1) [/code] Имейте в виду, что я это делаю именно так. Сначала я запускаю брокер, а затем подключаю датчик. Датчик записывает данные, как только он включается, и останавливается, как только он отключается. Датчик начинает записывать данные, и я могу сказать, что это правильно, потому что могу подписаться на эту тему и проверить точки данных. Я думаю запустить код Jupyter Notebook, и именно здесь возникает моя ошибка. Что странно, программа завершает работу автоматически, без кода ошибки.
Я работаю над проектом, используя массив обонятельных датчиков Bosch BME688 и перьевую доску Adafruit ESP32 Huzzah Featherboard (комплект разработчика Bosch BME688). В настоящее время я написал программу, которая использует датчик для записи данных...