Uploaded by igor9600f

Умное зарядное устройство Катаев Игорь.docx-1

advertisement
ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБЩЕОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ СРЕДНЯЯ
ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА № 491 С УГЛУБЛЕННЫМ ИЗУЧЕНИЕМ МАТЕМАТИКИ
КРАСНОГВАРДЕЙСКОГО РАЙОНА САНКТ-ПЕТЕРБУРГА
Индивидуальный проект
«Умное зарядное устройство»
по предмету «Информатика»
Выполнил: Катаев Игорь Владимирович
ученик 10 «Б» класса
Руководитель: Верещагина Полина
Александровна
Учитель информатики
_________________________________
(подпись руководителя)
Санкт-Петербург
2022-2023
Умное зарядное устройство
Катаев И.В.
Оглавление
Введение
3
1. Принцип работы зарядных устройств
4
1.1. Контроллер питания в смартфоне
5
2. Исследования и документации
6
3. Основа для разработки
8
4. Разработка зарядного устройства
10
4.1. Код для Arduino IDE
11
4.2. Код для приложения
14
4.3. Корпус зарядного устройства
19
4.4. Сборка умного зарядного устройства
20
5. Проверка работоспособности прототипа
21
Заключение
22
Приложения
25
Список литературы
37
2
Умное зарядное устройство
Катаев И.В.
Введение
В динамичной повседневной жизни человек стремится упростить
какие-либо процессы: питания, передвижения, развлечения. Современные
технологии позволяют этому совершиться. Ещё лет 5-10 назад нельзя было и
представить о конвекторах отопления с Wi-Fi или о дозаторах мыла с Wi-Fi.
Все эти устройства образуют систему умного дома, управляемую со
смартфона. Смартфон и подключение к интернету – основа большинства
систем умных домов. Новые технологии – часть Повестки дня на XXI век.
Помимо технологической повестки важная роль отводится экологии. Если
подключение к интернету условно постоянно и не меняется – всегда
доступно, то аккумуляторная батарея смартфона имеет ограниченный ресурс.
Есть два решения данной проблемы: экстенсивный и интенсивный. Нас
интересует лишь интенсивный путь решения – продление жизненного цикла
аккумуляторной батареи. С помощью этого мы можем повлиять на спрос
аккумуляторных батарей.
Цель: создать зарядное устройство с поддержкой технологии умной зарядки
Задачи:
1) Изучить принцип работы зарядных устройств
2) Изучить необходимые исследования и документации
3) Выбрать основу для разработки
4) Изучить необходимый язык программирования
5) Разработать прототип зарядного устройства с поддержкой технологии
умной зарядки
6) Проверить работоспособность прототипа
Проблема проекта: производители смартфонов и периферии делают
доступным технологию умной зарядки не для всех устройств
Объект исследования: технологии умных зарядных устройств и алгоритмов
Предмет исследования: производство зарядных устройств
Методы исследования: метод анализа, метод программирования
3
Умное зарядное устройство
Катаев И.В.
Продукт: умное зарядное устройство
Принцип работы зарядных устройств
В основном в большинстве девайсах используется литий-полимерные
аккумуляторные батареи (Li-Po). Например, в смартфонах. В дальнейшем мы
будем говорить о процессах, происходящих внутри АКБ смартфона и его
контроллере питания.
Литий-полимерные аккумуляторные батареи состоят из катода, анода и
полимерного электролита с растворенными солями лития. При зарядке
происходит процесс интеркалирования — ионы лития попадают в структуру
анода, тогда как при разрядке ионы проникают уже в катод. И тут надо
понимать, что любая зарядка даже с маленьким током так или иначе
способствует деградации аккумулятора в результате естественных процессов.
Анод постоянно взаимодействует с электролитом, что приводит к потере его
ёмкости, но и сам электролит тоже разлагается. (см.рис.1)
4
Умное зарядное устройство
Катаев И.В.
Контроллер питания в смартфоне
Контроллер питания на смартфоне отвечает за регулирование и
контроль напряжения и тока, поступающих из батареи в различные
компоненты устройства, такие как процессор, экран, камера и т.д. Он также
может обеспечивать защиту от перенапряжения и перегрева. Контроллер
питания может быть интегрирован в чипсет смартфона или быть отдельным
компонентом. Контроллер питания на смартфоне использует специальные
алгоритмы
для
регулирования
входного
напряжения
и
силы тока,
поступающих из батареи в различные компоненты устройства. Он обычно
использует метод импульсной модуляции ширины импульсов (PWM),
который позволяет быстро переключать напряжение, чтобы создавать
стабильный выходной ток. Если на входной порт зарядки смартфона подаётся
более высокий ток, контроллер питания может уменьшить ток и увеличить
напряжение для поддержания стабильного процесса зарядки.
Кроме того, некоторые контроллеры мощности могут использовать
разные методы регулирования зарядного тока и напряжения, поэтому не
обязательно верно, что все контроллеры мощности будут уменьшать ток и
повышать напряжение в ответ на более высокий входной ток. В большинстве
случаев, для зарядки смартфона используется ток от 0,5 до 2,4 Ампер.
Обычно для безопасной и эффективной зарядки рекомендуется не
превышать ток зарядки более чем на 1C (одну единицу емкости аккумулятора
в
ампер-часах).
Например,
для
аккумулятора
ёмкостью
3000 мАч
максимальный ток зарядки должен составлять не более 3А. Для зарядки
литий-полимерных аккумуляторов используется напряжение в диапазоне от
4,2 до 4,35 Вольт на элемент.
5
Умное зарядное устройство
Катаев И.В.
Исследования и документации
Компания Oppo и организация TÜV Rheinland (см. рис. 2) провели
тесты быстрой зарядки в своих лабораториях. В результате они пришли к
выводу, что после 800 циклов быстрой зарядки первоначальная ёмкость
аккумуляторов смартфонов уменьшается ненамного — примерно на 9%.
Испытания проводились в оптимальных лабораторных условиях, а в
реальных сценариях использования всё может быть хуже.
Команда Стэндфордского университета штата Калифорния (см. рис. 3)
провела исследование «Замкнутая оптимизация протоколов быстрой зарядки
аккумуляторов с помощью машинного обучения». Из их статьи можно взять
примерные данные оптимизации зарядки, представленные в виде графика
6
Умное зарядное устройство
Катаев И.В.
«Мы использовали симулятор на основе физики для оптимизации
гиперпараметров; этот симулятор позволяет нам оценить форму и диапазон
циклов жизни в пространстве параметров, хотя симулятор не предназначен
для точного представления деградации батареи во время быстрой зарядки.»
Ниже приведены высчитанные значения жизненного цикла АКБ при разных
алгоритмах. Исследования предполагают, что данный метод зарядки позволит
увеличить срок службы батареи минимум ещё на 600 циклов.
7
Умное зарядное устройство
Катаев И.В.
8
Умное зарядное устройство
Катаев И.В.
Основа для разработки
Целью моего проекта является создание рабочей модели зарядного
устройства. Для этого мы будем использовать максимально простые и
доступные материалы. Существует много контроллеров для IoT (Internet of
Things). Для начала разработки необходимо выбрать платформу. Плата
должна быть компактной. Самая популярная платформа Arduino.
Технические характеристики Arduino Nano:
● Напряжение питания 5В;
● Входное питание 7-12В (рекомендованное);
● Количество цифровых пинов – 14, из них 6 могут использоваться в
качестве выходов ШИМ;
● Флэш- память 16 Кб или 32 Кб, в зависимости от чипа;
● ОЗУ 1 Кб или 2 Кб, в зависимости от чипа;
● EEPROM 512 байт или 1 Кб;
● Частота 16 МГц;
● Размеры 19 х 42 мм;
● Вес 7 г.
● Arduino C;
Технические характеристики NodeMCU v3:
● Поддерживает Wi-Fi протокол 802.11 b/g/n;
● Поддерживаемые режимы Wi-Fi – точка доступа, клиент;
● Входное напряжение 3,7В – 20 В;
● Рабочее напряжение 3В-5В;
● Встроенный стек TCP/IP;
● Диапазон рабочих температур от -40С до 125С;
● 80 МГц, 32-битный процессор;
● Размеры 59 x 31 мм;
● Флэш- память 64 КБ;
● ОЗУ 96 КБ;
9
Умное зарядное устройство
Катаев И.В.
● Lua/Arduino C;
● Режимы: P2P (клиент), soft-AP (точка доступа), SPA;
Преимущества NodeMCU v3 над Arduino Nano:
● Встроенный Wi-Fi
● Больше памяти
● Больше контактов ввода-вывода
● Более высокая вычислительная мощность
● Проще в использовании
Arduino использует версию языка программирования C++. Некоторые
ключевые элементы синтаксиса включают в себя:
● Переменные: объявляются с типом (например, int, float), за которым
следует имя и, возможно, начальное значение.
● Функции: определяются типом возвращаемого значения, именем и
аргументами в скобках. Код выполняется в функции при ее вызове.
● Условные операторы: использование if, else и else if для управления
потоком программы на основе условий.
● Циклы: использование for, while и do-while для повторения блоков кода
заданное количество раз или до тех пор, пока не будет выполнено
условие.
● Библиотечные функции: предварительно написанные функции из
библиотек Arduino, используемые для взаимодействия с оборудованием
и выполнения общих задач.
● Режим контакта: установка режима цифрового контакта как ВХОД или
ВЫХОД с использованием функции pinMode.
● Цифровой и аналоговый ввод-вывод: чтение и запись цифровых и
аналоговых значений на выводы и с них с использованием функций
digitalRead, digitalWrite, AnalogRead и AnalogWrite.
10
Умное зарядное устройство
Катаев И.В.
Разработка зарядного устройства
Алгоритм зарядки будет взят из графика на рисунке 3, а после
доработан. Алгоритм будет состоять из 6 стадий.
В дальнейшем:
● параметр C представлен в 1 А
● СС(1-6) – стадии зарядки, которые соответствуют уровню заряда АКБ в
процентах, выводимого устройством
Начальный алгоритм таков:
1. СС1 – 2С
2. СС2 – 1,4С
3. СС3 – 1,5С
4. СС4 – 1С
5. СС5 – 0,5С
6. СС6 – 0,3С
Алгоритм был рассчитан, исходя из Стэндфордского исследования и
практики. В дальнейшем будут подобраны значения с применением закона
Ома для сопротивления.
Для реализации алгоритма нам понадобится:
1. NodeMCU v3
2. Расширительная плата для NodeMCU v3
3. Цифровой потенциометр X9C103S на 10кОм
4. Источник питания от 9 до 24 Вольта
5. Соединительные провода для платы
6. Arduino IDE
7. Код на Arduino C
8. Распределительная коробка 70x70x30 мм
11
Умное зарядное устройство
Катаев И.В.
Код для Arduino IDE
Код был написан на языке программирования C++ с использованием
интегрированной среды разработки (IDE) Arduino (см.прил.1).
Процесс написания кода может быть разбит на следующие этапы:
1. Импорт библиотек:
В начале кода были импортированы необходимые библиотеки:
● ESP8266WiFi.h - для работы с Wi-Fi модулем ESP8266
● X9C103S_digipot.h - для работы с цифровым потенциометром
X9C103S
● iostream - для вывода сообщений в монитор последовательного
порта.
2. Объявление переменных и установка пинов:
Затем были объявлены необходимые переменные, такие как пароль и
имя сети Wi-Fi, сервер, и т.д. Также были установлены пины, которые
будут использоваться для подключения цифрового потенциометра и для
управления светодиодом.
3. Настройка:
В функции setup() были установлены настройки модуля ESP8266,
настроен Wi-Fi и запущен сервер. В функции setup() выполняются
следующие действия:
● Устанавливается режим работы WiFi-модуля в режим клиента
(WIFI_STA) и происходит подключение к сети WiFi, используя
предопределенные значения ssid и passwd.
● Если подключение установлено, то на экран выводится IP-адрес
WiFi-модуля.
● Создается объект сервера WiFi на порту 80.
4. Цикл:
В функции loop() был реализован бесконечный цикл, который будет
работать до тех пор, пока питание не будет отключено. Внутри цикла
была установлена логика зарядки батареи с использованием цифрового
12
Умное зарядное устройство
Катаев И.В.
потенциометра. Также внутри цикла был реализован приём запросов от
клиента и обработка этих запросов. В цикле выполняются следующие
действия:
● Создается объект WiFiClient для обработки запросов от клиента.
● Считывается первая строка запроса в переменную req, используя
метод readStringUntil(), который считывает символы из потока,
пока не будет достигнут заданный символ '\r'.
● Выполняется обработка запроса и управление происходит в
зависимости от содержимого запроса. Если в запросе есть строка
"OFF", то происходит выключение платы, иначе происходит
начало зарядки батареи.
При начале зарядки батареи выполняются следующие действия:
● Считывается число процента заряда из запроса и преобразуется в
целочисленный тип (int).
● В зависимости от значения процента заряда, устанавливается
соответствующее значение сопротивления на дигипоте.
● Выполняется вывод текущего значения сопротивления на
серийный порт.
● После того, как зарядка батареи закончена, процесс повторяется
снова, начиная с чтения запроса от клиента.
5. Обработка запросов:
Приём запросов был реализован с помощью вызова функции
server.available(), которая возвращает объект WiFiClient, который можно
использовать для получения запросов и отправки ответов. Запросы
передавались в виде строк, которые были обрабатывались, исключая
все символы, кроме чисел. Затем полученное число было
преобразовано в целочисленный формат и использовано для
управления работой цифрового потенциометра.
13
Умное зарядное устройство
Катаев И.В.
6. Отладка:
Для отладки были использованы функции Serial.begin(115200) и
Serial.println(), которые выводили сообщения в монитор
последовательного порта. В функции setup() устанавливалось
соединение с Wi-Fi сетью, инициализировался сервер и выводился IP
адрес платы. В функции loop() происходила обработка запросов от
клиента, который подключался к серверу. Полученные данные
парсились и анализировались, и на основе этого устанавливалось
значение сопротивления дигипота, что позволяло регулировать заряд
батареи. Также в коде присутствовали команды для управления пинами
платы, включение/выключение светодиодов.
В целом, процесс написания кода состоял из написания и отладки различных
функций, анализа получаемых данных и установления необходимых значений
для управления платой.
14
Умное зарядное устройство
Катаев И.В.
Код для приложения
Для написания приложения на Android будем использовать бесплатную
программу Android Studio, используя язык программирования Kotlin.
1.Создадим проект с названием по умолчанию My Application.
2. Написание AndroidManifest.xml (см.прил.2).
Манифест файла является файлом конфигурации приложения в
Android, который описывает его компоненты, такие как активности, сервисы,
приёмники и содержит информацию о версии приложения, список
разрешений, которые приложение запрашивает у системы, и другие
настройки. Он должен быть размещен в корневой директории проекта и
иметь имя AndroidManifest.xml.
Первая строка манифеста содержит информацию о версии и
кодировке документа. Затем идут описания разрешений, которые запрашивает
приложение. Далее следует описание компонентов приложения, таких как
активности, их фильтры намерений и настройки.
Далее идёт объявление двух разрешений: INTERNET и BATTERY_STATS (с
атрибутом tools:ignore="ProtectedPermissions", что означает игнорирование
ошибки компиляции в связи с использованием защищенных разрешений).
Затем мы блок <application>, который содержит настройки приложения, такие
как имя пакета, имя иконки, настройки бэкапа, тема приложения и другие.
Под блоком <application> находится блок <supports-screens>, который
описывает, какие экраны поддерживаются приложением.
Общее представление о том, как был написан код – определение
необходимых разрешений, затем настройка приложения, указав параметры и
настройки, а затем указание, какие экраны поддерживаются.
15
Умное зарядное устройство
Катаев И.В.
3.Содержание файла MainActivity.kt, в котором содержится основной код
приложения (см.прил.3).
Код был написан на языке программирования Kotlin с использованием
Android Studio. Процесс написания кода может быть разбит на следующие
этапы:
1. Импорт библиотек: В начале кода были импортированы необходимые
библиотеки
2. Определение переменных и объектов.Были определены переменные и
объекты, используемые в коде, включая:
● wifiButton: Button - кнопка для включения/выключения Wi-Fi;
● edIP: TextView - поле ввода для IP-адреса;
● request: Request - объект для создания HTTP-запросов;
● binding: ActivityMainBinding - объект для связывания компонентов
пользовательского интерфейса с кодом;
● pref:
SharedPreferences
-
объект
для
сохранения
настроек
пользователя;
● client: OkHttpClient - объект для отправки HTTP-запросов;
● handler: Handler - объект для управления потоками и задержками;
● timeLeftText: String - текстовое поле для отображения времени
работы батареи.
3. Далее были реализованы методы жизненного цикла приложения, такие
как:
● onCreate() - метод, который вызывается при создании экрана,
инициализирует
компоненты
пользовательского
интерфейса,
регистрирует приёмник для получения информации о состоянии
16
Умное зарядное устройство
Катаев И.В.
батареи, и запускает поток, который обновляет время работы
батареи;
● onStart() - метод, который вызывается после onCreate(), и запускает
выполнение приложения;
● onRestart() - метод, который вызывается при повторном запуске
приложения;
● onResume() - метод, который вызывается после возврата приложения
в фокус;
● onPause() - метод, который вызывается при потере приложением
фокуса.
4. Реализация методов и функций:
● myBroadcastReceiver - приёмник, который получает информацию о
состоянии батареи и обновляет время работы батареи;
● SaveIpInTable - функция для сохранения IP-адреса в таблице;
● GetIp - функция для получения IP-адреса из таблицы;
● post - функция для отправки HTTP-запросов;
● run - функция для выполнения потока, который обновляет время
работы батареи.
5. Реализация логики
При
запуске
приложения
создается
экран,
на
котором
расположены компоненты пользовательского интерфейса, такие как
кнопка для включения/выключения зарядки и поле ввода для IP-адреса.
Приложение регистрирует приёмник для получения информации о
состоянии батареи и запускает поток, который обновляет время работы
батареи.
17
Умное зарядное устройство
Катаев И.В.
При нажатии на кнопку для включения/выключения Wi-Fi происходит
соответствующее
действие,
а
затем
приложение
отправляет
HTTP-запрос на сервер с заданным IP-адресом и параметрами.
При получении информации о состоянии батареи приложение
обновляет время работы батареи в текстовом поле на экране.
Код представляет собой основную часть, которая позволяет пользователю
управлять каким-либо устройством через сеть Wi-Fi. Основной функционал
включает в себя отправку запросов на сервер с текстом и мониторинг
состояния батареи. Код состоит из различных функций, отвечающих за
разные задачи, включая регистрацию приёмников вещания, обработку
пользовательского ввода и обновление пользовательского интерфейса.
Процесс написания и отладки кода включал анализ данных, определение
необходимых значений и интеграцию необходимых библиотек и классов.
4.Содержание файла activity_main.xml в директории res/layout (см.прил.4)
5.Для изменения иконки приложения следуем этим шагам:
1. Сохраните изображение в папке res/drawable в вашем проекте Android
Studio. Для сохранения файла выберите File -> New -> Image Asset в
меню Android Studio.
2. Выберите опцию "Launcher Icons" и нажмите "Next".
3. Загрузите изображение, которое вы хотите использовать, и выберите
его размер и плотность пикселей. Нажмите "Next".
4. Убедитесь, что имя файла и путь к нему правильны, и нажмите "Finish".
5. Откройте файл AndroidManifest.xml и найдите строку, содержащую тег
"application". В этом теге вы найдете атрибут "android:icon". Замените
значение этого атрибута на имя файла вашей новой иконки.
6. Сохраните изменения в файле AndroidManifest.xml.
18
Умное зарядное устройство
Катаев И.В.
19
Умное зарядное устройство
Катаев И.В.
Корпус зарядного устройства
В роли корпуса будет распределительная коробка размерами 70x70x30
мм. (см.рис.6) Также был разработана 3д модель корпуса для коммерческой
версии. Его разработка проводилась в программе Fusion 360 от Autodesk.
(см.прил.5). Данную 3д модель можно распечатать на 3д принтере из ABS
пластика.
20
Умное зарядное устройство
Катаев И.В.
Сборка умного зарядного устройства
1.Схема подключения (см.рис.7)
2.Сборка (см.рис.8)
21
Умное зарядное устройство
Катаев И.В.
Проверка работоспособности прототипа
Прототип зарядного устройства функционирует. Однако, для оценки его
реальной эффективности необходимо провести анализ минимум на 500 АКБ с
использованием необходимого оборудования, знаний и навыков, что в
настоящее время не представляется возможным. Тем не менее, можно
ориентироваться на примерную эффективность, определенную на основании
выводов исследования, проведенного в университете Стэнфорда.
22
Умное зарядное устройство
Катаев И.В.
Заключение
В данном проекте была разработана модель умного зарядного
устройства для смартфонов, которое позволяет мониторить уровень заряда
батареи и заряжать её с технологией умной зарядки, реализованной на основе
исследований, посвящённых зарядке батарей. Также было разработано
приложение для контроля процесса зарядки. В проекте были использованы
технологии программирования на языке Arduino С, Kotlin. Во время работы
над проектом я научился базово программировать на языках C и Kotlin, в
частности Arduino C. Базовых знаний в языках программирования хватило,
чтобы реализовать данный проект.
Проблемы, возникшие в ходе проекта:
1. В начале проекта были затруднения с получением процента заряда
батареи. Изначально было предложение о получении процента
заряда через USB-кабель напрямую, но оказалось, что технология
usb сложнее, чем просто отправка значений. То есть нельзя просто
подключить два провода data к плате и написать код на Arduino C
для получения процента заряда. Потом было решено использовать
выделенный сервер платы NodeMCU, но были предположения, что
скорость отправки данных с телефона на плату будет медленнее, чем
при
отправке
через
USB-кабель,
что
заметно
ухудшит
быстродействие устройства. Данная версия не подтвердилась и на
скорость это почти никак не повлияло: задержка в границах одной
секунды, что не критично.
2. Проблемы с выбором корпуса. Изначально проект подразумевал
разработанный проект корпуса, в котором находились бы все
крепления и технологические оптимизации. Модель корпуса была
реализована, но корпус не был изготовлен: оказалось, что изготовить
на 3д принтере продукт в единичном экземпляре у 3д печатной
службы крайне дорого, а литьё пластика под давлением тем более.
23
Умное зарядное устройство
Было
выбрано
Катаев И.В.
использовать
распределительную
коробку
подходящего размера, а именно 70x70x30 мм.
Возможные улучшения:
1. Интеграция с функциями умного дома, такими как голосовое
управление через умные колонки или управление через умные часы, а
также добавление анимаций и расширение интерфейса, например,
добавление окна главной страницы приложения (хаба), для удобного
управления всеми функциями устройства, чтобы пользователь мог
получать полезную информацию об использовании устройства в
удобном и интуитивно понятном формате.
2. Реализация функции отслеживания истории зарядки для анализа
использования устройства и энергопотребления
Умное зарядное устройство для смартфонов, разработанное в рамках данного
проекта,
может
значительно
облегчить
жизнь
людей.
Устройство
обеспечивает мониторинг уровня заряда батареи смартфона и заряжает его с
помощью технологии умной зарядки. Это означает, что пользователь может
забыть о проблемах с зарядкой и не беспокоиться о том, что батарея
смартфона выйдет из строя раньше заверенного производителем срока. Также
проект может послужить примером реализации подобного зарядного
устройства для электротранспорта.
Оценка стоимости проекта может зависеть от многих факторов, таких как
стоимость компонентов, затраты на разработку и производство, трудозатраты,
налоги, расходы на маркетинг и т.д. В данной модификации умной зарядки
были использованы:
1. NodeMCU V3 CH340G kit – 283 ₽
2. Цифровой потенциометр X9C103S на 10кОм – 169 ₽
3. Источник питания от 9 до 24 Вольта – 245 ₽
4. Соединительные провода – 16 ₽
24
Умное зарядное устройство
Катаев И.В.
5. Arduino IDE – 0 ₽
6. Распределительная коробка 70x70x30 мм – 60 ₽
Итого: 773 ₽
Что касается коммерциализации проекта, его потенциал на рынке может быть
довольно высоким, так как устройство может заинтересовать широкий круг
пользователей, особенно тех, кто постоянно использует свой смартфон и
нуждается в эффективной зарядке. Потенциальные пути монетизации
проекта могут включать:
● Продажу самого устройства: устройство может быть произведено в
большом
количестве
и продано через интернет-магазины или
розничные магазины. Можно уменьшить траты на производство, создав
плату, подходящую строго под нужны умного зарядного устройства:
NodeMCU имеет множество лишних для проекта возможностей.
● Предоставление услуг: устройство может быть предоставлено в аренду
или продано с подпиской на услуги обслуживания и технической
поддержки.
● Лицензирование технологии: технология умной зарядки может быть
лицензирована другим производителям, которые могут внедрить ее в
свои устройства.
● Реклама: устройство может использоваться для отображения рекламы
или
предоставления
дополнительных
фотографий, видео или новостей.
25
услуг,
таких
как
показ
Умное зарядное устройство
Катаев И.В.
Приложения
(1)
#include <ESP8266WiFi.h> // подключение библиотеки Wi-Fi модуля NodeMCU
#include <X9C103S_digipot.h> // подключение библиотеки цифрового потенциометра
using namespace std ; // директива пространства имен, которая позволяет использовать
все идентификаторы (функции, классы, переменные) из пространства имен "std" без явного
указания этого пространства имен.
#define PIN_CS 14 // D5
// обозначение выходов на плате NodeMCU
#define PIN_UD 12 // D6
// обозначение выходов на плате NodeMCU
#define PIN_INC 13 // D7
// обозначение выходов на плате NodeMCU
DigiPot pot(PIN_CS, PIN_UD, PIN_INC); // Пины дигипота CS,UD,INC
const char* ssid="Get";
// присвоение переменной значения имени Wi-Fi точки
const char* passwd="14881337"; // присвоение переменной значения пароля Wi-Fi точки
WiFiServer server(80); // присвоение порта выделенного сервера NodeMCU
void setup() {
String statusch = "ON";
Serial.begin(115200);
// единовременная инициализация переменных и её значений
// присваиваем переменной statusch значение "ON"
// присвоение boud чтения монитора порта
// Connect to WiFi network
WiFi.mode(WIFI_STA);
// присвоение STA(Station + SoftAP ) режима Wi-Fi
WiFi.begin(ssid, passwd);
// присвоение имени и пароля Wi-Fi сети
while(WiFi.status() != WL_CONNECTED){
// ожидание подключения к Wi-Fi точки
delay(500);
// ожидание подключения к Wi-Fi точки
Serial.println(".");
// ожидание подключения к Wi-Fi точки
}
Serial.println("WiFi connected");
// сообщение об успешном подключении к Wi-Fi
точки
// Start the server
server.begin();
// запуск сервера
// Print IP
Serial.println(WiFi.localIP());
// сообщение с IP сервера
}
void loop() {
// бесконечно выполняющаяся функция
// Client
WiFiClient client = server.available();
// Get bat
String req = client.readStringUntil('\r'); // -> read the first line of the request
String point = "";
for(int i=0; i<=req.indexOf("%"); i++)1{
1
Условие выполнения цикла задается как i <= req.indexOf("%"). Здесь req - это переменная типа String, а
indexOf() - метод этого класса, который возвращает индекс первого вхождения подстроки в строку. Таким
26
Умное зарядное устройство
Катаев И.В.
if(req[i] >= 48 && req[i] <= 57)2{
point = point + req[i];
}
}
int proc = point.toInt();
// присвоение переменной, содержащей целочисленный тип
данных, значению полученному выше
Serial.print(point.toInt()); // вывод этого значения в монитор порта
if (req.indexOf("OFF") != -1) { // Если в запросе есть строка "OFF"
turnoff = 1; // Присваиваем переменной turnoff значение 1
digitalWrite(3, LOW); // Выключаем пин 3
digitalWrite(4, LOW); // Выключаем пин 4
digitalWrite(16, LOW); // Выключаем пин 16
Serial.println(turnoff); // Выводим значение переменной turnoff в монитор
порта
statusch = "OFF"; // Присваиваем переменной statusch значение "OFF"
ESP.deepSleep(0); // Переводим плату в глубокий сон
} else if (turnoff && proc > 0) { // Если плата была выключена и пришло число,
включаем плату обратно
turnoff = 0; // Присваиваем переменной turnoff значение 0
digitalWrite(16, HIGH); // Включаем пин 16
}
//charge
if (proc<=5 && proc>0) {
pot.write(30);
// 0 это сопротивление 999
Serial.println("95/100");
}
if (proc<=20 && proc>=6) {
pot.write(100);
Serial.println("25/100");
}
if (proc<=40 && proc>=21) {
pot.write(50);
Serial.println("55/100");
}
if (proc<=60 && proc>=41) {
pot.write(70);
образом, условие означает, что цикл будет выполняться, пока значение переменной i не превышает или равно
индексу первого вхождения символа % в строке req.
Итерация в данном случае задается как i++, что означает увеличение значения переменной i на единицу
после каждого прохода цикла.
Таким образом, данный цикл будет выполняться, пока значение переменной i не достигнет индекса первого
вхождения символа % в строке req, а на каждой итерации будет увеличивать значение переменной i на
единицу.
2
условие req[i] >= 48 && req[i] <= 57 проверяет, находится ли символ на позиции i в строке req в диапазоне
символов от '0' (код ASCII 48) до '9' (код ASCII 57)
27
Умное зарядное устройство
Катаев И.В.
Serial.println("40/100");
}
if (proc<=80 && proc>=61) {
pot.write(35);
Serial.println("75/100");
}
if (proc<=90 && proc>=81) {
pot.write(20);
Serial.println("90/100");
}
if (proc<=95 && proc>=91) {
pot.write(10);
Serial.println("95/100");
}
if (proc<=100 && proc>=96) {
pot.write(0);
//100 это сопротивление 0,04
Serial.println("98/100");
}
}
}
}
(2)
// Объявление версии XML и кодировки
<?xml version="1.0" encoding="utf-8"?>
// Объявление элемента манифеста и пространства имен для Android
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
// Разрешение использования интернета в приложении
<uses-permission android:name="android.permission.INTERNET"/>
// Разрешение получения информации о состоянии батареи, игнорирующееся Android
Studio
<uses-permission android:name="android.permission.BATTERY_STATS"
tools:ignore="ProtectedPermissions" />
// Объявление основного приложения
<application
// Разрешение резервного копирования данных приложения
android:allowBackup="true"
// Определение правил для извлечения данных из приложения
android:dataExtractionRules="@xml/data_extraction_rules"
// Определение правил для полного резервного копирования приложения
android:fullBackupContent="@xml/backup_rules"
// Определение значка приложения на главном экране
28
Умное зарядное устройство
Катаев И.В.
android:icon="@drawable/ic_launcher_background"
// Определение названия приложения, отображаемого на главном экране
android:label="@string/app_name"
// Определение значка приложения для округленных углов
android:roundIcon="@mipmap/ic_launcher_round"
// Поддержка языков справа налево
android:supportsRtl="true"
// Разрешение передачи текста по сети в открытом виде
android:usesCleartextTraffic="true"
// Определение темы приложения
android:theme="@style/Theme.MyApplication"
// Определение версии API
tools:targetApi="31">
// Объявление основной активности приложения
<activity
// Определение имени основной активности
android:name=".MainActivity"
// Разрешение доступа к активности из других приложений
android:exported="true">
// Фильтр намерений
<intent-filter>
// Определение основного действия
<action android:name="android.intent.action.MAIN" />
// Определение категории, означающей, что активность должна быть
запущена как главная
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
// Метаданные для указания библиотеки
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
// Метаданные для указания предустановленных шрифтов
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
</application>
// Объявление настроек для поддерживаемых экранов устройств
<supports-screens
android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
29
Умное зарядное устройство
Катаев И.В.
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
</manifest>
(3)
// Указываем название пакета, в котором находится класс. Здесь уже приложение
названо fsc
package com.repak75.fsc
// Импортируем необходимые классы из стандартной библиотеки Android
import android.content.*
import android.os.BatteryManager
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.repak75.fsc.databinding.ActivityMainBinding
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.IOException
import android.os.Handler
//
Определяем
класс
MainActivity,
который
наследуется
от
класса
AppCompatActivity
class MainActivity : AppCompatActivity() {
// Определяем переменные
private lateinit var wifiButton: Button // Кнопка включения/выключения WiFi
private lateinit var edIP: TextView // Поле для ввода IP-адреса
private lateinit var request: Request // Запрос
private
lateinit
var
binding:
ActivityMainBinding
//
Объект
для
работы
с
разметкой
private lateinit var pref: SharedPreferences // Объект для работы с настройками
приложения
private val client = OkHttpClient() // Клиент для отправки HTTP-запросов
private val handler = Handler() // Объект для запуска кода в главном потоке
// Функция onCreate, которая вызывается при создании активности
override fun onCreate(savedInstanceState: Bundle?) {
// Вызываем конструктор суперкласса
super.onCreate(savedInstanceState)
// Связываем разметку с активностью
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// Устанавливаем название приложения
30
Умное зарядное устройство
Катаев И.В.
title = "FSC"
// Получаем доступ к настройкам приложения
pref =
getSharedPreferences("User_Pref", MODE_PRIVATE)
// Находим кнопку и поле для ввода IP-адреса по их ID
wifiButton = findViewById<Button>(R.id.wifiButton)
edIP = findViewById<TextView>(R.id.edIP)
// Создаем фильтр намерений для получения информации о зарядке устройства
val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
// Регистрируем приёмник намерений
this.registerReceiver(myBroadcastReceiver, intentFilter)
// создание объекта типа Runnable
val runnable = object : Runnable {
// переопределение метода run для запуска задачи в потоке
override fun run() {
// вычисление оставшегося времени зарядки
val timeLeft = batteryManager.computeChargeTimeRemaining() / 1000
// если оставшееся время положительное
if (timeLeft >= 0) {
// конвертация оставшегося времени в часы и минуты
val hours = TimeUnit.SECONDS.toHours(timeLeft)
val remainingMinutes = TimeUnit.SECONDS.toMinutes(timeLeft TimeUnit.HOURS.toSeconds(hours))
// форматирование текста вывода времени
val timeLeftText = String.format(Locale.getDefault(), "%02d:%02d",
hours, remainingMinutes)
// вывод текста с оставшимся временем на экран
binding.timeLeftText.text = "Time left: $timeLeftText"
} else {
// вывод сообщения, если устройство не заряжается
binding.timeLeftText.text = "not charging"
}
// постановка задачи на повтор через 5 секунд
handler.postDelayed(this, 5000)
}
}
// Добавляем слушатель нажатия на кнопку
wifiButton?.setOnClickListener() {
// установка обработчика клика на wifiButton, оператор "?" гарантирует, что
wifiButton не null
if (wifiButton.text == "OFF") {
// проверка текста кнопки
wifiButton.text = "ON"
// изменение текста кнопки на "ON"
if (edIP.text.isNotEmpty()) SaveIpInTable(edIP.text.toString())
// проверка наличия IP-адреса, если есть - сохранение в таблицу
31
Умное зарядное устройство
Катаев И.В.
GetIp()
// получение IP-адреса
post(binding.tvText.text.toString())
// отправка текста из TextView на сервер
} else {
wifiButton.text = "OFF"
// изменение текста кнопки на "OFF"
post("OFF")
// отправка сообщения "OFF" на сервер
Log.d("MyLogMAct", "OFF")
// добавлен вывод в логи
}
}
if (wifiButton.text == "ON") {
// проверка текста кнопки
post(binding.tvText.text.toString())
// отправка текста из TextView на сервер
println(binding.tvText.text.toString())
// вывод текста в консоль
} else {
wifiButton.text = "OFF"
// изменение текста кнопки на "OFF"
post("OFF")
// отправка сообщения "OFF" на сервер
println("OFF")
// вывод сообщения в консоль
}
// Устанавливаем задержку на выполнение определенной функции
handler.postDelayed(object : Runnable {
override fun run() {
// Получаем объект BatteryManager из службы BATTERY_SERVICE
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as
BatteryManager
// Получаем уровень заряда батареи
val batteryPercentage =
batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
// Вызываем метод post, передавая в него уровень заряда батареи в
процентах
post(batteryPercentage.toString() + "%")
// Устанавливаем задержку на выполнение этой же функции снова
// через 2 минуты (в миллисекундах)
32
Умное зарядное устройство
Катаев И.В.
handler.postDelayed(this, 2 * 60 * 1000) // Run every 4 minutes
}
}, 2 * 60 * 1000) // Start after 4 minutes
// Переопределяем методы жизненного цикла активности
override fun onStart() {
super.onStart()
Log.d("MyLogMAct", "onStart")
}
override fun onRestart() {
super.onRestart()
Log.d("MyLogMAct", "onRestart")
}
override fun onResume() {
super.onResume()
Log.d("MyLogMAct", "onResume")
}
override fun onPause() {
super.onPause()
Log.d("MyLogMAct", "onPause")
}
override fun onStop() {
super.onStop()
Log.d("MyLogMAct", "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d("MyLogMAct", "onDestroy")
}
// Метод для сохранения IP-адреса в SharedPreferences
private fun SaveIpInTable(ip: String)
{
// Получаем объект SharedPreferences и создаем его редактор
val editor = pref.edit()
// Сохраняем IP-адрес в редакторе
editor.putString("ip", ip)
33
Умное зарядное устройство
Катаев И.В.
// Применяем изменения
editor.apply()
}
// Метод для получения IP-адреса из SharedPreferences и установки его в
поле ввода edIP
private fun GetIp()
{
// Получаем IP-адрес из SharedPreferences
val ip = pref.getString("ip", "")
// Если IP-адрес не равен null и не пустой, то устанавливаем его в поле
ввода edIP
if (ip != null){
if(ip.isNotEmpty()) edIP.setText(ip)
}
}
// Метод для отправки POST-запроса на сервер
private fun post(post: String){
Thread{
// Создаем объект Request с URL-адресом, который состоит из IP-адреса и
переданного в метод post текста
request =
Request.Builder().url("http://${binding.edIP.text}/$post").build()
try {
// Выполняем запрос и получаем ответ
var responce = client.new
(4)
<?xml version="1.0" encoding="utf-8"?>
// Определение корневого элемента макета (ConstraintLayout) с использованием
библиотеки androidx.constraintlayout
<androidx.constraintlayout.widget.ConstraintLayout
// Определение пространства имен Android для разметки XML
xmlns:android="http://schemas.android.com/apk/res/android"
//
Определение
пользовательского
пространства
имен
для
ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
// Определение пространства имен для инструментов Android Studio
xmlns:tools="http://schemas.android.com/tools"
// Определение ширины и высоты макета как fill_parent
android:layout_width="match_parent"
android:layout_height="match_parent"
34
библиотеки
Умное зарядное устройство
Катаев И.В.
// Определение цвета фона макета
android:backgroundTint="#C3C3EB"
//
Определение
контекста,
связанного
с
этим
макетом
(в
данном
случае,
MainActivity)
tools:context=".MainActivity">
// Определение текстового поля EditText для ввода IP-адреса
<EditText
// Идентификатор текстового поля
android:id="@+id/edIP"
// Ширина и высота текстового поля
android:layout_width="314dp"
android:layout_height="67dp"
// Отступы текстового поля от границ макета
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
// Количество символов в текстовом поле
android:ems="10"
// Подсказка для текстового поля
android:hint="Paste IP address here"
// Тип вводимых данных (в данном случае, текст)
android:inputType="textPersonName"
// Поле для многострочного ввода
android:singleLine="false"
// Выравнивание текста в центре
android:textAlignment="center"
// Определение положения текстового поля относительно верхней границы
макета
app:layout_constraintTop_toTopOf="parent"
// Определение положения текстового поля относительно левой границы макета
app:layout_constraintStart_toStartOf="parent"
// Определение положения текстового поля относительно правой границы макета
app:layout_constraintEnd_toEndOf="parent"
// Определение положения текстового поля относительно верхней границы
TextView
app:layout_constraintBottom_toTopOf="@+id/tvText" />
// Создаем TextView, которое будет использоваться для отображения текста на
экране
<TextView
// Уникальный идентификатор TextView, который позволяет обращаться к нему из
Java-кода
android:id="@+id/tvText"
35
Умное зарядное устройство
Катаев И.В.
// Устанавливаем ширину TextView в 200dp
android:layout_width="200dp"
// Устанавливаем высоту TextView в 200dp
android:layout_height="200dp"
// Устанавливаем шрифт для текста в TextView
android:fontFamily="@font/gugi"
// Устанавливаем выравнивание текста в центр
android:gravity="center"
// Устанавливаем цвет текста в белый
android:textColor="#FFFFFF"
// Устанавливаем размер текста в 80dp
android:textSize="80dp"
// Устанавливаем жирное начертание для текста
android:textStyle="bold"
//
Устанавливаем
положение
TextView
относительно
другого
элемента
(edIP), в данном случае ниже EditText
app:layout_constraintTop_toBottomOf="@+id/edIP"
// Устанавливаем положение TextView слева, привязывая его к левому краю
ConstraintLayout
app:layout_constraintStart_toStartOf="parent"
// Устанавливаем положение TextView справа, привязывая его к правому
краю ConstraintLayout
app:layout_constraintEnd_toEndOf="parent" />
// Создаем кнопку, которая будет использоваться для включения/выключения Wi-Fi
<Button
// Уникальный идентификатор для кнопки
android:id="@+id/wifiButton"
// Стиль, определенный в ресурсах приложения
style="@style/Widget.AppCompat.Button"
// Ширина кнопки по содержимому
android:layout_width="wrap_content"
// Высота кнопки равна 70dp
android:layout_height="70dp"
// Отступ слева равен 156dp
android:layout_marginStart="156dp"
// Отступ справа равен 156dp
android:layout_marginEnd="156dp"
// Шрифт для кнопки
android:fontFamily="@font/gugi"
// Текст на кнопке "OFF"
android:text="OFF"
36
Умное зарядное устройство
Катаев И.В.
// Выравнивание текста в центре
android:textAlignment="center"
// Преобразование текста в верхний регистр
android:textAllCaps="true"
// Цвет текста белый
android:textColor="#FFFFFF"
// Размер текста 48sp
android:textSize="48sp"
// Жирный шрифт
android:textStyle="bold"
// Обычное начертание
android:typeface="normal"
// Кнопка видима
android:visibility="visible"
// Ограничения кнопки
// Кнопка расположена под TextView
app:layout_constraintTop_toBottomOf="@+id/tvText"
// Кнопка привязана к началу родительского элемента
app:layout_constraintStart_toStartOf="parent"
// Кнопка привязана к концу родительского элемента
app:layout_constraintEnd_toEndOf="parent"
// Кнопка привязана к нижней части родительского элемента
app:layout_constraintBottom_toBottomOf="parent"
// Закрытие тега ConstraintLayout
</androidx.constraintlayout.widget.ConstraintLayout>
(5)
37
Умное зарядное устройство
Катаев И.В.
38
Умное зарядное устройство
Катаев И.В.
Список литературы
1. Алексеев Андрей. Основы электротехники. — М.: Бином, 2018. — 224
с.
2. Android Developers. Android Developer Documentation [Электронный
ресурс]. — Режим доступа: https://developer.android.com/docs.
3. Kotlin. Kotlin Documentation [Электронный ресурс]. — Режим доступа:
https://kotlinlang.org/docs/home.html. — 2020. — Vol. 1528. — P. 012015.
4. Макрю Майкл. Arduino для начинающих. — СПб.: Питер, 2017. — 320
с.
5. Пайн Крис. Android-программирование для начинающих. — М.: ДМК
Пресс, 2019. — 384 с.
39
Download