风筝
发表于: 2018-12-11 21:27:17 | 显示全部楼层

我们大多数人都比较熟悉1602点阵液晶显示屏,它在许多项目中用于向用户显示一些信息。但是这些LCD显示器在他们能做的事情上有很多限制。在本篇文章中,我们将使用OLED显示Android智能手机的一些基本信息,如时间、日期、网络强度和电池状态。本篇文章主要介绍了制作一款基于Arduino的智能手表的基本思想和框架,并可进一步扩展以在OLED显示屏上显示来电、消息等等。


所以我们在这里通过使用Android应用程序从Android手机获取一些信息,然后使用蓝牙模块和Arduino Pro Mini开发板将此信息发送到OLED显示屏。 Android智能手机已经内置蓝牙来发送数据,在接收端我们使用蓝牙模块HC-06和Arduino开发板。蓝牙模块HC-05也可用于代替HC-06。


在Android应用程序中,数据从手机中获取并作为String发送到Arduino。Arduino收到数据后,解码传入的字符串并将其放入临时变量中以在OLED显示屏上显示。在OLED显示屏中,我们创建了一些图形来显示一些数值。


所需的硬件

●    OLED显示模块12864(SSD1306)

●    Arduino开发板(我们使用的是Arduino Pro Mini,也可以使用任何Arduino开发板)

●    蓝牙HC05 / HC06

●    连接导线

●    3.7v锂电池


OLED显示屏基本知识

术语OLED代表“有机发光二极管”,它使用与我们大多数电视机相同的技术,但与它们相比具有更少的像素。让这些酷炫的显示模块与Arduino接口真的很有趣,因为它会让我们的项目看起来很酷。本文中,我们使用的是单色4针SSD1306 0.96“OLED显示屏。此显示屏只能用于I2C模式。

OLED.jpg


●    VCC  - > 3.3v

●    GND  - > GND

●    SDA  - > SDA(引脚3)

●    SCL  - > SCL(引脚5)


Arduino社区已经为我们提供了很多可以直接用来简化这些的库。我尝试了一些库,发现Adafruit_SSD1306库非常易于使用,并且有一些图形选项,因此我们将在本文中使用相同的库。在这里,我们还需要在Arduino IDE中再安装一个库 - GFX图形库,可以从这里下载。


电路原理图

使用带有Arduino的4针SSD1306 OLED的电路图非常简单,如下所示

Circuit-Diagram-for-Arduino-based-OLED-Smart-Watch.png

Interfacing-OLED-display-with-Android-Phone-to-build-Smart-Watch.jpg


在这里,我们使用Arduino Pro Mini开发板来控制所有操作。选择Arduino pro mini的原因是它可以在3.3v电源下工作。 4针OLED和蓝牙模块HC-06也可以在3.3v下工作,因此所有这些模块都可以通过一个3.7v Li-on供电。锂电池是小巧轻便的电池,是可穿戴设备的完美选择。我们还可以在本文中制作可穿戴的东西,就像一个简单的智能手表,可以与您的智能手机同步。


现在一个关于电源的问题,这里所有的模块都在3.3v工作,但锂离子电池提供的是3.7v,这可能会损坏模块。因此,为了解决这个问题,我们已将电池的3.7v电源应用于Arduino pro mini的原始电源引脚,该引脚可将该电压转换为3.3v。


Android App通过蓝牙向Arduino发送数据

对于这款基于Arduino的智能手表,我们在Android Studio中创建了一个Android应用程序,这个应用程序可以从这里下载。因此,只需在Android智能手机中下载并安装此应用,然后启用蓝牙并将HC-06模块与手机配对即可。可能要求密码配对HC-06蓝牙模块,默认密码为1234或0000。


现在打开OLED应用程序并选择配对的蓝牙设备HC-06,如下图所示:

Android-app-for-Interfacing-OLED-display-with-Android-Phone.png

现在OLED应用程序将显示从Android手机获取的数据,如下所示:

Android-app-showing-data-to-be-sent-to-OLED-display-via-bluetooth.png


用于OLED智能手表的Arduino编程

本文末尾处给出了本篇文章的完整程序,这里我们先介绍代码中几个重要的部分。


首先从Github下载并安装Adafruit库以及GFX库,使用以下链接

     ●    Adafruit SSD1306库

     ●    GFX图形库


首先我们在程序中包含所有必需的库

  1. #include<SoftwareSerial.h>
  2. SoftwareSerial Serial1(10, 11);

  3. #include <SPI.h>
  4. #include <Wire.h>
  5. #include <Adafruit_GFX.h>
  6. #include "Adafruit_SSD1306.h"

  7. #define OLED_RESET 4
  8. Adafruit_SSD1306 display(OLED_RESET);
复制代码

在此之后,我们为不同的操作定义了一些宏和变量。

  1. #define NUMFLAKES 10
  2. #define XPOS 0
  3. #define YPOS 1
  4. #define DELTAY 2

  5. #define LOGO16_GLCD_HEIGHT 16
  6. #define LOGO16_GLCD_WIDTH  16
  7. String str = "";
  8. byte h = 0;
  9. byte m = 0;
  10. byte S = 0;
  11. String dmy, time, network, battery, inNumber, s;
  12. byte centerX = 24;
  13. byte centerY = 39;
  14. byte Radius = 24;

  15. double RAD = 3.141592 / 180;
  16. double LR = 89.99;
复制代码

之后写了一个模拟时钟的函数。

  1. void showTimeAnalog(int center_x, int center_y, double pl1, double pl2, double pl3)
  2. {
  3.   double x1, x2, y1, y2;
  4.   x1 = center_x + (Radius * pl1) * cos((6 * pl3 + LR) * RAD);
  5.   y1 = center_y + (Radius * pl1) * sin((6 * pl3 + LR) * RAD);
  6.   x2 = center_x + (Radius * pl2) * cos((6 * pl3 - LR) * RAD);
  7.   y2 = center_y + (Radius * pl2) * sin((6 * pl3 - LR) * RAD);
  8.   display.drawLine((int)x1, (int)y1, (int)x2, (int)y2, WHITE);
  9. }
复制代码

还有另一个数字时钟的函数。

  1. void digitalClock()
  2. {
  3.   display.setTextSize(1);
  4.   display.setTextColor(WHITE);
  5.   display.setCursor(60, 20);
  6.   display.println(dmy);
  7.   display.setTextSize(2);
  8.   display.setCursor(60, 30);
  9.   display.println(time);
  10.   display.display();
  11.   delay(2000);
  12. }
复制代码

Displaying-Time-on-Arduino-based-OLED-Smart-Watch.jpg


然后OLED将使用以下函数以数字和图形形式显示电池状态。

  1. void Battery()
  2. {
  3.   display.clearDisplay();
  4.   display.setTextSize(2);
  5.   display.setTextColor(WHITE);
  6.   display.setCursor(20, 0);
  7.   display.print("Bat:");
  8.   display.print(battery);
  9.   display.print("%");
  10.   display.drawRect(14, 20, 80, 40, WHITE);
  11.   display.drawRect(94, 30, 10, 20, WHITE);
  12.   display.fillRect(14, 20, (int)(8 * (battery.toInt()) / 10), 40, WHITE);
  13.   display.display();
  14.   delay(2000);
  15. }
复制代码

Displaying-Battery-on-Arduino-based-OLED-Smart-Watch.jpg

下面的函数也用于显示数字和图形表格中的网络状态。

  1. void Network()
  2. {
  3.   display.clearDisplay();
  4.   display.drawLine(5, 15, 25, 15, WHITE);
  5.   display.drawLine(5, 15, 14, 30, WHITE);
  6.   display.drawLine(25, 15, 17, 30, WHITE);
  7.   display.fillRect(14, 15, 4, 40, WHITE);
  8.   int net = network.toInt() / 20;
  9.   int x1 = 24, y1 = 50, x2 = 4, y2 = 5;
  10.   .......
  11.   .....
复制代码

Displaying-Network-on-Arduino-based-OLED-Smart-Watch.jpg


然后,在setup函数中,我们初始化了本文使用的所有通信和模块。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  5.   display.clearDisplay();
  6.   Serial1.begin(9600);
  7.   Serial1.println("System Ready");
  8. }
复制代码

loop函数中,我们从android mobile接收数据并解码该数据,然后在OLED显示屏上显示该数据。

  1. void loop(){
  2.   Serial1.println("1234");
  3.   delay(1000);
  4.   while (Serial1.available() > 0){
  5.     char ch = Serial1.read();
  6.     str += ch;
  7.     if (ch == '
  8. [p=30, 2, left]以上就是我们如何通过无线方式连接OLED和智能手机,并可以将我们想要的任何数据从智能手机发送或同步到OLED。[/p]
  9. [p=30, 2, left]代码[/p][p=30, 2, left]本篇文章使用的完整代码如下所示:[/p]
  10. ){
  11.       dmy = str.substring(str.indexOf("#") + 1, str.indexOf(" "));
  12.       time = str.substring(str.indexOf(" ") + 1, str.indexOf(",") - 3);
  13.       network = str.substring(str.indexOf(",") + 1, str.indexOf(",,"));
  14.       battery = str.substring(str.indexOf(",,") + 2, str.indexOf(",,,"));
  15.       inNumber = str.substring(str.indexOf(",,,") + 3, str.indexOf("[        DISCUZ_CODE_156        ]quot;));
  16.       s = time.substring(time.indexOf(" ") + 1, time.indexOf(" ") + 3);
  17.       h = s.toInt();
  18.       s = time.substring(time.indexOf(" ") + 4, time.indexOf(" ") + 6);
  19.       m = s.toInt();
  20.       s = time.substring(time.indexOf(" ") + 7, time.indexOf(" ") + 9);
  21.       S = s.toInt();
  22.       str = "";}
  23.   }
  24.   display.clearDisplay();
  25.   display.drawCircle(centerX, centerY, Radius, WHITE);
  26.   showTimeAnalog(centerX, centerY, 0.1, 0.5, h * 5 + (int)(m * 5 / 60));
  27.   showTimeAnalog(centerX, centerY, 0.1, 0.78, m);
  28.   // showTimePin(centerX, centerY, 0.1, 0.9, S);
  29.   digitalClock();
  30.   Battery();
  31.   Network();
  32. }
复制代码

以上就是我们如何通过无线方式连接OLED和智能手机,并可以将我们想要的任何数据从智能手机发送或同步到OLED。


代码

本篇文章使用的完整代码如下所示: main.rar (1.25 KB, 下载次数: 184)

跳转到指定楼层
blackfish
发表于: 2019-3-24 15:41:55 | 显示全部楼层

Android的控制程序下载之后无法安装是为什么啊??
回复

使用道具 举报

q575958816
发表于: 2019-5-23 08:29:47 | 显示全部楼层

app软件下载不成功怎么办
回复

使用道具 举报

q575958816
发表于: 2019-5-23 08:54:44 | 显示全部楼层

blackfish 发表于 2019-3-24 15:41
Android的控制程序下载之后无法安装是为什么啊??

我也不会  你怎么做了?
回复

使用道具 举报

q575958816
发表于: 2019-5-23 08:55:33 | 显示全部楼层

mini开发板下载不了程序怎么办
回复

使用道具 举报

风筝
发表于: 2019-5-23 09:46:27 | 显示全部楼层

q575958816 发表于 2019-5-23 08:29
app软件下载不成功怎么办

应用程序安装有点问题 可以在应用商店下载类似的蓝牙应用程序
回复

使用道具 举报

q575958816
发表于: 2019-5-26 12:53:24 | 显示全部楼层

风筝 发表于 2019-5-23 09:46
应用程序安装有点问题 可以在应用商店下载类似的蓝牙应用程序

mini pro版上传程序失败怎么办啊
回复

使用道具 举报

q575958816
发表于: 2019-5-26 17:20:00 | 显示全部楼层

可不可以私聊,说一下具体步骤啊
回复

使用道具 举报

q575958816
发表于: 2019-5-30 08:36:26 | 显示全部楼层

这个app不会用怎么办
回复

使用道具 举报

风筝
发表于: 2019-5-30 10:30:48 | 显示全部楼层

q575958816 发表于 2019-5-30 08:36
这个app不会用怎么办

可以在应用商店下载一个类似的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-26 19:21 , Processed in 0.049631 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表