ESP8266:Примеры/Использование 0,96-дюймового OLED-дисплея с ESP8266 при помощи IDE Arduino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Использование 0,96-дюймового OLED-дисплея с ESP8266 при помощи IDE Arduino[1]

Эта статья объясняет, как использовать 0,96-дюймовый OLED-дисплей вместе с чипом ESP8266, используя среду разработки IDE Arduino. О том, как использовать этот дисплей с платой Arduino, читайте тут.

Описание устройства

0,96-дюймовый OLED-дисплей выглядит следующим образом:

Это очень маленький дисплей, который состоит из OLED-пикселей, расположенных в формате 128x64. Подсветка этому дисплею не требуется. Кроме того, он использует интерфейс I2C, и это значит, что он может коммуницировать с ESP8266, используя всего 2 контакта.

Библиотеки

Чтобы управлять OLED-дисплеем, вам нужно установить в IDE Arduino библиотеку «esp8266 oled ssd1306». Для этого сделайте следующее:

  • Кликните тут, чтобы скачать ZIP-архив с библиотекой (он должен загрузиться в папку «Загрузки» на вашем компьютере).
  • Распакуйте этот ZIP-архив. В результате у вас должна появиться папка под названием «esp8266-oled-ssd1306-master».
  • Переименуйте ее на «esp8266_oled_ssd1306».
  • Переместите папку «esp8266_oled_ssd1306» в папку «libraries» IDE Arduino.
  • Перезапустите IDE Arduino.

Кроме того, нам нужно будет измерять температуру, для чего понадобится датчик DHT11, а для работы с этим датчиком – библиотека «DHT_sensor_library». Чтобы установить ее, сделайте следующее:

  • Кликните тут, чтобы скачать ZIP-архив с библиотекой (он должен загрузиться в папку «Загрузки» на вашем компьютере).
  • Распакуйте этот ZIP-архив. В результате у вас должна появиться папка под названием «DHT-sensor-library-master».
  • Переименуйте ее на «DHT_sensor_library» (все верно, тире нужно поменять на нижние подчеркивания)
  • Переместите папку «DHT_sensor_library» в папку «libraries» IDE Arduino.
  • Перезапустите IDE Arduino.

Скетч: Показ на OLED-дисплее данных о температуре и влажности

Теперь давайте создадим проект, который будет замерять в окружающем воздухе температуру и влажность, а потом показывать эти данные на OLED-дисплее. Цель этого примера – показать, как интегрировать OLED-дисплей в одну цепь с чипом ESP8266 при помощи IDE Arduino.

Интерфейс между OLED-дисплеем и ESP8266 будет проводным, но этот проект можно выполнить и при помощи веб-сервера (т.е. данные будут отображаться не на OLED-дисплее, а в браузере).

Температура и влажность будут измеряться при помощи датчика DHT11.

Если вы не знакомы с датчиком DHT11, лучше сначала ознакомьтесь с этими руководствами:

  • Здесь рассказывается, как использовать датчик DHT11/DHT22 вместе с платой Arduino
  • Здесь рассказывается, как показывать данные о температуре и влажности в браузере, используя чип ESP8266 и датчик DHT11/DHT22

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

  • Один 0,96-дюймовый OLED-дисплей (см. на eBay)
  • Один чип ESP8266 (см. на eBay)
  • Один датчик температуры и влажности DHT11 (см. на eBay)
  • Одна макетная плата
  • Один резистор на 10 кОм
  • Провода-перемычки

Схема

Подключите эти компоненты друг к другу согласно схеме, показанной ниже:

Код

Перед загрузкой кода на ESP8266 убедитесь, что установили все необходимые библиотеки. Какие именно библиотеки нужны для этого проекта, см. выше, в разделе «Библиотеки».

Вот код, который нужно загрузить на ESP8266:

/*
 * Более подробно о проекте на: http://randomnerdtutorials.com
 * 
 * Данный скетч распространяется по лицензии MIT
 * Копирайт (c) 2016, Дэниэл Эйкорн (Daniel Eichhorn)
 */
 
// библиотека Wire для коммуникации по I2C:
#include <Wire.h>  // нужна только для Arduino 1.6.5 и старее

// библиотека для монитора (в моем проекте используется SSD1306):
#include "SSD1306.h" // сокращенный вариант для #include "SSD1306Wire.h"

// для монитора SH1106 впишите #include "SH1106.h" 
// сокращенный вариант для #include "SSD1306Wire.h"

// при коммуникации через I2C при помощи brzo_i2c 
// (должна быть установлена), впишите следующее:
// #include <brzo_i2c.h> // нужна только для Arduino 1.6.5 и старее
// #include "SSD1306Brzo.h"
// #include "SH1106Brzo.h"

// библиотека для коммуникации по SPI:
// #include <SPI.h> // только для Arduino 1.6.5 и старее
// #include "SSD1306Spi.h"
// #include "SH1106SPi.h"

#include <DHT.h>

#define DHTPIN 5       // контакт, к которому подключен DHT11
#define DHTTYPE DHT11  // тип датчика DHT11

// инициализация OLED-дисплея с помощью библиотеки SPI:

// контакт D5 на ESP8266 -> к контакту CLK на дисплее 
// D7 -> к MOSI (DOUT)
// D0 -> к RES
// D2 -> к DC
// D8 -> к CS
// SSD1306Spi        display(D0, D2, D8);
// или
// SH1106Spi         display(D0, D2);

// инициализация OLED-дисплея с помощью библиотеки brzo_i2c:

// контакт D3 на ESP8266 -> к контакту SDA на дисплее
// D5 -> к SCL
// SSD1306Brzo display(0x3c, D3, D5);
// или
// SH1106Brzo  display(0x3c, D3, D5);

// инициализация OLED-дисплея с помощью библиотеки Wire:

SSD1306  display(0x3c, D3, D5);
// SH1106 display(0x3c, D3, D5);

// инициализация датчика DHT11 для обычной Arduino с 16 МГц:
DHT dht(DHTPIN, DHTTYPE);

void setup(){
  // с инициализацией UI будет инициализирован и дисплей: 
  display.init();

  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_16);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  dht.begin();  //  инициализация DHT
}

void displayTempHumid(){
  // считывание температуры и влажности занимает около 250 мс; 
  // кроме того, данные от датчика могут запаздывать 
  // примерно на 2 секунды (это очень медленный датчик): 
  float h = dht.readHumidity();
  // считываем температуру в градусах Цельсия:
  float t = dht.readTemperature();
  // считываем температуру в градусах Фаренгейта:
  float f = dht.readTemperature(true);

  // проверяем, прочлись ли данные, и если нет,
  // то выходим и пробуем снова: 
  if (isnan(h) || isnan(t) || isnan(f)){
    display.clear();  //  очищаем дисплей
    display.drawString(5,0, "Failed DHT");
                         // "Не удалось прочесть данные от датчика DHT"
    return;
  }
  display.clear();
  display.drawString(0, 0, "Humidity: " + String(h) + "%\t"); 
                        // "Влажность: "
  display.drawString(0, 16, "Temp: " + String(t) + "C"); 
                        // "Температура: "
  display.drawString(0, 32, "Temp: " + String(f) + "F"); 
                        // "Температура: "
}
void loop(){
  displayTempHumid();
  display.display();
  delay(2000);
}

Демонстрация

Результат должен быть примерно таким:

См.также

Внешние ссылки