Raspberry Pi ZeroとTSL25721 照度センサーの接続は「Raspberry Pi Zeroと照度センサーモジュールで照度を測る」を参照してください。
実行手順
1. データ保持用のテーブル作成PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table lux_sensor
(
device_name varchar(30) not null,
data_ts timestamp not null,
lux float,
constraint pk_lux_sensor primary key (device_name, data_ts)
);
2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update
sudo apt-get -y install python3-pip python3-distutils python3-dev
sudo pip3 install --upgrade pip
sudo pip3 install --upgrade setuptools
sudo pip3 install pipenv
echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc
source ~/.bashrc
3. smbusとpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbusとPostgreSQL用の仮想環境を作成します。
sudo apt-get -y install libpq-dev
mkdir -p ~/smbus_pg
cd ~/smbus_pg
pipenv --python 3
pipenv install psycopg2-binary smbus
pipenv shell
4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。
record_lux.py
import os
import psycopg2
import psycopg2.extras
import smbus
import time
i2c = smbus.SMBus(1)
addr_tsl25721=0x39
FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 # Auto-increment protocol transaction
REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN
REG_C0DATA = 0x14 # CH0 ADC low data register
# Initialize
# Reset Control Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, VAL_CONTROL_RESET)
# Reset Config Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, VAL_CONFIG_RESET)
# Set ALS time
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, VAL_ATIME_C64)
# Power on and enable ALS
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, VAL_ENABLE)
def read_lux():
atime = 0xC0 # 192
gain = 1.0
dat = i2c.read_i2c_block_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
adc0 = (dat[1] << 8) | dat[0]
adc1 = (dat[3] << 8) | dat[2]
cpl = (2.73 * (256 - atime) * gain)/(60.0)
lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
lux = 0
if ((lux1 <= 0) and (lux2 <= 0)) :
lux = 0
if (lux1 > lux2) :
lux = lux1
elif (lux1 < lux2) :
lux = lux2
return lux
while True:
lux= read_lux()
print("lux:{:.1f}".format(lux))
device_name = 'tsl25721'
sql = """insert into lux_sensor values (%s, current_timestamp, %s)"""
conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
cur.execute(sql , (device_name, lux))
conn.commit()
time.sleep(1)
5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_lux.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード
python3 record_lux.py
0 件のコメント:
コメントを投稿