LABA 120 - проект MIT app inventor 2 часы с боем и будильником

LABA 120 - проект MIT app inventor 2 часы с боем и будильником


LABA 120 - Главная ALT
куда применить старый андроид телефон который жалко выбросить? Зальем на него полезный софт и превратим в полезный девайс

Создадим приложение для андроид, в MIT App Inventor 2, которое будет выводить
на экран текущее время, дату, день недели

Так же аппарат будет показывать состояние батареи
процент зарядки, температуру батареи и тип подключенного
зарядного устройства. И еще осталось место на экране
В дальнейшем можно прикрутить метеостанцию например

Часы отбивают каждый час столько ударов,сколько они показывают часов,
а каждые полчаса один удар. Еще в программе можно установить будильник


Видео на ютубе демонстрирует бой часов и будильник



дизайн экрана оформим в палитре старых жидкокристаллических часов




разделение экрана на участки построено на элементах
из вкладки Layout,





черные полосы это HorizontalArrangement
с черным фоном и шириной 5 пикселей для вертикальной полосы
или высотой 5 пикселей для горизонтальной полосы




размер шрифта времени и даты вычисляется в зависимости
от ширины экрана андроид устройства. И в теории
должно нормально вписываться в разные размеры телефонов





разные значки пришлось скачивать из интернета и дорабатывать
в редакторе, заменить фон на цвет фона нашего экрана
(Custom... #aec1a4ff ) цвет фона реального LCD
и сжимать до размера примерно 45 х 45 пикселей

в MIT app inventor 2 изображения можно натягивать на кнопки
и использовать по назначению , но в данном проекте
пиктограммы загружены в элементы Image
в которых как и в кнопках имеются обработчики событий
OnClick




На экране разместились




икона этого сайта Число месяц год день недели




Часы минуты секунды индикатор установленного будильника , время будильника
Чек-боксы

Икона установки времени будильника
Икона включения будильника
Открывает окно настроек
Играет мелодию монтаны





Демо - ускоряет время для оценки боя часов
Бой - разрешает отбивать часы

разрешение экрана аппарата, почему то в релизе

Built: January 20 2022 Version: nb188a
Use Companion: 2.62 or 2.62u
Target Android SDK: 30 (Android 11.0)

ширина с высотой перепутаны

Операционная система аппарата
версия ОС




индикатор заряда батареи , значение в процентах
По мере зарядки разрядки меняется значек батареи, от полной до пустой




Тип подключенной зарядки
Температура батареи телефона, если поддерживается в вашей модели




окно настроек
Чек-боксы кнопка сохранить
ни чего полезного, остатки от грандиозных планов

Non-visible components





в среде программирования mit app inventor 2,
внизу сразу под визуальным редактором
экрана телефона, расположились невидимые компоненты

Clock1
* Clockie1
* TaifunAlarm1
* AppyKeepScreenOn1
TinyDB1
Clock2
Player1
* TaifunBattery1




все они разной степени учавствуют в работе программы
помеченые * не являются встроенными обьектами
мит апп инвентор 2, и их придется подгружать в проект




Размещаться они будут во вкладке Extension
в этом проекте все они уже прогружены

Блоки


начнем с переменных





Вообще тема переменных в мит апп инвентор 2
сама по себе очень увлекательна и достойна отдельной статьи

здесь ограничимся только нужными

Global h и Global m используются для хранения
часов и минут установленного будильника, компонентом
TimePicker и здесь не сильно нужны, так как
для этого можно было использовать свойства самого




TimePicker -
TimePicker.Hour
TimePicker.Minute


Global hh
Global mm
Global ss

применяются в режиме демонстрации боя часов
В этом режиме время сильно ускоряется
и минуты идут со скоростью секунд

Global boy
служит счетчиком при отбивании часов

Global rotate
применяется для счетчика угла вращения
шестеренки, значка настройка

Global Melody
работает триггером для пуска
и остановки проигрывания мелодии от
старых часов Монтана


События

Событие Screen.Initialize

возникает при запуске приложения
здесь обычно выполняются начальные настройки программы









Screen.TitleVisible=False убираем заголовок окна программы





Вызываем функцию Read в которой считываются
настройки пользователя, из хранилища телефона





AppyKeepScreenOn,KeepScreenOn=True
здесь Extension AppyKeepScreenOn велит программе
не гасить экран, и не уходить в спящий режим





затем расширение Clockie
методом Clockie.AddToView.View=Frame_AnalogClock
добавляет на невидимый фрейм аналоговые часы
которые используются здесь для пасхалки





Frame_setup.Visible=false делается невидимым






Здесь получается разрешение экрана и заносится в метку

Label_ScreenSize.Text

в мит апп инвентор 2 , блоки Label
поддерживают HTML разметку , поэтому тегом
<br> мы можем сделать вывод многострочным





таким же способом в метку Label_OsInfo.Text
записываем версию операционной системы телефона





Устанавливает размер шрифта метки
Label_Date.FontSize.To = Screen.Width/25
то есть ширина экрана в пикселях делим на 25




и далее похожими способами устанавливаем
размеры шрифтов остальных меток Label
что позволяет адаптировать размеры окна программы
для разных аппаратов (но это не точно)




Разрешаем нашим графическим кнопкам реагировать на нажатия
Image_melody.Clickable=true
и так далее



это можно сделать и в настройках блока




в конце запускаем пока невидимые аналоговые часы
методом
Clockie.Start

Таймер Clock1


Событие When.Clock1.Timer


возникает с интервалом указанным в свойстве


в миллисекундах, например
Clock.TimerInterval.to=1000
будет вызывать данное событие 1 раз
в секунду

в этой программе частота срабатывания таймера зависит от
режима работы, который устанавливается в CheckBox_Demo
и в зависимости от выбора режима, меняется интервал таймера
и вызывается функция DEMO или функция Clock

Таймер Clock2



Управляет вращением шестеренки в Image_Setup



увеличивая угол поворота в переменной
Global ms, которой затем присваивается свойству
Image_Setup.Rotation.to=Global ms




и ведет отсчет десятков милисекунд , мельче некуда
и выводит их в Label_ms.Text




Чтобы изображение на экране смартфона не дрыгалось когда Label_ms.Text меньше десяти,
в блоке IF проверяется длинна строки в переменной Global ms



, и хоть эта переменна объявлена как цифровая,


строковые функции с ней тоже работают.
В нужном случае метка дополняется лидирующим нулем

В программе имеется несколько графических кнопок

нажатия на которые выполняют определенные задачи

установка времени будильника

Открывает диалогововое окно выбора времени
компонента TimePicker



при нажатии кнопки ОК срабатывает событие TimePicker1.AterTimeSet


в переменные Global h и Global m заносится выбраное время из TimePicker.Hour и TimePicker.Minute

Установка включения будильника



если ткнуть пальцем в этот значек, в телефоне сработает вот такой код



вначале телефон издаст звуковой сигнал из функции Beep

Затем методом Extension TaifunAlarm.Set установит время срабатывания



Просле занесет в метку Label_alarm.Text.to

время при котором будильник сработает

и в завершении сменит значек не активного бедильника
в Image_alarm_clock.Picture.to="bud1.png"




на значек включенного, картинки хранятся тут же в проекте





Открывает окно настроек




При первом нажатии Играет мелодию монтаны,
при повторном останавливает проигрывание
это организовано програмно



Функции

BEEP




Заружает в плеер звук бип из файла
запускает плеер

Clock

Основная функция , управляет отображением времени и даты




Запрашивается состояние батареи телефона




В метку заносится минуты текущего времени
Label.Minute.Text.To=Clock1.FormatDateTime

Таким же способом выводятся секунды
С часами отдельная песня, там можно выводить на выбор, 12 или 24 часа , что требует дополнительного кода


В метку заносится минуты текущего времени  
Label.Minute.Text.To=Clock1.FormatDateTime 
Таким же способом выводятся секунды


если в вашей программе не требуется отдельных операций, с минутами, секундами и часами то можете просто использовать такой pattern - шаблон




Похожим способом на экран выводится текущая дата
оператором JOIN собирается такая конструкция -
День, Имя месяца, Год, День недели
и заносится в метку Label_Date.Text.To


оператором JOIN собирается такая конструкция -
День, Имя месяца, Год, День недели 
и заносится в метку Label_Date.Text.To


Если в опциях, установлен чек-бокс на 24 формат, время будет выводится
в 24-часовом формате, оператором IF проверяется состояние
CheckBox ch_v24 , и в зависимости от ситуации , отображается
соответствующий формат времени
за это отвечает шаблон-PATTERN "hh" или "HH"





бой часов срабатывает если -
он включен и
минуты = 0
секунды = 0
тогда в переменную числа ударов записывается текущее
количество часов, и вызывается функция BOY

если количество минут =30 и секунд =0
часы бьют один удар





Код - Бой часов

бой часов требует отдельного описания
построен он на компоненте плеер

Указываем плееру какой файл проигрывать
Player.Source.to="boy1.mp3"



этот файл загружен в Assets (Активы) зараннее





даем команду Player.Start





по окончании проигрывания возникает событие
Player.Completed
в обработчике уменьшаем переменную
Global boy на один
проверяем не достигла ли она нуля и
если она бельше , запускаем плеер Player.Start

изначально переменная Global boy хранит количество
часов текущего времени, стало быть плеер сыграет
столько же раз




Состояние батареи телефона

Функция BAT проверяет и выводит на экран информацию
о зарядке батареи, ее температуре, и тип подключеного зарядного устройства




За получения этой информации отвечает Extension
com.puravidaapps.TaifunBattery.aix


Этот Extension имеет доступ ко многим параметрам батареи



здесь используются только три


Plugged Level Temperature



В зависимости от значения Level меняется значек батареи


А значек подключения меняется при изменении Plugged


датчик Температуры есть не на всех аппаратах





продолжение следует..


Форум у меня пока работает коряво, вопросы и пожелания пишите
в коментах к видео

Скачать исходник проекта MIT app inventor 2, часы с боем и будильником

Скачать APK, часы с боем и будильником