外部显示器是我们可以与Android Things一起使用以显示信息的外围设备。 本文介绍了如何在Android Things中使用4个外部显示器。 当需要显示信息时,显示很重要。 当我们基于Android Things开发智能设备时,通常需要向用户显示信息。 即使我们可以使用RGB LED来显示某种信息,但在需要显示消息或其他信息时,连接到Android Things的外部显示器也起着重要作用。
Android Things支持多个外部显示器,并且可以使用不同的驱动程序来与这些外部显示器进行交互。
本Android Things教程介绍了如何在Android Things中使用以下外部显示:
- TM1637这是4位数字的显示屏
- Max7219此矩阵LED通常为8×8。 它由64个可寻址的单个LED制成。 此外,它具有SPI接口
- 基于HD44780芯片并由PCF8574芯片控制的LCD显示屏( LCD 1602和LCD 2004 )
- SSD1306具有0.96英寸屏幕的OLED显示器。 这款OLED显示器的分辨率为128×64,可以控制每个LED的开和关状态
本文将逐步介绍如何将外部显示器与Android Things连接以及如何显示信息。
目录
1.如何将TM1637外接显示器连接到Android Things
让我们从可用于Android Things的最简单的外部显示器开始:TM1637。 它具有四个必须连接到Android Things的引脚:
- Vcc(+ 3V或+ 5V)
- 地线
- DIO(数据)
- CLK(时钟)
连接Android Things与TM1637的草图如下所示:
我们在哪里可以使用此显示? 该外部显示器可以在以下情况下使用:
- 时间显示
- 显示传感器数据
如何在Android Things中使用TM1637
第一步是导入正确的驱动程序,以便我们可以与TM1637交互。 TM1637显示屏具有 Android Things中受支持的驱动程序 。
要使用此显示,必须在build.gradle
添加以下行:
dependencies {
implementation 'com.google.android.things.contrib:driver-tm1637:1.0'
......
}
让我们创建一个新类来处理TM1637外部显示器。 此类名为TM1637Display
,其外观类似于:
public class TM1637Display {
private NumericDisplay display;
private String DATA_PIN = "BCM4";
private String CLK_PIN = "BCM3";
private static TM1637Display me;
public static TM1637Display getInstance() {
if (me == null)
me = new TM1637Display();
return me;
}
private TM1637Display() {
init();
}
....
}
此类是单例类,在init()
方法中,应用程序使用Data引脚和Clock引脚初始化驱动程序:
private void init() {
try {
display = new NumericDisplay(DATA_PIN, CLK_PIN);
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
现在可以使用此方法显示数据:
public void display(String data) {
try {
display.display(data);
display.setColonEnabled(true);
display.setBrightness(NumericDisplay.MAX_BRIGHTNESS);
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
如您setBrightness
,可以使用setBrightness
更改显示亮度。 在MainActivity
我们可以使用TM1637显示屏通过以下方式显示数据:
private void testTM1637() {
TM1637Display display = TM1637Display.getInstance();
display.display("1420");
}
结果如下图所示:
该外部显示器非常易于使用。
2.如何将Max7219连接到Android Things
Max7219显示器是一个LED矩阵,具有8×8个LED,可以通过打开或关闭每个LED来解决。 通常,它是单色显示器,但是还有其他带有RGB LED的变体。 它是一个SPI接口 ,有趣的方面是链接它们的能力。 它具有5个不同的引脚:
- Vcc(+ 5V)
- 地线
- CLK(时钟>
- CS
- 数据
即使有一些限制,该外接显示器也可以有多种用途,也可以用于显示简单图像。
以下架构显示了如何将Max7219连接到Android Things:
如何在Android Things中使用Max7219
在将Max7219与Android Things结合使用之前,必须添加处理该外围设备的驱动程序。 不幸的是,Android Things不正式支持该显示,因此,有必要找到一个非官方的驱动程序。
有几种可用的驱动程序,本文中使用的一种是:
dependencies {
implementation 'rocks.androidthings:max72xx-driver:0.2'
....
}
当然,您也可以使用其他驱动程序,但要注意类可能会更改。
要处理此外部显示(Max7219),我们可以创建一个名为Max7219Display
的简单类,该类为单例 ,如前所述:
public class Max7219Display {
private MAX72XX display;
private static Max7219Display me;
private Max7219Display() {
init();
}
public static Max7219Display getInstance() {
if (me == null)
me = new Max7219Display();
return me;
}
....
}
Android Things应用在init()
方法中的哪个位置初始化显示:
private void init() {
try {
display = new MAX72XX("SPI0.0", 1);
//
display.setIntensity(0, 13);
display.shutdown(0, false);
display.clearDisplay(0);
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
在前面的代码中,我们使用setIntensity
方法初始化LED强度。 为了更好地了解如何使用此外部显示器,让我们假设我们想创建一个简单的盒子。
第一步,必须创建一个byte
数组:
private byte ROW = (byte) 0b11111111;
在此阵列中,1表示LED点亮,而0则熄灭。 在此示例中,所有LED均亮起。 阵列大小为8,作为矩阵中LED的数量。 下一步是绘制方框边框:
public void drawBorder() {
try {
display.setRow(0, 0, ROW);
display.setRow(0, 7, ROW);
display.setColumn(0, 0, ROW);
display.setColumn(0, 7, ROW);
display.close();
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
在上面的代码中,Android Things应用程序使用setRow
将字节数组应用于行中的所有LED。 在这种情况下,第一行(x = 0,y = 0)和最后一行(x = 0,y = 7)。 以相同的方式,应用程序沿列绘制边框。
最终结果如下图所示:
我们可以做更多的事情,并展示可以用于所有行和列的更复杂的数组。 将此数组添加到类中:
private byte[] table =
{(byte) 0b10101010,
(byte) 0b01010101,
(byte) 0b10101010,
(byte) 0b01010101,
(byte) 0b10101010,
(byte) 0b01010101,
(byte) 0b10101010,
(byte) 0b01010101};
这是显示上面绘制的方法:
public void drawTable() {
try {
for (int i=0 ; i < table.length; i++)
display.setRow(0, i, table[i]);
display.close();
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
您可以运行它并验证结果。
3.如何将SSD1306外接显示器连接到Android Things
如前所述,SSD1306是分辨率为128×64的外部显示器。 它是OLED显示器,可以在打开或关闭期间控制每个像素。 该显示器有两种不同的变体:一种带有SPI接口,另一种带有I2C接口。 本文中使用的一个具有I2C接口。 因此,有四个不同的引脚:
- Vcc(+ 3V或+ 5V)
- 地线
- 数据
- 时钟
下面显示了有关如何将SSD外部显示器连接到Android Things的详细信息:
如何在Android Things中使用SSD1306
Android Things 正式支持 SSD1306外部显示器。 因此,有一个我们可以用来连接到该外围设备的驱动程序。
要使用此LCD显示屏,必须将此驱动程序添加到build.gradle
:
dependencies {
implementation 'com.google.android.things.contrib:driver-ssd1306:1.0'
....
}
和之前一样,让我们创建一个新类来处理所有详细信息,并将id称为SSD1306Display
。 这个类看起来像:
public class SSD1306Display {
private static SSD1306Display me;
private Ssd1306 display;
private SSD1306Display() {
init();
}
public static SSD1306Display getInstance() {
if (me == null)
me = new SSD1306Display();
return me;
}
..
}
init()
方法定义为:
private void init() {
try {
display = new Ssd1306("I2C1");
display.clearPixels();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
[/code]
最后,我们可以开始使用此LCD显示器。 Android Things应用可以打开或关闭此显示屏中的每个LED,以便使用此功能可以画一条简单的线:
public void drawLine(int y) {
for (int x = 0; x < display.getLcdWidth(); x++)
display.setPixel(x, y, true);
try {
display.show();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
使用setPixel
,Android Things应用可以选择每个像素的状态。 最终结果如下所示(应该有一行,但是看不到!!!):
即使打开或关闭每个LED有用,当我们想要显示更复杂的图像时,它也可能非常复杂。
因此,可以使用如下所示的另一种方式:
public void drawBitmap(Resources res) {
Bitmap img = BitmapFactory.decodeResource(res, R.drawable.weathersun);
BitmapHelper.setBmpData(display, 0,0, img, false);
try {
display.show();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
可以直接加载图像并将其显示在LCD显示屏上。 这是非常有用和容易的。
就这样。
更多有用的资源:
如何使用Android Things和Twilio通过SMS发送通知
如何集成Android Things和Tensorflow来构建智能对象
4.如何将LCD显示器1602或2004连接到Android Things
我们在本文中介绍的最后一个外部显示器是一个简单的LCD显示器。 它可以显示标准字符或自定义字符。
它有多种尺寸,但它们的工作方式相同。 最容易找到16×2和20×4大小。 第一个可以在两行中显示16个字符,而第二个可以在四行中显示20个字符。
下图显示了如何将Android Things与LCD 2004连接:
它具有I2C接口,并且也具有背光。
如何将LCD显示器连接到Android Things
不管怎样,Android Things本身不支持这种设备,但是有几种驱动程序可用。
我们将使用的驱动程序如下所示:
dependencies {
...
implementation 'com.leinardi.android.things:driver-hd44780:1.0'
}
让我们再次开始创建一个名为LCDDisplay
的新类,该类与前面描述的类相似,唯一的区别在于init()
private void init() {
try {
driver = new Hd44780(I2C_PIN, I2C_ADDR, GEOMETRY);
driver.cursorHome();
driver.clearDisplay();
driver.setBacklight(true);
}
catch(Exception e) {
e.printStackTrace();
}
}
哪里
private static final String I2C_PIN = "I2C1";
private static final int I2C_ADDR = 0x27;
private static final int GEOMETRY = Hd44780.Geometry.LCD_20X4;
小费
请注意,I2C_ADDR可能与上面显示的不同
让我们假设Android Things应用程序希望在LCD屏幕上显示一条消息。 使用的代码如下所示:
public void display(String data) {
try {
driver.clearDisplay();
driver.cursorHome();
driver.setBacklight(true);
driver.setText(data);
driver.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
此方法一开始会清除显示,并将光标设置为home。 下一步是设置背光,最后显示消息。
结果如下所示:
如果我们想在显示屏上滚动消息,可以使用以下方法:
public void shift(final String word, final int speed) {
final int size = 20 - word.length();
Runnable r = new Runnable() {
@Override
public void run() {
try {
driver.createCustomChar(empty, 0);
for (int i = 0; i <= size; i++) {
if (i > 0) {
driver.setCursor(i - 1, 0);
driver.writeCustomChar(0);
}
driver.setCursor(i, 0);
driver.setText(word);
Thread.sleep(speed);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
};
Thread t = new Thread(r);
t.start();
}
需要注意的重要有趣方面是,我们可以创建一个自定义字符。 在这种情况下,自定义字符为空字符:
int[] empty = {0b000000, 0b000000,
0b000000, 0b000000,
0b000000, 0b000000,
0b000000, 0b000000};
5.总结
在本文的结尾,希望您已了解如何将外部显示与Android Things一起使用。 如您所知,有几个具有不同功能的外部显示器。 根据我们的需求和方案,我们可以选择最佳的外接显示器与Android Things一起使用。
翻译自: https://www.javacodegeeks.com/2018/10/external-displays-android-things.html