Для реализации этого проекта нам потребуется:
Ардуино нано;
Матрица WS2812B 8х8 светодиодов;
Датчик температуры и влажности AHT21;
Блок питания 5v 1a или аккумуляторы.
Как прошить ардуино нано можно узнать из многих статей в интернете, так что этот этап мы пропустим.
Проверка датчика
Подключаем датчик по такой схеме:
SDA – A4
SCL – A5
VCC – 5V
GND – GND arduino nano
После подключения загружаем этот скетч в ардуино нано:
#include <Wire.h>
#include <Adafruit_AHTX0.h>
Adafruit_AHTX0 aht;
void setup() {
Serial.begin(9600);
while (!Serial) delay(10); // Ожидание открытия сериального порта
if (!aht.begin()) {
Serial.println("Could not find AHT device!");
while (1) delay(10);
}
Serial.println("AHT21 found");
}
void loop() {
sensors_event_t temp;
aht.getEvent(nullptr, &temp); // Чтение только данных о температуре
Serial.print("Температура: "); Serial.print(temp.temperature); Serial.println(" C");
// в сериал порт выводится температура
delay(2000); // Пауза 2 секунды между измерениями
}
Проверка матрицы
Подключаем матрицу по такой схеме:
DIN – D6
5V – 5V
GND – GND arduino nano
После подключения загружаем скетч:
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 64
#define BRIGHTNESS 50
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
fill_solid(leds, NUM_LEDS, CRGB::White);
FastLED.show();
delay(1000); // Задержка для демонстрации, может быть изменена или удалена
}
После загрузки скетча вся матрица должна загореться белым цветом.
Если датчик и матрица исправны переходим к третьему этапу
Матрица с температурой
скетч для загрузки:
#include <FastLED.h>
#include <Wire.h>
#include <Adafruit_AHTX0.h>
#define LED_PIN 6
#define NUM_LEDS 64
#define BRIGHTNESS 50
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
Adafruit_AHTX0 aht;
CRGB getDotColor(float temperature) {
// Определяем начальный и конечный цвета
CRGB coldColor = CRGB::Blue; // Голубой для 25°C
CRGB hotColor = CRGB::Green; // Зелёный для 30°C
// Ограничиваем диапазон температуры
temperature = constrain(temperature, 25, 30);
// Рассчитываем коэффициент между 0 и 1, где 0 - это 25°C, а 1 - это 30°C
float t = (temperature - 25) / (30 - 25);
// Интерполируем цвет между голубым и зелёным
uint8_t red = lerp8by8(coldColor.r, hotColor.r, t * 255);
uint8_t green = lerp8by8(coldColor.g, hotColor.g, t * 255);
uint8_t blue = lerp8by8(coldColor.b, hotColor.b, t * 255);
return CRGB(red, green, blue);
}
void setup() {
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
Serial.begin(9600);
while (!Serial) delay(10); // Ожидание открытия сериального порта
if (!aht.begin()) {
Serial.println("Could not find AHT device!");
while (1) delay(10);
}
Serial.println("AHT21 found");
}
void loop() {
sensors_event_t temp;
aht.getEvent(nullptr, &temp); // Чтение только данных о температуре
// Преобразуем температуру в целое число для отображения
int temperature = temp.temperature + 0.5; // Округление до ближайшего целого
fill_solid(leds, NUM_LEDS, CRGB::Black); // Очищаем матрицу
// Ваш исходный код для отображения числа "12" с точкой изменен на динамическое отображение температуры
int startX = 0; // Начальная координата X
int startY = 2; // Начальная координата Y
if (temperature >= 10) { // Если температура двузначное число
drawNumber(temperature / 10, startX, startY); // Первая цифра температуры
drawNumber(temperature % 10, startX + 4, startY); // Вторая цифра температуры
drawDots(startX + 6, startY - 2, temp.temperature); // Точка после числа
} else {
// Если температура однозначная
drawNumber(0, startX, startY); // Выводим 0 перед однозначной температурой для формата 0X.X
drawNumber(temperature, startX + 4, startY); // Однозначная температура
drawDots(startX + 6, startY - 2, temp.temperature); // Точка после числа
}
FastLED.show(); // Обновляем матрицу
delay(2000); // Задержка для наблюдения
}
void drawNumber(int num, int x, int y) {
// Обновленные паттерны для каждой цифры с увеличенной высотой
int patterns[10][6][3] = {
{{1,1,1}, {1,0,1}, {1,0,1}, {1,0,1}, {1,0,1}, {1,1,1}}, // 0
{{0,1,0}, {1,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {1,1,1}}, // 1
{{1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}, {1,0,0}, {1,1,1}}, // 2
{{1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}, {0,0,1}, {1,1,1}}, // 3
{{1,0,1}, {1,0,1}, {1,0,1}, {1,1,1}, {0,0,1}, {0,0,1}}, // 4
{{1,1,1}, {1,0,0}, {1,0,0}, {1,1,1}, {0,0,1}, {1,1,1}}, // 5
{{1,1,1}, {1,0,0}, {1,0,0}, {1,1,1}, {1,0,1}, {1,1,1}}, // 6
{{1,1,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}}, // 7
{{1,1,1}, {1,0,1}, {1,0,1}, {1,1,1}, {1,0,1}, {1,1,1}}, // 8
{{1,1,1}, {1,0,1}, {1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}} // 9
};
// Рисуем цифру в соответствии с паттерном
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 3; j++) {
if (patterns[num][i][j] == 1) {
drawPixel(x + j, y + i, CRGB::White);
}
}
}
}
void drawPixel(int x, int y, CRGB color) {
int index = x * 8 + (7 - y);
if (index < NUM_LEDS) {
leds[index] = color;
}
}
void drawDots(int x, int y, float temperature) {
CRGB color = getDotColor(temperature); // Получаем цвет на основе температуры
drawPixel(x, y, color);
drawPixel(x + 1, y, color);
drawPixel(x, y + 1, color);
drawPixel(x + 1, y + 1, color);
}
Основная логика скетча заключается в считывании показаний с датчика и выводе температуры на матрицу. Так таже добавлена функция изменение цвета точки градуса, где 25° это голубой цвет, до 30° это зеленый цвет.
![](https://habrastorage.org/getpro/habr/upload_files/005/46d/12a/00546d12a45ecb46f42258f98401a478.jpg)
![](https://habrastorage.org/getpro/habr/upload_files/7a5/383/0a8/7a53830a86e91534d5aaf407f5b466a3.jpg)
Если вам не нравится, как какая-либо цифра отображается, то в паттерне можно сделать её такой, какой захотите, меняя единицы на нули и наоборот.
Это моя первая статья, так что не судите строго.