使用 Android Things 创建智能设备时,可能需要在屏幕上显示一些内容。它可以根据您的需要以各种方式完成。
在这篇博文中,我们将比较五种使用不同类型的外部显示器在屏幕上显示信息的方法。
当您想要开始使用 Android Things 时,这可能是最简单的解决方案。如果您的主板提供 HDMI 端口(Raspberry Pi 3),只需将其连接至电视机即可。
然后,您可以使用 Android 框架创建 activity,扩充 XML 布局,并以与您的 Android 手机/平板电脑项目中完全相同的方式操作视图。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Textview textview = (TextView) findViewById(R.id.my_textview);
textview.setText("Hello!!1!");
textview.animate().scaleXBy(2.f).scaleYBy(2.f).setDuration(500L).start();
}
“一个物联网项目的专用电视?#认真的吗?
虽然在开发阶段使用大型电视机可能没有问题,但您可能需要更小的 HDMI 屏幕,例如您可以以 40 美元购买的 “Waveshare 5 英寸 800 * 480 LCD”。
要使屏幕在 Raspberry Pi 3 上工作,您必须将 Android Things SD 卡安装到您的计算机上,并修改 /boot/config.txt
文件添加以下行:
max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0
如果你正在建造一个 “pepper”/”buddy” 式的机器人,使用一个小的 HDMI 屏幕是一个好主意。Waveshare 屏幕支持 SPI 上的触摸输入。Android Things 还没有开箱即用。如果您需要一个支持触摸输入的屏幕,与 Android Things 兼容,您可以考虑购买官方的 Raspberry Pi 屏幕。
优点:
缺点:
比 HDMI 屏幕小得多,OLED显示器可以是一个很好的选择。SSD1306 是一种单色的 0.96 英寸屏幕,价格不到 10 美元,可通过 I²C 连接到电路板。
驱动程序提供了一个 setPixels(int x, int y, boolean on)
方法,让我们轻松使用像素。
举个例子,下面的代码每 2 个像素打开一个:
ssd1306 = new Ssd1306(I2C_PORT);
ssd1306.clearPixels();
for (int x = 0; x < ssd1306.getLcdWidth(); x++) {
for (int y = 0; y < ssd1306.getLcdHeight(); y++) {
ssd1306.setPixel(x, y, (x % 2) == (y % 2));
}
}
ssd1306.show();
你可以使用这个方法来创建一个有趣的迷宫游戏。
但是,你会很快发现,逐个设置像素会变得相当麻烦。这也是为什么驱动程序,还提供了 BitmapHelper
方法让我们在屏幕上轻松绘制位图的原因之一。
透明/黑色像素将被跳过。
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.android);
BitmapHelper.setBmpData(ssd1306, 0, 0, bmp, false);
使用 Bitmap API,我们也可以通过 Paint 和 Canvas 实例显示一些文本:
String text = "Hello!!1!";
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(30f);
paint.setColor(Color.WHITE);
paint.setTextAlign(Paint.Align.LEFT);
Bitmap textAsBitmap = Bitmap.createBitmap(WIDTH, HEIGHT, ARGB_8888);
Canvas canvas = new Canvas(textAsBitmap);
canvas.drawText(text, 0, 0.5f * HEIGHT, paint);
BitmapHelper.setBmpData(ssd1306, 0, 0, textAsBitmap, true);
优点:
缺点:
虽然在技术上有所不同,但您可以像使用 SSD1306 OLED 显示器一样使用 LED 矩阵:手动设置像素或使用 Bitmap API。这里唯一的区别是,不是操纵 128x64 像素(对于 ssd1306),我们只能操纵 8x8 像素。 这确实是相当不同的。
上图中的元件是 MAX7219 LED 点阵模块。 个模块还没有官方的驱动,所以我创建了一个,可以在 github.com/Nilhcem/ledcontrol-androidthings上找到。
以下是如何使用此驱动程序显示位图的方法:
LedControl ledControl = new LedControl(SPI_NAME, 1);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);
ledControl.draw(0, bmp);
如果您喜欢通过 setLed(int addr, int row, int col, boolean on)
方法,还可以手动打开和关闭像素。
为了在 LED 矩阵上显示一些文本,我们将使用一个由 Python Sense Hat 库源代码启发的黑客技术:
首先,您将在项目中添加大量字符的精灵表(sprite sheet) :
然后,您可以创建一个 textToBitmap(String message)
方法,该方法将针对给定消息中的每个字符搜索关联的位图 sprite,并将其复制到给定位置(此处的实现)的新位图:
最后,您可以创建一个 Handler 来模拟从右向左移动位图,使用移动的光标(此处的实现)仅复制位图的 8 x 8 部分。
在 SithHAT RGB Led 矩阵上使用着色器,滚动文本的完整源代码 github.com/Nilhcem/ledmatrixfun-androings。
优点:
缺点:
从技术上讲,7 段显示器与 LED 矩阵有很多相似之处。 它仍然是要知道你想打开哪些部分。用于某些 LED 矩阵模块的 MAX7219CNG 显示驱动器,也可用于 7 段显示器。
有一个官方数字 TM1637 驱动器以及一个字母数字 HT16K33 驱动器(由 RainbowHAT 使用)。如果您使用他人,您可能需要创建自己的驱动程序。
AlphanumericDisplay segment = new AlphanumericDisplay(I2C_NAME)
segment.setBrightness(Ht16k33.HT16K33_BRIGHTNESS_MAX);
segment.setEnabled(true);
segment.display("WTF?");
优点:
缺点:
最后,最后一种方式可以是使用 LCD 屏幕,例如 LCD 模块 1602A。再次,没有官方的驱动程序,但我已经移植了 LiquidCristal Arduino 库的 Android Things,和驱动程序可在 github.com/Nilhcem/1602A-androngthings。
这个组件是理想的显示字母数字句子。
Lcd1602 lcd = new Lcd1602(RS, EN, D4, D5, D6, D7);
lcd.begin(16, 2);
lcd.clear();
lcd.print("Hello,");
lcd.setCursor(0, 1);
lcd.print("Android Things!");
您还可以创建最多 8 个自定义字符,每像素绘制这些像素
int[] heart = {0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000};
lcd.createChar(0, heart);
lcd.write(0);
提示:不要试图成为一个艺术家,结果将是丑陋的。这会让你伤心。
优点:
缺点:
从不到 1 美元到超过 50 美元,有很多方法可以在外部显示器上显示一些信息。虽然有些组件比其他组件使用起来不太直观,但总体来说还是很简单的。
我在本文中只介绍了几个组件。如果你买了一些没有在这里列出的,你可能需要创建自己的驱动程序。如果发生这种情况,我建议您为不同的平台(例如 Arduino)找到一个实现,并将源代码移植到Android Things。
这可能需要一段时间,但最后,您会很高兴在您的项目中使用带有自制驱动程序的组件。
观光\评论区