Help us understand the problem. What is going on with this article?

👔着る服が少なくなったら通知する「sentaquiq」を作ってみたの巻🐤

記事をご覧くださりありがとうございます!
初めまして。AI/IoT分野のプロフェッショナルを目指して修行中の、のぶたんです。🐉

今回は、服の状態を監視して、服が少なくなったらメールで通知するIoTシステムを自作してみたことについて書いている記事です。
この洗濯アラートサービス「SENTAQUIQ」を使うことで、早めに服を洗濯することで、「着る服がない!!」という困りごとを解消することができます(^▽^)/

システム構成

sentaquiq1.png

試作版SENTAQUIQ

MVIMG_20200405_193320_2.jpg
→ハンガーの服状態を監視する仕組みはシンプル、透過型フォトインタラプタでハンガーがかけているかを判別しています!
→ハンガーのかけている状態を監視して、服の乾き具合を測る方法が別案であるので、バージョン2では、改良していきます。
MVIMG_20200405_193607_2.jpg
→温湿度センサをつけているので、カビが生えやすい湿度になったら、通知することもできます★

メール通知

mail.PNG
→sigfoxのCallback機能を使ってサーバに飛んできたデータを判別してメール送信するようにしています。

ソースコード(サーバ側)

config.py
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USE_SSL = False
MAIL_USERNAME = '送り元@gmail.com'
MAIL_PASSWORD = '送り元パスワード'
MAIL_DEFAULT_SENDER = '送り元@gmail.com'
sentaquiqsvr.py
# -*- coding: utf-8 -*-
from datetime import datetime
from flask import Flask,request
import requests
from flask_mail import Mail, Message
import config
import json

bodytemp=datetime.now().strftime('%Y-%m-%d')+datetime.now().strftime('%H:%M:%S') +" \n熱中症リスクがあります。こまめな水分補給してください!!"
bodykabi=datetime.now().strftime('%Y-%m-%d')+datetime.now().strftime('%H:%M:%S') +"\nカビが生えやすい湿度です。換気してください!!"
bodycloth=datetime.now().strftime('%Y-%m-%d')+datetime.now().strftime('%H:%M:%S')+" \n服が少なくなりました。洗濯してください!!"

app = Flask(__name__)
app.config.from_object('config')
mail = Mail(app)

@app.route('/post', methods=['GET', 'POST'])
def post():
  if request.method == 'POST':
        data = request.data
        print(data)
        json_dict = json.loads(data)
        status = map(int, json_dict["data"])
        if status[-3] == 1 or status[-3] == 2 or status[-3] == 3 or status[-3] == 4:
                msg = Message(recipients=['宛先@gmail.com'],body=bodytemp,subject='SENTAQUIQサービス')
                mail.send(msg)
        if status[-2] == 1:
                msg = Message(recipients=['宛先@gmail.com'],body=bodykabi,subject='SENTAQUIQサービス')
                mail.send(msg)
        if status[-1] == 1 or status[-1] == 2:
                msg = Message(recipients=['宛先@gmail.com'],body=bodycloth,subject='SENTAQUIQサービス')
                mail.send(msg)
        return ''
if __name__ == "__main__":
  app.run(host='0.0.0.0',port=8090)

ソースコード(sentaquiqシステム側)

sentaquiqdatapost.ino
#include <SoftwareSerial.h>
#include "SparkFun_Si7021_Breakout_Library.h"
#include <Wire.h>

float humidity = 0;
float tempf = 0;
//Create Instance of HTU21D or SI7021 temp and humidity sensor and MPL3115A2 barrometric sensor
Weather sensor;

#define sensor1 4
#define sensor2 5
#define sensor3 6
#define sensor4 7
//#define sensor5 8
//#define sensor6 9
//#define sensor7 10
//#define sensor8 11


SoftwareSerial mySerial(3, 2); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  /*while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }*/
  pinMode(sensor1,INPUT);
  pinMode(sensor2,INPUT);
  pinMode(sensor3,INPUT);
  pinMode(sensor4,INPUT);
//  pinMode(sensor5,INPUT);
//  pinMode(sensor6,INPUT);
//  pinMode(sensor7,INPUT);
//  pinMode(sensor8,INPUT);

  sensor.begin();
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

void loop() { // run over and over
    getWeather();
  int tempc = (tempf-32)/1.8;
  int data=0;
  if(tempc >= 24){
     //level1
     data = 100;
  }else if(tempc >= 28){
    //level2
     data = 200; 
  }else if(tempc >= 31){
    //level3
     data = 300;
  }else if(tempc >= 34){
    //level4
    data = 400;
  }else{
    //level0
    data= 0;
  }

  if (humidity > 65){
    //kabi
    data = 10;
  }else{
    data = 0;
  }
  int s1=digitalRead(sensor1);
  int s2=digitalRead(sensor2);
  int s3=digitalRead(sensor3);
  int s4=digitalRead(sensor4);
 // int s5=digitalRead(sensor5);
 // int s6=digitalRead(sensor6);
 // int s7=digitalRead(sensor7);
 // int s8=digitalRead(sensor8);
 // Serial.println(String(s1)+String(s2)+String(s3)+String(s4)+String(s5)+String(s6));
  data  += !s1;
  data  += !s2;
  data  += !s3;
  data  += !s4;
  //data  +=!s5;
  // data  +=!s6;
  //data  +=!s7;
  // data  +=!s8;
  String senddata = "AT$SF=";
         senddata += String(data+1000);
         senddata += "\r";
  mySerial.write(senddata.c_str());

  //2時間おきにデータがポストされます!
  delay(1000*60*60*2);

}
void getWeather()
{
  // Measure Relative Humidity from the HTU21D or Si7021
  humidity = sensor.getRH();

  // Measure Temperature from the HTU21D or Si7021
  tempf = sensor.getTempF();
  // Temperature is measured every time RH is requested.
  // It is faster, therefore, to read it from previous RH
  // measurement with getTemp() instead with readTemp()
}

このSENTAQUIQをIoTサービスっぽいサイトとして作ってみた

https://rtkdoragon.jp/sentaquiq.html

感想

Sigfoxを始めて使ってみて、2時間に一回データをPOSTする仕組みにしているので、コスト的にも他の通信規格(ポケットWI-FIなど)よりいいと思いました。
→大量にデータ通信する場合は、別の規格がよい。

この記事をご覧になった方...
今回はSigfoxを使って洗濯通知IoTシステムを構築してみました。
センサーとArduinoとSigfoxボードを組み合わせれば、
アイデア次第でいろいろ活用できると思います。
皆さんも、生活の困りごとを解消するアイデアをIoTという形で実現してみてはいかがでしょうか。
とっても面白いですよ👍
それでは✋

nobutan_tinou
1996年生まれ。24歳。 情報系の学校を卒業後、AIシステム開発(自動車系)、 IoTファームウェア開発(環境系)を二年経験したのち、 現在は、フリーランスエンジニアとして活動中。 同時に、あるきっかけで臨床心理士と公認心理師を目指しています🐤
https://rtkdoragon.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away