LoginSignup
4
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-05

記事をご覧くださりありがとうございます!
初めまして。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サービスっぽいサイトとして作ってみた

感想

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

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1