4.センサの設定とプログラミング

20150617_231446
実際の配線の様子ですが、配線の色を揃えれなくて見苦しい所はご容赦を。

以下、ブロッグの構造上Pythonのプログラムの前スペースが消えてます。
そのままでは動きませ。参照サイトからダウンロードのうえ、お試しください。

4.1.今回準備したもの

温湿度センサ HDC1000(秋月電子)
http://akizukidenshi.com/catalog/g/gM-08775/

CO2センサ K30 (co2meter)
http://www.co2meter.com/products/k-30-co2-sensor-module

Grove OLED Display (スイッチサイエンス)
https://www.switch-science.com/catalog/829/

光センサ TSL2561 (スイッチサイエンス)
https://www.switch-science.com/catalog/1174/

Raspberry Pi2 B+
http://jp.rs-online.com/web/p/processor-microcontroller-development-kits/8326274/

Raspberry Pi2 B+ ケース
http://jp.rs-online.com/web/p/development-board-enclosures/8787594/

その他
2000mA 5V 1ポート 2A高出力 USB AC アダプタ USB(Amazon)
USB電源ケーブル(ダイソー 100均)
屋内・屋外兼用ケース P10-22CA (Amazon)
小さいブレットボード(白)(秋月電子)
LTE通信USBモデムカード docomo L-03D (Amazon)
Transcend microSDHCカード 16GB Class10(Amazon)
普通のジャンパワイヤ(オス~オス)(スイッチサイエンス)
普通のジャンパワイヤ(オス~メス)(スイッチサイエンス)
普通のジャンパワイヤ(メス~メス)(スイッチサイエンス)

開発言語は、可能な限り C,C++ の入門者に敷居が高い言語を使わず、Python、node.js(Java Script) を用いる方針です。

4.2.センサ値獲得用プログラム言語Python環境確認

センサ値取得に利用する開発言語 Python のバージョンを確認します。
最新の3にはまだ未対応のライブラリィなどが多く、2.7 を用います。

$ python -V
Python 2.7.3

Pythonのセンサ用開発環境を追加インストールします。

$ sudo apt-get install python-dev

4.3.CO2センサ K30 I2Cプログラム計測

参考情報

K-30 10,000ppm CO2 Sensor
http://www.co2meter.com/products/k-30-co2-sensor-module

メーカPDF資料
http://co2meters.com/Documentation/AppNotes/AN142-RaspberryPi-K_series.pdf

説明は難しくなるので、以下の手順をこなしてみてください。

$ mkdir notsmb
$ cd notsmb
$ wget http://www.byvac.com/downloads/sws/notsmb_1_3.zip
$ unzip notsmb_1_3.zip
$ sudo python setup.py install

以下インデントが表示されていません。
実際に解答したファイルの内容をご参照ください。

$ nano CO2meter.py
import time
from notsmb import notSMB
I2CBUS = 1
CO2_ADDR = 0x68
READ = 0x22
readBytes = [0x00, 0x08, 0x2A]
bus = notSMB(I2CBUS)
while True:
try:
resp = bus.i2c(CO2_ADDR,[0x22,0x00,0x08,0x2A],4)
time.sleep(0.1)
co2Val = (resp[1]*256) + resp[2]
print(resp)
print(co2Val);
break
except:
blank =0;

$ sudo python ./CO2meter.py
[33, 11, 116, 160]
2932

4.3.温湿度センサHDC1000 I2C プログラム計測

参考情報

秋月電子 HDC100使用 温湿度センサーモジュール
http://akizukidenshi.com/catalog/g/gM-08775/

RaspberryPi + wiringPi-Python + HDC1000 で温湿度を取る(femmnomenaさん)
http://d.hatena.ne.jp/femm/20150426/1430033839

説明は難しくなるので、以下の手順をこなしてみてください。

$ sudo apt-get install python-pip
$ sudo pip install wiringpi2

$ nano HDC1000.py
import wiringpi2
import os
import struct
from time import sleep

wiringpi2.wiringPiSetup()
i2c = wiringpi2.I2C()
dev = i2c.setup(0x40)
i2c.writeReg16(dev,0x02,0x10)
i2c.writeReg8(dev,0x00,0x00) #start conversion.
sleep((6350.0 + 6500.0 + 500.0)/1000000.0)

temp = ((struct.unpack(‘4B’, os.read(dev,4)))[0] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[1])
hudi = ((struct.unpack(‘4B’, os.read(dev,4)))[2] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[3])
os.close(dev)

print “Humidity %.2f” % (( hudi / 65535.0 ) * 100)
print “Temperature %.2f” % (( temp / 65535.0) * 165 – 40 )

$ sudo python ./HDC1000.py
Temperature 28.0
Humidity 74.3

4.4.OLED ディスプレイ 128×64 表示プログラム

参考情報

GROVE – I2C OLEDディスプレイ128×64
https://www.switch-science.com/catalog/829/

Seeed-Studio/Grove-RaspberryPi
https://github.com/Seeed-Studio/Grove-RaspberryPi/tree/master/Grove%20-%20OLED%20Display%20128×64

こちらだけC++でコンパイルします。
説明は難しくなるので、以下の手順をこなしてみてください。

$ git clone https://github.com/Seeed-Studio/Grove-RaspberryPi
$ cd “Grove-RaspberryPi\Grove – OLED Display 128×64”
$ nano main.cpp
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include “SeeedOLED.h”

using namespace std;

SeeedOLED oled = SeeedOLED(0x3c);

string GetStdoutFromCommand(string cmd) {
int len;
string data;
FILE * stream;
const int max_buffer = 256;
char buffer[max_buffer];
cmd.append(” 2>&1″);

stream = popen(cmd.c_str(), “r”);
if (stream) {
while (!feof(stream)) {
if (fgets(buffer, max_buffer, stream) != NULL) {
data.append(buffer);
}
}
pclose(stream);
}
len = data.size() – 1;
data = data.substr(0, len);
return data;
}

int main (int argc, char *argv[])
{

string line0 = ” “;

string argv1 = line0;
string argv2 = line0;
string argv3 = line0;
string argv4 = line0;
if(argc > 1) argv1 = argv[1];
if(argc > 2) argv2 = argv[2];
if(argc > 3) argv3 = argv[3];
if(argc > 4) argv4 = argv[4];

oled.writeString(0, 0, (char*)line0.c_str());
oled.writeString(1, 0, (char*)line0.c_str());
oled.writeString(2, 0, (char*)line0.c_str());
oled.writeString(3, 0, (char*)line0.c_str());

oled.writeString(0, 0, (char*)argv1.c_str());
oled.writeString(1, 0, (char*)argv2.c_str());
oled.writeString(2, 0, (char*)argv3.c_str());
oled.writeString(3, 0, (char*)argv4.c_str());
return 0;
}

$ make clean
$ make
$ OLED 1111 2222 3333 4444

4.5.照度センサ TSL2561 I2C プログラム計測

参考情報

GROVE – I2C デジタル光センサ
https://www.switch-science.com/catalog/1174/

seanbechhofer/raspberrypi
https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/tree/master/Adafruit_I2C
https://github.com/seanbechhofer/raspberrypi/blob/master/python/TSL2561.py

説明は難しくなるので、以下の手順をこなしてみてください。

$ git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code
$ git clone https://github.com/seanbechhofer/raspberrypi

以下、インデントが分からないので以下を参照してください。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/TSL2561.py

$ nano TSL2561.py
#!/usr/bin/python

import sys
import time
from Adafruit_I2C import Adafruit_I2C

class TSL2561:
i2c = None

def __init__(self, address=0x29, debug=0, pause=0.8):
self.i2c = Adafruit_I2C(address)
self.address = address
self.pause = pause
self.debug = debug
self.gain = 0 # no gain preselected
self.i2c.write8(0x80, 0x03) # enable the device

def setGain(self,gain=1):
“”” Set the gain “””
if (gain != self.gain):
if (gain==1):
self.i2c.write8(0x81, 0x02) # set gain = 1X and timing = 402 mSec
else:
self.i2c.write8(0x81, 0x12) # set gain = 16X and timing = 402 mSec
self.gain=gain; # safe gain for calculation
time.sleep(self.pause) # pause for integration (self.pause must be bigger than integration time)
def readWord(self, reg):

“””Reads a word from the I2C device”””
try:
wordval = self.i2c.readU16(reg)
newval = self.i2c.reverseByteOrder(wordval)
if (self.debug):
print(“I2C: Device 0x%02X returned 0x%04X from reg 0x%02X” % (self.address, wordval & 0xFFFF, reg))
return newval
except IOError:
print(“Error accessing 0x%02X: Check your I2C address” % self.address)
return -1
def readFull(self, reg=0x8C):

“””Reads visible+IR diode from the I2C device”””
return self.readWord(reg);
def readIR(self, reg=0x8E):

“””Reads IR only diode from the I2C device”””
return self.readWord(reg);
def readLux(self, gain = 0):

“””Grabs a lux reading either with autoranging (gain=0) or with a specified gain (1, 16)”””
if (gain == 1 or gain == 16):
self.setGain(gain) # low/highGain
ambient = self.readFull()
IR = self.readIR()
elif (gain==0): # auto gain
self.setGain(16) # first try highGain
ambient = self.readFull()
if (ambient < 65535):
IR = self.readIR()
if (ambient >= 65535 or IR >= 65535): # value(s) exeed(s) datarange
self.setGain(1) # set lowGain
ambient = self.readFull()
IR = self.readIR()

if (self.gain==1):
ambient *= 16 # scale 1x to 16x
IR *= 16 # scale 1x to 16x

ratio = 0
if (ambient != 0):
ratio = (IR / float(ambient)) # changed to make it run under python 2

if ((ratio >= 0) & (ratio <= 0.52)):
lux = (0.0315 * ambient) – (0.0593 * ambient * (ratio**1.4))
elif (ratio <= 0.65):
lux = (0.0229 * ambient) – (0.0291 * IR)
elif (ratio <= 0.80):
lux = (0.0157 * ambient) – (0.018 * IR)
elif (ratio <= 1.3):
lux = (0.00338 * ambient) – (0.0026 * IR)
elif (ratio > 1.3):
lux = 0

return lux

if __name__ == “__main__”:
while True:
tsl=TSL2561()
print “LUX HIGH GAIN “, tsl.readLux(16)
print “LUX LOW GAIN “, tsl.readLux(1)
print “LUX AUTO GAIN “, tsl.readLux()

$ sudo python TSL2561.py
LUX HIGH GAIN 0
LUX LOW GAIN 2318.77744967
LUX AUTO GAIN 0.45162

続きは 5.センサ値をクラウドに保管・表示 へ

広告

About Yukihito Kataoka
@ykataoka

現在コメントは受け付けていません。

%d人のブロガーが「いいね」をつけました。