リアルタイム監視!Raspberry PiでつくるIoT防災システム


前へ⇒ 家庭でできる災害監視!Raspberry Piで構築する表示付き防災システム

※当サイトは、アフィリエイトプログラムを利用して商品を紹介しています。

今回は、これまでRaspberry Piを使って構築した「オールインワン防災システム(水位計測・温度監視・自動撮影)」に、Webモニター機能を追加。これにより、スマートフォンやパソコンからリアルタイムに監視が可能になります。


センサーやカメラの状態をブラウザで簡単に確認できるため、災害発生時の状況把握や防犯対策がより直感的で実用的になります。

① 超音波センサー(HC-SR04)

HC-SR04端子Raspberry Piピン備考
VCC5V(Pin 2)電源
GNDGND(Pin 6)共通GND
TRIGGPIO24(Pin 18)送信
ECHOGPIO23(Pin 16)、GND(Pin 9)分圧で接続(下図)

分圧回路

ECHO信号は5V出力なので、GPIOを守るために分圧回路を作ります。

この構成で約3.0Vになり、GPIOが安定して信号を検出します。

② 温度センサー(ADT7410)

ADT7410端子Raspberry Piピン
VCC3.3V(Pin 1)
GNDGND(Pin 6)
SCLGPIO3(Pin 5)
SDAGPIO2(Pin 3)

アドレス確認

sudo apt install -y i2c-tools
sudo i2cdetect -y 1

表示例:48 → アドレスは 0x48

③ OLEDディスプレイ(SSD1306)

OLED端子Raspberry Piピン
GNDGND  ADT7410と共存(Pin 6)
VCC3.3V(Pin 1)  ADT7410と共存(Pin 1)
SCLGPIO3  ADT7410と共存(Pin 5)
SDA GPIO2  ADT7410と共存(Pin 3)

ADT7410と同じI2Cラインに接続可能。アドレスは通常0x3Cまたは0x3D

④ カメラ(Picamera2)

Raspberry PiのCSIポートにケーブルを正しく接続してください。(Pi4/5はケーブル形状に注意)
接触不良防止のためロック部分を確実に閉めます。

Raspberry pi本体 GPIOピンの配置

3.3V  (1) (2)  5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17(11)(12) GPIO18
GPIO27(13)(14) GND
GPIO22(15)(16) GPIO23
3.3V (17)(18) GPIO24
GPIO10(19)(20) GND
GPIO9 (21)(22) GPIO25
GPIO11(23)(24) GPIO8
GND (25)(26) GPIO7
ID_SD (27)(28) ID_SC
GPIO5 (29)(30) GND
GPIO6 (31)(32) GPIO12
GPIO13(33)(34) GND
GPIO19(35)(36) GPIO16
GPIO26(37)(38) GPIO20
GND (39)(40) GPIO21

1. OSアップデート

ターミナルを開きます。Ctrl + Alt + T を同時に押す。

以下を入力します。

sudo apt update && sudo apt upgrade -y

2. 開発環境とツール導入

以下を入力します。

sudo apt install -y python3-pip python3-venv python3-pil python3-tk python3-smbus i2c-tools
sudo apt install -y fonts-takao

3. 仮想環境の作成(OLED表示・Webモニター用)

以下を入力します。

# 仮想環境を作成(ホームディレクトリ内)
python3 -m venv ~/myenv

# 仮想環境を有効化
source ~/myenv/bin/activate

→ プロンプトの先頭に (myenv) と表示されればOK!

4. 必要ライブラリのインストール

以下を入力します。

pip install luma.oled Pillow flask gpiozero smbus2 picamera2

flask … Webサーバ機能
pillow … 画像処理ライブラリ(FlaskでJPEG等を扱うため)

※前のブログと同じ内容です。既にプログラムが完成しているならば、「Webモニター構築編(仮想環境内)」へお進みください。

Pythonファイルを作ります。

ターミナルを開きます。Ctrl + Alt + T を同時に押す。以下を入力します。

nano shikoshikosysmail.py

nanoエディタで以下のプログラムを入力します。

超音波センサーと温度センサーでデータを取得し、カメラで撮影します。水位が30cm以上になったとき、メールアドレスに現在の水位と温度、画像が添付されてきます。

撮影した画像とデータは、~/picturesフォルダとsensor_data.txtに保存されます。

ファイル名:shikoshikosysmail.py

# shikoshikosysmail.py  (仮想環境外で実行)

from gpiozero import DistanceSensor
import smbus2
import threading
from time import sleep
from datetime import datetime
from picamera2 import Picamera2
import os
import tkinter as tk
from PIL import Image, ImageTk
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formatdate
from email.mime.base import MIMEBase
from email import encoders

# ---------------- 設定 ----------------
MAX_DISTANCE = 5.0
sensor = DistanceSensor(echo=23, trigger=24, max_distance=MAX_DISTANCE)

I2C_ADDR = 0x48
I2C_CH = 1
bus = smbus2.SMBus(I2C_CH)

camera = Picamera2()
camera.configure(camera.create_still_configuration())
SAVE_DIR = os.path.expanduser("~/pictures")
os.makedirs(SAVE_DIR, exist_ok=True)

# データ共有ファイル
SHARED_PATH = os.path.expanduser("~/sensor_data.txt")
TMP_PATH = SHARED_PATH + ".tmp"

# ---------------- メール設定 ----------------
SMTP_SERVER = "smtp.lolipop.jp"
SMTP_PORT = 465
EMAIL_ADDRESS = "メールアドレス"       # 送信元(あなたのメールアドレス)
EMAIL_PASSWORD = "ここにメールパスワードを入力"  # 注意:絶対に公開しない!
TO_ADDRESS = "受信者のメールアドレス"  # 送信先(自分や家族など)

# 水位メール送信のしきい値(cm)
SNOW_THRESHOLD = 30.0


def send_email(distance_cm, temp_c, image_path=None):
    """水位データと温度をメール送信"""
    try:
        subject = f"水位観測アラート! {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
        body = f"現在の水位: {distance_cm:.1f} cm\n温度: {temp_c:.2f} ℃\n\n30cmを超えました。ご確認ください。"

        msg = MIMEMultipart()
        msg["From"] = EMAIL_ADDRESS
        msg["To"] = TO_ADDRESS
        msg["Date"] = formatdate(localtime=True)
        msg["Subject"] = subject
        msg.attach(MIMEText(body, "plain", "utf-8"))

        # 添付画像
        if image_path and os.path.exists(image_path):
            with open(image_path, "rb") as f:
                part = MIMEBase("image", "jpeg")
                part.set_payload(f.read())
                encoders.encode_base64(part)
                part.add_header(
                    "Content-Disposition",
                    f'attachment; filename="{os.path.basename(image_path)}"',
                )
                msg.attach(part)

        with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as smtp:
            smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
            smtp.send_message(msg)

        print("メール送信成功:", subject)

    except Exception as e:
        print("メール送信エラー:", e)


def write_shared_data(distance_cm, temp_c):
    """原子操作で書き込み"""
    try:
        with open(TMP_PATH, "w") as f:
            f.write(f"{distance_cm:.1f},{temp_c:.2f}\n")
        os.replace(TMP_PATH, SHARED_PATH)
    except Exception as e:
        print("データ書き込みエラー:", e)


def capture_image():
    """撮影してファイルに保存し、パスを返す"""
    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    filename = os.path.join(SAVE_DIR, f"capture_{timestamp}.jpg")
    try:
        camera.start()
        sleep(1)
        camera.capture_file(filename)
        camera.stop()
        print(f" 撮影: {filename}")
        return filename
    except Exception as e:
        print("カメラ撮影エラー:", e)
        return None


def read_temperature():
    try:
        data = bus.read_i2c_block_data(I2C_ADDR, 0x00, 2)
        raw = (data[0] << 8) | data[1]
        raw = raw >> 3
        if raw & 0x1000:
            raw -= 1 << 13
        return raw * 0.0625
    except Exception as e:
        print("通信エラー:", e)
        return None


# ---------------- GUI設定 ----------------
root = tk.Tk()
root.title("センサー&カメラ")
root.geometry("600x500")

label = tk.Label(root, text="測定中...", font=("Helvetica", 16))
label.pack(pady=10)

image_label = tk.Label(root)
image_label.pack(pady=10)


# ---------------- 測定スレッド ----------------
def measure_loop():
    while True:
        distances, temps = [], []

        for _ in range(10):
            actual_distance = sensor.distance * MAX_DISTANCE
            reversed_distance = max(0.0, MAX_DISTANCE - actual_distance)
            distances.append(reversed_distance)
            temp = read_temperature()
            if temp is not None:
                temps.append(temp)
            sleep(1)

        avg_distance = sum(distances) / len(distances)
        avg_temp = sum(temps) / len(temps) if temps else 0.0
        distance_cm = avg_distance * 100.0

        # データ保存
        write_shared_data(distance_cm, avg_temp)

        # 撮影
        filename = capture_image()

        # GUI更新
        text = f"️水位: {distance_cm:.1f} cm\n️温度: {avg_temp:.2f} ℃"
        label.after(0, lambda t=text: label.config(text=t))

        if filename and os.path.exists(filename):
            def update_image():
                img = Image.open(filename)
                img = img.resize((400, 300))
                tk_img = ImageTk.PhotoImage(img)
                image_label.config(image=tk_img)
                image_label.image = tk_img
            image_label.after(0, update_image)

        # ----------------
        #  水位30cm以上でのみメール送信
        # ----------------
        if distance_cm >= SNOW_THRESHOLD:
            print(f"水位 {distance_cm:.1f}cm (しきい値 {SNOW_THRESHOLD}cm 以上)メール送信!")
            send_email(distance_cm, avg_temp, filename)
        else:
            print(f"水位 {distance_cm:.1f}cm(しきい値未満)メール送信なし")

        # 測定間隔(例: 1分ごと)
        sleep(60)


# ---------------- 実行開始 ----------------
threading.Thread(target=measure_loop, daemon=True).start()
root.mainloop()

保存は Ctrl + O → Enter、終了は Ctrl + X です。

OLED表示プログラム(仮想環境内)

仮想環境内で動作するGUIプログラムです。shikoshikosysmail.pyが生成したsensor_data.txtを読み込み、水位と温度を表示します。

ターミナルを開きます。Ctrl + Alt + T を同時に押す。以下を入力します。

nano shikoshikosys2.py

nanoエディタで以下のプログラムを入力します。

ファイル名:shikoshikosys2.py

# shikoshikosys2.py  (仮想環境内で実行)

from luma.core.interface.serial import i2c
from luma.oled.device import ssd1306
from PIL import Image, ImageDraw, ImageFont
import time
import os

SHARED_PATH = os.path.expanduser("~/sensor_data.txt")
I2C_ADDR = 0x3C   #環境によって0x3Cか0x3Dを確認
FONT_PATH = "/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf"

# OLED 初期化
serial = i2c(port=1, address=I2C_ADDR)
device = ssd1306(serial)

# フォントの読み込み(無ければデフォルト)
try:
    font_small = ImageFont.truetype(FONT_PATH, 12)
    font_large = ImageFont.truetype(FONT_PATH, 16)
except Exception:
    font_small = ImageFont.load_default()
    font_large = ImageFont.load_default()

def read_shared_data():
    """ sensor_data.txt の読み取り。フォーマット: distance_cm,temp_c """
    try:
        with open(SHARED_PATH, "r") as f:
            line = f.readline().strip()
            if not line:
                return None, None
            parts = line.split(",")
            if len(parts) >= 2:
                distance = float(parts[0])
                temp = float(parts[1])
                return distance, temp
    except FileNotFoundError:
        return None, None
    except Exception as e:
        print("読み取りエラー:", e)
        return None, None

def draw_display(distance_cm, temp_c):
    img = Image.new("1", device.size, "black")
    draw = ImageDraw.Draw(img)
    # ヘッダ
    draw.text((2, 0), "観測中", font=font_large, fill=255)
    # データ部分
    if distance_cm is not None:
        draw.text((2, 20), f"水位: {distance_cm:.1f} cm", font=font_small, fill=255)
    else:
        draw.text((2, 20), "水位: ---", font=font_small, fill=255)

    if temp_c is not None:
        draw.text((2, 36), f"温度: {temp_c:.2f} ℃", font=font_small, fill=255)
    else:
        draw.text((2, 36), "温度: ---", font=font_small, fill=255)

    # 時刻
    draw.text((80, 50), time.strftime("%H:%M:%S"), font=font_small, fill=255)
    device.display(img)

def main_loop():
    while True:
        distance, temp = read_shared_data()
        draw_display(distance, temp)
        time.sleep(2)  # 表示更新間隔(任意)

if __name__ == "__main__":
    print("OLED 表示開始")
    main_loop()

保存は Ctrl + O → Enter、終了は Ctrl + X です。

概要

Flask を使って、

  • センサー値(温度・距離)
  • カメラ画像(静止画)

HTMLでwebページを作り、Webブラウザでリアルタイム表示 できるようにします。尚、すでに最初のコマンドで flaskPillow は導入されています。

Flask(フラスク)とは?

Flask(フラスク)は、Pythonで作られた軽量なWebアプリケーションフレームワークです。難しい設定をしなくても、数行のコードでWebサーバを立ち上げることができるのが大きな特徴です。

たとえば、今回のように「Raspberry Piで取得したセンサー情報をブラウザで見たい」といった場合、Flaskを使えばデータをリアルタイムに表示する仕組みを手軽に構築できます。

Flaskのメリットは次の3つです。

  1. とにかく軽量で簡単 – 余計な機能が少なく、すぐ動かせる
  2. HTMLと連携しやすい – テンプレート機能で画面を柔軟に作れる
  3. 拡張性が高い – 必要に応じて機能を追加可能(API、グラフ表示など)

Flaskが「Webモニター」の中心となり、センサーからのデータを受け取り、HTMLを通して画面に反映します。

HTMLとは?

HTML(HyperText Markup Language)は、Webページを作るための基本的な言語です。Flaskが「データを送り出す側」だとすると、HTMLは「そのデータを見やすく表示する側」です。

たとえば、HTMLを使って次のような表示を作れます。

  • 温度や距離の数値を画面中央に大きく表示
  • 最新のカメラ画像を自動で更新
  • 背景色や文字サイズをデザインで調整

HTMLには、「タグ」と呼ばれる部品(<p><h1><img>など)を組み合わせて文章・画像・ボタンなどを配置していくというシンプルな仕組みがあります。

今回の構成では、index.html がWebブラウザで表示されるページそのものであり、FlaskがこのHTMLをブラウザに送り、JavaScriptが定期的にデータを更新してくれます。

FlaskとHTMLの関係を図でイメージすると
[ Raspberry Pi ]
   │
   ├── Flask(Pythonで動くWebサーバ)
   │        ├── /status → 温度・距離を返す
   │        └── /image  → 最新画像を返す
   │
   └── index.html(ブラウザで表示)
            ├── 温度や距離をリアルタイム更新
            └── カメラ画像を自動リロード

つまり、

  • Flaskが「裏側の仕組み(データの配信)」を担当
  • HTMLが「見せる部分(画面デザイン)」を担当

することで、Raspberry Piがまるで“ミニ監視サーバ”のように動作します。

Webアプリ本体 web_monitor.py

ターミナルを開きます。Ctrl + Alt + T を同時に押す。以下を入力します。

ファイル名:web_monitor.py

nano web_monitor.py

nanoエディタで以下のプログラムを入力します。

# web_monitor.py

from flask import Flask, render_template, Response, request, send_file
import os, time, io
from time import sleep
from threading import Thread
from datetime import datetime
from pathlib import Path
from typing import Optional

# ----- 設定 -----
SHARED_PATH = os.path.expanduser(os.getenv("SHARED_PATH", "~/sensor_data.txt"))
PICTURE_DIR = os.path.expanduser(os.getenv("PICTURE_DIR", "~/pictures"))
CAM_INTERVAL = float(os.getenv("CAM_INTERVAL", "3.0"))
WEB_USER = os.getenv("WEB_USER", "ユーザー名")  # あなたのユーザー名を入力してください。
WEB_PASS = os.getenv("WEB_PASS", "パスワード")    # パスワードを入力してください。
STATION_NAME = os.getenv("STATION_NAME", "観測地の名") # 観測地の場所や住所などを入力

app = Flask(__name__)

# ---- センサーデータ読み取り ----
def read_sensor_data():
    try:
        with open(SHARED_PATH, "r") as f:
            line = f.readline().strip()
            if not line:
                return None, None
            parts = line.split(",")
            if len(parts) >= 2:
                return float(parts[0]), float(parts[1])
    except Exception:
        return None, None

# ---- 画像取得ユーティリティ(最新ファイルを返す) ----
def get_latest_image_path() -> Optional[str]:
    p = Path(PICTURE_DIR)
    if not p.exists():
        return None
    files = list(p.glob("capture_*.jpg"))
    if not files:
        return None
    files.sort(key=lambda f: f.stat().st_mtime, reverse=True)
    return str(files[0])

# ---- 簡易 BasicAuth ----
def check_auth(auth):
    if not auth:
        return False
    return auth.username == WEB_USER and auth.password == WEB_PASS

from flask import Response as FlaskResponse
def requires_auth(fn):
    def wrapped(*args, **kwargs):
        auth = request.authorization
        if not check_auth(auth):
            return FlaskResponse('認証が必要', 401, {'WWW-Authenticate': 'Basic realm="Login"'})
        return fn(*args, **kwargs)
    wrapped.__name__ = fn.__name__
    return wrapped

# ---- ルート ----
@app.route("/")
@requires_auth
def index():
    distance, temp = read_sensor_data()
    last = "-"
    try:
        last = datetime.fromtimestamp(os.path.getmtime(SHARED_PATH)).strftime("%Y-%m-%d %H:%M:%S")
    except Exception:
        last = "-"
    return render_template("index.html",
                           station=STATION_NAME,
                           distance=distance,
                           temp=temp,
                           last=last)

# 最新画像を返す
@app.route("/latest.jpg")
@requires_auth
def latest_jpg():
    img_path = get_latest_image_path()
    if not img_path or not os.path.exists(img_path):
        # プレースホルダーを返す(空画像)
        return send_file(io.BytesIO(b""), mimetype='image/jpeg')
    # キャッシュ対策ヘッダを付けて送る
    resp = send_file(img_path, mimetype="image/jpeg")
    resp.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0"
    return resp

# JSON API(集中ダッシュボード用)
@app.route("/api/status")
@requires_auth
def api_status():
    distance, temp = read_sensor_data()
    return {"station": STATION_NAME, "distance": distance, "temp": temp, "time": datetime.now().isoformat()}

if __name__ == "__main__":
    # 確認メッセージ
    print("Web monitor starting. Serving images from:", PICTURE_DIR)
    app.run(host="0.0.0.0", port=5000, debug=False)

保存は Ctrl + O → Enter、終了は Ctrl + X です。

/tmp/sensor_data.json/tmp/latest.jpg は、センサー側スクリプト(仮想環境外)から定期的に書き出されるファイルです。Flaskはそれを読み取ってブラウザに表示します。

HTMLテンプレート templates/index.html

templates フォルダの作成方法

Flaskでは、HTMLファイルを格納するフォルダ名が決まりごとで “templates” になっています。index.html などのテンプレートファイルは、必ずこの中に置きますので、本プロジェクトのフォルダ内にtemplatesファルダを新規に作成してください。

ターミナルを開きます。Ctrl + Alt + T を同時に押す。

index.html を作成します。

nano templates/index.html

以下を ~/templates/index.html に保存します。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{{ station }} - 観測</title>
<style>
  body{font-family:Arial,Helvetica,sans-serif;text-align:center;background:#f2f7fb;}
  .card{display:inline-block;padding:18px;border-radius:8px;background:#fff;box-shadow:0 2px 6px rgba(0,0,0,0.12);}
  img{width:480px;border-radius:6px;border:1px solid #ccc;}
  .meta{margin-top:12px;color:#444;}
  .warn { color: #b00; font-weight: bold; }
</style>

<script>
  const REFRESH_INTERVAL_MS = 3000; // 3秒ごとに更新

  // 画像の自動更新(キャッシュ回避)
  function refreshImage() {
    const img = document.getElementById("camimg");
    if (!img) return;
    img.src = "/latest.jpg?t=" + Date.now();
  }

  // センサーデータをAPIから取得して表示を更新
  async function refreshData() {
    try {
      // fetch に基本認証情報が必要な場合は fetch の第二引数に credentials を付けるか、
      // ブラウザの認証ダイアログで入れているなら同一セッションで動作します。
      const res = await fetch("/api/status", { cache: "no-store" });
      if (!res.ok) {
        console.error("api/status fetch error", res.status);
        return;
      }
      const j = await res.json();
      // j: { station, distance, temp, time }
      const d = document.getElementById("distance");
      const t = document.getElementById("temp");
      const u = document.getElementById("lastupdate");

      d.textContent = (j.distance === null ? '---' : j.distance.toFixed(1)) + " cm";
      t.textContent = (j.temp === null ? '---' : j.temp.toFixed(2)) + " ℃";
      // API の time は現在時刻(サーバ側)。sensor_data.txt の最終更新を優先表示するため
      // ここではページ上部の last 要素に別途入れている last 値を上書きしない。
      u.textContent = new Date(j.time).toLocaleString();

    } catch (err) {
      console.error("refreshData error", err);
    }
  }

  // 初回と定期処理
  function startAutoRefresh() {
    refreshImage();
    refreshData();
    setInterval(refreshImage, REFRESH_INTERVAL_MS);
    setInterval(refreshData, REFRESH_INTERVAL_MS);
  }
  window.addEventListener("load", startAutoRefresh);
</script>
</head>
<body>
  <h1>{{ station }}</h1>
  <div class="card">
    <img id="camimg" src="/latest.jpg" alt="camera">
    <div class="meta">
      <p>積雪: <span id="distance">{{ distance if distance is not none else '---' }}</span></p>
      <p>温度: <span id="temp">{{ temp if temp is not none else '---' }}</span></p>
      <p>最終更新: <span id="lastupdate">{{ last }}</span></p>
    </div>
  </div>
</body>
</html>

保存は Ctrl + O → Enter、終了は Ctrl + X です。

3秒ごとに /status/image を取得して、温度と距離・最新画像を更新します。

Flask と HTML の関係

Flaskを使うと、Pythonで取得したセンサー情報(温度や距離など)をHTMLテンプレートに埋め込み、リアルタイムにブラウザで表示できます。このHTMLテンプレートを保存する場所が templates フォルダで、Flaskは自動的にこのフォルダ内を探してWebページを生成します。

センサー側の実行(仮想環境外)

ターミナルを開きます。Ctrl + Alt + T を同時に押す。

以下を実行します。

python shikoshikosysmail.py

表示側の実行(仮想環境内)

ターミナルを開きます。Ctrl + Alt + T を同時に押す。

仮想環境内で以下を実行します。

# 仮想環境を有効化
source ~/myenv/bin/activate

# 表示側の実行
python shikoshikosys2.py

web_monitorの実行(仮想環境内)

ターミナルを開きます。Ctrl + Alt + T を同時に押す。

仮想環境内で以下を実行します。

# 仮想環境を有効化
source ~/myenv/bin/activate

# Web_monitorの実行
python web_monitor.py

Webブラウザの実行

ブラウザでターミナルに表示されているアドレス(例 http://192.168.1.15:5000など)にアクセスします。(同一LAN内のPCやスマホからもOK)

・Running on http://192.168.1.15:5000
・Running on http://111.136.32.23:5000

サイトがログインすることを求めているので、ユーザー名とパスワードを入力します。

ブラウザに表示されます。

表示例
カメラ画像

水位(例:125.2cm)
温度(例:25.34℃)

今回のRaspberry Piプロジェクトでは、水位計測・気温監視・自動撮影・メール通知・Web確認をすべて一台で実現しました。

ポイント

  • センサー処理はリアルタイム性重視で仮想環境外
  • 表示・Web機能は安全性重視で仮想環境内
  • sensor_data.txt を介してシンプルにデータ連携

これで、あなたの家も「スマートホーム」の仲間入りです。

次回は、外出先からでも安心アクセス!Cloudflare Tunnelで安全なリモート監視 です。

イケオジ流!ラズベリーパイ(Raspberry Pi)一覧はこちら

ラズベリーパイを始めるならこれ!本体・モニター・センサー類の商品リスト

(旧twitter) 今日のイケオジ 

イケオジのキング・オブ・アスリートへの道はこちら

お名前.com:[PR]1999年のサービス開始以来、登録実績3,200万件突破!国内シェアNo.1のドメイン登録サービスです。年間「0円」から独自ドメインの取得が可能。600種類以上のドメインを取扱い国内最大級のドメイン登録実績。個人から中小企業、大企業まで幅広く利用。選りすぐりの中古ドメインオークションも多数開催中 !

ネットショップ作成サービス:[PR]メディアECを無料で始めるなら、カラーミーショップ、byGMOペパボ!法人導入件数22,000件以上!総流通額1兆円以上!国内最大級のECサイト構築サービスです。圧倒的なコストパフォーマンスと充実の電話サポート。まずは30日間の無料お試しを。

カラーミーショップ

ホームページ格安制作所:[PR]制作費用0円~、月額3,850円~の格安ホームページ制作です。税込み3,850円は業界最安値レベルです。個人事業主様や中小企業様などの「予算が無いけどとにかく安くホームページを作りたい」という方へ。

ホームページ作成:[PR]スマホだけで簡単にホームページが作成できるノーコードツールです。専門知識がない方でも誰でも簡単にWEBサイトが作成できます。お好みのパーツを選び、文字と写真を入力するだけですので、分かりやすく使いやすいです。

だれでもHP:[PR]プロが作るのに格安でホームページを制作できるだれでもHPがオープンしました。だれでもHPは、ホームページ制作会社よりも遥かに安い金額で、他のホームページ制作ツールのように自分で制作をすることなく、ホームページが完成するサービスです。

採用特化型SNS運用代行サービス:[PR]InstagramやTikTokなどのSNSを使った採用活動を代行する、採用特化型SNS運用代行サービスです。SNSのプロ集団が在籍しており、人材採用に向けて、企画、制作、投稿、分析など一貫してSNSの運用をおこないます。

さあ、勇気を出してイケオジブログをシェアしよう!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


PAGE TOP