Этот скетч реализует компактную метеостанцию, которая:
Измеряет температуру, влажность и атмосферное давление
Выводит данные на 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 компонентов.

