忍者ブログ

設備のマニアどっとこむ

設備、電子工作、DIYのブログ!

04/14

Sun

2019

ラズパイとTkinterで温度のGUI監視

やっとというか、遂にというか温度監視をGUIでできました。pythonのGUIツールTkinterを使ってます。

今まではSlackでつぶやいたり、単発だったのですが、今回は連続監視です。


ラズパイと接続している素子はadt7410ってていう温度センサーでI2Cで通信しています。




↑↑マイニングマシンのグラボ排気をリアルタイムで計測しています。
けっこう素子の反応が良くて0.7秒毎でもいけそうです。(GUIはもっさりしますが)
import smbus
import time
import sys
import RPi.GPIO as GPIO
import tkinter as tk
GPIO.setmode(GPIO.BCM)
 
i2c = smbus.SMBus(1)
address = 0x48
root = tk.Tk()
root.geometry("600x300")
t = tk.Label(text='温度[℃]',font = ('', 70))
t.pack()
while True :
 block = i2c.read_i2c_block_data(address, 0x00, 12)
 temp = (block[0] << 8 | block[1]) >> 3
    
 
 print("Temperature:%6.2f" % (temp / 16.0))
 time.sleep(0.7)
               
 temp2 = (temp / 16.0)
 s = tk.Label(text=temp2,font = ('', 70))
 s.pack()
 s.update()
 s.forget()
root.mainloop()
 
正直、かなりTkinterは手ごわいです。update()とかforget()の使い方を間違えるとブラクラみたいになります笑 一度表示した数値を消して上書きするのは大変でした。

t = tk.Label(text='温度[℃]',font = ('', 70))
↑このあたりもtext=をいれないとAttributeError: 'Label' object has no attribute '_w'となったりします。
変数がNoneになった時に出るそうですが…

これをうまく使えばモニターで常時監視できそうです、温度以外ではビットコインをやってみました。



モニターによってはGPIOが死んでしまいますが…


もうちょっと勉強すればデジタルサイネージ、設備監視装置なんてできる・・・ かも。















拍手[0回]

PR

04/07

Sun

2019

3Dプリンタカードリッジをarduinoでリセットする方法

3Dプリンタを購入してはや1年、使う頻度がめっきり減っていたのですが、久々に使ってみました。

しかし、たっぷりあったはずのABSカードリッジなのですが、XYZprintから衝撃のメッセージが!

「カードリッジ残量がありません」

・・・おかしい、カードリッジをパカっと開くとまだまだ数十メートル入ってるのに!

途方に暮れていたのですが、こんな記事を見つけました、なんとカードリッジ残量をリセットできるそうな。

それにはarduinoが必要との事。あるぞ、あるぞarduino!


ここからダウンロードしたxyz_dv_eprom.inoをarduino IDEで開きます。

↓いじるところはこのあたりです。
// Value to write to the EEPROM for remaining filament lenght
// Default Starter Cartdridge is 120m
char x[] = {0xc0,0xd4,0x01,0x00}; //120m
//char x[] = {0x80,0xa9,0x03,0x00}; //240m
//char x[] = {0x80,0x1a,0x06,0x00}; //400m
// extruder temp, default is 210 C for ABS
//char et[] = {0xd2,0x00}; // 210 C 
char et[] = {0xe6,0x00}; // 230 C
//char et[] = {0xf5,0x00}; // 245 C
//char et[] = {0xfa,0x00}; // 250 C
// bed temp 90 degrees, default ABS
char bt[] = {0x5a,0x00}; //90C
//char bt[] = {0x32,0x00}; //50C
//char bt[] = {0x28,0x00}; //40C
//Materials
char mt[] = {0x41}; //ABS
//char mt[] = {0x50}; //PLA
//char mt[] = {0x46}; //Flex
これをarduinoに書き込んで、あとはD7pinと5VとGNDの3本をカードリッジの底に接続するだけ。実際はあてる感じ)基盤の端が欠けてるところが5V、逆位側がGND、真ん中がD7pinです。

arduinoの高速点滅が点灯に変わったら成功です!



カードリッジ残量が増えました!!

これで思う存分使い切れます。

・・・でもちょっと失敗。











拍手[0回]

03/05

Tue

2019

AWSでラズパイの位置情報を公開する

前回、前々回でラズパイからAWSへ温湿度と画像データのアップロードができたので今度は位置情報の公開にチャレンジします。

以前購入したGPSモジュールで座標を取得してCSVでAWSへアップロード、Googleマップにピンを入れるようにします。

→GPSモジュールのセットアップについての記事はこちら


↑こんな感じです



まずはラズパイ上に位置情報CSVを作成します。
micropyGPSだけはここからmicropyGPS.pyをダウンロードして同じディレクトリにいれてください。
import serial
import micropyGPS
import threading
import time
import math
import csv
gps = micropyGPS.MicropyGPS(9, 'dd') 
                                     
def rungps(): 
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    s.readline() 
    while True:
        sentence = s.readline().decode('utf-8') 
        if sentence[0] != '$': 
            continue
        for x in sentence: 
            gps.update(x)
gpsthread = threading.Thread(target=rungps, args=()) 
gpsthread.daemon = True
gpsthread.start() 
#logger_latitude = 3540.8061
decimal, integer = math.modf(gps.timestamp[1]/100.0)
gps_latitude = integer + decimal / 60.0 * 100.0
decimal2, integer2 = math.modf(gps.timestamp[2]/100.0)
gps_latitude2 = integer2 + decimal2 / 60.0 * 100.0
while True:
    if gps.clean_sentences > 20: 
        h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
        print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
        print('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
        print('海抜: %f' % gps.altitude)
        print(gps.satellites_used)
        print('衛星番号: (仰角,方位角, SN比)')
        for k, v in gps.satellite_data.items():
            print('%d: %s' % (k, v))
        print(gps.latitude[0])
        if  gps.latitude[0] > 0:
         with open('gps.csv','a') as f:
           writer = csv.writer(f)
           #writer.writerow([h,gps.timestamp[1],gps.timestamp[2],gps.latitude[0],gps.longitude[0]])
           writer.writerow([h, gps.timestamp[1], gps.timestamp[2],gps.latitude[0],gps.longitude[0]])
    time.sleep(3.0)

これでCSVが作成されます。
GPSがつかまらない場合は追記しません。 if  gps.latitude[0] > 0: としています。

あとはこの記事を参照にAWSのS3へアップロードしていきます。


ブラウザでGPSのデータを読み込むのにjavascriptを使う必要があります。
CSV値の後ふたつの値をとります。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>test</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
html,body {
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
    <a id="map">地図</a>
<script type="text/javascript">
function getCSV(){
    var req = new XMLHttpRequest();
    req.open("get", "gps.csv", true);
    req.send(null);
    req.onload = function(){
convertCSVtoArray(req.responseText);
    }
}
 
function convertCSVtoArray(str){
    var tmp = str.split("\n");
    var val = tmp.slice(-2)[0];
    var lat = val.split(',').slice(-2)[0];
    var lng = val.split(',').slice(-1)[0];
    
    var link = document.getElementById('map');
    link.setAttribute('href', 'https://maps.google.co.jp/maps?q='+lat+','+lng);
}
 
getCSV();
</script>
</body>
</html>
位置がずれたりちょっと不安定な動きをしますが、屋外にラズパイをもっていくとGooglmap
ピンがささり、位置情報を公開することができました。

ちなみに・・。


モバイルバッテリーは必須です!! wi-fiはテザリングでなんとかなりますが…










拍手[0回]

02/24

Sun

2019

ラズパイからAWSへ温湿度CSVのアップロード

今回はかなりオーソドックスなIoTをやってみようかと思います。前回はAWSへの画像のアップロードだけだったんですが、今度はHPまで作ってそこからCSVをダウンロードできるようにしてみます。 

DHT11を使いました。3本足はそれぞれ5V、GND、14ピンに接続します。


ラズパイからCSVファイルを出力できるようにします。
import time
import datetime
import dht11
import RPi.GPIO as GPIO
import csv
Temp_sensor=14
def main():
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       
  instance = dht11.DHT11(pin = Temp_sensor)
  while True:
       
        result = instance.read()
        print"Temperature =",result.temperature,"C"," Humidity = ",result.humidity,"%"
        time.sleep(2)
        with open('dht.csv','a') as f:
           if result.temperature > 0:
            writer = csv.writer(f)
            writer.writerow([datetime.datetime.now(),result.temperature,result.humidity])
           
        f.close()
print('done. see dht.csv')
            
if __name__ == '__main__':
  try:
    main()
  except KeyboardInterrupt:
    pass
これでdht.csvというCSVファイルができました。
このファイル前回の要領でS3へアップロードしていきます。
前回は画像ファイルtest.jpgだったものをdht.csvへ変更するだけでOKです。
(同じフォルダに入れる必要があります)

今度はAWS側の設定です。

S3にindex.htmlファイルを作って公開できる設定にします。




パブリックアクセスをEvery Oneにするとだれでもアクセス可能になります。
アップロードしたファイルを同じバケットにしてhtmlで関連付けました。

こんな具合でできました。CSVがダウンロードできるはずです!


3/31 0のデータが多かったためコード修正しています。







拍手[0回]

02/17

Sun

2019

ラズパイカメラからAWS S3への写真のアップロード

データセンター業界では最近AWSって大手クラウドとしてよく聞くけど、実際サービスってどんな感じかな~ って思ってました。 1年間は無料なので今回ラズパイとの連携をやってみることにしました。
まずはAWSのアカウントを取得してください。いきなりカード番号を聞かれますが大丈夫です笑
はじめにS3というストレージサービスでバゲットを作ります。
(ここに画像データを送ります)
 
あとは右上のタブからセキュリテイ認証を選択して
アクセスキー (アクセスキー ID とシークレットアクセスキー)を取得します。
(ここでコピーしておいて下さい)
あとでラズパイ上で使います。
今度はユーザーと紐づけていきます。
AWS S3FullAccessのポリシーをアタッチしてください。
あとはラズパイの準備!
必要なパッケージをインストールしていきます。
pip install boto3
pip install awscli
あとはアクセスキー ID とシークレットアクセスキーを設定していくのですが、
ここでエラーが出ることがあります。
aws configure
AWS Access Key ID [None]: ***********
AWS Secret Access Key [None]: ***********
Default region name [None]: ***********
Default output format [None]: json
configureのコマンドが見つからないといった症状がでればこちらでインストールしてください。
pip install awscli --upgrade
画像をアップロードするコードです。
BUCKET_NAME = '*******'はS3で作成したバケット名をいれて下さい
import sys
import threading
import boto3
# boto3 (.aws/config)
BUCKET_NAME = '*******'
class ProgressCheck(object):
    def __init__(self, filename):
        self._filename = filename
        self._size = int(os.path.getsize(filename))
        self._seen_so_far = 0
        self._lock = threading.Lock()
    def __call__(self, bytes_amount):
        with self._lock:
            self._seen_so_far += bytes_amount
            percentage = (self._seen_so_far / self._size) * 100
            sys.stdout.write(
                    "\r%s / %s (%.2f%%)" % (
                        self._seen_so_far, self._size,
                        percentage))
            sys.stdout.flush()
def UploadToS3():
    # S3Connection
    s3 = boto3.resource('s3')
    s3.Object(BUCKET_NAME, 'test.jpg').upload_file('test.jpg')
UploadToS3()  
これでtest.jpgをアップロードできます。S3で確認できました。


もしエラーになることがあればこちらのコマンドでアクセスキー ID とシークレットアクセスキーを設定してみてください(自分はここでハマりました・・)
aws configure set aws_access_key_id AKIA****************
aws configure set aws_secret_access_key ***************
自動でアップロードをするなら
raspistill -w 480 -h 360 -n -o test.jpg
などと絡めてシェルスクリプトをcrontabに登録しておけば定期投稿できます。

ちなみにAWSはアプリもあるので携帯でも見れます!!
(S3などのサービスに限定されますが)


ラズパイでIotをやるならAWSは要チェックですね…
IoT coreとかも手を出していこうかと・・。
 










拍手[0回]

翻訳(Translate)

AD

シェアしてね

プロフィール

HN:
アルティメット雅史
性別:
男性
自己紹介:
製油所、データセンター、化学工場を渡り歩いた設備のマニア
最近はarduino,Raspberry pi等の電子工作にハマる。
取得資格は電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトほか

カウンター

お問い合わせ

忍者アクセスランキング

Copyright © 設備のマニアどっとこむ : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]