kuroの覚え書き

96の個人的覚え書き

Raspberry piで温度ロガー

ラズパイを温度監視用ロガーとして使えないかなと。

ここまでラズパイはマイクロLinuxボックスとしてしか使っておらず、IoT的な電子工作はやっていない。
で、どうなんよ、と今更ながらにIO関係を調べてみたところ、AD変換とかはない。
抵抗とコンデンサを使って、あとはソフトウェアでゴリ押しでなんとかするとかできなくもないだろうけど、今どきそんなことをするやつはおらず、みんな安いAD変換モジュールとかを買ってきてつなぐだけなんだ。つまんね。

とまあ、話はそれたが、結局ラズパイはただのミニPCなので、やはりセンサ関係をコントロールするならArduinoとかマイコンがまだまだ活躍するわけだ。
ラズパイにはユーザインターフェースに専念してもらうことになる。

で、そうなると結局10年ほど前にごにょごにょやっていたArduino温度計に戻っちゃう。あの頃はラズパイなんてなかったから改造FONルータにopen-WRTを入れて作ってた。
k-kuro.hatenadiary.jp

結局同じことをすることになる。

温度センサは
温室の温度警報装置 - kuroの覚え書き
これでも使ったLM-35DZが残っていたのでそれを利用。

Arduinoのスケッチはサンプルをちょいとだけいじって

#include <TimeLib.h>
// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, 500);
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);

  // print the results to the serial monitor:
  Serial.print(now());
  Serial.print("\t sensor = " );
  Serial.print(sensorValue);
  Serial.print("\t temp = ");
  Serial.println(outputValue);

  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(60000);
}

こんな感じ。
結局Arduinoは時計を持っていないのでリアルタイムは残せない。
なのでシリアルを受信した時間から換算して、ラズパイ側で日時を割り出す方式でお茶を濁す
RTCもいるな、やっぱり。そもそもラズパイにも時計入れたいし。

さて、ラズパイの側でシリアルを受信するプログラムであるがcuコマンドをインストールして利用する。

$ cu -l /dev/ttyUSB0 -s 9600

こんな感じでターミナル上にデータが送られてくることを確認。
f:id:k-kuro:20190522202019p:plain
これをpythonでファイルに落とし込むところを作る。

import datetime
import subprocess

date1 = datetime.datetime.now()
date2 = "{0:%Y%m%d_%H%M%S}".format(date1)
file1 = "./" + date2 + ".txt"
cmd = "cu -l /dev/ttyUSB0 -s 9600 > %s" % file1
subprocess.call(cmd, shell=True)

こんだけ。

このスクリプトをどうにかラズパイ起動と同時に走らせたいのだが、案外うまくいかない。

そういえばシリアルを受信するだけだったら

$ cat /dev/ttyUSB0 >> log.txt

みたいにするだけでできたような気がする。送信しないし、こっちのほうが簡潔かも。

f:id:k-kuro:20190522200859p:plain

#!/bin/sh
date1=`date +%Y%m%d_%H%M%S`
file1='./temp/'$date1'.txt'
cat /dev/ttyUSB0>>$file1

わざわざpython持ち出すよりこのほうがいいな。
これをcronに

crontab -e

@reboot /home/pi/temp.sh&

と追加してやったところ、問題なく記録が開始された。