Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Для знакомства с датчиком влажности и температуры достаточно выводить показания в последовательный монитор. В реальных проектах числа нужно выводить на экран. Поэтому я решил объединить пример датчика и 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;
}
У меня в наличии был очень маленький дисплей, поэтому мне пришлось немного переделывать скетч, уменьшая размер шрифта и выводя данные в одной строке. Если у вас экран будет больше, то можете разместить сообщение в другом виде. И ещё одно предупреждение - выводить одно и тоже сообщение на экран не слишком хорошая идея, в этом месте будут выгорать пиксели. Имейте это в виду при создании реального проекта.
У меня получилось следующее.