ATmega328 + OLED 0.96″ SSD1306 I2C

OLED-дисплеи (Organic Light-Emitting Diode) стали популярными благодаря своей компактности, низкому энергопотреблению и высокой контрастности изображения. Дисплей 0.96″ с контроллером SSD1306 является одним из наиболее распространенных вариантов среди разработчиков, особенно в проектах на основе Arduino и подобных платформ.

Характеристики дисплея 0.96″ SSD1306:

  • Размер: 0.96 дюйма.
  • Разрешение: 128 x 64 пикселя.
  • Контрастность: Высокая, благодаря использованию органических светодиодов.
  • Энергопотребление: Низкое, что делает его идеальным выбором для проектов с ограниченным источником питания.
  • Интерфейс: I2C (также возможен SPI, но чаще всего используется I2C).
  • Адрес I2C: Обычно 0x3C, хотя иногда встречается 0x3D.

Подключение дисплея:

Как уже упоминалось ранее, для подключения дисплея к микроконтроллеру ATmega328 через интерфейс I2C потребуются следующие соединения:

  • VCC: Питание +3.3В или +5В.
  • GND: Земля.
  • SCL: Тактовый сигнал (подключите к выводу SCL на Arduino).
  • SDA: Данные (подключите к выводу SDA на Arduino).

Если у вас плата Arduino, выводы SCL и SDA обычно находятся на контактах A5 и A4 соответственно.

Пример кода:

Давайте еще раз рассмотрим пример кода для управления этим дисплеем, но теперь более детально разберем каждую часть.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // Ширина экрана
#define SCREEN_HEIGHT 64 // Высота экрана
#define OLED_RESET     -1 // Не используем пин сброса
#define SCREEN_ADDRESS 0x3C ///< Адрес I2C дисплея

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  // Инициализация дисплея
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for (;;) ; // Если дисплей не инициализировался, зацикливаемся
  }

  // Очищаем экран
  display.clearDisplay();

  // Устанавливаем цвет текста
  display.setTextColor(WHITE);

  // Устанавливаем размер шрифта
  display.setTextSize(1);

  // Печатаем текст
  display.setCursor(0, 0);
  display.println("Hello, World!");

  // Отображаем всё на экране
  display.display();
}

void loop() {
  // Здесь можно добавить логику обновления информации на экране
}

Подробное объяснение кода:

  1. Подключение библиотек:
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    • Wire.h: Библиотека для работы с интерфейсом I2C.
    • Adafruit_GFX.h: Графическая библиотека, предоставляющая базовые функции рисования для различных типов дисплеев.
    • Adafruit_SSD1306.h: Специализированная библиотека для работы с OLED-дисплеями на базе контроллера SSD1306.
  2. Определение параметров дисплея:
    #define SCREEN_WIDTH 128
    #define SCREEN_HEIGHT 64
    #define OLED_RESET     -1
    #define SCREEN_ADDRESS 0x3C
    • SCREEN_WIDTH и SCREEN_HEIGHT: Размеры дисплея в пикселях.
    • OLED_RESET: Пин сброса, если он используется. В нашем случае он не используется (-1).
    • SCREEN_ADDRESS: Адрес I2C дисплея. Обычно это 0x3C, но иногда может быть 0x3D.
  3. Инициализация объекта дисплея:
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    • Создается объект класса Adafruit_SSD1306, которому передаются размеры дисплея, ссылка на объект Wire для работы с I2C и номер пина сброса (в нашем случае -1, так как не используется).
  4. Функция setup():
    • Проверка успешной инициализации:
      if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        for (;;) ; // Если дисплей не инициализировался, зацикливаемся
      }

      Эта проверка необходима для того, чтобы убедиться, что дисплей был успешно найден и инициализирован. Если нет, программа входит в бесконечный цикл, предотвращая дальнейшее выполнение кода.

    • Очистка экрана:
      display.clearDisplay();

      Метод clearDisplay() очищает весь экран, заполняя его черным цветом.

    • Установка цвета текста:
      display.setTextColor(WHITE);

      Устанавливает цвет текста белым. Доступны также другие цвета, но поскольку дисплей монохромный, выбор ограничен черным и белым.

    • Установка размера шрифта:
      display.setTextSize(1);

      Устанавливает размер шрифта. В библиотеке предусмотрены разные размеры шрифтов, начиная с 1.

    • Расположение курсора и печать текста:
      display.setCursor(0, 0);
      display.println("Hello, World!");

      Устанавливает курсор в левый верхний угол экрана (координаты 0, 0) и выводит строку «Hello, World!» на экран.

    • Отображение изменений на экране:
      display.display();

      Метод display() отправляет все буферизованные данные на дисплей, делая их видимыми.

  5. Функция loop():
    • В этой функции можно добавлять логику для обновления информации на экране. Например, можно периодически менять отображаемый текст или рисовать графики.

Расширенные возможности:

С помощью библиотеки Adafruit_GFX и Adafruit_SSD1306 можно реализовать множество дополнительных возможностей, таких как:

  • Рисование линий, прямоугольников, кругов и других геометрических фигур.
  • Отображение изображений и символов.
  • Создание анимаций и эффектов.
  • Работа с несколькими шрифтами разного размера.

Для реализации этих возможностей достаточно изучить документацию и примеры использования библиотек, предоставляемых Adafruit.

Заключение:

Использование OLED-дисплея 0.96″ с контроллером SSD1306 через интерфейс I2C предоставляет удобный и эффективный способ визуализации информации в ваших проектах. Благодаря низким требованиям к питанию и простоте подключения, такой дисплей идеально подходит для небольших проектов на базе микроконтроллеров, таких как ATmega328.


Вот пример работы с часами реального времени DS1307, с выводом времени и даты на OLED 0.96.

Модуль DS1307 представляет собой микросхему часов реального времени (Real Time Clock, RTC), разработанную компанией Maxim Integrated. Он предназначен для точного отслеживания текущего времени и даты даже при отключении основного источника питания благодаря встроенному батарейному резерву. Модуль широко применяется в различных электронных устройствах, таких как системы мониторинга, регистраторы данных, будильники и другие устройства, требующие точного измерения времени.

Основные характеристики DS1307:

  1. Точность: Модуль DS1307 обеспечивает высокую точность хода времени за счет использования кварцевого резонатора с частотой 32.768 кГц. При нормальных условиях эксплуатации погрешность составляет около ±2 ppm (частиц на миллион).
  2. Интерфейс связи: DS1307 поддерживает интерфейс I²C (Inter-Integrated Circuit), что делает его удобным для интеграции в различные проекты. Адрес устройства на шине I²C фиксирован и равен 0x68.
  3. Резервное питание: Для обеспечения непрерывной работы при отсутствии основного питания модуль оснащен разъемом для литиевой батареи (например, CR2032). Батарея поддерживает работу часов до нескольких лет в автономном режиме.
  4. Форматы времени и даты: DS1307 хранит информацию о текущем времени и дате в следующих форматах:
    • Время: Часы, минуты, секунды.
    • Дата: День недели, день месяца, месяц, год.
    • Дополнительно поддерживается режим 12/24 часа и BCD-кодировка.
  5. Функции будильника: Модуль имеет возможность настройки двух независимых будильников, которые могут срабатывать в заданные моменты времени.
  6. Температурный диапазон: Диапазон рабочих температур модуля составляет от -40°C до +85°C, что позволяет использовать его в различных климатических условиях.
  7. Потребляемая мощность: В активном режиме потребление тока составляет порядка 500 нА, а в режиме ожидания – всего несколько наноампер, что делает его энергоэффективным решением для проектов с ограниченным энергопотреблением.

Принцип работы:

DS1307 использует внешний кварцевый генератор для поддержания точности времени. Когда основной источник питания отсутствует, модуль переключается на резервную батарею, продолжая отслеживать время и дату. При восстановлении основного питания происходит автоматическое переключение обратно на него.

Связь с основным контроллером осуществляется через интерфейс I²C. Контроллер отправляет команды и данные на модуль, а также получает актуальную информацию о времени и дате.

Применение:

DS1307 часто используется в проектах, связанных с мониторингом времени, регистрацией событий, управлением расписаниями и другими задачами, требующими точного отслеживания временных интервалов. Примеры применения включают:

  • Регистраторы данных (логгеры)
  • Будильники и таймеры
  • Системы управления освещением
  • Умные дома и IoT-устройства
  • Автоматизированные системы контроля доступа

Заключение:

DS1307 является надежным и точным решением для задач, связанных с измерением времени и дат. Его компактные размеры, низкое энергопотребление и поддержка интерфейса I²C делают этот модуль популярным выбором среди разработчиков электроники.

#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // screen width
#define SCREEN_HEIGHT 64 // screen height

// Display connection pins
#define OLED_RESET     -1 // not using reset pin
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

RTC_DS1307 rtc;

void setup() {
    Serial.begin(9600);
    
    if (! rtc.begin()) {
        Serial.println("Could not find the clock module.");
        while (1); // Stop program execution
    }

    // Manually setting the time on first run
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // Comment out this line after initial setup

    // Initialize the display
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
        Serial.println(F("Error initializing display!")); 
        for(;;); // Stop program execution
    }
}

void loop() {
    DateTime now = rtc.now();

    // Formatting the time string
    char timeStr[9];
    sprintf(timeStr, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());

    // Formatting the date string
    char dateStr[11];
    sprintf(dateStr, "%02d/%02d/%04d", now.day(), now.month(), now.year());

    // Output time and date to the display
    display.clearDisplay(); // Clear the display
    display.setTextSize(2); // Set text size
    display.setTextColor(WHITE); // Set text color
    display.setCursor(15, 15); // Set cursor position
    display.print(timeStr);
    display.setCursor(5, 40); // Set cursor position
    display.print(dateStr);
    display.display(); // Update the display

    delay(1000); // Delay before next update
}

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

Войти с помощью: