Введение
Привет, читатель, меня зовут Морозов Алексей, и в этой статье я наглядно покажу, как сделать метеостанцию! За работу.
Идея и ответы на почему
Я хочу сделать простую и модульную метеостанцию с консольным выводом данных
Сделать плату-опросчик, которая читает данные с датчиков и отправляет их в порт.
Сделать скрипт на питоне, который будет обрабатывать и выводить значения в консоль
Почему модульность?
Разделение метеостанции на два уровня, низкий(опрос датчиков) и высокий(обработка и вывод данных) позволяет быстро вносить изменения в систему, добавлять новые датчики или даже менять сами устройства.
Почему именно консольный вывод?
TUI - отличная отправная точка для вывода данных, можно быстро менять формат вывода, добавлять новые диаграммы и даже окна.
Подбор компонентов
В качестве платы опросчика, подойдёт
arduino nano, у неё достаточно мощности и портов, чтобы развивать метеостанцию до пределаВ качестве датчика я решил взять
htu21d, который умеет определять температуру и влажность воздуха. Отличная плата для начала, потом заменю наbmp280
Подключение
Приступим к сборке метеостанции! Вот схема подключения:

Пример сборки тут.




Код для ардуино
Вот код для считывания данных с датчика и отправки их в порт:
#include <GyverHTU21D.h> GyverHTU21D htu; void getTemp(){ Serial.print("Temp:"); Serial.print(htu.getTemperature()); Serial.print(","); Serial.print("Humd:"); Serial.println(htu.getHumidity()); } void setup() { Serial.begin(115200); htu.begin(); } void loop() { if (htu.readTick()) { getTemp(); } }

Если открыть вывод в ардуино иде, то мы увидим вот такую картину.
Код на питон
Вот код скрипта на питон, для парсинга и вывода данных в виде графика:
import serial import plotext as plt import time ser = serial.Serial('/dev/ttyUSB0', 115200) def read_and_parse(): response = ser.readline() if not response: return None, None try: decoded_response = response.decode('utf-8') input_string = decoded_response.rstrip('\n') # Разбиваем строку на пары ключ:значение pairs = input_string.split(',') if len(pairs) != 2: print("Ошибка: строка должна содержать ровно две пары ключ:значение") return None, None expected_key1 = "Temp" expected_key2 = "Humd" value1 = None value2 = None for pair in pairs: parts = pair.split(':', 1) # Разбиваем только по первому ':' if len(parts) != 2: print(f"Ошибка: некорректный формат пары: {pair}") return None, None key, value = parts[0].strip(), parts[1].strip() if key == expected_key1: value1 = value elif key == expected_key2: value2 = value else: print(f"Предупреждение: неизвестный ключ '{key}' найден в строке") # Проверяем, нашли ли оба ожидаемых значения if value1 is None or value2 is None: print("Ошибка: не найдены значения для одного или обоих ожидаемых ключей") return None, None return value1, value2 except Exception as e: print(f"Произошла ошибка при парсинге: {e}") return None, None def plot_data(temp, humd): x = ["Температура", "Влажность"] # Значения y = (float(temp), float(humd)) colors = ["cyan", "red"] plt.clear_data() plt.bar(x, y, color=colors, orientation="horizontal", width=3/5) plt.title("Данные с датчика") plt.ylabel("Значение") plt.clt() plt.show() def main(): print("Начало работы! Нажмите Ctrl+C для завершения.") try: while True: temp, humd = read_and_parse() # Рисуем только если данные успешно получены if temp is not None and humd is not None: plot_data(temp, humd) # Небольшая пауза, чтобы не нагружать процессор и дать время Arduino time.sleep(0.1) except KeyboardInterrupt: print("\nЗавершение работы...") finally: ser.close() if __name__ == "__main__": main()
Обратите внимание!
На 4 строчке, если вы работаете на windows, то нужно поменять с /dev/ttyUSB0 на COMX(заменить на номер порта куда подключена ваша плата, можно посмотреть в ардуино иде)
Тесты
Всё исправно работает!

Завершение
Всё заработало - это успех.
Идеи по доработке:
Поставить датчик давления(bmp280)
сделать GUI, например на PyQt6 + Qt creator
Спасибо за внимание!
Комментарии (9)

Arhammon
03.07.2026 03:44Отличная плата для начала, потом заменю на
bmp280Насколько я помню у Бошевских датчиков надо брать из памяти калибровочные коэффициенты и много считать и помниться 8битным АВРкам на этом этапе будет плохо.

ArduDragon Автор
03.07.2026 03:44Спасибо за новость, какой датчик вы посоветуете поставить?

Arhammon
03.07.2026 03:44Датчик нормальный, что то он будет показывать и без калибровки. Тут проще взять современные ардуины на Ренесасе они у китайцев не сильно дороже нанок, а внутри практически полный фарш USB, DAC. Ну или ESP или даже во "взрослые" STM пойти.

fio
03.07.2026 03:44Датчик BM280 лучше менять на BMP580 - цена примерно та же, а качество данных гораздо выше
Можно заменить и Arduino nano - на ESP32C3(или S3) Supe mini. Появится очень много дополнительных возможностей. Например, обмен с вашим python-скриптом через TCP/IP (по беспроводу). Или вообще - на МК разместить web-сервер с отображением информации с датчика.

Coder007
03.07.2026 03:44Очень улыбнула фотография: Arduino в корпусе. Это прям классно)))
Расскажите про модульность, как вы её реализуете? Программный код на ардуино и на ПК понятно, это back и front. А в чем модульность? Или это будет шина i2c, к которой будете подключать датчики или это будет шина rs485, на которой будут ардуины висеть?
В качестве платы опросчика, подойдёт arduino nano, у неё достаточно мощности и портов, чтобы развивать метеостанцию до предела
Честно сказать, она может и домом управлять, не то что данные с датчиков тянуть. При желании, на Ардуинку можно повесить 256 дискретных входов и выходов суммарно и это только расширителями.
Кстати, очень удобно использовать Arduino pro mini. Она ещё компактные, нежели Nano, но и стоит почти в половину дешевле. Самый главный момент, нужен внешний программатор.

Она прям компактная и удобная. Без пинов вообще как брелок будет выглядеть.

ArduDragon Автор
03.07.2026 03:44По поводу смены контроллера, то я переведу на ESP, будет интересно запрограммировать на ESP-IDF. По поводу модульности, я имел в виду, что мы разделяем систему на две части (модуля) и можем точечно вводить изменения при надобности.
StrangerMe
Отлично! И backed и fronted реализован. Хорошая статья для начинающих. Молодец!