------------------------------------------------------------
変更履歴
2017/07/08 コード修正
52行目:ソートをfor文の外に(インデントを一つ左に寄せる)
------------------------------------------------------------
MCP3208からの入力値をファイルに保存するPythonコード。
このコードに関する記事は下記にあります。
ハウス栽培5:土壌センサを使って土壌の湿気計測
http://ameblo.jp/hagechip/entry-12276074267.html
MCP3208, Raspberry Piの使用ピン
アナログ入力はMCP3208の0chに接続
シリアルクロック(CLK) - Raspberry Pi BCM11番ピン
シリアルデータIN (DIN) - Raspberry Pi BCM10番ピン
シリアルデータOUT (Dout) - Raspberry Pi BCM9番ピン
チップセレクト(CS/SHDN) - Raspberry Pi BCM8番ピン
一回の実行で一回計測。
結果は下記形式で'/home/pi/MoistureLog.csv'の最終行に追加保存。
(ファイルがない場合は自動で新規作成)
[YYYY/mm/dd],[HH:MM:SS],[計測結果][改行]
コード
# -*- coding: utf-8 -*-
# MCP3208からデジタル値を取得し、ファイルに保存する。
# このコードではMCP3208の8chのうち、0chの値を使用している。
import RPi.GPIO as GPIO
from time import sleep
from datetime import datetime
# CP3208からSPI通信で12ビットのデジタル値を取得する。
# 0から7の8チャンネル使用可。
# 引数adcnum:MCP3208の使用するチャンネル
# 引数clockpin:SPI通信クロックピン
# 引数misopin:SPI通信デジタルINピン
# 引数mosipin:SPI通信デジタルOUTピン
# 引数cspin:SPI通信チップセレクトピン
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if adcnum > 7 or adcnum < 0:
return -1
GPIO.output(cspin, GPIO.HIGH)
GPIO.output(clockpin, GPIO.LOW)
GPIO.output(cspin, GPIO.LOW)
commandout = adcnum
commandout |= 0x18 # スタートビット+シングルエンドビット
commandout <<= 3 # LSBから8ビット目を送信するようにする
for i in range(5):
# LSBから数えて8ビット目から4ビット目までを送信
if commandout & 0x80:
GPIO.output(mosipin, GPIO.HIGH)
else:
GPIO.output(mosipin, GPIO.LOW)
commandout <<= 1
GPIO.output(clockpin, GPIO.HIGH)
GPIO.output(clockpin, GPIO.LOW)
adcout = 0
# 13ビット読む(ヌルビット+12ビットデータ)
for i in range(13):
GPIO.output(clockpin, GPIO.HIGH)
GPIO.output(clockpin, GPIO.LOW)
adcout <<= 1
if i>0 and GPIO.input(misopin)==GPIO.HIGH:
adcout |= 0x1
GPIO.output(cspin, GPIO.HIGH)
return adcout
# 5回計測し、中央値を返す
def getval():
val_list = []
for i in range(5):
val_list.append(readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS))
sleep(0.5)
val_list.sort()
return val_list[2]
GPIO.setmode(GPIO.BCM)
# ピンの名前を定義
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
# SPI通信用の入出力を定義
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)
# 取得した値をファイルに保存する
try:
f = open('/home/pi/MoistureLog.csv', 'a')
f.write(datetime.now().strftime('%Y/%m/%d,%H:%M:%S, ') + str(getval()) + '\n')
except KeyboardInterrupt:
pass
finally:
f.close()
GPIO.cleanup()