ラズパイでLCDディスプレイを使う

やること

TFTに文字列や画像を表示する

必要なもの

  • パソコン(esp32のプログラムを作成します)
  • esp32 1台

www.amazon.co.jp


f:id:j04328:20191117044347p:plain

 

( ILI9341)PIN配置例

HiLetgo® 2.8 スプレイ タッチパネル SPIシリアル240 * 320 ILI9341 5V / 3.3V STM32 [並行輸入品]

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

 

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が設定されていなかったので設定します

xcode-設定
f:id:j04328:20191020231344p:plain
xcode-設定2

シミュレータのデフォルトがiphone Xらしいのですが、なくて起動しないので追加しました。

f:id:j04328:20191020231410p:plain
Xcode-device1
f:id:j04328:20191020231427p:plain
Xcode-device2

 

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>
        );
    }
}
f:id:j04328:20191020231643p:plain
サンプルアプリの起動画面

rsyncによるバックアップ

背景

timemachineのバックアップが失敗していて
復元できなかったことから自分でnasに保存しておくことにしました。

環境

ReadyNASの設定例

rsyncのユーザーを作成します。

f:id:j04328:20191020135827p:plain
rsyncのユーザー作成

共有フォルダを作成します

f:id:j04328:20191020144025p:plain
共有フォルダ設定例


rsyncを有効にします。

f:id:j04328:20191020135416p:plain
ReadyNASの設定例

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 ReadyNASrsyncユーザーパスワード

macでphotoslibraryをバックアップする

rsyncだとphotoslibraryをバックアップしてもバックアップしたファイルが開けないので手動でコピーする必要があります。
そこで、 起動時にnasに自動的に接続する設定を行います。

f:id:j04328:20191020174523p:plain
設定画面からユーザーとグループをクリックする

f:id:j04328:20191020174605p:plain
ログイン先を追加する

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など)

f:id:j04328:20191006180257p:plain

  • モーション検知範囲は任意に4か所設定できます。
  • 動き検知をオープンしますにチェックを入れると動作します。

f:id:j04328:20191006180300p:plain

  • インターバルタイマは1秒にしました。1秒枚にモーション検知します
  • 7*24は24時間モーション検知する設定です


f:id:j04328:20191006180304p:plain

  • アクションタイプはFTPとスナップショットを指定します。片方だけだとダメでした。

f:id:j04328:20191006180309p:plain

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"

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
  • ジャンパーワイヤ

 

  • bme280

akizukidenshi.com

  • SDカード 32GB
  • ユニバーサル基盤
  • はんだ
goot 家庭用はんだこてセット SR-40

goot 家庭用はんだこてセット SR-40

 
  • 耐熱電子ワイヤー

配線

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日です。