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

от автора

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

  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° это зеленый цвет.

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/794520/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *