В этой статье мы рассмотрим создание умных часов (Smart Watch) на основе платы Arduino, OLED дисплея и смартфона на Android. На OLED дисплее мы будем показывать основную информацию со смартфона на Android, такую как время, дата, уровень сигнала и уровень заряда батареи. В дальнейшем этот проект умных часов на Arduino можно усовершенствовать, добавив вывод на экран OLED дисплея входящих звонков, сообщений и многого другого.
В этом проекте мы будем собирать необходимую нам информацию на смартфоне с помощью специального приложения для него и затем передавать эту информацию на OLED дисплей с помощью Bluetooth модуля и платы Arduino Pro Mini. Смартфоны на Android уже имеют в своем составе Bluetooth модуль, а для приема этой информации на плате Arduino мы можем использовать Bluetooth модули HC-05 или HC-06.
От приложения на Android данные передаются плате Arduino в виде строк. Плата Arduino декодирует принимаемые строки, записывает их во временные переменные и отображает на экране ЖК дисплея. Затем мы используем графические возможности OLED дисплея чтобы отображать эти данные в удобной форме. Если раньше вы никогда не работали с OLED дисплеями, то вначале рекомендуем прочитать статью о подключении OLED дисплея к плате Arduino.
Необходимые компоненты
- Плата Arduino Pro Mini (вы можете использовать и другие типы плат Arduino) (купить на AliExpress).
- 128×64 OLED display Module (SSD1306) – модуль OLED дисплея (купить на AliExpress).
- Bluetooth модуль HC05/HC06 (купить на AliExpress).
- Соединительные провода.
- 3.7v Li-On Battery (литий-ионная или литий-полимерная батарея) (купить на AliExpress).
- Перемычка (Jumper).
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Немного о принципах работы OLED дсиплея
Термин OLED расшифровывается как “Organic Light emitting diode”, что в переводе означает органический светоизлучающий диод. Подобные светодиоды применяются в большинстве телевизоров, выпускаемых в настоящее время. В данном проекте мы будем использовать монохромный 4-контактный OLED дисплей SSD1306 с диагональю 0.96”. Этот дисплей может работать только по протоколу I2C. Внешний вид данного дисплея и назначение его контактов показаны на следующем рисунке и таблице.
Наименование контакта | Назначение контакта |
VCC | 3.3v |
GND | земля |
SDA | SDA (Physical pin 3) |
SCL | SCL (Physical pin 5) |
Для работы с OLED дисплеями сообществом Arduino разработано множество библиотек, мы этом проекте применили одну из этих библиотек — Adafruit_SSD1306 Library. Она достаточно проста в использовании и имеет много возможностей для работы с графикой. Также в этом проекте нам понадобится еще одна библиотека, которую необходимо будет скачать и установить — GFX Graphics Library.
Работа схемы
Схема проекта умных часов на основе платы Arduino показана на следующем рисунке.
Внешний вид собранной конструкции проекта умных часов показан на следующем рисунке.
В представленной схеме плата Arduino Pro Mini используется для управления всеми операциями. Причиной, по которой мы выбрали для этого проекта именно плату Arduino Pro Mini, является то, что эта плата может работать от напряжения источника питания 3.3v. OLED дисплей и Bluetooth модуль HC-06 также могут работать от напряжения 3.3v, поэтому всю схему в нашем случае можно запитать от литий-ионной батареи на 3.7v. Подобная батарея отличается небольшим весом, поэтому она очень удобна для применения в различных носимых устройствах.
Но чтобы наша батарея на 3.7 В не повредила компоненты схемы, работающие от 3.3v, мы подаем напряжение от этой батареи на контакт raw платы Arduino pro mini и в дальнейшем в плате это напряжение преобразуется в напряжение 3.3v.
Приложение для Android для передачи данных Arduino при помощи Bluetooth
Специально для проекта этих умных часов мы создали приложение для Android в среде Android Studio, которое можно скачать по этой ссылке. После скачивания установите это приложение в свой смартфон на Android, включите Bluetooth и установите связь с модулем HC-06. По умолчанию пароль для HC-06 — 1234 или 0000. При желании вы можете использовать любое другое подобное приложение из магазина PlayStore.
На следующем рисунке показан пример работы данного приложения (оно называется OLED) когда оно установило связь с модулем HC-06.
Это приложение может показывать все основные параметры работы смартфона как показано на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.
Сначала скачайте и установите необходимые для работы программы библиотеки по следующим ссылкам:
1. Adafruit Library.
2. GFX Graphics Library.
Затем в программе необходимо подключить использование этих библиотек.
1 2 3 4 5 6 7 8 9 10 |
#include<SoftwareSerial.h> SoftwareSerial Serial1(10, 11); #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include "Adafruit_SSD1306.h" #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); |
После этого необходимо инициализировать некоторые макросы и переменные для различных операций.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 String str = ""; byte h = 0; byte m = 0; byte S = 0; String dmy, time, network, battery, inNumber, s; byte centerX = 24; byte centerY = 39; byte Radius = 24; double RAD = 3.141592 / 180; double LR = 89.99; |
После этого запрограммируем функцию для аналоговых часов.
1 2 3 4 5 6 7 8 9 |
void showTimeAnalog(int center_x, int center_y, double pl1, double pl2, double pl3) { double x1, x2, y1, y2; x1 = center_x + (Radius * pl1) * cos((6 * pl3 + LR) * RAD); y1 = center_y + (Radius * pl1) * sin((6 * pl3 + LR) * RAD); x2 = center_x + (Radius * pl2) * cos((6 * pl3 - LR) * RAD); y2 = center_y + (Radius * pl2) * sin((6 * pl3 - LR) * RAD); display.drawLine((int)x1, (int)y1, (int)x2, (int)y2, WHITE); } |
Также запрограммируем функцию для цифровых часов.
1 2 3 4 5 6 7 8 9 10 11 12 |
void digitalClock() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(60, 20); display.println(dmy); display.setTextSize(2); display.setCursor(60, 30); display.println(time); display.display(); delay(2000); } |
Далее на OLED дисплее мы будем отображать уровень заряда батареи в цифровой и графической форме с помощью следующей функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void Battery() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(20, 0); display.print("Bat:"); display.print(battery); 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); display.display(); delay(2000); } |
Следующая функция будет отображать уровень сигнала сети в цифровой и графической форме.
1 2 3 4 5 6 7 8 9 10 11 |
void Network() { display.clearDisplay(); display.drawLine(5, 15, 25, 15, WHITE); display.drawLine(5, 15, 14, 30, WHITE); display.drawLine(25, 15, 17, 30, WHITE); display.fillRect(14, 15, 4, 40, WHITE); int net = network.toInt() / 20; int x1 = 24, y1 = 50, x2 = 4, y2 = 5; ....... ..... |
Затем в функции setup мы должны инициализировать все устройства, используемые в нашем проекте.
1 2 3 4 5 6 7 8 |
void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) display.clearDisplay(); Serial1.begin(9600); Serial1.println("System Ready"); } |
Затем в функции loop мы будем принимать данные от смартфона, декодировать их и давать команды на отображение необходимой информации на экране OLED дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void loop(){ Serial1.println("1234"); delay(1000); while (Serial1.available() > 0){ char ch = Serial1.read(); str += ch; if (ch == '$'){ dmy = str.substring(str.indexOf("#") + 1, str.indexOf(" ")); time = str.substring(str.indexOf(" ") + 1, str.indexOf(",") - 3); network = str.substring(str.indexOf(",") + 1, str.indexOf(",,")); battery = 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, Radius, 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); digitalClock(); Battery(); Network(); } |
Исходный код программы (скетча)
Код программы достаточно большой, но по сути он очень простой и прямолинейный – мы надеемся что его понимание не вызовет у вас затруднений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
#include<SoftwareSerial.h> SoftwareSerial Serial1(10, 11); #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include "Adafruit_SSD1306.h" #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 String str = ""; byte h = 0; byte m = 0; byte S = 0; String dmy, time, network, battery, inNumber, s; byte centerX = 24; byte centerY = 39; byte Radius = 24; double RAD = 3.141592 / 180; double LR = 89.99; void showTimeAnalog(int center_x, int center_y, double pl1, double pl2, double pl3) { double x1, x2, y1, y2; x1 = center_x + (Radius * pl1) * cos((6 * pl3 + LR) * RAD); y1 = center_y + (Radius * pl1) * sin((6 * pl3 + LR) * RAD); x2 = center_x + (Radius * pl2) * cos((6 * pl3 - LR) * RAD); y2 = center_y + (Radius * pl2) * sin((6 * pl3 - LR) * RAD); display.drawLine((int)x1, (int)y1, (int)x2, (int)y2, WHITE); } void digitalClock() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(60, 20); display.println(dmy); display.setTextSize(2); display.setCursor(60, 30); display.println(time); display.display(); delay(2000); } void Battery() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(20, 0); display.print("Bat:"); display.print(battery); 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); display.display(); delay(2000); } void Network() { display.clearDisplay(); display.drawLine(5, 15, 25, 15, WHITE); display.drawLine(5, 15, 14, 30, WHITE); display.drawLine(25, 15, 17, 30, WHITE); display.fillRect(14, 15, 4, 40, WHITE); int net = network.toInt() / 20; int x1 = 24, y1 = 50, x2 = 4, y2 = 5; for (int i = 1; i <= net; i++) { display.fillRect(x1, y1, x2, y2, WHITE); x1 += 10; y1 -= 5; y2 += 10; y2 -= 5; } display.setTextSize(3); display.setTextColor(WHITE); display.setCursor(80, 34); display.print(network); display.setTextSize(1); display.setCursor(117, 44); display.println("%"); display.display(); delay(2000); } void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //инициализация дисплея для работы по протоколу I2C с адресом 0x3D (for the 128x64) display.clearDisplay(); Serial1.begin(9600); Serial1.println("System Ready"); } void loop(){ Serial1.println("1234"); delay(1000); while (Serial1.available() > 0){ char ch = Serial1.read(); str += ch; if (ch == '$'){ dmy = str.substring(str.indexOf("#") + 1, str.indexOf(" ")); time = str.substring(str.indexOf(" ") + 1, str.indexOf(",") - 3); network = str.substring(str.indexOf(",") + 1, str.indexOf(",,")); battery = 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, Radius, 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); digitalClock(); Battery(); Network(); } |
22 ответа к “Умные часы (Smart Watch) на основе Arduino, OLED дисплея и смартфона”
Автор, здравствуйте. Нужна ваша помощь, можем ли где-то списаться?
Добрый день. Да, можем, в телеграме например — https://t.me/Alex_infinit
да можно но приложение нельзя скачать!
Загрузил его еще на яндекс диск дополнительно, надеюсь с него вам удастся скачать — https://disk.yandex.ru/d/pUggjGo6jOHAug
приложение на скачивает андроид 10 редми 9
К сожалению, в этом вопросе не знаю что конкретного вам подсказать. Попробуйте другой смартфон если у вас есть такая возможность
какойто исходный код можно увидеть?
пробовал другие устройсства с андроидом 10 не помогло. других к сожалению нету
К сожалению, с исходным кодом приложения помочь не смогу, приложение же не мое
скажите пожалуйста исходный код приложеия или какие коды посылать для изменения праметров
А что конкретно вы хотите изменить? Может быть, для этого будет достаточно изменения кода программы для Ардуино без изменения кода приложения
А если вместо hc-06 . Использовать at-09
Да, можно применить без проблем, но для этого необходимо будет немного изменить код программы. У модуля at-09 другое название HM-10 и на нашем сайте вы можете прочитать статью о его подключении к плате Arduino. Соответственно, на ее основе вы можете изменить код программы для данного проекта умных часов
А можете сделать ещё под него , а то я не могу разобраться с этой темой.
Пожалуйста
У вас хотя бы получается подключить модуль at-09 к плате Arduino?
Здравствуйте! А как реализовать меню с обычными приложениями? К примеру «настройки», может Браузер какой-то если сильно заморочится. Так же интересует картинка цифирблата. Как её поставить?
Добрый день. Чтобы сделать меню с приложениями нужна будет плата с возможностями помощнее чем та плата Ардуино, которая использована в этом проекте. А циферблат сделать можно используя графические возможности используемого в проекте OLED дисплея. Наверняка такие проекты можно найти в сети с помощью поисковиков
да можно но приложение нельзя скачать!
А как их заряжать ?
Отключать литиевую батарею и заряжать ее в специализированном зарядном устройстве (сейчас есть очень дешевые зарядки для этого, даже от детской игрушки зарядка может подойти). Вместо литиевого аккумулятора в этом проекте также вы можете использовать обычные батарейки. Это всего лишь макет часов, вы сами можете внести в него необходимые изменения
У меня айфон( Что делать?
Надо просто найти аналогичное приложение для айфона. К сожалению, плохо разбираюсь в приложениях для айфона (потому что у меня его никогда не было), поэтому какое конкретно приложение подойдет — подсказать не смогу. Но функции у этого приложения достаточно простые, мне кажется, вы без проблем сможете найти его замену для айфона