Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Температура и влажность с датчика DHT11 на OLED-дисплее

Для знакомства с датчиком влажности и температуры достаточно выводить показания в последовательный монитор. В реальных проектах числа нужно выводить на экран. Поэтому я решил объединить пример датчика и OLED-дисплея в одном месте. Заодно проверил пару библиотек для дисплея с поддержкой русских символов.

Подключение стандартное. Сигнальный вывод датчика соединяем со вторым цифровым портом. Выводы OLED-дисплея соединяются с цифровыми выводами платы 8, 9, 11, 12, 13.

Перед запуском скетча следует установить библиотеки Adafruit GFX Library, Adafruit SSD1306, DHT sensor library. В библиотеке Adafruit GFX Library найдите файл glcdfont.c и замените его на другой из архива, который поддерживает русские символы. После этого можно запускать скетч.


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11 // DHT 11

// software SPI:
#define OLED_MOSI   11
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    12
#define OLED_RESET 8
#define maxString 21
char target[maxString + 1] = "";
unsigned char i1, i2, c3;
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC);
  display.cp437(true);
  dht.begin();
  Serial.begin(57600);
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float hic = dht.computeHeatIndex(t, h, false);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(utf8rus("Температура: "));
  //display.setTextSize(2);
  display.setCursor(10, 10);
  display.println(t);
  display.setCursor(0, 20);
  display.println(utf8rus("Влажность(%): "));
  display.setCursor(80, 20); // место вывода чисел для влажности
  display.println(h); // выводим надпись

  display.setCursor(45, 10);
  display.println("\xB0"); // знак градуса
  //display.setCursor(78, 20);
  //display.println("%");
  display.display();
}

/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

У меня в наличии был очень маленький дисплей, поэтому мне пришлось немного переделывать скетч, уменьшая размер шрифта и выводя данные в одной строке. Если у вас экран будет больше, то можете разместить сообщение в другом виде. И ещё одно предупреждение - выводить одно и тоже сообщение на экран не слишком хорошая идея, в этом месте будут выгорать пиксели. Имейте это в виду при создании реального проекта.

У меня получилось следующее.

OLED-дисплей с показаниями датчика температуры и влажности

Реклама