ラズパイでLCDディスプレイを使う
やること
TFTに文字列や画像を表示する
( ILI9341)PIN配置例
HiLetgo® 2.8 スプレイ タッチパネル SPIシリアル240 * 320 ILI9341 5V / 3.3V STM32 [並行輸入品]
HiLetgo® 2.8 "TFT LCDディスプレイ タッチパネル SPIシリアル240 * 320 ILI9341 5V / 3.3V STM32 [並行輸入品]
- 出版社/メーカー: HiLetgo
- メディア:
- この商品を含むブログを見る
raspi | TFT |
GND | GND(TFT) |
3.3V | VCC(TFT) |
GPIO16 | CS(TFT) CS(Change Select) or SS |
None | RESET |
GPIO13 | D/C(TFT) |
GPIO20 | SDI(MOSI) |
GPIO21 | SCK |
3.3V | LED |
( ST7735)PIN配置例
WINGONEER 1.44インチTFT LCD 65Kカラー128×128表示画面SPIシリアルポートモジュールST7735(51 ARM Arduino用
TFT | Raspi (SPI1:未確認) | Raspi(SPI0) |
GND | GND | GND |
VCC | 3.3V | 3.3V |
SCK | GPIO21 | GPIO11 |
SDA(MOSI) | GPIO20 | GPIO10 |
RES | GPIO16 | GPIO25 |
DC | GPIO24 | GPIO24 |
CS | GPIO18(CE0) | GPIO8 |
BLK | 3.3V | 3.3V |
(ST7735)PIN配置例
EasyWordMall SPI TFT シリアルインターフェイス LCDモジュール 1.8インチ PCB
EasyWordMall SPI TFT シリアルインターフェイス LCDモジュール 1.8インチ PCB
- 出版社/メーカー: Apple Trees E-commerce co., LT
- メディア: その他
- この商品を含むブログを見る
TFT | Raspi (SPI0) |
VCC | 5V |
GND | GND |
CS | GPIO8(CE0) |
RES | GPIO25 |
A0 | GPIO24 |
SDA(MOSI) | GPIO10 |
SCK | GPIO11 |
LED | 5V |
react-native-chart-kitを使ってみよう
react-nativeのインストール
公式サイトを参照すること
以下はメモ
brew install yarn brew install node brew install watchman brew tap AdoptOpenJDK/openjdk brew cask install adoptopenjdk8 npm install -g react-native-cli yarn global add create-react-native-app
xcodeのデフォルトではcommandline toolが設定されていなかったので設定します
シミュレータのデフォルトがiphone Xらしいのですが、なくて起動しないので追加しました。
react-native-chart-kitの導入
yarn add react-native-chart-kit react-native-svg
react-native link react-native-svg
import React, {Component} from 'react'; import { StyleSheet, Text, View, Dimensions } from 'react-native'; import { LineChart, BarChart, PieChart, ProgressChart, ContributionGraph, StackedBarChart } from 'react-native-chart-kit' export default class App extends Component<Props> { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Charts</Text> <LineChart data={{ labels: ['1月', '2月', '3月', '4月', '5月', '6月'], datasets: [{ data: [ Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100 ] }] }} width={300} // from react-native height={220} yAxisLabel={'円'} chartConfig={{ backgroundColor: '#fff', backgroundGradientFrom: '#fff', backgroundGradientTo: '#fff', color: (opacity = 0.5) => `rgba(0, 0, 0,0.5)`, }} // bezier /> </View> ); } }
rsyncによるバックアップ
背景
timemachineのバックアップが失敗していて
復元できなかったことから自分でnasに保存しておくことにしました。
環境
- macbook air ( 11-inch, early 2015 )
- ReadyNAS 316 6.10.1
rsyncコマンド
usernameを自分のmacbookアカウント名にします。
Rsync -ur --delete --progress --info=progress2 --password-file=/Users/username/rsync.passwd --exclude=/Pictures/* --exclude=/Library/* --exclude=node_modules /Users/username/ rsync://[uhestia(rsyncのアカウント名)]@[ReadyNASのIP]:/[hestia(readynasのrsync共有フォルダ)]
オプション | 別名 | 意味 |
-r | --recursive | 指定ディレクトリ配下をすべて対象とする |
-u | --update | 転送先に既にファイルが存在し、転送先のタイムスタンプの方が新しい場合は転送しない |
--info=progress2 | 進捗表示 | |
--delete | 転送元に存在しないファイルは削除 | |
--progress | ファイル単位で転送状況が表示される。 | |
--exclude=/Pictures/* | Picturesフォルダは除外 | |
--exclude=/Library/* | Libraryフォルダは除外 | |
/Users/username/ | バックアップ対象 | |
--password-file=/Users/username/rsync.passwd | ReadyNASのrsyncユーザーパスワード |
cpコマンドの代わりにpythonで進捗率を出す
背景
cpコマンドって進捗率出ませんよね。
進捗率を出すためだけにpythonプログラムを作成しました。
プログラム
H.VIEWの使い方
amazonで以下の防犯カメラを購入しました。
H.View ドーム型防犯カメラ 500万画素 IPカメラ 5MP 防犯カメラ 2.8mmレンズ 内蔵オーディオ IP66防水防塵 24個赤外線LED搭載 暗視撮影25M 動体検知機能 遠隔監視操作 メールお知らせ ネットワークカメラ IPカメラ 屋外/屋内、Iphone/Android/Windows PC対応 日本語取扱説明書付き (HV-500E6)
- サーバーIP:サーバーのIPアドレスを設定します
- ポート:21
- アカウント:ftpアクセスできるアカウント名です(ftp-accountとします)
- パスワード:ftp-accountのパスワードを設定します
- リモートパス:例えば、/home/ftp-account/配下のFTPフォルダを指定します。フルパスが必要です(/home/ftp-account/FTPなど)
- モーション検知範囲は任意に4か所設定できます。
- 動き検知をオープンしますにチェックを入れると動作します。
- インターバルタイマは1秒にしました。1秒枚にモーション検知します
- 7*24は24時間モーション検知する設定です
- アクションタイプはFTPとスナップショットを指定します。片方だけだとダメでした。
mongodbでシャーディングのラズベリーパイ包み
シャーディングで行うこと
- configサーバーの準備
- mongosのセットアップ 5
- シャード準備
- mongosからシャード追加
環境
raspberry pi 3b + を4台使用します。
1台目:mongos専用
2台目:configsvr1とshard1
3台目:configsvr2とshard2
4台目:configsvr3とshard3
configsvrとシャードは兼用させます。
configsvrは軽量な為、兼用させても問題ないようです。
configsvr1とシャード1の準備
ラズパイ2台目(192.168.100.20)にログインします。
下記を実行します。
sudo mkdir -p /data/configdb1
sudo mongod --configsvr --dbpath /data/configdb1 --port 27031 --logpath /data/configdb1/log -fork
sudo mkdir /data/shard1
sudo mongod --port 27021 --dbpath=/data/shard1 --logpath /data/configdb1/shard1.log -fork
configsvr2とシャード2の準備
ラズパイ3台目(192.168.100.21)にログインします。
下記を実行します。
sudo mkdir -p /data/configdb2
sudo mongod --configsvr --dbpath /data/configdb2 --port 27032 --logpath /data/configdb2/log -fork
sudo mkdir /data/shard2
sudo mongod --port 27022 --dbpath=/data/shard2 --logpath /data/configdb2/shard2.log -fork
configsvr3とシャード3の準備
ラズパイ4台目(192.168.100.22)にログインします。
下記を実行します。
sudo mkdir -p /data/configdb3
sudo mongod --configsvr --dbpath /data/configdb3 --port 27033 --logpath /data/configdb3/log -fork
sudo mkdir /data/shard3
sudo mongod --port 27023 --dbpath=/data/shard3 --logpath /data/configdb3/shard3.log -fork
mongosの準備
configsvrを指定してmongosを起動します。
mongos --configdb 192.168.100.20:27031,192.168.100.21:27032,192.168.100.22:27033
mongosからシャードを追加します。
mongo
> use admin
> db.runCommand({"addShard":"192.168.100.20:27021"})
> db.runCommand({"addShard":"192.168.100.21:27022"})
> db.runCommand({"addShard":"192.168.100.22:27023"})
試しにデータを追加したりします。
> db.printShardingStatus()
> dv.test.inserrt({cateory:"A",name:"aaa", age: 22 })
> db.test.find()
sharding
mongos> db.runCommand({enablesharding:"test"});
mongos> sh.shardCollection("test.stats_a",{"id":1})
mongos> for ( var i=1; i<=30000;i++){db.stats_a.insert({id:i})}
各シャードにアクセスして分散されていることを確認します。
mongo 192.168.100.20:27021
> db.stats_a.count()
23026
mongo 192.168.100.21:27022
> db.stats_a.count()
0
mongo 192.168.100.22:27023
> db.stats_a.count()
6974
mongoが起動できない場合
ps aux | grep mongo
sudo kill -9 "mongodb process ID"
参考
mongoDBのクラスタ環境をいじってみる - notebook
MongoDBでシャーディングを試してみるの巻 - 日頃の行い
MongoDBイン・アクション
pymongoによるmongodbの操作
shard設定を有効にするには下記の操作を行います(シェルで言うsh.enableShardingに相当します)。
client = pymongo.MongoClient()
client.admin.command('enableSharding', 'dbname')
さらにコレクションに足して下記の操作をします(シェルで言うsh.shardCollectionに相当します)。
client.admin.command('shardCollection', 'dbname.collectionname', key={'shardkey': 1})
pymongo
ログインするには下記のようにします。
>>> from pymongo import MongoClient
>>> import urllib.parse
>>> username = urllib.parse.quote_plus('user')
>>> username
'user'
>>> password = urllib.parse.quote_plus('pass/word')
>>> password
'pass%2Fword'
>>> MongoClient('mongodb://%s:%s@127.0.0.1' % (username, password))
...
host1/host2/host3はmongosサーバーを指定します。
こうすることでロードバランサーとして働きます。
>>> client = MongoClient('mongodb://host1,host2,host3')
pymongoはlocalThresholdMS内のmongosサーバーに均等に分配します。
localThresholdMSのデフォルト値は15msです。
このため例えば下記のようなレスポンス時間のmongosがあるとします。
するとhost1が最もレスポンスが早いため選択されるか、
host2が最も早いレイテンシ(host1)の15ms以内のため選択されます。
host3はhost1より20msも遅いため選択されません。
host1: 20 ms
host2: 35 ms
host3: 40 ms
DBにアクセスするには下記のようにします
db = client['test-database']
コレクションにアクセスするには下記のようにします
collection = db['test-collection']
下記のようなデータを追加することを考えます。
import datetime
post = {"username": "j04328",
"d1": 30,
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
下記のようにするとデータを追加できます。
result1 = collection.insert_one(post)
複数同時に追加したい場合には下記のようにします。
result2 = collection.insert_many(posts)
すべてのデータを取ってくるには下記のようにします。
for data in collection.find():
print data
esp32で室温をグラフ表示する
やること
TFTに室温をグラフ表示する
必要なもの
- パソコン(esp32のプログラムを作成します)
- esp32 1台
- TFT
HiLetgo® 2.8 "TFT LCDディスプレイ タッチパネル SPIシリアル240 * 320 ILI9341 5V / 3.3V STM32 [並行輸入品]
- 出版社/メーカー: HiLetgo
- メディア:
- この商品を含むブログを見る
- ジャンパーワイヤ
- bme280
- SDカード 32GB
Samsung microSDカード32GB EVOPlus Class10 UHS-I対応 Nintendo Switch 動作確認済 正規代理店保証品 MB-MC32GA/ECO
- 出版社/メーカー: 日本サムスン
- 発売日: 2017/04/17
- メディア: Personal Computers
- この商品を含むブログ (1件) を見る
- ユニバーサル基盤
HiLetgo® 10個セット 5*7CM FR-4 ユニバーサル ブレッドボード プロトタイプ PCB ダブルサイド Tinned 1.6mm Thick [並行輸入品]
- 出版社/メーカー: HiLetgo
- メディア:
- この商品を含むブログを見る
- はんだ
- 耐熱電子ワイヤー
- トランジスタ
- 抵抗2つ(1K, 200)
配線
esp32 | 他 | memo |
GND | GND(TFT) | |
GND | GND(bmp280) | |
3.3V | VCC(TFT) | |
GPIO16 | D/C(TFT) | |
GPIO17 | CS(TFT) | CS(Change Select) or SS |
GPIO5 | SD_CS(SD) | CS or SS |
GPIO21 | T_CS(TFT toch) | CS or SS |
GPIO18 | SCK(TFT) | SCK or SCL |
GPIO18 | SD_SCK(SD) | SCK or SCL |
GPIO18 | T_CLK(TFT toch) | SCK or SCL |
GPIO19 | SD0(MISO)(TFT) | MISO or DC or SD0 or Dout |
GPIO19 | T_D0(TFT toch) | MISO or DC or SD0 or Dout |
GPIO19 | SD_MISO(SD) | MISO or DC or SD0 or Dout |
GPIO23 | SDI(MOSI)(SD) | MOSI or SDA or SDI or Din |
GPIO23 | T_DIN(TFT toch) | MOSI or SDA or SDI or Din |
GPIO23 | SD_MOSI(SD) | MOSI or SDA or SDI or Din |
GPIO33 | SCK(BME280) | |
GPIO32 | SDI(BME280) | |
GPIO35 | 抵抗(220) | |
3.3V | 抵抗(1k) |
bme280用の電源回路
抵抗(220) | ベース(トランジスタ) | |
抵抗(1K) | コレクタ(トランジスタ) | |
GND | エミッタ(トランジスタ) |
User_Setup.h
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 17 // Chip select control pin
#define TFT_DC 16 // Data Command control pin
//#define TFT_RST 5 // Reset pin (could connect to RST pin)#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
解説
TFTに室温変化のグラフを表示します。
画面の真ん中の上で1日前になります。
画面の真ん中の下で1日後になります。
起動時に7日の室温データをSDカードから読み込みます。
表示できる日数も7日です。