0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

室温湿度データをグラフ化して、RaspberryPI zeroとtwikitでX(twitter)に投稿しよう。

Last updated at Posted at 2024-09-07

完成して動作しましたがまだ作業をまとめていません。しばしお待ちを。
image.png

ソースコード

from matplotlib import pyplot
import os
import smbus
import time
import datetime
import csv
import RPi.GPIO as GPIO
import logging
import traceback
import random

import numpy as np
from twikit import Client

led_pin=24
max_retries = 3
Pin_TF=True
retries = 0
success = False


print("start")


GPIO.setmode(GPIO.BOARD)
GPIO.setup(led_pin, GPIO.OUT)
GPIO.output(led_pin,True)

logging.basicConfig(filename='/home/(作業フォルダ)/tempbot2/bot.log', encoding='utf-8', level=logging.DEBUG)

bus = smbus.SMBus(1)
address_sht31 = 0x44

client =Client('ja')
client.load_cookies("/home/(作業フォルダ)/tempbot2/temp_bot_cookies.json")

dt_now=datetime.datetime.now()
last_min=dt_now.minute
last_hour=dt_now.hour
last_day=dt_now.day
file_ad="/home/(作業フォルダ)/tempbot2/temp_data"+dt_now.strftime("%Y%m%d")+".csv"
temp_i=0
humi_i=0
avecount=0



text="started!!"+str(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))
#client.create_tweet(text)
print(text)
logging.debug(text)





while not success and retries < max_retries:
    try:   
        while True:
            time.sleep(2)
            dt_now=datetime.datetime.now()
            Pin_TF=not Pin_TF
            GPIO.output(led_pin,Pin_TF)
            

            #print(temp)
            #print(humi)
            #print(dt_now)
            if dt_now.minute!=last_min:
            
                bus.write_byte_data(address_sht31, 0x24, 0x00)
                time.sleep(3)
                readData = bus.read_i2c_block_data(address_sht31, 0x00, 6)
                
                temp = round(0.00267 * ((readData[0] << 8) + readData[1]) -45 ,1) 
                humi = round(0.00152 * ((readData[3] << 8) + readData[4]),1)      

                temp_i+=temp
                humi_i+=humi
                avecount+=1

                #client.create_tweet(text)
                text=str(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))+" temp="+str(temp)+" humi="+str(humi)+" T_ave="+str(round((temp_i / avecount),1))+" H_ave="+str(round((humi_i / avecount),1))
                print(text)
                logging.debug(text)

                last_min=dt_now.minute


            if dt_now.hour!=last_hour:
                #with open(file_ad, 'a') as f:
                #    writer = csv.writer(f)
                #    writer.writerow([last_hour,temp_i/avecount,humi_i/avecount])
                rows = []
                try:
                    with open(file_ad, 'r', newline='') as f:
                        reader = csv.reader(f)
                        rows = list(reader)
                except FileNotFoundError:
                    pass  # ファイルが存在しない場合、新しいファイルを作成する
                
                # 必要な長さまで空白行を追加
                while len(rows) <=last_hour:
                    rows.append([])

                # 指定された行にデータを上書き
                rows[last_hour] = [last_hour, round((temp_i / avecount),1), round((humi_i / avecount),1)]

                # ファイルに書き戻し
                with open(file_ad, 'w', newline='') as f:
                    writer = csv.writer(f)
                    writer.writerows(rows)
                os.chmod(file_ad,0o777)    #ファイルを作成したら、全権限がアクセスできるように   

                text="Saved! hour="+str(last_hour)+"T_ave="+str(round((temp_i / avecount),1))+"H_ave="+str(round((humi_i / avecount),1))
                print(text)
                logging.debug(text)

                temp_i=0
                humi_i=0
                avecount=0

                last_hour=dt_now.hour
                #if dt_now.day!=last_day:
                #last_day=dt_now.day


            if dt_now.day!=last_day:
                day_data=np.loadtxt(file_ad ,encoding="utf-8_sig",delimiter=',')
                print(day_data)

                time_array= np.array(day_data[0:24,0])
                temp = np.array(day_data[0:24,1])
                situ = np.array(day_data[0:24,2])


                temp_max= np.max(temp)
                night_index=np.argmax(time_array>20)
                temp_night = np.array(day_data[night_index:24,1])
                temp_night_min=np.min(temp_night)

                print(time_array)
                text="Temp:"+str(temp)+"Humi:"+str(situ)+"tempmax:"+str(temp_max)+"night_index"+str(night_index)+"temp_nightmin:"+str(temp_night_min)
                print(text)
                logging.debug(text)
                


                fig, ax1 = pyplot.subplots()

                # Plot the temperature data with the first y-axis
                ax1.set_xlim(0, 24)
                ax1.set_ylim(0, 45)
                ax1.set_xticks([0, 6, 12, 18,24])
                ax1.set_yticks([0, 5, 10, 15, 20, 25, 30, 35, 40,45])
                ax1.set_xlabel("Time[h]")
                ax1.set_ylabel("Temp[°C]")
                ax1.plot(time_array, temp, label='Temp[°C]', color='tab:red')
                ax1.grid()

                # Create a second y-axis sharing the same x-axis
                ax2 = ax1.twinx()
                ax2.set_ylim(0, 100)
                ax2.set_yticks([0, 20,40,60,80,100])
                ax2.set_ylabel('Humi[%]')
                ax2.plot(time_array, situ, label='Humi[%]', color='tab:green')

                # Add a legend to differentiate the plots
                fig.legend(loc='upper right')

                # Save the figure
                pyplot.savefig("/home/(作業フォルダ)/tempbot2/time-temp.png")
                pyplot.close()


                media_list={client.upload_media("/home/(作業フォルダ)/tempbot2/time-temp.png")}
                text=str(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))+"\n前日の室温、湿度の推移です。\n"
                text+="最高室温は"+str(temp_max)+"°C 夜間最低室温は"+str(temp_night_min)+"°Cでした。\n "

                if temp_max>=25:
                    text+="昨日は "
                    if temp_max>=40:
                        text+="#酷暑日"
                    elif temp_max>=35:
                        text+="#猛暑日"
                    elif temp_max>=30:
                        text+="#真夏日"
                    elif temp_max>=25:
                        text+="#夏日"   
                    if (temp_night_min>=25)&(night_index!=0):
                        text+=" また、 #熱帯夜"
                    text+="\nでした。"

                bot_block_delay=random.randrange(0, 180, 20)
                print("waiting"+str(bot_block_delay)+"second")
                logging.debug("waiting"+str(bot_block_delay)+"second")
                time.sleep(bot_block_delay)

                client.create_tweet(text, media_list)
                print(text)
                logging.debug(text)
                print("tweeted")
                file_ad="/home/(作業フォルダ)/tempbot2/temp_data"+dt_now.strftime("%Y%m%d")+".csv"

                last_day=dt_now.day
                retries = 0
        

        GPIO.cleanup() 

    except Exception as e:
        retries += 1
        error_details = traceback.format_exc()
        text = f"error happened!\nretry count: {retries}\n{error_details}"
        print(text)
        logging.debug(text)
        time.sleep(1)
        if retries==2:
            os.system('sudo reboot')
            

  • こんなイメージ

  • セットアップssh 2.4ghzにつなぐことに注意

 いまさら聞けない https://fabcross.jp/category/make/what_is_raspberrypi/20220830_windows.html

  • ラズパイpip不具合

pipxをつかう?→使わない

venvをつかう?→これ

詳しく

https://www.denshi.club/parts/2024/01/202310-bookworm-3-

シンプル

pythoni2c.htmlhttps://wisteriahill.sakura.ne.jp/CMS/WordPress/2022/01/29/raspberry-pi-python-venv/

  • matplotlib numpy がpipでインスコできない(ハッシュエラー

→グローバル環境にインストール、 --system-site-packages で全部importできるようにする

https://milestone-of-se.nesuke.com/app/python/venv-switch/https://milestone-of-se.nesuke.com/app/python/venv-switch/#:~:text=付ける必要があり-,ます,-。

  • ip確認

  • winscp ファイル閲覧

vscodeと連携 https://shironoir0000.hatenablog.com/entry/2019/05/14/144159

  • 温度センサ i2c DHT20

   使い方

dht20じゃ泣きけど https://tutorial.chirimen.org/pizero/

homekit https://diysmartmatter.com/archives/298

手動実装なら https://craft-gogo.com/raspberry-pi-dht20/

twikit

i2cが無効になってた

  • SHT30 を使用するとき

ipアドレスは44

グラフを添付

10分に一回計測し、csvに保存→一日一回グラフを制作し、最高気温とともに投稿

pip

twikit

  • 自動起動

PyでPYを開く

  • Lチカ

GPIO.cleanup()を忘れない

  • rc local

Led_testは直接やれば動く

Envが悪そう?

envが良くなかった。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?