#include "Adafruit_GFX.h" // библиотеки для работы с адресной лентой
#include "Adafruit_NeoMatrix.h"
#include "Adafruit_NeoPixel.h"
#include "DHT.h" // библиотека для датчика DHT11
#include "iarduino_RTC.h" // библиотека для модуля часов
iarduino_RTC time(RTC_DS3231);
#define DHT_PIN 2 // порт подключения датчика DHT11
#define LED_PIN 9 // порт подключения адресной ленты
#define WIDTH 31 // ширина матрицы в пикселях
#define ROWS 7 // количество строк в матрице
#define PHOT_PIN 6 // Пин фоторезистора
boolean adapt_light = 1; // адаптивная подсветка (1 - включить, 0 - выключить)
unsigned long last_bright; // время адаптивной подсветки
int max_bright = 100; // максимальная яркость (0 - 255)
int min_bright = 100; // минимальная яркость (0 - 255)
int new_bright; // новая яркость
boolean humidity = true; // выводить влажность воздуха - true/false
unsigned int timer = 50; // скорость бегущей строки
unsigned int pausa1 = 10000; // на сколько мсек остановится время на табло
unsigned int pausa2 = 1000; // на сколько мсек остановится температура и влажность
unsigned int brightness = 200; // яркость матрицы с адресной лентой
// настройки матрицы (если текст выводится некорректно, следует их изменить)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(WIDTH, ROWS, 1, 1, LED_PIN,
NEO_MATRIX_LEFT + NEO_MATRIX_BOTTOM +
NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
DHT dht(DHT_PIN, DHT22); // создаем объект для датчика температуры
byte w, t, h;
int x = WIDTH;
void setup() {
dht.begin(); // запускаем датчик давления
Serial.begin(9600); // запускаем монитор порта
matrix.begin();
matrix.fillScreen(0);
// установка цветовой палитры адресной ленты (RGB)
matrix.setTextColor(matrix.Color(0, 0, 255));
matrix.setTextWrap(false);
matrix.setBrightness((brightness);
time.begin();
// после установки времени и загрузки скетча в плату Ардуино
// закомментируйте следующую строчку и снова загрузите скетч в плату
//time.settime(0, 35, 17, 12, 14, 21, 2); // сек, мин, час, число, месяц, год, день недели
}
void loop() {
if (adapt_light) { // если включена адаптивная яркость
if (millis() - last_bright > 500) { // каждые полсекунды
last_bright = millis(); // сброить таймер
new_bright = map(analogRead(PHOT_PIN), 1, 1000, min_bright, max_bright); // считать показания с фоторезистора, перевести диапазон
matrix.setBrightness(new_bright); // установить новую яркость
}
}
// выводим на монитор порта: температуру, влажность и время
t = dht.readTemperature();
h = dht.readHumidity();
Serial.print(t);
Serial.println("°C");
Serial.print(h);
Serial.println("%");
Serial.println(time.gettime("H:i"));
// два варианта вывода информации на табло (ненужный можно удалить)
variant1(); // первый вариант с бегущей строкой
//variant2(); // второй вариант с плавным затуханием
}
void variant1() {
//matrix.setBrightness((brightness);
matrix.fillScreen(0);
w = 1;
// == выводим время (часы и минуты) на светодиодное табло == //
while (w == 1) {
matrix.fillScreen(0);
matrix.setTextColor(matrix.Color(0, 0, 255));
matrix.setCursor(x, 0);
matrix.print(time.gettime("H:i"));
matrix.show();
delay(timer);
x--;
// когда текст оказывается посередине табло - делаем паузу
if (x == -1) {
delay(pausa1);
}
if (x < - WIDTH) {
x = WIDTH;
w = 2;
}
}
// == выводим температуру воздуха на светодиодное табло == //
while (w == 2) {
matrix.fillScreen(0);
matrix.setCursor(x, 0);
matrix.print(t);
matrix.setTextColor(matrix.Color(0, 255, 0));
matrix.print("'C");
matrix.show();
delay(timer);
x--;
// когда текст оказывается посередине табло - делаем паузу
if (x == 3) {
delay(pausa2);
}
if (x < - WIDTH && humidity == true) {
x = WIDTH;
w = 3;
}
if (x < - WIDTH && humidity == false) {
x = WIDTH;
w = 0;
}
}
// == выводим влажность воздуха на светодиодное табло == //
while (w == 3) {
matrix.fillScreen(0);
matrix.setTextColor(matrix.Color(255, 0, 0));
matrix.setCursor(x, 0);
matrix.print(h);
matrix.print("%");
matrix.show();
delay(timer);
x--;
// когда текст оказывается посередине табло - делаем паузу
if (x == 6) {
delay(pausa2);
}
if (x < - WIDTH) {
x = WIDTH;
w = 0;
}
}
}
void variant2() {
matrix.setBrightness(0);
matrix.fillScreen(0);
w = 1;
// == плавное появление/исчезновение времени на табло == //
while (w == 1) {
for (byte i = 0; i < brightness; i++) {
matrix.setBrightness(i);
matrix.setCursor(0, 0);
matrix.print(time.gettime("H:i"));
matrix.show();
delay(timer / 10);
}
delay(pausa1); // пауза перед затуханием надписи
for (byte i = brightness; i > 0; i--) {
matrix.setBrightness(i);
matrix.setCursor(0, 0);
matrix.print(time.gettime("H:i"));
matrix.show();
delay(timer / 10);
}
matrix.setBrightness(analogRead(0);
delay(timer * 10);
w = 2;
}
// == плавное появление/исчезновение температуры воздуха == //
while (w == 2) {
for (byte i = 0; i < brightness; i++) {
matrix.setBrightness(i);
matrix.setCursor(4, 0);
matrix.print(t);
matrix.print("'C");
matrix.show();
delay(timer / 10);
}
delay(pausa2); // пауза перед затуханием надписи
for (byte i = brightness; i > 0; i--) {
matrix.setBrightness(i);
matrix.setCursor(4, 0);
matrix.print(t);
matrix.print("'C");
matrix.show();
delay(timer / 10);
}
matrix.setBrightness(analogRead(0);
delay(timer * 2);
if (humidity == true) {
w = 3;
}
if (humidity == false) {
w = 0;
}
}
// == плавное появление/исчезновение влажности воздуха == //
while (w == 3) {
for (byte i = 0; i < brightness; i++) {
matrix.setBrightness(i);
matrix.setCursor(6, 0);
matrix.print(h);
matrix.print("%");
matrix.show();
delay(timer / 10);
}
delay(pausa2); // пауза перед затуханием надписи
for (byte i = brightness; i > 0; i--) {
matrix.setBrightness(i);
matrix.setCursor(6, 0);
matrix.print(h);
matrix.print("%");
matrix.show();
delay(timer / 10);
}
matrix.setBrightness(0);
delay(timer * 10);
w = 0;
}
}