實(shí)驗(yàn)設(shè)備
Raspberry Pi 3 with Android Things
DHT12 溫濕度傳感器
DHT12 實(shí)物圖
DHT12.jpg
端口連接
pinout-raspberrypi.png
獲得 I2C 總線名稱(chēng)
PeripheralManagerService manager = new PeripheralManagerService();
List<String> deviceList = manager.getI2cBusList();
if (deviceList.isEmpty()) {
Log.i(TAG, "No I2C bus available on this device.");
} else {
Log.i(TAG, "List of available devices: " + deviceList);
}
得到如下輸出
List of available devices: I2C1
通信協(xié)議
本實(shí)驗(yàn)中逞敷, DHT12 的 I2C 地址為 0x5C 祭椰,讀取到的數(shù)據(jù)格式如下:
BYTE ADDR | Desc. |
---|---|
0x00 | 濕度整數(shù)位 |
0x01 | 濕度小數(shù)位 |
0x02 | 溫度整數(shù)位 |
0x03 | 溫度小數(shù)位 |
0x04 | 校驗(yàn)和 |
- 若前四位之和等于最后一位的校驗(yàn)和,則讀取到的數(shù)據(jù)無(wú)誤驰弄;
- 溫度小數(shù)位(即 0x03 )的最高位代表溫度的正負(fù)功茴。若其為 0 陨簇,溫度為正值;若其為 1 彼哼,溫度為負(fù)值对妄。
實(shí)驗(yàn)代碼(Kotlin)
package cn.anguiao.things
import android.app.Activity
import android.os.Bundle
import android.os.Handler
import android.util.Log
import com.google.android.things.pio.I2cDevice
import com.google.android.things.pio.PeripheralManagerService
import java.io.IOException
class MainActivity : Activity() {
companion object {
private val TAG = "MainActivity"
private val I2C_DEVICE_NAME = "I2C1"
private val I2C_ADDRESS = 0x5C
}
private val handler = Handler()
private lateinit var device: I2cDevice
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
// 獲得串口服務(wù)
val service = PeripheralManagerService()
// 打開(kāi)相應(yīng)的I2C設(shè)備
device = service.openI2cDevice(I2C_DEVICE_NAME, I2C_ADDRESS)
// 采集數(shù)據(jù)
handler.post(readRunnable)
} catch (e: IOException) {
Log.e(TAG, "Error on I2C API", e)
}
}
override fun onDestroy() {
super.onDestroy()
handler.removeCallbacks(readRunnable)
try {
device.close()
} catch (e: IOException) {
Log.e(TAG, "Error on I2C API", e)
}
}
private val readRunnable = object : Runnable {
override fun run() {
try {
// 采集數(shù)據(jù)并輸出到 logcat
val data = readHumidityAndTemperature()
Log.d(TAG, data.joinToString())
} catch (e: IOException) {
Log.e(TAG, "Error on I2C API", e)
}
// 延時(shí)一秒,再次采集
handler.postDelayed(this, 1000)
}
}
private fun readHumidityAndTemperature(): DoubleArray {
// 初始化 byte 數(shù)組
val data = ByteArray(5, { 0 })
// 讀取數(shù)據(jù)
device.readRegBuffer(0x00, data, data.size)
// 校驗(yàn)數(shù)據(jù)
if ((data[0] + data[1] + data[2] + data[3]) % 256 != data[4].toInt()) {
return doubleArrayOf(0.0, 0.0)
}
// 處理濕度數(shù)據(jù)
val humidity = (data[0].toString() + "." + data[1].toString()).toDouble()
// 處理溫度數(shù)據(jù)
val temperature = if (data[3] < 128) {
(data[2].toString() + "." + data[3].toString()).toDouble()
} else {
-(data[2].toString() + "." + (data[3] - 128).toString()).toDouble()
}
// 返回?cái)?shù)據(jù)
return doubleArrayOf(humidity, temperature)
}
}
實(shí)驗(yàn)結(jié)果
result.png