Этот скетч реализует компактную метеостанцию, которая:
Измеряет температуру, влажность и атмосферное давление
Выводит данные на OLED-дисплей
Передает показания на смартфон по Bluetooth
Визуализирует изменения параметров на графике
Необходимые компоненты:
Плата Arduino Nano/Uno
Датчик BME280 (температура/влажность/давление)
OLED-дисплей 0.96" (I2C)
Модуль HC-05/HC-06 (Bluetooth)
Макетная плата и провода
Источник питания (Power Bank или 9V батарея)
Полный скетч
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SoftwareSerial.h> // Настройки OLED #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Настройки BME280 Adafruit_BME280 bme; #define SEALEVELPRESSURE_HPA (1013.25) // Настройки Bluetooth SoftwareSerial bluetooth(2, 3); // RX, TX // Переменные для графиков float tempHistory[10] = {0}; int historyIndex = 0; void setup() { Serial.begin(9600); bluetooth.begin(9600); // Инициализация дисплея if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("OLED error"); while(1); } // Инициализация датчика if (!bme.begin(0x76)) { Serial.println("BME280 error"); display.println("Sensor error!"); display.display(); while(1); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); } void loop() { // Чтение данных float temperature = bme.readTemperature(); float humidity = bme.readHumidity(); float pressure = bme.readPressure() / 100.0F; // Обновление истории для графика tempHistory[historyIndex] = temperature; historyIndex = (historyIndex + 1) % 10; // Вывод на OLED display.clearDisplay(); // Текстовые данные display.setCursor(0,0); display.print("Temp: "); display.print(temperature); display.println(" C"); display.print("Hum: "); display.print(humidity); display.println(" %"); display.print("Pres: "); display.print(pressure); display.println(" hPa"); // Простой график температуры drawGraph(); display.display(); // Отправка по Bluetooth bluetooth.print("T:"); bluetooth.print(temperature); bluetooth.print("|H:"); bluetooth.print(humidity); bluetooth.print("|P:"); bluetooth.println(pressure); // Отладочный вывод Serial.print("Temp: "); Serial.print(temperature); Serial.print("C, Hum: "); Serial.print(humidity); Serial.print("%, Pres: "); Serial.print(pressure); Serial.println("hPa"); delay(5000); // Обновление каждые 5 сек } void drawGraph() { // Поиск min/max для масштабирования float minTemp = tempHistory[0], maxTemp = tempHistory[0]; for(int i=1; i<10; i++) { if(tempHistory[i] < minTemp) minTemp = tempHistory[i]; if(tempHistory[i] > maxTemp) maxTemp = tempHistory[i]; } float range = max(maxTemp - minTemp, 5); // Минимальный диапазон 5 градусов // Отрисовка графика int graphHeight = 20; int graphWidth = 100; int graphY = SCREEN_HEIGHT - graphHeight - 5; for(int i=1; i<10; i++) { if(tempHistory[i] == 0) continue; int x1 = map(i-1, 0, 9, 0, graphWidth); int y1 = map(tempHistory[i-1], minTemp, maxTemp, graphY+graphHeight, graphY); int x2 = map(i, 0, 9, 0, graphWidth); int y2 = map(tempHistory[i], minTemp, maxTemp, graphY+graphHeight, graphY); display.drawLine(x1+25, y1, x2+25, y2, WHITE); } display.drawRect(25, graphY, graphWidth, graphHeight, WHITE); }
Как это работает:
Датчик BME280:
Измеряет три параметра: температуру, влажность и давление
Высокая точность (±1°C, ±3% влажности)
OLED-дисплей:
Выводит текущие показания
Отображает график изменения температуры за последние 10 измерений
Bluetooth-модуль:
Передает данные в формате: "T:25.5|H:45|P:1012"
Совместим с мобильными приложениями типа "Serial Bluetooth Terminal"
Графическая визуализация:
Автоматическое масштабирование графика
История последних 10 измерений (50 секунд при интервале 5 сек)
Подключение компонентов:
BME280 (I2C):
VCC → 3.3V
GND → GND
SCL → A5 (Uno) / SCL (Nano)
SDA → A4 (Uno) / SDA (Nano)
OLED (I2C):
VCC → 5V
GND → GND
SCL → A5/SCL
SDA → A4/SDA
Bluetooth HC-05:
VCC → 5V
GND → GND
TX → D2 (Arduino RX)
RX → D3 (Arduino TX)
Улучшения системы:
Добавьте RTC модуль для временных меток:
#include "RTClib.h" RTC_DS3231 rtc; // В setup(): if (!rtc.begin()) { Serial.println("RTC error"); }
Режим энергосбережения для батарейного питания:
#include <LowPower.h> // В loop(): LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
Подключение к IoT платформам через ESP8266:
// Отправка данных в ThingSpeak или Blynk
Калибровка датчика:
// Добавьте смещения в setup(): bme.setTemperatureCompensation(-1.5);
Приложения для визуализации:
Для Android:
"Serial Bluetooth Terminal"
"Bluetooth Electronics"
Для ПК:
CoolTerm
Putty (с Bluetooth SPP)
Этот скетч превращает Arduino в профессиональную метеостанцию с возможностью расширения! Для реализации потребуется около 30 минут сборки и $15-20 компонентов.