Для реализации этого проекта нам потребуется:
Ардуино нано;
Матрица 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° это зеленый цвет.


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