带有滚动文本的 Arduino 蓝牙控制矩阵
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 7 | ||||
| × | 1 | ||||
| × | 2 |
必要的工具和机器
|
应用和在线服务
| ||||
|
关于这个项目
在多次尝试在 8x8 矩阵上制作滚动文本后,我在嵌入式实验室页面上找到了最完整的手册:http://embedded-lab.com/blog/portable-bluetooth-enabled-scrolling-led-matrix-display -part-1/.
该器件包含一个 Arduino nano、用于从智能手机接收数据的蓝牙模块和由 MAX7219 驱动的 8x8 LED 矩阵。
与那里不同的是,我使用现成的带有 MAX7219 芯片的 8x8 矩阵模块,可以在 Ebay 或 Alexpress 上以非常便宜的价格购买。目前我只有7个模块,所以我对代码做了一个小小的修改。 Google Play 商店中已不存在 android 应用程序,因此您可以从以下位置下载:
https://bluetooth-spp-pro.en.uptodown.com/android
.它可以控制滚动速度、LED 亮度、暂停、擦除文本和几个预定义的文本按钮。
最后,我把整个设备放在一个盒子里,盒子是用 PVC 材料制成的,上面贴着黑色壁纸。
Arduino 库:
https://github.com/markruys/arduino-Max72xxPanel
https://github.com/adafruit/Adafruit-GFX-Library
代码
- 代码
代码Arduino
/*这里是Arduino识别的命令。 1. 任何字符流都必须用括号括起来发送。示例:假设您想显示一条消息“你好!你好吗?”你应该像这样发送它:(你好!你好吗?)当 Arduino 接收到第一个字符为 '(' 时,它知道接下来的字符是显示数据,直到收到 ')'。消息显示为从右向左滚动。 2. 分别发送/+或/-可增加或减少显示强度。每次 Arduino 收到“/”时,它都会理解这是一个命令。它支持 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 波特.作者:Rajendra Bhatt 联系人:[email protected] Easy Matrix 产品链接:http://embedded-lab.com/blog/?p=9186 */#include#include #include int pinCS =10; // 将 CS 连接到此引脚,将 DIN 连接到 MOSI,将 CLK 连接到 SCK (cf http://arduino.cc/en/Reference/SPI)int numberOfHorizontalDisplays =7;int numberOfVerticalDisplays =1;Max72xxPanel matrix =Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);int scrollspeed =100; // 默认滚动速度(毫秒)int separator =1; // 两个字符之间的空格int width =5 + separator; // 字体宽度为5像素boolean inChar =false, NewData =false, pause =false;boolean dataAvailable =false;char inputString[512];int count =0, BTvalue =5;void setup() { matrix.setIntensity(1 ); // 使用 0 到 15 之间的值作为亮度 // 根据自己的需要调整 matrix.setPosition(0, 0, 0); // 第一个显示在 <0, 7> matrix.setPosition(1, 1, 0); // 第二个显示在 <1, 0> matrix.setPosition(2, 2, 0); // 第三个显示在 <2, 0> matrix.setPosition(3, 3, 0); // 最后显示在 <3, 0> matrix.setPosition(4, 4, 0); // 第一个显示在 <0, 0> matrix.setPosition(5, 5, 0); // 第二个显示在 <1, 0> matrix.setPosition(6, 6, 0); // 第三个显示在 <2, 0> // ... // matrix.setRotation(0, 2); // 第一个显示位置颠倒 // matrix.setRotation(3, 2); // 对最后一次显示同样保持 matrix.fillScreen(0);矩阵写(); Serial.begin(9600); // 串行通信初始化 // 在数字引脚 2 上使用中断 0。 pinMode(2, INPUT);数字写入(2,低); attachInterrupt(0, serialInterrupt, CHANGE); }void loop(){ if(dataAvailable){ display_data(); } }void display_data(){ for ( int i =0; i =0 &&letter>=0 ) { if ( letter 0) { NewData =true; } } } } if(ch =='/'){ // 命令模式 inChar =true; while(inChar){ if (Serial.available()) { ch =Serial.read(); // '/+' 用于亮度增加 if(ch =='+'){ if(BTvalue <15) { BTvalue ++; matrix.setIntensity(BTvalue); } 休息; } // '/-' 用于亮度递减 if(ch =='-'){ if(BTvalue> 0){ BTvalue --; matrix.setIntensity(BTvalue); } 休息; } // '/>'是减慢滚动速度 if(ch =='>'){ if(scrollspeed <200) { scrollspeed =scrollspeed + 20; } 休息; } // '/<'是为了让滚动更快 if(ch =='<'){ if(scrollspeed> 10){ scrollspeed=scrollspeed-10; } 休息; } // '/e'是擦除显示 if(ch =='e'){ dataAvailable =false;休息; } // '/p'是暂停显示 if(ch =='p'){ if(pause ==false){ pause =true; } else { 暂停 =假; } 休息; }其他{休息; // 无法识别的命令 } } } } // if(ch =='!') } // while(serial.available) inService =false;}
示意图
制造工艺