2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Arduino × AWSサーバーレスで作るIoT温度モニタリングシステム(仮)【第1回】

Last updated at Posted at 2025-04-13

AWSでクラウド側の受け口を作ってみるかぁ

はじめに

2024年の年末、ふと 「仕事とはまったく違う分野のシステム開発に挑戦してみたい」 という気持ちが湧いてきました。

普段は業務向けのソフトウェア開発に携わっていますが、
ここ最近、「手を動かしてリアルなデバイスとつなぐような開発」にどこか惹かれていたんです。

ちょうど年末年始(2024年12月末〜2025年1月上旬)でまとまった時間が取れそうだったこともあり、
これを機に 「センサー × モバイルアプリ × クラウド連携」 という、
いわゆる IoTっぽいことをゼロからやってみよう! と動き出しました。


Bluetoothを使ったスマホアプリの開発経験はあったので、
「じゃあデータ送信はAndroidアプリでやればいいかも」と思いつき、
さらにArduinoを使えばセンサー類のプロトタイピングも手軽にできる。

気づけば、
Arduino → Android → AWS (API Gateway → Lambda → DynamoDB)」という構成が頭の中で浮かんでいました。


このプロジェクトでは、そんな“ちょっとした思いつき”から始まった
個人による実験的なIoTシステムの構築記録を、段階的にまとめていきます。

まずは第一歩として、クラウド側の受け口を作ってデータを送信できるかどうかを確認してみるところからスタートです!

この記事は「Arduino × AWSサーバーレスで作るIoT温度モニタリングシステム」シリーズの一部です。シリーズの全体リンクは記事の末尾にまとめてあります!


全体構成(今回の範囲)

Mac (cURL) → API Gateway → Lambda(Python)→ DynamoDB

まだArduinoやセンサーは使っていないけど、
AWS上でクラウド側の受け口(API)とデータベースの登録までは完成!


Lambda関数(Python)

Lambda関数は以下のような形にしました。

import json
import boto3
import os
from datetime import datetime
from decimal import Decimal

# DynamoDBクライアントを初期化(環境変数からテーブル名を取得)
TABLE_NAME = os.environ.get('DYNAMODB_TABLE_NAME', '********')  # ★ 環境変数に設定すること
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(TABLE_NAME)

def lambda_handler(event, context):
    try:
        # リクエストボディをパース
        data = json.loads(event['body'])

        # 必須項目: temperature, timestamp
        if 'temperature' not in data or 'timestamp' not in data:
            return {
                'statusCode': 400,
                'body': json.dumps({'error': 'Missing required fields'})
            }

        temperature = Decimal(str(data['temperature']))
        timestamp = data['timestamp']

        # オプション項目: humidity(省略可)
        humidity = Decimal(str(data['humidity'])) if 'humidity' in data else None

        # 登録データの構築
        item = {
            'id': str(datetime.now().timestamp()),  # 一意のID
            'temperature': temperature,
            'timestamp': timestamp
        }

        if humidity is not None:
            item['humidity'] = humidity

        # データをDynamoDBに保存
        table.put_item(Item=item)

        return {
            'statusCode': 200,
            'body': json.dumps({'message': 'Data saved successfully!'})
        }

    except Exception:
        # エラー詳細は公開しない
        return {
            'statusCode': 500,
            'body': json.dumps({'error': 'Internal server error'})
        }

POSTの内容

curlで以下のようなJSONをAPI Gatewayに送信しています:

{
  "temperature": 20.3,
  "timestamp": "2024-12-28T23:27:00Z"
}

結果スクショ 📸

✅ DynamoDBにデータ登録できた!

データがしっかり登録されている様子:

curl_screenshot


✅ curlでのPOST送信も成功!

Macのターミナルから送信したときの様子:

dynamodb_screenshot

ここまでの感想と次の一手

やってみた感想としては、AWSのサーバーレス構成は想像以上にスムーズ!

今後は、以下のように発展させていく予定です:

  • Arduinoで温度データを取得(DHT11 or DHT22)
  • HC-06モジュールでBluetooth送信
  • Androidアプリで受信し、そのままAWS APIにPOST!

おわりに

今回はまだ「クラウド側だけ」だけど、
ちゃんとデータが保存されると一気にモチベ爆上がり⤴️

次回は、Arduinoとセンサーのリアルな動きを交えて、もっとIoTっぽくしていきます!


シリーズ記事一覧

※今後の更新もお楽しみに!


つづく…(第2回へ)🔧📡🌐

2
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?