我們大多數(shù)人都熟悉 16×2 點(diǎn)陣 LCD 顯示器 ,它在許多項(xiàng)目中用于向用戶(hù)顯示一些信息。但是這些液晶顯示器的功能有很多限制。在本教程中,我們將使用OLED 顯示來(lái)自 Android 智能手機(jī)的一些基本信息,例如時(shí)間、日期、網(wǎng)絡(luò)強(qiáng)度和電池狀態(tài)。該項(xiàng)目提供了構(gòu)建基于Arduino 的智能手表的基本理念和框架,并且可以進(jìn)一步擴(kuò)展以在 OLED 顯示屏上顯示來(lái)電、消息等。
所以這里我們使用一個(gè)安卓應(yīng)用程序從安卓手機(jī)中獲取一些信息,然后使用藍(lán)牙模塊和Arduino Pro Mini將這些信息發(fā)送到OLED顯示器。
在 Android 應(yīng)用程序中,從手機(jī)中獲取數(shù)據(jù)并作為字符串發(fā)送到 Arduino?,F(xiàn)在收到數(shù)據(jù)后,Arduino 解碼傳入的字節(jié)串并將其放入臨時(shí)變量中以顯示在 OLED 顯示器上。在 OLED 顯示屏中,我們創(chuàng)建了一些圖形來(lái)顯示值,在此處了解有關(guān)在 Arduino 中使用 OLED 顯示屏的更多信息。
所需硬件
128×64 OLED顯示模組(SSD1306)
Arduino(我們使用的是 Arduino Pro Mini。但我們可以使用任何 Arduino 板)
藍(lán)牙 HC05/HC06
連接電線(xiàn)
3.7v 鋰電池
跳線(xiàn)
了解 OLED 顯示器
OLED 一詞代表“有機(jī)發(fā)光二極管” ,它使用與我們大多數(shù)電視中使用的技術(shù)相同的技術(shù),但與它們相比像素更少。將這些看起來(lái)很酷的顯示模塊與 Arduino 連接起來(lái)真的很有趣,因?yàn)樗鼤?huì)讓我們的項(xiàng)目看起來(lái)很酷。我們 在此處介紹了有關(guān) OLED 顯示器及其類(lèi)型的完整文章。在這里,我們使用的是 單色 4 針 SSD1306 0.96” OLED 顯示屏。此顯示器只能在 I2C 模式下工作。
Arduino 社區(qū)已經(jīng)為我們提供了很多庫(kù),可以直接使用這些庫(kù)來(lái)簡(jiǎn)化此操作。我嘗試了一些庫(kù),發(fā)現(xiàn) Adafruit_SSD1306 庫(kù)非常易于使用并且有一些圖形選項(xiàng),因此我們將在本教程中使用相同的庫(kù)。在這里,我們還需要在 Arduino IDE 中安裝一個(gè)庫(kù),可以從這里下載GFX 圖形庫(kù)。
電路原理圖
使用 4 針 SSD1306 OLED 與 Arduino的 電路圖 很簡(jiǎn)單,如下所示
在這里,我們使用了Arduino Pro Mini板來(lái)控制所有操作。選擇 Arduino pro mini 的原因是它可以在 3.3v 電源下運(yùn)行。4針 OLED和藍(lán)牙模塊 HC-06也可以在 3.3v 上工作,因此所有這些模塊都可以由單個(gè) 3.7v Li-on 供電。鋰電池是小巧輕便的電池,是可穿戴設(shè)備的完美選擇。在這里,我們還在這個(gè)項(xiàng)目中制作了一些可穿戴的東西,比如一個(gè)簡(jiǎn)單的智能手表,它可以與你的智能手機(jī)同步。
現(xiàn)在關(guān)于電源的一個(gè)問(wèn)題是,這里所有的模塊都在 3.3v 上工作,但鋰離子電池提供 3.7v,這可能會(huì)損壞模塊。因此,為了解決這個(gè)問(wèn)題,我們將電池的 3.7v 電源應(yīng)用于 Arduino pro mini 的原始引腳,該引腳可以將該電壓轉(zhuǎn)換為 3.3v。
用于通過(guò)藍(lán)牙向 Arduino 發(fā)送數(shù)據(jù)的 Android 應(yīng)用
對(duì)于這款基于 Arduino 的智能手表,我們?cè)?Android Studio 中創(chuàng)建了一個(gè) Android 應(yīng)用程序,該應(yīng)用程序可以從這里下載。因此,只需在您的 Android 智能手機(jī)中下載并安裝此應(yīng)用程序,然后啟用藍(lán)牙并將 HC-06 模塊與您的手機(jī)配對(duì)。它可能會(huì)要求輸入密碼來(lái)配對(duì) HC-06 藍(lán)牙模塊,默認(rèn)密碼是 1234 或 0000。
現(xiàn)在打開(kāi) OLED 應(yīng)用程序并選擇已配對(duì)的藍(lán)牙設(shè)備 HC-06,如下圖所示:
現(xiàn)在OLED 應(yīng)用程序?qū)@示從 android 手機(jī)獲取的數(shù)據(jù),如下所示:
為 OLED 智能手表編程 Arduino
在這個(gè)項(xiàng)目的最后給出了帶有演示視頻的完整程序,這里我們解釋了幾部分代碼。
首先使用下面的鏈接從 Github 下載 Adafruit 庫(kù)和 GFX 庫(kù)
阿達(dá)果圖書(shū)館
GFX 圖形庫(kù)
然后從包含所有必需的庫(kù)開(kāi)始
#include
SoftwareSerial Serial1(10, 11);
#include
#include
#include
#include “Adafruit_SSD1306.h”
#define OLED_RESET 4
Adafruit_SSD1306 顯示(OLED_RESET);
在此之后,我們?yōu)椴煌牟僮鞫x了一些宏和變量。
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
字符串 str = "";
字節(jié) h = 0;
字節(jié) m = 0;
字節(jié) S = 0;
String dmy、時(shí)間、網(wǎng)絡(luò)、電池、inNumber、s;
字節(jié)中心X = 24;
字節(jié)中心Y = 39;
字節(jié)半徑 = 24;
雙 RAD = 3.141592 / 180;
雙 LR = 89.99;
在此之后為模擬時(shí)鐘編寫(xiě)一個(gè)函數(shù)。
無(wú)效 showTimeAnalog(int center_x,int center_y,雙 pl1,雙 pl2,雙 pl3)
{
雙 x1,x2,y1,y2;
x1 = center_x + (半徑 * pl1) * cos((6 * pl3 + LR) * RAD);
y1 = center_y + (半徑 * pl1) * sin((6 * pl3 + LR) * RAD);
x2 = center_x + (半徑 * pl2) * cos((6 * pl3 - LR) * RAD);
y2 = center_y + (半徑 * pl2) * sin((6 * pl3 - LR) * RAD);
display.drawLine((int)x1, (int)y1, (int)x2, (int)y2, WHITE);
}
然后還有另一個(gè)數(shù)字時(shí)鐘功能。
無(wú)效數(shù)字時(shí)鐘()
{
display.setTextSize(1);
display.setTextColor(白色);
display.setCursor(60, 20);
display.println(dmy);
display.setTextSize(2);
display.setCursor(60, 30);
display.println(時(shí)間);
顯示.顯示();
延遲(2000);
}
然后 OLED 將使用以下功能以數(shù)字和圖形形式顯示電池狀態(tài)。
無(wú)效電池()
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(白色);
display.setCursor(20, 0);
display.print("蝙蝠:");
display.print(電池);
display.print("%");
display.drawRect(14, 20, 80, 40, WHITE);
display.drawRect(94, 30, 10, 20, WHITE);
display.fillRect(14, 20, (int)(8 * (battery.toInt()) / 10), 40, WHITE);
顯示.顯示();
延遲(2000);
}
以下函數(shù)也用于以數(shù)字和圖形形式顯示網(wǎng)絡(luò)狀態(tài)。
無(wú)效網(wǎng)絡(luò)()
{
display.clearDisplay();
display.drawLine(5, 15, 25, 15, WHITE);
display.drawLine(5, 15, 14, 30, 白色);
display.drawLine(25, 15, 17, 30, 白色);
display.fillRect(14, 15, 4, 40, WHITE);
int net = network.toInt() / 20;
整數(shù) x1 = 24, y1 = 50, x2 = 4, y2 = 5;
…………
......
在設(shè)置功能之后,我們初始化了我們?cè)谶@個(gè)項(xiàng)目中使用的所有通信和模塊。
無(wú)效設(shè)置()
{
序列號(hào).開(kāi)始(9600);
display.begin(SSD1306_SWITCHCAPVCC,0x3C);// 使用 I2C 地址 0x3D 初始化(對(duì)于 128x64)
display.clearDisplay();
Serial1.開(kāi)始(9600);
Serial1.println("系統(tǒng)就緒");
}
在循環(huán)功能中,我們從 android mobile 接收數(shù)據(jù)并解碼該數(shù)據(jù)并將它們發(fā)送到 OLED 顯示器。
無(wú)效循環(huán)(){
Serial1.println("1234");
延遲(1000);
而(Serial1.available()> 0){
char ch = Serial1.read();
str += 通道;
如果 (ch == '$'){
dmy = str.substring(str.indexOf("#") + 1, str.indexOf(""));
時(shí)間 = str.substring(str.indexOf(" ") + 1, str.indexOf(",") - 3);
網(wǎng)絡(luò) = str.substring(str.indexOf(",") + 1, str.indexOf(",,"));
電池 = str.substring(str.indexOf(",,") + 2, str.indexOf(",,,"));
inNumber = str.substring(str.indexOf(",,,") + 3, str.indexOf("$"));
s = time.substring(time.indexOf(" ") + 1, time.indexOf(" ") + 3);
h = s.toInt();
s = time.substring(time.indexOf(" ") + 4, time.indexOf(" ") + 6);
m = s.toInt();
s = time.substring(time.indexOf(" ") + 7, time.indexOf(" ") + 9);
S = s.toInt();
str = "";}
}
display.clearDisplay();
display.drawCircle(centerX, centerY, 半徑, WHITE);
showTimeAnalog(centerX, centerY, 0.1, 0.5, h * 5 + (int)(m * 5 / 60));
showTimeAnalog(centerX, centerY, 0.1, 0.78, m);
// showTimePin(centerX, centerY, 0.1, 0.9, S);
數(shù)碼時(shí)鐘();
電池();
網(wǎng)絡(luò)();
}
這就是我們?nèi)绾螌?OLED 與智能手機(jī)無(wú)線(xiàn)連接,并將我們想要的任何數(shù)據(jù)從智能手機(jī)發(fā)送或同步到 OLED。
-
智能手機(jī)
+關(guān)注
關(guān)注
66文章
18493瀏覽量
180221 -
OLED
+關(guān)注
關(guān)注
119文章
6200瀏覽量
224215 -
智能手表
+關(guān)注
關(guān)注
36文章
3288瀏覽量
114078
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論