Android Things: барометр/термометр з Raspberry Pi 3 та клієнт на Android для нього

Відразу після анонсу Android Things мені закортіло отримати один з девайсів для тестування. Я вирішив зробити кімнатний барометр/термометр з можливістю віддаленого перегляду даних зі смартфону. Спочатку була ідея написати невеликий сервер для зберігання даних, але потім я згадав про існування Firebase Realtime Database. :)

Мною був обраний одноплатний комп’ютер Raspberry Pi 3. Крім нього був придбаний корпус, блок живлення, радіатори, а також барометр MP180.

Так це виглядає у зібраному вигляді:

Після монтажу можна приступати до написання коду. Для того, щоб розробляти під Android Things потрібно додати залежність до build.gradle:

provided 'com.google.android.things:androidthings:0.1-devpreview'

В AndroidManifest.xml в тегу Application потрібно вказати:

<uses-library android:name="com.google.android.things"/>

І також налаштувати intent-filter для вашої основної Activity. Це дозволить запускатись вашій аплікації разом з девайсом:

<intent-filter> 
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.IOT_LAUNCHER"/> <category android:name="android.intent.category.DEFAULT"/> 
</intent-filter>

Для того, щоб підключити і працювати зі сторонніми девайсами, у Google розробили концепт User-Space Drivers, який дозволяє самостійно написати драйвер.
Для деяких девайсів вже є готові написані драйвери, знайти ви можете на GitHub Android Things.

На жаль, під мій датчик, на момент написання статті, готового драйвера не було, а писати самому було лінь. Але на GitHub я знайшов драйвер сторонньої реалізації, він і був використаний у проекті, за що і хочу подякувати автору.

Для написання був обраний Kotlin. По суті вся моя аплікація для Android Things складається з однієї Activity, в якій раз на 10 хвилин беруться покази з датчика і пишуться у Firebase для того, щоб потім їх зміг забрати мобільний Android клієнт. Для зручної реалізації таймера була використана RXJava.

private fun startSensorPolling() {
        disposable = getSensorDataAsFlowable()
                .repeatWhen { it.delay(10, TimeUnit.MINUTES) }
                .retryWhen { it.delay(10, TimeUnit.MINUTES) }
                .subscribe({ storeToDB(it) },
                        { Log.e(TAG, "Can't read data from sensor:", it) })
    }

    private fun storeToDB(data: Bmp180Data?) {
        val firebase = FirebaseDatabase.getInstance()
        val reference: DatabaseReference = firebase.getReference(SENSOR_DATA_REFERENCE)
        reference.push().setValue(data)
        Log.d(TAG, "${data.toString()}  saved into firebase")
    }

    private fun getSensorDataAsFlowable(): Flowable<Bmp180Data> {
        return Flowable.fromCallable { getSensorData() }
    }

    private fun getSensorData(): Bmp180Data {
        val temp = mBmp180.readTemperature()
        val press = mBmp180.readPressure()
        val alt = mBmp180.readAltitude()
        return Bmp180Data(temp.toInt(), press, alt.toInt())
    }

Далі напишемо клієнт для телефону. Для того щоб отримувати останній показ датчика, зареєструємо Firebase ChildEventListener і вкажемо ліміт

private val bmp180Reference: DatabaseReference by lazy { fireBase.getReference(CONNECTION_DATA_REFERENCE) }
private fun registerFirebaseListener() { bmp180Reference.orderByChild("date").limitToLast(1).addChildEventListener(this) }

І тільки з’являться нові дані у Firebase ми зможемо отримати їх у колбеці

    override fun onChildAdded(dataSnapshot: DataSnapshot?, p1: String?) {
        showContent()
        fillUI(dataSnapshot?.getValue(Bmp180Data::class.java))
    }

Ось і результат:

Код проекту доступний на GitHub. На зауваження, пропозиції з радістю дам відповіді у коментарях.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному1
LinkedIn



56 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Для измерения температуры и давления в этом проекте слишком много избыточности технических средств. Потребляет много энергии. Я не очень понимаю, чем тут хвалиться.

Метою не було створення найдешевшого, найенергоощадніщого термометра/барометра. Ця стаття по суті огляд можливостей Android Things

у статті якось пропущений момент встановлення Android на Raspberry Pi. чи можете вказати лінк на гайд по встановленню?

Так, дійсно, в статті я на цьому не зупинявся. гайд тут — developer.android.com/...hardware/raspberrypi.html

Все самое интересное и познавательное в коментах

Почему не выгружать с устройств данные через mqtt на сервер, а в приложении отображать данные с сервера? Минус только в том что нужен сервер)

З початку я теж планував сервер, але ідея була відкинута у зв’язку з існуванням готового умовно-безкоштовного рішення у вигляді Firebase для якого треба мінімум коду :)

Вставлю свои 5копеек)
Месяц назад рассказывал про AThings на андроид митапе в Торонто. Вроде много умных людей было, а вопросы все те же...почему не ардуино, шо это за чухня вообще, на кой на распбери андроид тулить есть же дебиан(распбиан, армбиан ... ). Прикол в том что наскоком это фик обьяснишь. Если в двух- четырех словах то:
— Почему не ардуино? Ардуино (как и любой другой MCU) как правило заточена под определенный кусок хардварной логики(например мерять напряжение с высокой частотой замеров-*500 раз в секунду) и предполагается для работы с RTOS(real time OS) — важно время реакции системы на внешнее взаимодействие, тогда как Linux/Android(в подавляющем большинстве) GPOS система (общего назначения) и предполагается что эта система должна менеджерить скоуп «ардуинок» подключенных к ней, в данном случае через вышеупомянутые юзерспейс драйвера
— Почему не дебиан? Андроид не совсем Linux, начиная от ядра, которое имеет мегатоны патчей, продолжая рутфсом который не совсем такой как в привычном линуксе, и заканчивая андроидовским фреймворком, который вообще сам по себе отдельная история. И все это сделано для того что бы: сделать дивайс мобильным(менее прожорливым), ограничить юзера от внутренностей системы(работает не тронь), сделать систему монолитной(все что в рамках сдк — работает, остальное на свой страх\риск\очумелые ручки), ну и одно из наиболее значимых особенностей — портирование(закон джавы — написал раз, запускаешь везде). Взять хотя бы убунту фон, вроде и убунту, а по образу и подобию андроида сделана, видимо не зря))
Мое мнение — платформа имеет будущее. Выбирать ее или что то другое — решать вам. В любом случае она пережила стадию Brillo, на мой взляд успешно, теперь же это всего лишь девелопер превью, чем она обрастет в «релизе» одному Богу\Гуглу известно...
P.S: androiddev.apptractor.ru/android-dev-podkast-25 вот ребята на AppТракторе в подкасте обсуждали, можно послушать, я там коментарий в дискасе написал с некоторыми поправками
P.P.S: если кому тема андроида как системы интересна, и он умеет помимо Java в Си\++, не боиться Linux, могу порекомендовать курс от GlobalLogic’a www.globallogic.com/...velopment-workshops-2017 . Не реклама)) Прошел курс сам, могу сказать что ведут его толковые ребята, к тому же, если не ошибаюсь, это бесплатно.

Вот это уже нормальное объяснение, и использование более дорогого девайса будет оправданным.

я також при потребі використовую Arduino як плату з Bootloader — це дозволяє обійтись без програматора: embedded.co.ua/...rduino-plus-atmel-studio
, а їхні бібліотеки не використовую взагалі.

Бутлоадер нормальна тема до поки не треба дебагер. Мені наприклад бутлоадера в STM32 теж вистачає. easystm32.ru/...hings/42-bootloader-stm32 ось один з прикладів як то працює. Та й на проді то звичайна річ при апдейтах(овер зе ейр) фірмвару MCU використовувати юарт, бо той же джитаг треба залатати так щоб туди ніхто не лазив, а ще й місце на нього на борді витрачати треба. Знаю історії що деякі вендори, при детекті джитага кірпічать сок(випалють його)

Atmel Studio має хороший симулятор, що дозволяє бачити всі регістри, ставити брейкпойнти та багато іншого. Це звичайно не замінить дебаг в залізі, але може бути дуже корисним. Враховуючи ціну AVR JTAG і те що не всі AVR його підтримують.

інша справа STM32, JTAG для нього в районі 20$

Симулятор то добре коли щось трохи більше ніж діодом поморгать чи коли є розуміння шо таке ті регітри на практиці)) Я памятаю колись в воркбенчі симулював таймер(555й). Спочатку навісом в кучу всьо спаяв, працює. Захотів лутом травануть кусок текстоліту, розвів платку зразу ж під всі компоненти що в навісі чіпляв. Воркбенч каже: давай симуляцію. Стартонув)) Воркбенч каже шо всьо пропало(мікруха таймера) вигорає, в навісі все працює нічого не гріється, все як має бути))Так з того часу я перестав довірти симулятору)) Шо мені подобається в ембедеді, так то шо там треба бути уважним шо куди чіпляєш, де яка напругаʼструм, не додивишся, чіп згорів, чи електроліт гарно так стрельнув)) Весело і жизнєно)) А воно все грошей коштує) Наука на все життя). Ще одне «фе» проти симулятора — забув наприклад підтяжку на інпут поставити, симулятор нічого не покаже, а вот якийсь імпульснік, чи крива трасіровка гємороя додасть, без досвіду так і не зрозумієш шо то за єрєсь приходить.
А з приводу джитага, так в стмці ж через свд в брейкпоінт ставати можна, а сам програматор всього 5 баксів коштує і це вже в Україні(www.mini-tech.com.ua/...ct&path=63&product_id=171) на ібеях я думаю трохи дешевше можна знайти.

Ще одне «фе» проти симулятора — забув наприклад підтяжку на інпут поставити, симулятор нічого не покаже
якщо включити внутрішню підтяжку то покаже.

ось так виглядала робота в симуляторі: www.youtube.com/watch?v=zGKaJy-3JgI

це була моя улюблена версія IDE — AVR studio — класний інтерфейс, швидка, займає не багато... Але зараз Atmel пішла іншим шляхом, за основу взяла Visual Studio та створила Atmel Studio — IDE монстр в поганому значенні слова — повільна, займає кілька гігабайт на диску...

хороша симуляція в Proteus (можна зібрати схему з мікроконтроллером і запрограмувати його своїм хексом)

ST-LINK V2 є на платах Discovery, для них не потрібний зовнішній програматор.

Я свою першу діскавері купив на радіоринку десь гривень за сорок, коли їх там з журналами безкоштовно відправляли) Та яка VL. Через рік-два я успішно спалив слейв(користувався потім нею як програматором). Лажа в тому що тепер та сама VLка коштує близько 500гривень, в той час як друзі з піднебесної барижать «лайк адрдуіно» формат бордами, без вшитого бутлоадера, за 2 — 3 долари (ну там і 64 корпус а не 128), тобто шити її тільки стлінком(ну або діскавері якшо є). Плюс стлінк зручно возити з собою, а ще плюс для мене що там непоганий стабілізатор стоїть на 3.3, ніколи не міряв скільки він може витянути але використовув його в цьому сенсі))

враховуючи ціну

ST-LINK V2
 зручніше його купити ніж discovery :)

також маю китайський борд для STM та stm32 nucleo, правда останнім часом працюю тільки з PSoC 4

повністю погоджуюсь :)

Да чего уж урезаный, обычный андроид)) Урезаный андроид, считай без рантайма(джавы) был «проджект брило» (сингс от нее произошел, точнее от целей для которых брило был предназначен). Кто подписывался на брило должен быть в курсе, что как система без рантайма она была на много енергоефективней, но жутко неудобной в плане работы, местами глючной. Про порог входа вообще молчу. В сингс пришлось балансировать. Если взять к примеру обычный андроид телефон, то там львиную долю батареи отжирает экран и гугловые срвисы. Тут же сервисы порезаны, от екрана вообще можно отказаться. Да и в общем то кернел так пропатчен, что его основная задача «спать» по максимуму. В современных дивайсах например тяжелые фоновые задачи стараются перекладывать на более енергоефективные железки(к примеру примеру аудиоплеер выноситься в отдельный чип, ядро просыпается говорит чипу откуда читать медийку и засыпает, ждет другие прерывания, а чип декодит себе указаные области памяти и воспроизводит музычку). Та же штука с RIL(radio interface layer), это даже более привычный кейс, так как он был вынесен в отдельный модуль с самого начала по разным причинам, но как с ним работать по енергии — на ваше усмотрение, хотите, держите LTE все время, а хотите поднимайте канал только по надобности. Так что как по мне, так потребление иснтансами виртульных машин в этом случае местами можно вообще чуть ли не принебрегать, если грамотно все прикрутить в кучу. Да и не стоит забывать про ARM(J) чипы которые поддерживают инструкции джавы на хардварном уровне. Грубо говоря, тут пожертвовали долей перфоманса и енергии но для удобства работы с платформой. Опять же выбирать вам.
По поводу ардуинки, я с вами согласен что проще и быстрее, но под ардуинкой стоить понимать что это обычный Atmelовский микроконтроллер, который может использоваться с "Arduino«(считай фреймворком) а можно взять любую Арду подобную борду, потереть бутлоадер, напилить свой инит, и это будет какой нибуть Васядуино. А если на готовых бордах стоит лишний обвес так вообще не вижу смысла Атмегами голову морочить, если те же атмеловские «атини» будут еще дешевле, и их хватит с головой. Если говорить про продакшен, то по тем же ценам рентабельнее взять STMку или NXPишку по цене меги, что и делают, и работать с ней не через «ручками». Все зависит конечно от потребностей проекта и «наполнения» головы разработчика.
Отсюда как мне кажеться мораль топика а точнее платформы в том, что бы заинтересовать разработчиков «вникать» в мир железа, сегодня он поморгает диодом, а «завтра» полезет в кернел, через год станет каким никаким полезным звеном. Как выражаются коментаторы «любимой редакции» — мамкиным борщехлебам, если они хотят зарабатывать на зеркалки и дальше, придется таки подстраиваться под потребности рынка, которые растут, так что без таких вот «ардуинок сингсов нод.м.ц.ю» сделать свитч, и заполнить дыры в сфере будет вообще не реально, а всякие заводы где пашут роботы а не люди нужны уже вчера. С чем то работать дороже, с чем то дешевле(тот же акк Ios стоит 100баксов, против плеймаркета за 25), но и там и там есть люди которые туда идут. Хорошо это или плохо, хз. Покалечит к примеру их робот парочку людей перед тем как станет нормально работать, потому шо на ардуинке а не на плисе, хз. Упадет какой нить дрон на голову кому то, потому что на джаве а не на асамблере, хз. Експертиза она ж со временм приходит, и лучше бы раньше чем вообще никогда.

Останнім часом стало більше коментарів типу
1. «Класно що на Arduino»
2. «Чому не використано Arduino ?»

это обычный Atmelовский микроконтроллер, который может использоваться с "Arduino"(считай фреймворком)
є багато різних мікроконтроллерів: AVR, PIC, PSoC, STM32, TIVA, Freescale, NXP.... із нормальними IDE та можливістю дебагу. Також не можу зрозуміти для чого люди себе обмежують Arduino платами.

Бо в Ардуїни таке позиціонування-реклама) То шо пишуть в гайдах діайвай чи на форумах легко читати і добре повторювати. Візьміть роботу GPIO: як підняти пін на ардуїні(2 строки), і як підняти його на тій же ST-шці. Але то й так добре, якщо хоч людина зрозуміє що таке GPIO, потім, як Віктор написав — треба буде щось серьйозніше, буде хоч розуміти куди дивитись. Буде хоч якесь розуміння чим той зоопарк термінів(периферії) відрізняється. Як приспічить то й з пехапе в джаву тікають а то й в сі, база є(змінні, цикли, методи-функції, структури), майже всьо то саме. Якшо взяти той лєго, то дійсно іграшка, коли ардуінка хоч трохи себе оправдовує як засіб для обкатки роботи з залізячками.

Візьміть роботу GPIO: як підняти пін на ардуїні(2 строки), і як підняти його на тій же ST-шці.
так, на STM32 треба коректно заповнити структуру :)

Не сприйміть за рекламу, але на PSoC можна працювати з GPIO не написавши і 2 рядків коду, ось приклад: embedded.co.ua/psoc-kurs-2-hello-world

P.S. своє знайомство з мікроконтроллерами починав з кіта STK500(www.atmel.com/tools/stk500.aspx) та AVR Assembler, дізнався багато що відбувається в МК при виконанні кожної команди....

P.P.S щоб включити лед на Assembler достатньо було 2 команд:
sbi DDRB, 0×00 ; configure port B to output mode
sbi PORTB, 0×00 ; set bit 0 in port B to logic 1

В современных дивайсах например тяжелые фоновые задачи стараются перекладывать на более енергоефективные железки(к примеру примеру аудиоплеер выноситься в отдельный чип, ядро просыпается говорит чипу откуда читать медийку и засыпает, ждет другие прерывания, а чип декодит себе указаные области памяти и воспроизводит музычку).
Это как раз типичный пример энерго-неэффективного применения.

Автор молодец, но не понятно что такое Android Things и почему не Ардуино.

Если можно то просьба переписать статью с объяснением что это и для чего, а не просто ссылки. Что можно сделать то же самое на edison joulie и прочем железе. Что архитектура «мой девайс считывает с датчика отправляет в облачную базу из которой потом может вычитать приложение клиент под андроид»

Много коментов по поводу Arduino — я бы тоже выбрал именно его из — за цены данного прибора (China Arduino nano + ethernet shield < 200 uah vs Rasp ~ 1000 uah)

По суті Android Things трішки «кастрована» версія андроіда .Недоступні стандартні програми а також деякі Google API. На даний момент Android API 24 (Android 7 Nougat) при чому Гугл буде менеджити оновлення ОС, відповідно відпаде проблема сегментації яка зараз присутня для андроід смартфонів.Теоритично написавши програму раз ви зможете заінсталювати apk файл на будь якому девайсі з Android Things будь то RPi 3 чи Intel Edison в незалежності від архітектури (ARM, x86). Також на мою думку однозначно зменшуються поріг входження в IoT програмування : для цього достатньо зняння Java та Android SDK.

Что архитектура «мой девайс считывает с датчика отправляет в облачную базу из которой потом может вычитать приложение клиент под андроид»
В прикладі зі статті було використано Firabase — умовно-безкоштовну хмарну базу даних яка надається як сервіс SaaS відповідно як RPi так і андроід смартфон підключені до однієї бази, що досить зручно не використовуючи власний сервер. В статті я хотів показати як з легкістю та швидко можна написати якийсь невеличкий проект використовуючи Гугл/андроід API. Для прикладу можна спробувати підключити камеру і використовуючи той же Mobile Vision API зчитувати баркоди, розпізнавати обличчя, чи розпізнавати текст з картинок і це все прямо на девайсі! Думаю такого роду задачу на ардуіно буде складно вирішити.

Спасибо за ответ. Сереж постарайся и перепиши статью если можно )

Android Things
Чи правильно я зрозумів — це андроїд який ставиться на RPi ?

Так, це прошивка яка ставиться на девайси, і не тільки RPi. повний перелік тут developer.android.com/...dware/developer-kits.html

Дякую, я зрозумів. Певно відповідь гугла на Windows IoT.

Насправді ціллю статті було показати як легко можна працювати з IoT девайсами використовоючи Android Things а не написати крутий проект :). Технологія поки що в deleloper preview, інформації мало тому я і вирішив поділитись інформацією.

А яка ,на вашу думку, задача ІоТ не рівень школи ?

наприклад проекти студентів Корнельського університету:
people.ece.cornell.edu/...es/ece4760/FinalProjects
people.ece.cornell.edu/...es/ece5760/FinalProjects

А який тиск буде показувати датчик?

На моїй висоті сенсор BME-280 показує значення майже як у синоптиків, altitude теж визначає правильно. Всі значення в межах заявленої виробником похибки. І це без калібрування. Точність у цих сенсорів прийнятна. І невідомо хто більш точний: синоптики у своїх прогнозах чи онлайн-сенсор.

Что действительно смешно, так это когда великовозрастной программист оставляет комментарий, который больше подходит школьнику. Автор раскурил Android Things, который вышел месяц назад, и у которого есть шансы стать широко распространенной платформой для интернета вещей. И когда приводят простой пример для того, чтоб показать как это приблизительно работает, всегда находится эксперт, который скажет про Ардуино или про то, что можно использовать ртутный барометр, а для определения влажности воздуха заюзать конский волос. А потом взять и промасштабировать это все на украинских программистов. Отлично сработано

Не проблема, можете использовать конский волос в купе с отлаженными протоколами. Вас никто не заставляет использовать Android Things, но разве это повод намекать на то, что кто-то школьник и делать вывод про украинских программистов?

А у этого шансов нет, очередная хипстерская поделка, которая скоро забудется, как и куча других подобных.
Це ваша приватна думка, поживемо побачимо. А щодо переходу на особистості я вважаю як мінімум це низько як для «великовозрастного» програміста.

Это вы точно про Гугл говорите? Хипстерская поделка, говорите?

А насчет конского волоса — по чем калибровать будете? Вы когда ни будь из него таки гигрометр делали? С шишкой и то меньше гемороя, при сопоставимой «точности».

Это вы точно про Гугл говорите? Хипстерская поделка, говорите?
Да, одна из многих. Гугл много фигни производит, которая, как ей и положено быстро уходит в небытие.

и кстати, почему — бы этому программисту не показать, то что Он сам пишет ))) уверен не покажет ))))))

так тем более нужно поддерживать молодых )))

«Можно и на чем подешевле ардуинки сделать. (а ардуинки есть еще очень маленькие по размерам). » Проекти на Ардуіно теж рівень школяра.

Зараз є багато статтей типу «Arduino + якийсь сенсор», а стаття автора щось новеньке.
Хоча з описаним завданням може справитись esp8266.

Підписатись на коментарі