虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

身近なもので気圧を測ってみたい+Swiftを学んでみる

こんにちは、虎の穴ラボのHYです。
虎の穴ラボ Advent Calendar 2020 - Qiita 5日目の記事です。
4日目はA.M.さんがGAS+スプレッドシートの記事を書かれています。
6日目はT.M.さんがSupabaseについての記事を書かれる予定です。

事の始め


冬が近づき、忘れていたことを思い出しました。
私には天気が悪くなり、気圧が低くなると頭痛で悲しみを覚えるという「隠れ特性」があるのです。
そこで当初はRaspberry Piの気圧センサーを買ってきて、気圧を測り、Slackに通知するシステムを考えました。
ですが、弊社は2020年3月頃(うろ覚え)からリモート勤務になっている為、
以前のように手軽に秋葉原のなんとかパーツとか、なんとか電子に行って電子パーツを買う事ができません。
(Amazonで1000円ぐらいで買えたりしますが。。。)
それに、Raspberry Piは以前にも記事のネタにしているので、今回は別のやり方で気圧を測りたい。

そんな矢先、ふと乱雑な机を見ると乗り換え後に放置していたiPhone6Sが。
f:id:toranoana-lab:20201203174540j:plain
(撮影のためにきれいな場所(当社比)で撮りました。)

iOSアプリの開発は初めてでしたが、以前、手を出してみようとSwiftの本を買っていたので、今回はそれを参考に開発を開始。
ですが、その本は3年前の本だったので、現在の開発環境とSwift、Xcode共にかなりバージョンが違っていたので、相当手間取ることに。
最後は、Webサイトを参考にして開発を行なっていました。「俺は・・・ね○っちにはなれない・・・」

気圧センサーとUIの使い方については、以下のページを参考にしました。
台風が多かったのでSwiftUIで気圧計を作る - Qiita

開発のポイント

  1. 1秒おきに気圧の判定するようにしました。
func doReset(){
    altimeter?.stopRelativeAltitudeUpdates()
    //1秒おきにslack通知判定
    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { (timer) in
        self.startUpdate()
        self.judgeSend()
    })
}


2. 特定の気圧になると、Slackでメッセージを送るようにしました。
測定値が設定した閾値付近をうろうろすると通知が連続できてしまいます。
そこで、閾値をdownThresholdとupThresholdの2つ用意し、downThresholdを下回って通知をすると、次は、一度upThresholdの閾値を上回らないと再度通知が来ないようにしています。

// 送るかどうかを判定
func judgeSend(){
    var message = self.pressureString
    if downThreshold <= nowPressure && !downFlg {
        return
    } else if downThreshold > nowPressure && !downFlg{
        //鳴らす
        message += "/n気圧が低くなっています。"
        self.sendSlack(messege: message)
        downFlg = true
    } else if upThreshold > nowPressure && downFlg {
        return
    } else if upThreshold <= nowPressure && downFlg {
        //元に戻す
        downFlg = false
        return
    } else {
        return
    }
}


Slackの通知部分はSlack Webhook URLを取得して、それに対してPOSTで投げます。
(エラーハンドリングは一切せず・・・)

// slack通知
func sendSlack(messege: String){
    
    //slack hookのURL
    let url = "https://hooks.slack.com/services/xxxxxx/xxxxxx/xxxxxx"
    var request = URLRequest(url: URL(string: url)!)


    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let params: [String: String] = [
        "text": messege
    ]
    
    do{
        let paramData = try JSONEncoder().encode(params)
        let task = URLSession.shared.uploadTask(with: request, from: paramData) {
            data, response, error in
        }
        task.resume()
    }catch{}
}

起動画面はこんな感じになります。



テスト

動かしてみると、気圧を測れていることはわかりました。

この後は、実際にiPhoneの周りの気圧を変化させてテストをする必要があります。
ですが、山に登ったり降りたりのエクストリームなテストはできないため、
f:id:toranoana-lab:20201126194027j:plain
こんな感じに、息でビニール袋を膨らませて密閉して気圧を上げたり下げたりしてテストしました。
(この時に、酸欠になったのは秘密)

f:id:toranoana-lab:20201126194705p:plain
Slackにもちゃんと通知できているので問題なさそうです。
ちなみに、画像の気圧が低い理由は、自宅が山の上にあるからです。


まとめ

Swiftを使ったモバイルでの開発を初めてやってみて、やりたい事がなかなか実現できなくてムズムズしました。
今回、検索してみてわかったのですが、Swiftはバージョンが違うと使用するメソッド名も変わってくるので、作る際に戸惑いました。
たまにiOSがバージョンアップした時に阿鼻叫喚のツイートを見るのですが、理由がわかりました。
まずは、最新の参考書を買いたいと思います。

本当は気圧の測定をバックグラウンドで動かすとか、アプリのボタンのテキストを測定値によって変化させるとかもやりたかったのですが、「HYには、まだちょっと早いかもしれない」

P.S.

作ってみて思った事は、低気圧を通知されても、どうにもできない事・・・事前にロキソニン飲むとか・・・?
(症状が出る前の服用とか、薬剤師の方々に怒られそうですが。)