Sensor Suhu Raspberry Pi
Beberapa minggu yang lalu, saya membeli Raspberry Pi. Setelah membaca Panduan Pengguna Raspberry Pi Eben Upton, khususnya dua bab yang menjadi fokus perhatiannya pada GPIO, saya punya ide untuk proyek pertama saya. Postingan ini mencakup iterasi pertama dari proyek pemantauan suhu rumah yang saya buat menggunakan Raspberry Pi, MCP9808, Mac Mini lama (awal 2008), InfluxDB, Grafana, sedikit Python, dan runit.
Perangkat Keras Sensor
Untuk proyek ini saya memilih untuk menggunakan Papan Breakout MCP9808 dari Adafruit – sumber yang sangat baik untuk komponen, sirkuit, dan ide. Saya memilih unit ini karena beberapa alasan:
- Ini dikendalikan melalui I²C – GPIO Raspberry Pi mendukung bus I²C yang diperlukan melalui pin 3 (Jalur Data Serial, SDA) dan 5 (Jalur Jam Serial, SCL)
- Ini berjalan dalam rentang daya dan logika 2,7V hingga 5,5V – Raspberry Pi menyediakan saluran listrik pada 3,3V dan 5V
- Cukup murah (<$5 USD) – Keterampilan menyolder saya bukan yang terbaik.
Perakitan Sirkuit
Kapal Breakout Board MCP9808 dari Adafruit sebagian besar sudah dirakit. Kit khusus ini hanya mengharuskan Anda menyolder strip header 8 pin yang disertakan ke papan breakout.
Saya menggunakan GPIO Breakout dan papan tempat memotong roti untuk menghubungkan Raspberry Pi ke MCP9808; pendekatan ini sedikit lebih mudah untuk dikelola, memperbaiki kesalahan pengkabelan, dan kurang permanen daripada menyolder sensor ke Raspberry Pi. Untuk membaca suhu dari MCP9808, hanya pin daya, ground, dan pin I²C SDA dan SCL yang diperlukan:
Pin yang tersisa, opsional, tidak digunakan dalam proyek ini. Mereka memberikan solusi untuk mengatasi masalah I²C saat beberapa perangkat digunakan pada bus yang sama dan pin untuk memperingatkan jika sensor membaca suhu di atas atau di bawah ambang batas.
Datastore
Saya tahu bahwa saya ingin mendukung proyek dengan penyimpanan data yang persisten. Ini akan memungkinkan saya untuk menangkap titik data dan kemudian menganalisisnya untuk tren umum, referensi silang pola pemanasan/pendinginan dengan peristiwa cuaca, dll.
Saya memilih InfluxDB karena bahasa kueri waktu dan model penyimpanannya. Saya menginstal Influx di Mac Mini lama (Awal 2009 dengan OSX 10.10) yang saya duduki di bawah meja saya. Menginstal dan menjalankan InfluxDB dasar didokumentasikan dengan baik; karena saya sudah menggunakan Homebrew untuk mengelola sebagian besar dependensi pihak ketiga saya dan ada formula untuk InfluxDB, instalasi diselesaikan dengan mengeluarkan brew install influxdb
.
Dengan InfluxDB terinstal, saya menyiapkan database untuk menyimpan pembacaan suhu saya dan pengguna database untuk mengelolanya. Saya menggunakan konsol web instans InfluxDB saya untuk melakukan ini; secara default berjalan pada port 8083
dari host InfluxDB.
Konfigurasi Raspberry Pi
Sekarang setelah perangkat keras dan penyimpanan data disiapkan, ada sedikit konfigurasi OS yang diperlukan untuk Raspberry Pi yang siap pakai untuk berkomunikasi dengan MCP9808 melalui bus I²C.
Aktifkan I²C
Secara default, Raspberry Pi tidak memuat modul kernel yang diperlukan untuk menggunakan bus I²C. Untuk mengaktifkan komunikasi I²C melalui GPIO, saya menambahkan dua baris berikut ke /etc/modules
i2c-bcm2708i2c-dev
Kemudian reboot Raspberry Pi
sudo reboot
Setelah sistem initalizses sistem harus dapat mengenali MCP9808 terhubung. Saya menggunakan i2cdetect
cli alat untuk melakukannya:
sudo i2cdetect 1 # channel 1 adalah default pada model Raspberry Pi B+
Perangkat Lunak Sensor
Adafruit menyediakan pembungkus MCP9808 dan abstraksi I²C. Saya menggunakan keduanya dalam skrip driver utama untuk proyek ini.
Instal dependensi build
sudo apt-get updatesudo apt-get install build-essential python-dev python-smbus
Instal pembungkus Adafruit_Python_MCP9808
cd ~/Downloadsgit clone https://github.com/adafruit/Adafruit_Python_MCP9808/blob/master/Adafruit_MCP9808cd Adafruit_MCP9808sudo python setup.py install
Ini juga akan menginstal abstraksi I²C karena pembungkus MCP9808 bergantung padanya.
Baca, Laporkan, Ulangi
Selanjutnya saya menulis sedikit skrip python, poll.py
, untuk membaca dari MCP9808 pada suatu interval dan melaporkan temuannya ke instans database InfluxDB mcp9808_test.
#!/usr/bin/python import time import Adafruit_MCP9808.MCP9808 as MCP9808 dari influxdb import InfluxDBClient # Menghasilkan muatan yang diperlukan untuk memposting # data suhu ke InfluxDB def temperature_data(degrees_c):return [ { 'points':[[c_to_f(degrees_c)]], 'name':'Temperature Readings', 'columns':['degrees_f']}] # Mengonversi representasi suhu dalam Celcius # ke Farenheight def c_to_f(c):return c * 9.0 / 5.0 + 32.0 # Menginisialisasi komunikasi dengan MCP9808 # melalui bus I2C. sensor =MCP9808.MCP9808() sensor.begin() # Menentukan interval di mana logika pengambilan # akan terjadi capture_interval =60.0 # Setiap 60 detik # Membuat koneksi ke mcp9808_test # InfluxDB instance influxClient =InfluxDBClient('', 8086, 'mcp9808', '', 'mcp9808_test') # Read, Report, Repeat while True:temp =sensor.readTempC() print "Temperature {0:0.3} F".format( c_to_f(temp)) influxClient.write_points(temperature_data(temp)) time.sleep(capture_interval)
Sekarang dapat dijalankan menggunakan perintah berikut; perhatikan bahwa skrip perlu dijalankan sebagai root
pengguna Raspberry Pi untuk berinteraksi dengan GPIO.
sudo python /poll.py
Untuk-selamanya
Hore! Semuanya berjalan dan berjalan… sampai saya menyalakan/mematikan sakelar powertip di bawah meja saya. Pada titik ini saya menyadari bahwa saya ingin memastikan bahwa poll.py
skrip berjalan selama Raspberry Pi memiliki kekuatan. Untuk mencapai ini, saya menggunakan pengawas proses runit.
Untuk detail lebih lanjut:Sensor Suhu Raspberry Pi