Pull to refresh

Температура на матрице WS2812B

Level of difficultyEasy
Reading time4 min
Views4K

Для реализации этого проекта нам потребуется:

  1. Ардуино нано;

  2. Матрица WS2812B 8х8 светодиодов;

  3. Датчик температуры и влажности AHT21;

  4. Блок питания 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° это зеленый цвет.

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

Это моя первая статья, так что не судите строго.

Tags:
Hubs:
Total votes 8: ↑6 and ↓2+7
Comments7

Articles