Дисплеи

Ответить
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Дисплеи

Сообщение Oleg »

Мало того, что к Raspberry Pi можно подключить монитор,- - имеется еще множе ство различных устройств вывода, способных отображать текст, цифры или графи- ку, можно даже управлять целыми светодиодными панелями. Чтобы рассказать о каждом типе существующих дисплеев, пришлось бы уделить этому слишком много времени, так что в этой главе нам придется остановиться лишь на наиболее практичных и интересных дисплеях и некоторых согласующих устройствах.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Светодиодные ленты

Сообщение Oleg »

RGB-светодиоды состоят из трех светоизлучающих диодов, объединенных в одном корпусе. Другой тип светодиодов, известный как адресуемый светодиод, также включает в свой корпус управляющую микросхему. Эта микросхема осуществляет управление интенсивностью свечения трех цветов светодиода с помощью ШИМ-модуляции, аналогично тому, как это делается с Arduino или Raspberry Pi. Следует отметить, что управляющая микросхема встроена непосредственно в сам светодиод.

Адресуемые светодиоды разработаны для управления большим количеством из них с использованием одного микроконтроллера или компьютера, таких как Arduino или Raspberry Pi. В магазине Adafruit можно приобрести адресуемые светодиоды, которые они называют NeoPixels (обратите внимание, что название NeoPixels используется довольно часто, особенно на сайтах и в описаниях других адресуемых светодиодов, не имеющих отношения к Adafruit). Самыми популярными из них являются адресуемые светодиоды типа WS2812. Они поддерживают стандарт последовательной передачи данных, что позволяет создавать длинные цепи из этих светодиодов для создания больших дисплеев. Кроме использования в качестве RGB-адресуемых светодиодов, светодиоды WS2812 также могут быть использованы как одноцветные светоизлучатели.

Иногда адресуемые светодиоды компонуются в форме матрицы, но их также можно приобрести в виде свернутой в рулон ленты, с которой можно отрезать светодиодную полоску нужной длины для вашего проекта (см. рисунок).
image.png
На рисунке 14.1 видно, что лента разделена на сегменты, подобно ленточному червю. По трем проводам с каждой стороны светодиода подводится заземление (GND) и напряжение 5 В (5V) для питания, а также последовательные данные D0, которые передаются от одного светодиода к другому по всей гирлянде. Иными словами, выход одного светодиода соединен с входом другого. Посередине сегментов проведена вертикальная черта, обозначающая место для отрезания светодиодной ленты, если необходимо укоротить ее.

Обратите внимание на стрелки на ленте, указывающие направление потока последовательных данных. В соответствии с этим направлением для управления светодиодами всегда следует подключаться к левой стороне ленты.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: управление дисплеем из ленты RGB-светодиодов

Сообщение Oleg »

Приобретая один-два метра светодиодной ленты, вы, вероятно, захотите попробовать ее на практике. Подключить ее к Arduino довольно просто (см. рисунок), но для подключения ленты к Raspberry Pi потребуется немного усилий.
Светодиодная лента, подключенная к Arduino
Светодиодная лента, подключенная к Arduino
Комплектующие

Для проведения этого эксперимента с Arduino потребуются следующие компоненты:
Адресуемая светодиодная лента WS2812
Три перемычки "папа-папа"

Поскольку логический вход светодиодов NeoPixels не совместим с логическими сигналами уровня 3 В, для эксперимента с Raspberry Pi потребуются дополнительные компоненты. Однако перед тем как предпринимать дополнительные усилия, стоит попробовать обойтись без преобразователя логического уровня, так как ваша светодиодная лента может работать нормально с логическими сигналами 3 В.

Тем не менее, для эксперимента с Raspberry Pi могут потребоваться следующие дополнительные компоненты:

400-точечная беспаечная макетная плата
R1, R2 Два резистора 470 Ом 0,25 Вт
Q1 МОП-транзистор 27000
01 Перемычки "мама-папа"

Обратите внимание, что для данного эксперимента использован маломощный МОП-транзистор 27000, так как он лучше справляется с высокочастотными последовательными данными по сравнению с 2N3904. Вы также можете использовать транзистор типа FQP30N06L, но его мощность будет избыточной для данного эксперимента.

Подключение Arduino

С одной стороны светодиодной ленты обычно имеется кабель с трехконтактным разъемом, подсоединенным к контактам GND, 5V и D0. Если такой разъем сохраняется, то для подключения его к макетной плате или Arduino можно использовать перемычки "мама-папа". Если разъема нет, вы можете аккуратно припаять провода к контактам GND, 5V и D0 на левом краю ленты.

Я использовал три перемычки "папа-папа", отрезав контакты с одной стороны и припаяв их к пяти светодиодам NeoPixel на ленте. Затем эти три контакта можно подключить непосредственно к Arduino, как показано на рисунке, причем контакт D0 светодиодной ленты должен быть подключен к контакту 19 на Arduino.
Удобный NeoPixel-дисплей
Удобный NeoPixel-дисплей
Потребление энергии адресуемых светодиодов

При увеличении яркости светодиодов NeoPixels до максимальной мощности они потребляют значительный ток (приблизительно 60 мА на каждый светодиод). Если у вас подключено пять светодиодов NeoPixels, это может привести к потреблению 300 мА, что может быть слишком большой нагрузкой для Arduino или Raspberry Pi. В таком случае вам, возможно, потребуется подключить внешний источник питания с напряжением 5 В к светодиодной ленте.

Программа для Arduino

Уважаемые сотрудники Adafruit разработали библиотеку для Arduino, которая значительно упрощает управление длинными цепочками адресуемых светодиодов. Вы можете загрузить эту библиотеку по следующей ссылке: [https://github.com/adafruit/Adafruit_NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) и установить ее в вашу среду Arduino.

Для проведения эксперимента с Arduino вам потребуется использовать скетч.

Код: Выделить всё

#include <Adafruit_NeoPixel.h>  // 1

const int pixelPin = 9;    // 2
const int numPixels = 5;   // 3

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(numPixels, pixelPin, NEO_GRB + NEO_KHZ800); // 4

void setup() {
  pixels.begin(); // 5
}

void loop() {
  for (int i = 0; i < numPixels; i++) { // 6
    int red = random(255);
    int green = random(255);
    int blue = random(255);
    pixels.setPixelColor(i, pixels.Color(red, green, blue)); // 7
    pixels.show(); // 8
  }
  delay(100L); 
}
Давайте рассмотрим этот скетч подробнее, разбив его на пункты, которые описаны в комментариях:

1. Импортируйте библиотеку Adafruit NeoPixel.
2. Если вам нужно использовать другой контакт для управления светодиодами NeoPixel, отредактируйте эту часть кода.
3. Если у вас больше или меньше светодиодов в вашей цепочке NeoPixel, внесите изменения здесь. Обратите внимание, что вы должны учитывать энергопотребление, как описано ранее.
4. Инициализируйте библиотеку NeoPixel в соответствии с вашими настройками.
5. Начните отправку данных на дисплей.
6. Установите произвольный цвет для каждого пикселя, обновите дисплей и добавьте задержку в 1/10 секунды перед сменой цвета всех светодиодов. Теперь время для танцев в стиле диско!
7. Функция `setPixelColor` принимает два параметра: индекс пикселя, который нужно установить, и цвет, который представлен тремя значениями в диапазоне от 0 до 255 для каждого из трех цветовых каналов.

Эксперимент с Raspberry Pi:

Для подключения вашего Raspberry Pi к светодиодной ленте NeoPixel сначала попробуйте выполнить подключение без преобразователя уровня. Вот как это можно сделать:

1. С помощью перемычек "мама-мама" создайте следующие соединения:
- GND (светодиодной ленты NeoPixel) -> GND (Raspberry Pi)
- 5V (светодиодной ленты NeoPixel) -> 5V (Raspberry Pi)
- D0 (светодиодной ленты NeoPixel) -> GPIO 18 (Raspberry Pi)

На рисунке ниже показано подключение светодиодной ленты непосредственно к Raspberry Pi.
Лента светодиодов NeoPixel, подключенная непосредственно к Raspberry Pi.
Лента светодиодов NeoPixel, подключенная непосредственно к Raspberry Pi.
Перейдите к следующему разделу "Программа для Raspberry Pi" и попробуйте выполнить программу. Если светодиодная лента не светится и не отображает красочный многоцветный дисплей, вам, возможно, потребуется добавить преобразователь уровня, чтобы увеличить уровень сигнала с 3 В до 5 В.

Поднятие уровня сигнала с 3 В до 5 В:
Уровень сигнала 3 В на Raspberry Pi ниже ожидаемого уровня (high) для адресуемых светодиодов WS2812, который составляет 4 В. Схема, показанная на рисунке ниже, демонстрирует, как можно использовать МОП-транзистор для поднятия уровня сигнала до 5 В.

Побочным эффектом от такого смещения уровня является инвертирование выходного сигнала. То есть, когда на GPIO-контакте Raspberry Pi выставлен логически низкий уровень (low, 0 В), то на выходе для светодиодной ленты появится сигнал напряжением 5 В, а когда на GPIO-контакте Raspberry Pi выставлен высокий уровень (high, 3,3 В), то на выходе для светодиодной ленты появится сигнал напряжением 0 В.

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

На рисунке показано преобразование уровня с 3 до 5 В.
Преобразование уровня с 3 до 5 В
Преобразование уровня с 3 до 5 В
На рисунке ниже показано подключение светодиодной ленты к Raspberry Pi с использованием преобразователя уровня.
Подключение светодиодной ленты к Raspberry Pi с использованием преобразователя
Подключение светодиодной ленты к Raspberry Pi с использованием преобразователя
Программа для Raspberry Pi

Программа для Raspberry Pi основана на предоставленном компанией Adafruit руководстве (см. https://learn.adafruit.com/neopixels-on-raspberry-pi). Однако библиотека языка С, на которую опирается руководство Adafruit, на момент подготовки книги была несовместима с Raspberry Pi 2.

К счастью для владельцев Raspberry Pi 2, Ричард Херст (Richard Hurst) создал версию программы, работающую с Raspberry Pi 2. Эта версия также совместима и с более ранними версиями Raspberry Pi. Для установки указанной библиотеки и необходимых программных пакетов воспользуйтесь командой:

$ sudo apt-get install build-essential python-dev git scons swig

Следующий этап нашей работы расходится с направлением, заданным в руководстве Adafruit, потому что вам нужно получить версию программы, исправленную для работы с Raspberry Pi 2. Извлеките измененный код NeoPixel из GitHub, используя следующую команду:

$ git clone https://github.com/richardghirst/rpi_ws281x.git

Измените в извлеченной из GitHub программе каталог, а затем произведите сборку кода на языке С, воспользовавшись следующей командой:

$ scons

По завершении компиляции кода на языке С вам нужно установить библиотеку Python, взаимодействующую с быстрым кодом на языке С, воспользовавшись следующей командой:

$ cd python
$ sudo python setup.py install


Загружаем и выполняем программу

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

Код: Выделить всё

#!/usr/bin/env python

import time, random
from neopixel import * //1

# LED strip
LED_COUNT      = 30      # Number of LED pixels. //2
LED_PIN        = 18      # GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ    = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA        = 5       # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 255     # Set to 0 for darkest and 255 for brightest
LED_INVERT     = False    # True to invert the signal (when using NPN transistor level shift)

# Initialize the display        
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
strip.begin()

while True: //3
    for i in range(strip.numPixels()):
        red = random.randint(0, 255)
        green = random.randint(0, 255)
        blue = random.randint(0, 255)
        strip.setPixelColor(i, Color(red, green, blue))
        strip.show()
    time.sleep(0.1)
1. Импорт библиотеки NeoPixel.

2. Эти параметры установки не требуют изменений, если только вам необходимо использовать другой контакт для LED_PIN.

3. Основной цикл программы выполняет практически те же действия, что и его аналог для Arduino. Он генерирует произвольный цвет и применяет его к пикселю.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Дисплеи I²C на органических светодиодах

Сообщение Oleg »

Raspberry Pi можно подключить к любому монитору, будь то большой или маленький, при наличии разъемов HDMI или AV. Однако иногда требуется выводить всего несколько строк на экран. У Arduino Uno нет видеовыхода вообще, и в таких случаях может пригодиться небольшой дисплей, способный отображать графические изображения или несколько строк текста.

Небольшие дисплеи на основе органических светодиодов (OLED) имеют доступные цены, низкое энергопотребление и предоставляют четкое и хорошо читаемое изображение (см. рисунок ниже). Во многих потребительских товарах они заменяют жидкокристаллические дисплеи. OLED-дисплеи доступны как в монохромном, так и в цветном исполнении.

Наиболее распространенным типом OLED-дисплея является модуль, включающий в себя сам дисплей и управляющую микросхему на печатной плате. Обычно для управления используется микросхема SSD1306, которая имеет интерфейс I2C (произносится как "ай-ту-си") и требует всего два контакта для передачи данных и два контакта для питания.

Экраны таких дисплеев имеют небольшой размер и высокое разрешение, поэтому при использовании Arduino иногда может возникать дефицит памяти, если не предпринять соответствующие меры предосторожности.
Дисплей на основе технологии OLED
Дисплей на основе технологии OLED
Дисплей на основе технологии OLED.jpg (20.41 КБ) 3381 просмотр
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: Использование I²C-дисплея с Raspberry Pi

Сообщение Oleg »

OLED-дисплеи с интерфейсом I²C могут использоваться как с Arduino, так и с Raspberry Pi. В этой главе рассмотрим эксперимент, в котором мы заменим светодиодный индикатор температуры на OLED-дисплей, отображающий текущую и заданную температуру.

Этот эксперимент в первую очередь предназначен для демонстрации того, как можно использовать дисплей с Raspberry Pi. Программа эксперимента выводит на экран текущее время и небольшую анимацию (см. рисунок ниже).

Компоненты

OLED-дисплей имеет четыре контакта, которые должны быть подключены напрямую к Raspberry Pi с использованием четырех проводов "мама-мама".

Убедитесь, что ваш OLED-дисплей имеет разрешение 128x64 пикселей и использует микросхему управления SSD1306. Некоторые дисплеи могут иметь дополнительные контакты на SSD1306, которые не используются, поэтому для упрощения задачи выбирайте дисплей с четырьмя контактами: GND (заземление), VCC (+5V), SDA (данные) и SCL (тактовый сигнал). Эксперимент можно провести как с монохромным, так и с цветным OLED-дисплеем.
Схема использования OLED-дисплея с Raspberry Pi в сборе
Схема использования OLED-дисплея с Raspberry Pi в сборе
Подключение к Raspberry Pi

Микросхема SSD1306 может работать при напряжении 3V или 5V. Поскольку ранние модели Raspberry Pi могли обеспечивать недостаточно тока при напряжении 3V, рекомендуется подключать микросхему к 5V.

Подключите провода следующим образом:
- Провод GND на OLED-дисплее соедините с GND на Raspberry Pi.
- Провод VCC на OLED-дисплее соедините с 5V на Raspberry Pi.
- Провод SCL (тактовые сигналы) на OLED-дисплее соедините с GPIO 3 на Raspberry Pi.
- Провод SDA (данные) на OLED-дисплее соедините с GPIO 2 на Raspberry Pi.

Программа для Raspberry Pi

Если ваша Raspberry Pi еще не настроена для работы с интерфейсом I²C, обратитесь к разделам ранее и выполните настройку, как описано в разделе "Настройка I²C на Raspberry Pi".

Для работы с OLED-дисплеем вы можете воспользоваться библиотекой Python, разработанной Adafruit. Она хорошо работает с OLED-дисплеями, управляемыми микросхемой SSD1306, независимо от их производителя. Для установки этой библиотеки выполните следующие команды:

$ git clone https://github.com/adafruit/Adafruit-SS ... rduino.git
$ cd Adafruit_Python_SSD1306
$ sudo python setup.py install


Система координат дисплея
OLED-дисплеи представляют собой графические дисплеи, на которых можно рисовать фигуры и выводить текст. Для работы с ними необходимо указывать координаты элементов на экране. В библиотеке Adafruit используется система координат, где верхний левый угол экрана имеет координаты (0, 0), а нижний правый угол - (127, 63).
Система координат дисплея
Система координат дисплея
Программа для этого эксперимента:

Код: Выделить всё

#!/usr/bin/env python

from oled.device import ssd1306   # 1
from oled.render import canvas
from PIL import ImageFont    # 2
import time

device = ssd1306(port=1, address=0x3C)  # 3
large_font = ImageFont.truetype('FreeMono.ttf', 24)  # 4

x = 0
while True:
    with canvas(device) as draw:      # 5
        draw.pieslice((x, 30, x+30, 60), 45, -45, fill=255)   # 6
        x += 10    # 7
        if x > 128:
            x = 0
        now = time.localtime()  # 8
        draw.text((0, 0), time.strftime('%H:%M:%S', now), font=large_font, fill=255)
    time.sleep(0.1)
Давайте рассмотрим ее по пунктам:

1. Импортируются два модуля из библиотеки OLED: `SSD1306`, который предназначен для работы с устройством, и `Image`, который используется для создания холста, на котором будут рисоваться фигуры и выводиться текст.

2. Также импортируется библиотека `PIL` (Python Imaging Library).

3. Создается переменная `device`, которая предоставляет доступ к OLED-дисплею. Значение `0x3C` - это адрес I²C-устройства OLED-дисплея. Этот адрес может различаться в зависимости от производителя дисплея, поэтому важно уточнить его в документации к вашему дисплею.

4. Указывается используемый шрифт высотой 24 пикселя, который будет использоваться для вывода времени на дисплей.

5. С помощью конструкции `with ... as` создается блок кода для вывода текста на экран.

6. В этом блоке рисуется фигура, представляющая собой анимацию игры "Pac-Man". Фигура имеет размер 30x30 пикселей и угол открытой челюсти меняется от -45° до 45°, что создает впечатление движения. Цвет фигуры устанавливается как 255, что соответствует белому цвету.

7. Переменной `x` прибавляется 10 на каждой итерации, что позволяет перемещать анимацию вправо.

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

Запуск программы

Для запуска программы выполните следующую команду:

$ sudo python oled.py

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

В данном примере используется функция `pieslice`, которая рисует круг с вырезанным куском. Вы также можете использовать другие функции для рисования различных графических элементов. Дополнительные примеры и функции можно найти на сайте http://effbot.org/imagingbook/imagedraw.htm. Попробуйте разные варианты, чтобы оживить свой OLED-дисплей!
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Проект: добавления дисплея к проекту охладителя напитков

Сообщение Oleg »

Проект: Добавление дисплея к охладителю напитков

Для понимания того, как работает OLED-дисплей в сочетании с Arduino, давайте возьмем за основу материал из раздела "Проект: термостатический охладитель напитков" и заменим зеленый светодиод, который используется для фиксации температурного режима охладителя, на OLED-дисплей. Этот дисплей будет отображать как текущую, так и заданную температуру (см. рисунок ниже).
Добавление OLED-дисплея проекту охладителя напитков
Добавление OLED-дисплея проекту охладителя напитков
Компоненты

Для этого проекта, помимо компонентов, использованных в разделе "Проект: термостатический охладитель напитков" (за исключением зеленого светодиода и резистора R3), вам понадобится OLED-дисплей, аналогичный тому, который использовался ранее в разделе "Эксперимент: использование модуля OLED-дисплея с Raspberry Pi" в этой главе, а также четыре проводника типа "мама-папа".

Подключение Arduino

Если вы еще не выполнили это ранее, соберите схему, описанную в разделе "Проект: термостатический охладитель напитков". В этом проекте вам не нужно добавлять зеленый светодиод и резистор R3.

OLED-дисплей можно подключить напрямую к Arduino, избегая использования макетной платы и уменьшая мешающие помехи. На рисунке ниже показана только новая часть проекта с OLED-дисплеем, подключенным к Arduino. При подключении проводов к выводам OLED-модуля, обратите внимание, чтобы не перепутать контакты 5V и GND.
Подключение Arduino к OLED-дисплею
Подключение Arduino к OLED-дисплею
Программа для Arduino

Как вы могли ожидать, для работы с OLED-дисплеем существует библиотека Arduino (https://github.com/adafruit/Adafruit_SSD1306). Поэтому вам нужно загрузить и установить эту библиотеку в вашей среде разработки Arduino.

Для этой версии охладителя используется почти та же программа, что и для варианта без дисплея. Изменения включают добавление следующих библиотек: `Adafruit_GFX.h` и `Adafruit_SSD1306.h`.

Код: Выделить всё

#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const double minTemp = 0.0;  
const double maxTemp = 20.0;

double kp = 1500;     
double ki = 50.0;
double kd = 0.0;

const int tempPin = 2;
const int coolPin = 9;    
const int potPin = A0;
const long period = 1000; // >750

OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 display(4);

double setTemp = 0.0;
double measuredTemp = 0.0;
double outputPower = 0.0;     
long lastSampleTime = 0;

PID myPID(&measuredTemp, &outputPower, &setTemp, kp, ki, kd, REVERSE); 

void setup() {
  pinMode(coolPin, OUTPUT);
  Serial.begin(9600);
  sensors.begin();
  myPID.SetSampleTime(1000); // (4)
  myPID.SetMode(AUTOMATIC);  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
}

void loop() { 
  long now = millis();         
  if (now > lastSampleTime + period) {
      checkTemperature();
      lastSampleTime = now;
  }
  setTemp = readSetTempFromPot(); 
}

void checkTemperature() {      
  measuredTemp = readTemp();  
  Serial.print(measuredTemp);
  Serial.print(", ");
  Serial.print(setTemp);
  Serial.print(", ");
  Serial.println(outputPower);
  myPID.Compute();
  analogWrite(coolPin, outputPower);
  updateDisplay();
}

double readSetTempFromPot() {   
  static double oldTemp = 0;
  int raw = analogRead(potPin);
  double temp = map(raw, 0, 1023, minTemp, maxTemp);
  if (oldTemp != temp) {
    updateDisplay();
    oldTemp = temp;
  }
  return temp;
} 

double readTemp() {
  sensors.requestTemperatures(); 
  return sensors.getTempCByIndex(0);  
}

void updateDisplay() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Temp:");
  display.println(measuredTemp);
  display.print("Set: ");
  display.println(setTemp);
  display.display();
}
  
Переменная `display` определяется для обращения к библиотеке. Параметр `4` является фактическим номером контакта, используемого для подключения к контакту Enable дисплея (если он существует). В наших дисплеях контакта Enable нет, поэтому номер 4 не используется ни для чего другого в Arduino.

Adafruit_SSD1306 display(4);

Функция `setup()` включает следующую строку, которая инициализирует дисплей:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Функция `loop()` теперь вызывает новую функцию `updateDisplay()`, чтобы обновлять содержимое дисплея текущей температурой каждую секунду:

void loop() {
updateDisplay();
// Другие операции вашей программы
}


Функция `updateDisplay()` очищает экран, устанавливает размер текста и цвет, а затем выводит текущую и заданную температуры на дисплей:

Код: Выделить всё

void updateDisplay() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Температура:");
  display.println(measuredTemp);
  display.print("Установка: ");
  display.println(setTemp);
  display.display();
}
Функция `readSetTempFromPot()` была чуть-чуть изменена, чтобы обновлять установленную температуру сразу же при изменении, без ожидания следующей секунды:

double readSetTempFromPot() {
static double oldTemp = 0;
int raw = analogRead(potPin);
double temp = map(raw, 0, 1023, minTemp, maxTemp);
if (oldTemp != temp) {
updateDisplay();
oldTemp = temp;
}
return temp;
}


Ключевое слово `static` перед определением `oldTemp` означает, что переменная будет сохранять свое значение между вызовами функции `readSetTempFromPot()`. Обе переменные, `temp` и `oldTemp`, имеют тип `double` (число с плавающей запятой двойной точности), так как этот тип используется в библиотеке DS18B20.

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

Ответить