Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Bluetooth-матрица 8×8 с бегущей строкой на Arduino

Компоненты и материалы

Название Количество
Arduino Nano R3 1
Bluetooth-модуль HC-05 1
Модуль матрицы 8×8 с MAX7219 7
Резистор 6.8 кОм 1
Резистор 2.2 кОм 2

Необходимые инструменты

Приложения и онлайн-сервисы

О проекте

После нескольких попыток сделать бегущую строку на матрице 8×8, нашел полное руководство на Embedded Lab: Portable Bluetooth Enabled Scrolling LED Matrix Display.

Устройство содержит Arduino Nano, Bluetooth-модуль для приема текста со смартфона и 7 модулей матриц 8×8 на драйвере MAX7219. Использовал готовые модули (дешево на eBay/Aliexpress). В коде небольшие правки под 7 модулей. Android-приложение удалено из Google Play, но доступно по ссылке выше. Оно управляет скоростью прокрутки, яркостью, паузой, очисткой экрана и имеет кнопки с заготовленными текстами.

Готовое устройство помещено в коробок из ПВХ с черной обоевой бумагой.

Библиотеки Arduino:

Код

Скетч (Arduino)
/* Команды, которые распознает Arduino:
1. Текст в скобках: (Hello! How are you?) — прокрутка справа налево.
2. Яркость: /+ увеличить, /- уменьшить (16 уровней).
3. Скорость: /> замедлить, /< ускорить.
4. /p — пауза/продолжение.
5. /e — стереть буфер и очистить экран.

Подключение:
Easy Matrix -> Arduino
VCC -> +5V
DIN -> MOSI (Pin 11)
LOAD -> pinCS (задан в программе)
CLK -> SCK (Pin 13)
GND -> Gnd
UART: 9600 baud.
Автор: Rajendra Bhatt, admin@embedded-lab.com
*/

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

int pinCS = 10;
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

int scrollspeed = 100;
int spacer = 1;
int width = 5 + spacer;
boolean inChar = false, NewData = false, pause = false;
boolean dataAvailable = false;
char inputString[512];
int count = 0, BTvalue = 5;

void setup() {
  matrix.setIntensity(1);
  matrix.setPosition(0, 0, 0);
  matrix.setPosition(1, 1, 0);
  matrix.setPosition(2, 2, 0);
  matrix.setPosition(3, 3, 0);
  matrix.setPosition(4, 4, 0);
  matrix.setPosition(5, 5, 0);
  matrix.setPosition(6, 6, 0);
  matrix.fillScreen(0);
  matrix.write();
  Serial.begin(9600);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  attachInterrupt(0, serialInterrupt, CHANGE);
}

void loop() {
  if (dataAvailable) display_data();
}

void display_data() {
  for (int i = 0; i < width * count + matrix.width() - 1 - spacer; i++) {
    matrix.fillScreen(0);
    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;
    while (x + width - spacer >= 0 && letter >= 0) {
      if (letter < count) {
        matrix.drawChar(x, y, inputString[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write();
    if (!dataAvailable) {
      i = width * count + matrix.width() - 1 - spacer;
      matrix.fillScreen(LOW);
      matrix.write();
    }
    if (NewData) {
      i = 0;
      matrix.fillScreen(LOW);
      matrix.write();
      NewData = false;
    }
    while (pause) delay(0);
    delay(scrollspeed);
  }
}

volatile boolean inService = false;
void serialInterrupt() {
  if (inService) return;
  inService = true;
  interrupts();
  while (!Serial.available());
  while (Serial.available()) {
    char ch = Serial.read();
    if (ch == '(') {
      count = 0;
      inChar = true;
      while (inChar) {
        if (Serial.available()) {
          ch = Serial.read();
          if (ch == ')') {
            inChar = false;
            dataAvailable = true;
          } else {
            inputString[count] = ch;
            count++;
          }
          if (count > 0) NewData = true;
        }
      }
    }
    if (ch == '/') {
      inChar = true;
      while (inChar) {
        if (Serial.available()) {
          ch = Serial.read();
          if (ch == '+') { if (BTvalue < 15) { BTvalue++; matrix.setIntensity(BTvalue); } break; }
          if (ch == '-') { if (BTvalue > 0) { BTvalue--; matrix.setIntensity(BTvalue); } break; }
          if (ch == '>') { if (scrollspeed < 200) scrollspeed += 20; break; }
          if (ch == '<') { if (scrollspeed > 10) scrollspeed -= 10; break; }
          if (ch == 'e') { dataAvailable = false; break; }
          if (ch == 'p') { pause = !pause; break; }
          else break;
        }
      }
    }
  }
  inService = false;
}

Схемы

Bluetooth-матрица 8×8 с бегущей строкой на Arduino

Производственный процесс

  1. Умная копилка: управление монетоприёмником на Arduino Nano
  2. Сборка консоли Pong 24×16 на Arduino Nano и MAX7219
  3. Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
  4. Bluetooth Text Teleporter: передача текста с Android на Arduino (HID‑клавиатура)
  5. Голосовое управление бытовыми приборами: Bluetooth-управление через Google Assistant
  6. Мастерство 8×8 LED-матрицы с Arduino Uno: Пошаговое руководство
  7. Измерение солнечной радиации на Arduino UNO с Ethernet Shield
  8. Удалённое управление автомобилем на Arduino Uno и Bluetooth: пошаговое руководство
  9. Отправка и прием SMS с GSM SIM900 Shield на Arduino Mega
  10. HID-UPS на Arduino: превращаем «глупый» ИБП в умный USB-устройство