Alvaro Viebrantz
@alvaroviebrantz
aviebrantz.com.br
Guilherme Campos
@guilhermefscampos
IoT e dispositivos embarcados
Cameras
Gateways
HVAC Control
Smart Meters
Point of Sale
Inventory Control
Interactive Ads
Vending Machines
Security Systems
Smart Doorbells
Routers
Energy Monitors
Asset Tracking
Fleet Management
Driver Assist
Predictive Service
Ideal para dispositivos poderosos e inteligentes na
ponta e que precisam de segurança.
Do Protótipo à Produção
Android SDK Android Studio Play Services Firebase Cloud Platform
Mesmo ecossistema do Android
IoT Developer
Console
Automatic
Security Updates
Signed Images Verified Boot
Deploy fácil e seguro
SoM
Architecture
Google Managed
BSP
Produção em escala
Android Things para Desenvolvedores
Telas são opcionais
Considere alternativas de UI
Problemas : (
● Developer Preview
● Ainda está no começo
● Algumas APIs ainda não funcionam
○ Até a última versão não tinha Bluetooth
○ Permissões estão bastante bugadas
Eletrônica básica
Componentes
Conexões
Protoboard - Placa de prototipação de
eletrônicos
Jumpers - Conectar os componentes na
Protoboard
Componentes
Entradas e saidas básicas
LEDs - Emitem luzes visíveis quando uma
corrente passa por ele
Botões - Permitem que a eletricidade flua entre
as duas extremidades dos contatos
Digital
Entradas e saidas
Serial - Série de 1s e 0s digitais que
representam algum padrão de comunicação
Digital - Valores binários de sinais de voltagem,
sendo o valor 1 se estiver próximo de Vcc e 0 se
estiver perto do terra.
Analógico
Entradas e saidas
Leitura Analógica - Voltagem proporcional a
condição física medida.
PWM - Valores binários de sinais de voltagem
em uma determinada frequência que “parecem”
ter uma saída analógica
Resistores
Reduz o fluxo de corrente
Lei de Ohm - A corrente que passa entre dois
condutores é diretamente proporcional a
voltagem entre os dois pontos .
V = I * R
V é voltagem
I é a corrente
R é a resistência
GPIO
General Purpose Input/Output
Diagramas
Projetos unindo tudo isso
Construindo um app Android Things
dependencies {
provided 'com.google.android.things:androidthings:...'
}
<application ...>
<uses-library android:name="com.google.android.things"/>
<activity ...>
...
<!-- Launch activity automatically on boot -->
<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>
</activity>
</application>
Home Activity
GPIO
PWM
I2
C
SPI
UART
Input
Sensors
GPS
Peripheral
Driver
Library
Peripheral I/O
User Drivers
O que é Machine Learning?
Machine Learning
Uma area dentro da IA
Exemplo
Exemplo
Exemplo
Exemplo
Novo problema? Comece tudo de novo!
Machine Learning - Aprendizagem de máquina
● Aprendizagem supervisionada
● Aprendizagem não-supervisionada
● Aprendizagem por reforço
Como você pode iniciar com
Machine Learning?
Como você pode iniciar com Machine Learning?
Três caminhos, com diferentes complexidades:
(1) Usar a Cloud ou a Mobile API (Vision, Natural Language,
etc.)
(2) Usar um arquitetura existente e retreinar ela ou fazer um
ajuste fino para o seu conjunto de dados
(3) Desenvolver o seu próprio modelo para resolver novos
problemas
Mais
flexível,
mas
requer
maior
esforço
Cloud Machine Learning APIs
Veja, Ouça e Entenda o mundo
Cloud
Natural Language
Cloud
Speech
Cloud
Vision
Faces
Faces, marcações faciais, emoções
OCR
Ler e extrair texto, com suporte
para > 10 linguagens
Classificação
Detectar entidades de mobília a
meios de transporte
Logos
Identificar logos de produtos
Marcos e Propriedades da
imagem
Busca Segura
Detectar conteúdo explícito - adulto,
violência, médicas e fraudes
Cloud Vision API
Uso da API: Detectar objetos em uma imagem
Imagem Itens
Detectados
Vision API
Criar uma
requisição
JSON com a
imagem
Processar
o JSON da
resposta
Chamar a
API REST1 2 3
Cloud Natural Language API
Extrair frases, identificar partes da fala e
criar uma árvore de dependências para
cada sentença.
Identificar entidades e classificá-las por
tipos, como pessoa, organização local,
evento, produto e media.
Entender o sentimento dominante do
bloco de texto.
Análise de Sintaxe Reconhecimento de entidades
Análise de sentimentos
Cloud Speech API
Automatic Speech Recognition (ASR)
powered by deep learning neural
networking to power your
applications like voice search or
speech transcription.
Recognizes over 80
languages and variants
with an extensive
vocabulary.
Returns partial
recognition results
immediately, as they
become available.
Filter inappropriate
content in text results.
Audio input can be captured by an application’s
microphone or sent from a pre-recorded audio
file. Multiple audio file formats are supported,
including FLAC, AMR, PCMU and linear-16.
Handles noisy audio from many
environments without requiring
additional noise cancellation.
Audio files can be uploaded in the
request and, in future releases,
integrated with Google Cloud
Storage.
Automatic Speech Recognition Global Vocabulary Inappropriate Content
Filtering
Streaming Recognition
Real-time or Buffered Audio Support Noisy Audio Handling Integrated API
Mobile Vision API
Provendo visão para aplicações diretamente no dispositivo
Face API
faces, marcações faciais,
olhos abertos, sorrisos
Barcode API
Códigos de barra 1D e 2D
Text API
Alfabeto latino / estrutura
Common Mobile Vision API
Suporte para detecção e rastreio de imagens e vídeos no dispositivo
Face API
Photo credit developers.google.com/vision
Googly Eyes Android App
Video credit Google
1. Create a face detector for facial landmarks (e.g., eyes)
3. For each face, draw the eyes
FaceDetector detector = new FaceDetector.Builder()
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.build();
SparseArray<Face> faces = detector.detect(image);
for (int i = 0; i < faces.size(); ++i) {
Face face = faces.valueAt(i);
for (Landmark landmark : face.getLandmarks()) {
// Draw eyes
2. Detect faces in the image
Detecção de texto
Detecção de linguagem
Entendimento da estrutura textual
Photo credit Getty Images
Estrutura Textual
Blocos
Linhas
Palavras
Linhas
Palavras Palavras Palavras
Detecção de código de
barras
1D barcodes
EAN-13/8
UPC-A/E
Code-39/93/128
ITF
Codabar
2D barcodes
QR Code
Data Matrix
PDF-417
AZTEC
UPC
DataMatrix
QR Code
PDF 417
Video and image credit Google
Combinado Visão e Tradução
● Biblioteca de machine
learning Open source
● Funções especificas para
Deep Learning
● Para pesquisa and produção
● Licença Apache 2.0
Um array multidimensional.
Um grafo de operações.
Escalar S = 42
Vetor V = [1, 2, 3, 4]
Matriz M = [[1, 0],[0, 1]]
Cubo ...
Vetor n-dimensional, onde n = [0, 1, 2, 3, ...]
Grafo de fluxo de dados
A computação é definida com um grafo acíclico dirigido
para otimizar uma função objetivo
● Grafo é definido em uma linguagem de nível alto
(Python)
● Grafo é compilado e otimizado
● Grafo é executado nos dispositivos disponíveis (CPU,
GPU)
● Dados (tensores) fluem através do grafo
Arquitetura do
Core TensorFlow Execution System
CPU GPU Android iOS ...
C++ front end Python front end ...
Raspberry
Pi
DatacentersSeu laptop Android iOS
Portável e Escalável
Transferência de conhecimento
Inception V3 - Modelo Open Source
Toucan 71,27%
Hornbill 16,84%
School Bus 1,65%
Import keras
img_width, img_height, img_channels = 120, 120, 3
train_data_dir = 'train'
validation_data_dir = 'valid'
nb_train_samples = 4000
nb_validation_samples = 400
epochs = 1
batch_size = 32
a = Input(shape=(img_width, img_height, img_channels))
model = keras.applications.inception_v3.InceptionV3(weights='imagenet', include_top=False, input_tensor=a)
model.trainable = False
x = model.output
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(256, activation='relu')(x)
x = keras.layers.Dropout(0.5)(x)
predictions = keras.layers.Dense(1, activation='sigmoid')(x)
model_final = keras.models.Model(inputs=model.input, outputs=predictions)
model_final.compile(loss='binary_crossentropy', optimizer="adadelta", metrics=['accuracy'])
Predito: Cachorro
Predito: Gato
Criando o seu modelo
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import RMSprop
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
mnist = read_data_sets( "MNIST_data/", one_hot=True)
batch_size = 100
epochs = 20
x_train, y_train = mnist.train.next_batch( 50000)
x_test, y_test = mnist.test.next_batch( 10000)
model = Sequential()
model.add(Dense( 32, activation='relu', input_shape =(784,)))
model.add(Dense( 128, activation='relu'))
model.add(Dense( 32, activation='relu'))
model.add(Dense( 10, activation='softmax'))
model.summary()
model.compile( loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size=batch_size, verbose=1, validation_data =(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
model.save( 'my_model.h5')
A.I Candy Dispenser
Máquina de doces inteligente
Diagrama
GPIO
PWM
I2
C
SPI
UART
Peripheral I/O
class CandyMachine(gpio: String): AutoCloseable{
private val CANDY_TIMEOUT = 3*1000L
private var mCandyPin: Gpio? = null
private var mCandiesTimer: CountDownTimer? = null
Init{
val service = PeripheralManagerService()
mCandyPin = service.openGpio(gpio)
mCandyPin?.setDirection(
Gpio.DIRECTION_OUT_INITIALLY_LOW)
mCandyPin?.setActiveType(Gpio.ACTIVE_HIGH)
}
}
Controle de GPIO mais baixo nível
fun giveCandies() {
mCandyPin?.value = true
mCandiesTimer?.cancel()
mCandiesTimer = object: CountDownTimer(
CANDY_TIMEOUT, CANDY_TIMEOUT) {
override fun onTick(remainingMillis: Long) {}
override fun onFinish() {
mCandyPin?.value = false
}
}
mCandiesTimer?.start()
}
GPIO
PWM
I2
C
SPI
UART
Input
Sensors
GPS
Peripheral I/O
User Drivers
dependencies {
compile 'com.google.android.things.contrib:driver-button:...'
}
Leitura do botão utilizando um driver
val mButtonEventListener = { _: Button, pressed: Boolean ->
Log.d(TAG, "Button is pressed: " + pressed)
if(pressed){
when(mGameState){
WAITING_PLAYER -> {
updateGameState(WAITING_PHOTO)
}
WAITING_PHOTO -> {
updateGameState(ANALYZING_PHOTO)
}
WAITING_RECLAIM_PRIZE -> {
mCandyMachine?.giveCandies()
updateGameState(WAITING_PLAYER)
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mButton = Button(BUTTON_PIN,
Button.LogicState.PRESSED_WHEN_LOW)
mButton?.setOnButtonEventListener(mButtonEventListener)
updateGameState(WAITING_PLAYER)
}
dependencies {
compile nz.geek.android.things:things-drivers:...'
}
mDisplay = Display(LCD_I2C_BUS)
mDisplay?.clear()
mDisplay?.print(1, "A.I. Candy Dispenser")
mDisplay?.printCenter(2, "")
mDisplay?.printCenter(3, "Press the Button")
mDisplay?.printCenter(4, "To start")
Display 20x4 Serial i2C
Pi Camera - Exatamente igual ao Android Padrão
The Power of
Android
=
dependencies {
compile ’com.google.api-client:google-api-client-android:...'
compile ’com.google.apis:google-api-services-vision:...'
}
Vision API
fun annotateImage(imageBytes: ByteArray): Map<String, Float>{
// Construct the Vision API instance
val httpTransport = AndroidHttp.newCompatibleTransport()
val jsonFactory = GsonFactory.getDefaultInstance()
val initializer = VisionRequestInitializer(CLOUD_VISION_API_KEY)
val vision = Vision.Builder(httpTransport, jsonFactory, null)
.setApplicationName("AI Candy Dispenser")
.setVisionRequestInitializer(initializer)
.build()
Vision API
// Create the image request
val imageRequest = AnnotateImageRequest()
val image = Image()
image.encodeContent(imageBytes)
imageRequest.image = image
// Add the features we want
val labelDetection = Feature()
labelDetection.type = "LABEL_DETECTION"
labelDetection.maxResults = 10
imageRequest.features = listOf(labelDetection)
// Batch and execute the request
val requestBatch = BatchAnnotateImagesRequest()
requestBatch.requests = listOf(imageRequest)
val response = vision.images()
.annotate(requestBatch)
.setDisableGZipContent(true)
.execute()
The Power of
Android
Automatic and
Secure
Managed by
Google
https://github.com/alvarowolfx/ai-candy-dispenser
Open Source - Máquina de Doces Inteligente
https://github.com/riggaroo/android-things-electricity-monitor
Codelab - Estação Meteorológica AndroidThings
https://riggaroo.co.za/android-things-building-distributed-piano/
Codelab - Piano distribuido
https://codelabs.developers.google.com/codelabs/androidthings-weatherstation
Codelab - Estação Meteorológica AndroidThings
Cloud
Natural Language
Cloud
Speech
Cloud
Vision
https://codelabs.developers.google.com/codelabs/firebase-cloud-functions
Codelab - Cloud Function + Cloud Vision API
Google's IoT Developers Community
https://g.co/iotdev
Google's IoT Solutions
https://iot.google.com
Android Things SDK
https://developer.android.com/things
Alvaro Viebrantz
@alvaroviebrantz
aviebrantz.com.br
Guilherme Campos
@guifscampos

Internet das Coisas com Android things e Machine Learning

  • 1.
  • 2.
  • 3.
    Cameras Gateways HVAC Control Smart Meters Pointof Sale Inventory Control Interactive Ads Vending Machines Security Systems Smart Doorbells Routers Energy Monitors Asset Tracking Fleet Management Driver Assist Predictive Service Ideal para dispositivos poderosos e inteligentes na ponta e que precisam de segurança.
  • 4.
    Do Protótipo àProdução
  • 5.
    Android SDK AndroidStudio Play Services Firebase Cloud Platform Mesmo ecossistema do Android
  • 6.
    IoT Developer Console Automatic Security Updates SignedImages Verified Boot Deploy fácil e seguro
  • 7.
  • 8.
    Android Things paraDesenvolvedores
  • 11.
  • 12.
    Problemas : ( ●Developer Preview ● Ainda está no começo ● Algumas APIs ainda não funcionam ○ Até a última versão não tinha Bluetooth ○ Permissões estão bastante bugadas
  • 13.
  • 14.
    Componentes Conexões Protoboard - Placade prototipação de eletrônicos Jumpers - Conectar os componentes na Protoboard
  • 15.
    Componentes Entradas e saidasbásicas LEDs - Emitem luzes visíveis quando uma corrente passa por ele Botões - Permitem que a eletricidade flua entre as duas extremidades dos contatos
  • 16.
    Digital Entradas e saidas Serial- Série de 1s e 0s digitais que representam algum padrão de comunicação Digital - Valores binários de sinais de voltagem, sendo o valor 1 se estiver próximo de Vcc e 0 se estiver perto do terra.
  • 17.
    Analógico Entradas e saidas LeituraAnalógica - Voltagem proporcional a condição física medida. PWM - Valores binários de sinais de voltagem em uma determinada frequência que “parecem” ter uma saída analógica
  • 18.
    Resistores Reduz o fluxode corrente Lei de Ohm - A corrente que passa entre dois condutores é diretamente proporcional a voltagem entre os dois pontos . V = I * R V é voltagem I é a corrente R é a resistência
  • 19.
  • 20.
  • 21.
    Construindo um appAndroid Things
  • 22.
    dependencies { provided 'com.google.android.things:androidthings:...' } <application...> <uses-library android:name="com.google.android.things"/> <activity ...> ... <!-- Launch activity automatically on boot --> <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> </activity> </application> Home Activity
  • 23.
  • 24.
    O que éMachine Learning?
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
    Novo problema? Comecetudo de novo!
  • 31.
    Machine Learning -Aprendizagem de máquina ● Aprendizagem supervisionada ● Aprendizagem não-supervisionada ● Aprendizagem por reforço
  • 32.
    Como você podeiniciar com Machine Learning?
  • 33.
    Como você podeiniciar com Machine Learning? Três caminhos, com diferentes complexidades: (1) Usar a Cloud ou a Mobile API (Vision, Natural Language, etc.) (2) Usar um arquitetura existente e retreinar ela ou fazer um ajuste fino para o seu conjunto de dados (3) Desenvolver o seu próprio modelo para resolver novos problemas Mais flexível, mas requer maior esforço
  • 34.
    Cloud Machine LearningAPIs Veja, Ouça e Entenda o mundo
  • 35.
  • 36.
    Faces Faces, marcações faciais,emoções OCR Ler e extrair texto, com suporte para > 10 linguagens Classificação Detectar entidades de mobília a meios de transporte Logos Identificar logos de produtos Marcos e Propriedades da imagem Busca Segura Detectar conteúdo explícito - adulto, violência, médicas e fraudes Cloud Vision API
  • 37.
    Uso da API:Detectar objetos em uma imagem Imagem Itens Detectados Vision API Criar uma requisição JSON com a imagem Processar o JSON da resposta Chamar a API REST1 2 3
  • 38.
    Cloud Natural LanguageAPI Extrair frases, identificar partes da fala e criar uma árvore de dependências para cada sentença. Identificar entidades e classificá-las por tipos, como pessoa, organização local, evento, produto e media. Entender o sentimento dominante do bloco de texto. Análise de Sintaxe Reconhecimento de entidades Análise de sentimentos
  • 39.
    Cloud Speech API AutomaticSpeech Recognition (ASR) powered by deep learning neural networking to power your applications like voice search or speech transcription. Recognizes over 80 languages and variants with an extensive vocabulary. Returns partial recognition results immediately, as they become available. Filter inappropriate content in text results. Audio input can be captured by an application’s microphone or sent from a pre-recorded audio file. Multiple audio file formats are supported, including FLAC, AMR, PCMU and linear-16. Handles noisy audio from many environments without requiring additional noise cancellation. Audio files can be uploaded in the request and, in future releases, integrated with Google Cloud Storage. Automatic Speech Recognition Global Vocabulary Inappropriate Content Filtering Streaming Recognition Real-time or Buffered Audio Support Noisy Audio Handling Integrated API
  • 40.
    Mobile Vision API Provendovisão para aplicações diretamente no dispositivo
  • 41.
    Face API faces, marcaçõesfaciais, olhos abertos, sorrisos Barcode API Códigos de barra 1D e 2D Text API Alfabeto latino / estrutura Common Mobile Vision API Suporte para detecção e rastreio de imagens e vídeos no dispositivo
  • 42.
    Face API Photo creditdevelopers.google.com/vision
  • 43.
    Googly Eyes AndroidApp Video credit Google 1. Create a face detector for facial landmarks (e.g., eyes) 3. For each face, draw the eyes FaceDetector detector = new FaceDetector.Builder() .setLandmarkType(FaceDetector.ALL_LANDMARKS) .build(); SparseArray<Face> faces = detector.detect(image); for (int i = 0; i < faces.size(); ++i) { Face face = faces.valueAt(i); for (Landmark landmark : face.getLandmarks()) { // Draw eyes 2. Detect faces in the image
  • 44.
    Detecção de texto Detecçãode linguagem Entendimento da estrutura textual Photo credit Getty Images
  • 45.
  • 46.
    Detecção de códigode barras 1D barcodes EAN-13/8 UPC-A/E Code-39/93/128 ITF Codabar 2D barcodes QR Code Data Matrix PDF-417 AZTEC UPC DataMatrix QR Code PDF 417 Video and image credit Google
  • 47.
  • 48.
    ● Biblioteca demachine learning Open source ● Funções especificas para Deep Learning ● Para pesquisa and produção ● Licença Apache 2.0
  • 50.
    Um array multidimensional. Umgrafo de operações.
  • 51.
    Escalar S =42 Vetor V = [1, 2, 3, 4] Matriz M = [[1, 0],[0, 1]] Cubo ... Vetor n-dimensional, onde n = [0, 1, 2, 3, ...]
  • 52.
    Grafo de fluxode dados A computação é definida com um grafo acíclico dirigido para otimizar uma função objetivo ● Grafo é definido em uma linguagem de nível alto (Python) ● Grafo é compilado e otimizado ● Grafo é executado nos dispositivos disponíveis (CPU, GPU) ● Dados (tensores) fluem através do grafo
  • 53.
    Arquitetura do Core TensorFlowExecution System CPU GPU Android iOS ... C++ front end Python front end ...
  • 54.
  • 55.
  • 56.
    Inception V3 -Modelo Open Source
  • 57.
  • 58.
    Import keras img_width, img_height,img_channels = 120, 120, 3 train_data_dir = 'train' validation_data_dir = 'valid' nb_train_samples = 4000 nb_validation_samples = 400 epochs = 1 batch_size = 32 a = Input(shape=(img_width, img_height, img_channels)) model = keras.applications.inception_v3.InceptionV3(weights='imagenet', include_top=False, input_tensor=a) model.trainable = False x = model.output x = keras.layers.Flatten()(x) x = keras.layers.Dense(256, activation='relu')(x) x = keras.layers.Dropout(0.5)(x) predictions = keras.layers.Dense(1, activation='sigmoid')(x) model_final = keras.models.Model(inputs=model.input, outputs=predictions) model_final.compile(loss='binary_crossentropy', optimizer="adadelta", metrics=['accuracy']) Predito: Cachorro Predito: Gato
  • 59.
  • 60.
    from keras.models importSequential from keras.layers import Dense from keras.optimizers import RMSprop from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets mnist = read_data_sets( "MNIST_data/", one_hot=True) batch_size = 100 epochs = 20 x_train, y_train = mnist.train.next_batch( 50000) x_test, y_test = mnist.test.next_batch( 10000) model = Sequential() model.add(Dense( 32, activation='relu', input_shape =(784,))) model.add(Dense( 128, activation='relu')) model.add(Dense( 32, activation='relu')) model.add(Dense( 10, activation='softmax')) model.summary() model.compile( loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) history = model.fit(x_train, y_train, batch_size=batch_size, verbose=1, validation_data =(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) model.save( 'my_model.h5')
  • 61.
    A.I Candy Dispenser Máquinade doces inteligente
  • 62.
  • 63.
  • 64.
    class CandyMachine(gpio: String):AutoCloseable{ private val CANDY_TIMEOUT = 3*1000L private var mCandyPin: Gpio? = null private var mCandiesTimer: CountDownTimer? = null Init{ val service = PeripheralManagerService() mCandyPin = service.openGpio(gpio) mCandyPin?.setDirection( Gpio.DIRECTION_OUT_INITIALLY_LOW) mCandyPin?.setActiveType(Gpio.ACTIVE_HIGH) } } Controle de GPIO mais baixo nível fun giveCandies() { mCandyPin?.value = true mCandiesTimer?.cancel() mCandiesTimer = object: CountDownTimer( CANDY_TIMEOUT, CANDY_TIMEOUT) { override fun onTick(remainingMillis: Long) {} override fun onFinish() { mCandyPin?.value = false } } mCandiesTimer?.start() }
  • 65.
  • 66.
    dependencies { compile 'com.google.android.things.contrib:driver-button:...' } Leiturado botão utilizando um driver val mButtonEventListener = { _: Button, pressed: Boolean -> Log.d(TAG, "Button is pressed: " + pressed) if(pressed){ when(mGameState){ WAITING_PLAYER -> { updateGameState(WAITING_PHOTO) } WAITING_PHOTO -> { updateGameState(ANALYZING_PHOTO) } WAITING_RECLAIM_PRIZE -> { mCandyMachine?.giveCandies() updateGameState(WAITING_PLAYER) } } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mButton = Button(BUTTON_PIN, Button.LogicState.PRESSED_WHEN_LOW) mButton?.setOnButtonEventListener(mButtonEventListener) updateGameState(WAITING_PLAYER) }
  • 67.
    dependencies { compile nz.geek.android.things:things-drivers:...' } mDisplay= Display(LCD_I2C_BUS) mDisplay?.clear() mDisplay?.print(1, "A.I. Candy Dispenser") mDisplay?.printCenter(2, "") mDisplay?.printCenter(3, "Press the Button") mDisplay?.printCenter(4, "To start") Display 20x4 Serial i2C
  • 68.
    Pi Camera -Exatamente igual ao Android Padrão The Power of Android =
  • 69.
    dependencies { compile ’com.google.api-client:google-api-client-android:...' compile’com.google.apis:google-api-services-vision:...' } Vision API fun annotateImage(imageBytes: ByteArray): Map<String, Float>{ // Construct the Vision API instance val httpTransport = AndroidHttp.newCompatibleTransport() val jsonFactory = GsonFactory.getDefaultInstance() val initializer = VisionRequestInitializer(CLOUD_VISION_API_KEY) val vision = Vision.Builder(httpTransport, jsonFactory, null) .setApplicationName("AI Candy Dispenser") .setVisionRequestInitializer(initializer) .build()
  • 70.
    Vision API // Createthe image request val imageRequest = AnnotateImageRequest() val image = Image() image.encodeContent(imageBytes) imageRequest.image = image // Add the features we want val labelDetection = Feature() labelDetection.type = "LABEL_DETECTION" labelDetection.maxResults = 10 imageRequest.features = listOf(labelDetection) // Batch and execute the request val requestBatch = BatchAnnotateImagesRequest() requestBatch.requests = listOf(imageRequest) val response = vision.images() .annotate(requestBatch) .setDisableGZipContent(true) .execute()
  • 71.
    The Power of Android Automaticand Secure Managed by Google
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
    Google's IoT DevelopersCommunity https://g.co/iotdev Google's IoT Solutions https://iot.google.com Android Things SDK https://developer.android.com/things Alvaro Viebrantz @alvaroviebrantz aviebrantz.com.br Guilherme Campos @guifscampos