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

ソースコード
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できるようにする
- 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が良くなかった。