にゃーんボタンを作る

# 目的
にゃーんしたいときににゃーんとツイートしたい

# にゃーんボタン1号
IFTTTでつくった.
<img width="298" alt="スケッチ.png" src="https://qiita-image-store.s3.amazonaws.com/0/198319/4fd79adb-c978-fef6-abf0-cca74ded41df.png">

ボタンが押されると現在時間とともにツイート.
スマホやAppleWatchで使えてとても便利
![Screenshot_20170818-121248.png](https://qiita-image-store.s3.amazonaws.com/0/198319/d22b931a-d72b-438b-cc9c-69c57773163c.png)
![IMG_-96qcj7.jpg](https://qiita-image-store.s3.amazonaws.com/0/198319/c3fcdfca-b717-e93e-9dfc-2a8060164190.jpeg)

## 問題点
投稿文が `にゃーん August 24, 2017 at 03:45AM` のようになってしまい,1分以内だと投稿の重複により投稿できない.にゃーんを連投したい時もあり困る.

# にゃーんボタン2号
家にラズパイがあるのでそいつに仕事してもらいたい
練習として,IFTTTでWebhookしてみる
IFTTTでWebhook飛ばすアプレットと受け取るアプレットを作ってみた.

![maker.ifttt.com-use-dFATP1QGninuFBL9kK7NLv(Laptop with HiDPI screen).png](https://qiita-image-store.s3.amazonaws.com/0/198319/669865d8-97c5-33aa-8e50-d8a6c7809206.png)
IFTTTでWebhookのSettingを開くとこんな感じでPOSTするといいよみたいなURLが表示されるのでそれをそのまま使えばよかった.Webhookめっちゃ便利
curlの入力例も表示される
## Webhook飛ばすやつ
![ifttt.com-applets-59725732d--edit(Laptop with HiDPI screen).png](https://qiita-image-store.s3.amazonaws.com/0/198319/9baf67d0-2a55-b314-82f4-58e84eb27e81.png)

## Webhook受け取るやつ
![ifttt.com-applets-59725732d--edit(Laptop with HiDPI screen) (1).png](https://qiita-image-store.s3.amazonaws.com/0/198319/5ad15745-aece-fe64-7098-f4947881fab8.png)
飛ばすやつで決めたイベント名を指定する.

2号もいい感じに動く.あとは飛ばす方をラズパイにお願いするだけ.

# にゃーんボタン3号
ラズパイと言えばPythonらしいのでPythonをつかうことにした

```py
import wiringpi as pi ,time,requests,datetime
SW_PIN = 15 # スイッチがつながってるピン番号
url='https://maker.ifttt.com/trigger/python1/with/key/******'
swi=0
pi.wiringPiSetupGpio()
pi.pinMode(SW_PIN,pi.INPUT)
pi.pullUpDnControl(SW_PIN,pi.PUD_DOWN)

while True:
    if(pi.digitalRead(SW_PIN)==pi.HIGH):
        if(swi==0):
            print("Switch ON")
            str = datetime.datetime.now().strftime('%H:%M:%S')
            payload = {'value1':str}
            requests.post(url,data=payload)
            swi=1
    else:
       print("Switch OFF")
       swi=0
    time.sleep(0.01)
```

`swi` にスイッチのオンオフを保持し,0→1になった時に時刻を取ってきてwebhook先に飛ばす.

```py
payload = {'value1':str}
requests.post(url,data=payload)
```

とすることで時刻データを飛ばすことができる.
![IMG_-x10jmo.jpg](https://qiita-image-store.s3.amazonaws.com/0/198319/e232e146-5408-1c2d-3157-f1c560e1fa7a.jpeg)
ボタンを押すと投稿

## 問題点
POSTの送信に時間がかかってしまい,送信中は連打してもにゃーんしてくれない.もっと連打したい

# にゃーんボタン4号
送信部だけスレッド化して非同期にしたい.
調べたらPythonにサブスレッドを作る機能があったけどよくわからないのでバックグラウンドで送信部だけ動かすことにしたら解決してしまった.

送信部を `nyaan.py` に分け,`os.system('sudo python3 nyaan.py &')` に書き換えるだけで解決してしまった.
これでにゃーんボタンを連打しても最短1秒間隔でにゃーんすることができる.理想的だ.

## 問題点
毎にゃーんごとに `sudo python3 nyaan.py &` を実行することになるのでちょっと残念.
コンパイルしておきたいけど眠いからまた今度やる.

# にゃーんボタン5号
連打の機運が高まってしまったのでミリ秒表示に対応する.
今までの仕様では1秒に1ツイートが限界だった（ツイートの重複）

```py
now = datetime.datetime.now()
str = now.strftime('%H:%M:%S.') + "%03d" % (now.microsecond // 1000)
```

むずかしいぷろぐらみんぐよくわかんないから http://shohu.hatenablog.com/entry/20081117/1226936130 ここをそのままうつした.

## 結果
理論的には1秒に1000連打しても問題なくツイートできる.

# にゃーんボタン6号
あれからいろいろあってマルチスレッドになったりスピーカーから音が出るようになった

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading,tweepy,datetime,kjfsm4,wiringpi as pi,time

import pygame.mixer

SW_PIN = 14
swi=0
pi.wiringPiSetupGpio()
pi.pinMode(SW_PIN,pi.INPUT)
pi.pullUpDnControl(SW_PIN,pi.PUD_DOWN)

auth = tweepy.OAuthHandler(kjfsm4.consumer_key,kjfsm4.consumer_secret)
auth.set_access_token(kjfsm4.access_token,kjfsm4.access_secret)
api = tweepy.API(auth)

pygame.mixer.init()
pygame.mixer.music.load('nyan.mp3')

def tweet():
    pygame.mixer.music.play(1)
    print("tweet")
    now = datetime.datetime.now()
    str = now.strftime('%H:%M:%S.') + "%03d" % (now.microsecond // 1000)
    print (str)
    str = 'にゃーん '+str
    api.update_status(str)

while True:
    if(pi.digitalRead(SW_PIN)==pi.HIGH):
        if(swi==0):
            th_me = threading.Thread(target=tweet,name="th_me")
            th_me.start()
            swi=1
    else:
       swi=0
    time.sleep(0.01)
```