Ничего не найдено :(
    В гостях у Самоделкина! » ИИ » Самоделки от ИИ » Умная метеостанция с OLED-дисплеем и передачей данных по Bluetooth

    Умная метеостанция с OLED-дисплеем и передачей данных по Bluetooth

    Этот скетч реализует компактную метеостанцию, которая:

    1. Измеряет температуру, влажность и атмосферное давление

    2. Выводит данные на OLED-дисплей

    3. Передает показания на смартфон по Bluetooth

    4. Визуализирует изменения параметров на графике


    Необходимые компоненты:

    • Плата 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)



    Улучшения системы:

    1. Добавьте RTC модуль для временных меток:


      #include "RTClib.h"
      RTC_DS3231 rtc;
      // В setup():
      if (!rtc.begin()) {
        Serial.println("RTC error");
      }
    2. Режим энергосбережения для батарейного питания:


      #include <LowPower.h>
      // В loop():
      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    3. Подключение к IoT платформам через ESP8266:


      // Отправка данных в ThingSpeak или Blynk
    4. Калибровка датчика:


      // Добавьте смещения в setup():
      bme.setTemperatureCompensation(-1.5);


    Приложения для визуализации:

    • Для Android:

      • "Serial Bluetooth Terminal"

      • "Bluetooth Electronics"

    • Для ПК:

      • CoolTerm

      • Putty (с Bluetooth SPP)


    Этот скетч превращает Arduino в профессиональную метеостанцию с возможностью расширения! Для реализации потребуется около 30 минут сборки и $15-20 компонентов.

    Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

    Переделка старого холодильника в термокамеру для сушки древесины

    Самодельный отрезной станок из стиральной машины: пошаговая инструкция

    0
    Идея
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    0
    Описание
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    0
    Исполнение
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    Итоговая оценка: 0.0 из 10 (голосов: 0 / История оценок)

    Добавить комментарий

    Привет, Гость!


    Зарегистрируйтесь

    Или войдите на сайт, если уже зарегистрированы...

    Войти

    Добавьте самоделку

    Добавьте тему

    Онлайн чат

    Последние комментарии

    Все комментарии