hagechipのブログ -23ページ目

hagechipのブログ

ブログの説明を入力します。

------------------------------------------------------------

変更履歴

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()