Skip to main content

ラズパイとDHT11。温度と湿度を自動的にGoogleスプレッドシートに記録しています。

やっと重い腰を上げてラズベリーパイなるものに手を出しました。
これからの時代IoTだと。
プログラミングなんてほとんど知らないのでインターネットから先人の方々のお知恵を拝借しました。
参考にしたサイトはこちら。
簡単にRaspberryPi+DHT11で気温と湿度を通知するTweetBotを作る。

ラズパイを通じてIoTデバイスからtwitterにつぶやいてみる(DHT11+IFTTT編)

両方とも温度と湿度をTwitterに通知するところまでやっています。
私は…
挫折しました。

TwitterのAPI取得がめちゃくちゃ手間だったのです。

ですので、webhooksというものを使いIFTTTに飛ばし、そこからGoogleスプレッドシートに書き込んでいくという形にしました。

まず、ラズベリーパイをインストールし、設定などやっていきました。

家にUSBキーボードがなかったのでVNCでノートパソコンで操作できるようにしました。
 
よりDHT11の接続、温度と湿度の取得を行いました。
プログラムがどうなっているかほとんどわかりません。少し英語の力でこうなのかなと思えるくらいです。
超初心者。
 
なんとか温度、湿度が出るようになりました。
それをどう手元で確認できるようにするのか。
TwitterだとAPIに登録するところでめんどくさくなってつまづきました。
IFTTTはどうか?
Google大先生に教えを頂き、直接IFTTTではなくwebhooksというものを間にいれるということを知りました。
そこで、
ここでつまづきました。
  dht11_ifttt.py
# -*- coding: utf-8 -*

import RPi.GPIO as GPIO
import dht11
import time
import os
import sys

sys.path.append('/path/to/program/') #auth_ifttt.pyのありか

import json
import requests
from auth_ifttt import(
    ifttt_key
)

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=21)

def getInfo():
    while True:
        result = instance.read()
        if result.is_valid():
            #print('温度:', str(result.temperature), '℃です。')
            #print('湿度:', str(result.humidity), '%です。')
            pass
        break
    time.sleep(1)
    return result

def commInfo(current_time, res):
    #IFTTT Webhooks
    str_key = ifttt_key
    str_event = "DHT11"
    str_headers = {'Content-Type': 'application/json'}
    str_json_data = {
        "value1" : current_time,
        "value2" : res.temperature,
        "value3" : res.humidity
    }
    str_url = "https://maker.ifttt.com/trigger/"\
              + str_event\
              + "/with/key/"\
              + str_key
    #print(str_url)

    jd = json.dumps(str_json_data)

    print("begin request")
    s = requests.Session()
    r = requests.post(str_url, data=jd, headers=str_headers)
    #print("status code : ", r.status_code)
    print("end request")

    if r.status_code == 200:
        return r.text
    else:
        return "error occurred!!"

if __name__ == '__main__':

    #time stamp
    timestamp = 'date +%F_%H:%M:%S'
    current_time=os.popen(timestamp).readline().strip()

    res = getInfo()
    rt = commInfo(current_time, res)
    print(rt)
どうやっても温度と湿度が出てきません。0になるのです。
プログラミング超初心者。どこをどう変えてもうまくいきません。
試行錯誤、Google大先生の聞いてもわかりません。
最後の望み、知人。
彼からラズパイの面白さを聞いたと言っても過言ではありません。
彼にどうすれば最後の値が返るのか尋ねました。
ちょっとしたら、彼は言います。
このプログラム、変だ。と。
なぬっ。
 
def getInfo():
    while True:
        result = instance.read()
        if result.is_valid():
            #print('温度:', str(result.temperature), '℃です。')
            #print('湿度:', str(result.humidity), '%です。')
            pass
        break
    time.sleep(1)
ここのpassが入らなくてbreakとtime.sleep(1)を一階層下げないといけない。と。
なんと。
そんなことがすぐわかるのか。
ということで修正しました。
最後、値が返るのか確認のためにprintがいくつか入っています。
# -*- coding: utf-8 -*

import RPi.GPIO as GPIO
import dht11
import time
import os
import sys

sys.path.append('/path/to/program/') #auth_ifttt.pyのありか

import json
import requests
from auth_ifttt import(
ifttt_key
)

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=14)

def getInfo():
while True:
result = instance.read()
if result.is_valid():
print('温度:', str(result.temperature), '℃です。')
print('湿度:', str(result.humidity), '%です。')
break
time.sleep(1)
return result

def commInfo(current_time, res):
#IFTTT Webhooks
str_key = ifttt_key
str_event = “DHT11"
str_headers = {'Content-Type': 'application/json'}
str_json_data = {
"value1" : current_time,
"value2" : res.temperature,
"value3" : res.humidity
}
str_url = "https://maker.ifttt.com/trigger/"\
+ str_event\
+ "/with/key/"\
+ str_key
#print(str_url)

jd = json.dumps(str_json_data)

print("begin request")
s = requests.Session()
r = requests.post(str_url, data=jd, headers=str_headers)
#print("status code : ", r.status_code)
print("end request")

if r.status_code == 200:
print(res.temperature, res.humidity)
return r.text
else:
return "error occurred!!"

if __name__ == '__main__':

#time stamp
timestamp = 'date +%F_%H:%M:%S'
current_time=os.popen(timestamp).readline().strip()

res = getInfo()
rt = commInfo(current_time, res)
print(rt)
 
これで、値がWebhooksを通じてIFTTTへ行くようになりました。
IFTTTからGoogleスプレッドシートへ行くようになっています。
 
ちなみにこのプログラムはcronで1時間おきに動くようになっています。
 
 
なんとか完成。
知人、ありがとう。めちゃくちゃ助かった。
 

Comments

Popular posts from this blog

弁当肥という技術

台風通過中で季節外れの大雨です。 今季の稲ですが、なんだか出穂が少ないように思いました。 肥料なのか水なのか。 肥料は少なく1回多めに散布しました。 総量は同じですが、1回の量は減らしています。 イネがほしいときに少なかったのかもしれません。 ただ、丈は良いのです。 灌水もできる限りしました。 しかしながら、穂の数が少ないのです。 有効分げつが少ないという言い方をします。 なぜなのか。 調べてみると肥料が少ないとのことでした。 その中で ”弁当肥” という言葉がありました。 何という意味なのか。 田植え5日前くらいに追肥をして田植え後の栄養にする肥料だそうです。 それによって田植え後の活着を良くして生長させるようです。 田植えに弁当を持っていくことから弁当肥と言うらしいです。 そう言われるとフィリピンでもそれをしています。 忘れましたが現地でも言葉があるくらいです。 最初、やる理由がわからなかったのです。 田植えしたら早く元気になると言われました。 体内に栄養を保持してるのか疑問でしたし、ちょっとおなかがすいている方が頑張って根を伸ばすだろうと思っていました。 ですので育苗の時には肥料を少ない目にやっていました。 ひょっとしたらそれが理由なのかもしれません。 なかなか思ったようにはいきません。 皆がしている技術には理由があることを改めて思い知らされました。 農業において引く、減らすというのは慎重にしなければならないようです。 … 調べるのは次回、来年の雨季になってしまいます。 準備はできるだけしなければいけないのですが、なかなか結果を見て対処しなければいけないことが多いです。

今年の挑戦 (1) トマト

今年の挑戦の一つはトマト生産です。 日本のような施設園芸には到底かないませんが、フィリピンにあるローカルの品種よりもちょっと品質の良いトマトを生産する計画にしています。 フィリピンのトマトの品種はいろいろありますが、一般的なものは皮が厚くて甘くありません。それよりも、まずちょっと良い品種でおいしいトマトを良い収量で作るのが今年の目標です。 今までいろいろな甘い品種のトマトを試してきましたが、ほとんどのものは途中でウイルスにやられてしまいました。大きくて甘いトマトはなかなか難しいのです。 今回の品種は最初、ウイルスにかかったものは少なかったのですが、だんだん増えてきています。一般的に虫や樹液(野菜でも樹液というのかどうか知りませんが)を介して伝播します。 トマトに限らず、初めて栽培したものに関してはそんなに害虫がつきません。それもあって良かったのかもしれません。 2作3作続けていくと熱帯の高温で繁殖しやすい虫はどんどん住処を移動して増えていきます。日本では冬があるので一度、虫の繁殖がリセットされますが、フィリピンではそうはいきません。年がら年中虫は繁殖し放題です。それをどうコントロールしていくか。トマトに限らず、農業全般的に課題です。 … 生産技術はまだまだ低いですが、良くしていきます。

小学校からの訪問者

日本人学校の生徒さんたちが田植え体験に来てくれました。 総勢70人。 1時間弱と短い時間でしたが、楽しんでいってくれました。 都会の子どもたちで裸足で土を歩いたり水田に入ったり、普通ではできない経験だったと思います。 毎年、課外実習の一環でオクラの収穫やパッキング、精米所などを見学、体験してくれているのですが、今年初めて、この時期に田植えの体験を組み込んでくれました。 ここでの先生は、私の圃場で働いてくれている人たちでした。中には彼らの息子もいて両方にとって刺激のある時間だったはずです。 これに関して、知人と話しをしましたが、その中で、彼ら小学生の家は駐在員などで彼らのメイド以下の収入でこっちはやっているのに。などお金に関する話になりました。 果たして、自分自身どうなのか。なぜ、フィリピンで農業をやっているのか。自分の子ども、家族はどうなのか。改めて考える機会になりました。 なぜ、フィリピンで農業をしているのか。 フィリピンが好きだし、農業も好きだから。 なのですが、生活もしていかなくてはなりません。 フィリピンドリーム的なものを目指しているのか。 ただ、ここで農業をやっていることを足跡を残せるような仕事をしたいというのは本心にもあります。 … そんな悩みを吹き飛ばしてくれる子どもたちの笑顔がありました。 子どもたちの笑顔で元気づけられるような機会を続けていきたいですし、もっと増やしていきたいと思っています。