สร้างระบบแจ้งเตือน SMS ผ่าน Cloud ด้วย Raspberry Pi และเซนเซอร์วัดอุณหภูมิ (ไม่ต้องง้อซิม!)

Raspberry Pi Based SMS Alert System
ระบบแจ้งเตือนอุณหภูมิผ่าน SMS ด้วย Raspberry Pi แบบ Real-time

สวัสดีชาว Maker ทุกคนครับ! คุณเคยอยากได้ระบบแจ้งเตือนผ่าน SMS สำหรับโปรเจกต์ Raspberry Pi แต่ไม่อยากปวดหัวกับโมดูล GSM ชิ้นใหญ่ๆ หรือการเซ็ตอัปซิมการ์ดที่แสนวุ่นวายไหมครับ? [cite: 1]

ลองจินตนาการดูว่า ถ้าห้องเซิร์ฟเวอร์ของคุณร้อนเกินไป หรือโรงเรือนสมาร์ทฟาร์มมิ่งมีอุณหภูมิสูงทะลุขีดจำกัด แล้วมีข้อความ SMS เด้งเข้ามือถือคุณทันที โดยไม่ต้องเปิดแอป ไม่ต้องล็อกอินหน้าแดชบอร์ดใดๆ มันจะสะดวกขนาดไหน! [cite: 1]

ในโปรเจกต์นี้ ผมจะพาไปดูวิธีสร้างระบบแจ้งเตือนอุณหภูมิด้วย Raspberry Pi และเซนเซอร์ DHT11 โดยใช้แค่ Wi-Fi และ SMS API ฟรีจาก Circuit Digest Cloud ครับ! ไม่ต้องมีซิมการ์ด ไม่ต้องมี GSM Shield ทุกอย่างส่งผ่านคลาวด์แบบล้ำๆ ใช้งานง่ายสุดๆ พร้อมแล้วมาลุยกันเลย! [cite: 1]

ฮาร์ดแวร์ที่ต้องใช้ (Components Required) [cite: 1]

  • Raspberry Pi: (รุ่น 3, 4 หรือ 5 ก็ได้) x1 [cite: 1]
  • เซนเซอร์วัดอุณหภูมิ: DHT11 Temperature Sensor x1 [cite: 1]
  • ตัวต้านทาน: 220Ω (สำหรับหลอด LED) x2 [cite: 1]
  • หลอด LED: สีแดง และ สีเขียว อย่างละ 1 ดวง [cite: 1]
  • เบรดบอร์ดและสายจัมเปอร์: ตามความเหมาะสม [cite: 1]

💡 Maker's Tip: โปรเจกต์นี้เหมาะมากสำหรับสาย Smart Home หรือผู้ที่ดูแลระบบฟาร์มอัจฉริยะ (Smart Farming) ครับ

หากเพื่อนๆ คนไหนกำลังมองหา บอร์ด Raspberry Pi, เซนเซอร์ DHT11, หลอด LED หรืออุปกรณ์อิเล็กทรอนิกส์อื่นๆ แวะมาเลือกช้อปสินค้าคุณภาพพร้อมส่งได้ที่ Globalbyte เลยครับ! ของครบ จบในที่เดียว

Step 1: การตั้งค่า Raspberry Pi (Raspberry Pi Setup) [cite: 1]

เริ่มต้นให้แน่ใจก่อนว่า Raspberry Pi ของคุณรันระบบปฏิบัติการล่าสุด (Raspberry Pi OS) [cite: 1] ถ้าเพิ่งเริ่มทำ ให้ใช้โปรแกรม Raspberry Pi Imager แฟลช OS ลงใน SD Card แล้วเชื่อมต่ออินเทอร์เน็ตผ่าน Wi-Fi หรือสาย LAN ให้เรียบร้อย [cite: 1]

จากนั้น เปิด Terminal ขึ้นมาแล้วอัปเดตระบบด้วยคำสั่งนี้:

Terminal
sudo apt update && sudo apt upgrade -y

การติดตั้ง Python Libraries และวิธีแก้ปัญหาจุกจิก [cite: 1]

เราต้องใช้ไลบรารี Adafruit_DHT (สำหรับอ่านเซนเซอร์) และ requests (สำหรับคุยกับ API) แต่เดี๋ยวก่อน! ใน OS รุ่นใหม่ๆ ถ้าคุณพิมพ์ pip install Adafruit_DHT ไปดื้อๆ คุณอาจจะเจอ Error ว่า "This environment is externally managed" [cite: 1] (เป็นระบบป้องกันไฟล์พังของ PEP 668 ครับ) วิธีแก้มี 2 ทางเลือก:

วิธีที่ 1: บังคับลง (Override) [cite: 1]

Terminal
sudo pip3 install --break-system-packages Adafruit_DHT

วิธีที่ 2: ใช้ Virtual Environment (แนะนำ!) [cite: 1] วิธีนี้ปลอดภัยและเป็นระเบียบกว่ามากครับ

Terminal
sudo apt install python3-venv -y
python3 -m venv myenv
source myenv/bin/activate
pip install Adafruit_DHT requests

Step 2: การต่อวงจร (Circuit Diagram) [cite: 1]

การต่อสายใช้งานค่อนข้างตรงไปตรงมาครับ ดูพินตามตารางนี้ได้เลย:

Sensor/LED Pins Raspberry Pi GPIO Pins
DHT11 DATA GPIO4 (Pin 7)
DHT11 GND Common Ground
DHT11 VCC 5V
Green LED GPIO23 (Pin 16)
Red LED GPIO24 (Pin 18)
Raspberry Pi OS Update Adafruit DHT Install Circuit Diagram Part Marking

Step 3: การตั้งค่า Cloud API และสร้าง API Key [cite: 1]

โปรเจกต์นี้ใช้บริการของ Circuit Digest Cloud ซึ่งมีเครื่องมือครบวงจรสำหรับ IoT (มีทั้ง SMS, ระบบอ่านป้ายทะเบียน และ GPS Tracker) [cite: 1] มาดูวิธีขอ API Key กันครับ:

  1. เข้าไปที่เว็บ https://www.circuitdigest.cloud/ สมัครสมาชิกและล็อกอินให้เรียบร้อย [cite: 1]
  2. คลิกที่ปุ่ม “Account” มุมขวาบน เลือก “API Key” ระบบจะพาไปหน้าสร้างคีย์ [cite: 1]
  3. ระบบจะสร้าง API Key ให้ โดยคุณจะ ส่ง SMS ได้ฟรี 100 ข้อความ/เดือน (หมดแล้วต่ออายุฟรีได้) [cite: 1]
  4. เลื่อนลงมาหาหัวข้อ SMS Notification API แล้วคลิก "View Details" [cite: 1]
  5. เลือก "Link Phone Number" แล้วกรอกเบอร์โทรศัพท์ที่คุณต้องการให้ SMS ส่งไปหา [cite: 1]
  6. กด "Get OTP" แล้วนำรหัสที่ได้มากรอกเพื่อยืนยันเบอร์โทรศัพท์ เป็นอันเสร็จสิ้น! [cite: 1]
Cloud Features Cloud Login Page API Key Generating Page Complete Captcha View More on SMS API Link Phone Number Option Linking Phone

รูปแบบข้อความสำเร็จรูป (SMS Template) [cite: 1]

API ของเขามีเทมเพลตให้เลือกใช้ถึง 15 แบบ โดยแต่ละแบบจะมีตัวแปร {#var#} ให้เรายัดข้อมูลลงไปได้ 2 ตัวแปรครับ (ใส่ได้สูงสุด 30 ตัวอักษร/ตัวแปร ห้ามใช้อักขระพิเศษ) [cite: 1] ลองดูเทมเพลตที่น่าสนใจด้านล่างนี้ได้เลย:

Template ID Template Type Message Format
101 Device Status Alert Your {#var#} is currently at {#var#}.
102 Temperature Alert The temperature in {#var#} has reached {#var#}°C. Please take necessary action.
103 Motion Detected Motion detected by {#var#} in the {#var#}. Investigate immediately.
104 Battery Low Alert The battery level of {#var#} is critically low at {#var#}%. Recharge immediately.
107 Error Notification Error {#var#} has been detected in {#var#}. Please troubleshoot immediately.
112 Connection Lost Alert The connection with {#var#} was lost at {#var#}. Please check the network or device.

(ยังมีเทมเพลตอื่นๆ อีกมากมาย เช่น ระบบแจ้งเตือนซ่อมบำรุง, แจ้งเตือนบุกรุก, แบตเตอรี่อ่อน ฯลฯ สามารถดูเพิ่มเติมได้ในเว็บไซต์ของ Circuit Digest ครับ) [cite: 1]

Step 4: อธิบายโค้ด Python แบบเจาะลึก 🐍 [cite: 1]

เรามาดูส่วนสำคัญในโค้ดกันครับ (โค้ดฉบับเต็มอยู่ด้านล่างสุดนะ)

  • User Configuration: ตรงนี้ให้คุณใส่ API_KEY, TEMPLATE_ID (เราใช้ 102), และ MOBILE_NUMBER ของคุณลงไป นอกจากนี้ยังตั้งค่า TEMP_THRESHOLD ได้ด้วยว่า ถ้าร้อนเกินกี่องศาถึงจะให้ส่ง SMS [cite: 1]
  • LED Feedback: ฟังก์ชัน led_feedback(success) ถ้าส่ง SMS สำเร็จไฟเขียวจะกะพริบ ถ้าล้มเหลวไฟแดงจะกะพริบ [cite: 1]
  • SMS Sending Function: ระบบจะใช้ requests.post() ส่งข้อมูลพิกัด (var1) และอุณหภูมิ (var2) ไปที่ API_URL ในรูปแบบ JSON payload [cite: 1]
  • Main Loop: รันเช็คอุณหภูมิตลอดเวลา ถ้าเกินกำหนดก็จะเรียกฟังก์ชันส่ง SMS และจะเข้าสู่ช่วง COOLDOWN_TIME (หน่วงเวลา 60 วินาที) เพื่อกันไม่ให้ส่ง SMS รัวๆ จนโควต้าหมดครับ [cite: 1]

การแก้ปัญหาเบื้องต้น (Troubleshooting) 🛠️ [cite: 1]

ปัญหาที่พบ วิธีแก้ไข
ไม่ได้รับ SMS ตรวจสอบว่ากดยืนยันเบอร์มือถือ (Verify) ในแอคเคาท์ Circuit Digest ครบถ้วนแล้วหรือยัง
ลง Library ไม่ผ่าน ใช้คำสั่ง --break-system-packages หรือสร้าง virtualenv ตามที่สอนไปในสเตปแรก
Network Timeout เช็คเน็ต Raspberry Pi ดูว่าออกเน็ตได้ไหม ลองพิมพ์ ping www.google.com ดูครับ
เซนเซอร์ Error บ่อย เป็นเรื่องปกติของ DHT11 โค้ดถูกเขียนมาให้ดักจับ Error และลองอ่านค่าใหม่เรื่อยๆ อยู่แล้ว

สาธิตการทำงาน (Demonstration) 🎬 [cite: 1]

เมื่อรันโค้ดเสร็จ ลองเอาไดร์เป่าผมเป่าลมร้อนใส่เซนเซอร์ดูครับ พออุณหภูมิพุ่งทะลุ 33°C ไฟสีเขียวจะติดขึ้น 1 วินาที และมีข้อความ SMS เด้งเข้ามือถือคุณทันทีว่า "The temperature in Home at 02:45 PM has reached 34°C. Please take necessary action." [cite: 1]

Temperature Alarm Demo
เมื่ออุณหภูมิเกินกำหนด ไฟ LED จะกระพริบพร้อมส่งข้อความ SMS
Run Script Demo
หน้าจอ Terminal ขณะรันสคริปต์

โค้ดฉบับสมบูรณ์ (Complete Project Code) [cite: 1]

สามารถก๊อปปี้โค้ดด้านล่างนี้ ไปแก้ตัวแปร API_KEY และเบอร์มือถือ แล้วรันบนบอร์ดได้เลยครับ! [cite: 1]

Python (Complete Code)
import time
import requests
import adafruit_dht
import board
import RPi.GPIO as GPIO
from datetime import datetime

# === USER CONFIGURATION ===
API_KEY = 'xxxxxxxxxx'        # ใส่ API Key ของคุณ
TEMPLATE_ID = '102'
MOBILE_NUMBER = '91xxxxxxxxxx' # ใส่เบอร์มือถือ (พร้อมรหัสประเทศ)
LOCATION = 'Home'
TEMP_THRESHOLD = 33             # อุณหภูมิสูงสุดก่อนแจ้งเตือน (°C)
READ_INTERVAL = 10              # ความถี่ในการอ่านเซนเซอร์ (วินาที)
COOLDOWN_TIME = 60              # ระยะเวลาหน่วงก่อนส่ง SMS ครั้งถัดไป (วินาที)
API_URL = f'https://www.circuitdigest.cloud/api/v1/send_sms?ID={TEMPLATE_ID}'

# === GPIO PINS ===
DHT_PIN = board.D4              # GPIO4 = Pin 7
GREEN_LED = 23                  # GPIO23 = Pin 16 (Success)
RED_LED = 24                    # GPIO24 = Pin 18 (Failure)

# === GPIO SETUP ===
GPIO.setmode(GPIO.BCM)
GPIO.setup(GREEN_LED, GPIO.OUT)
GPIO.setup(RED_LED, GPIO.OUT)

# === DHT11 SENSOR SETUP ===
dht = adafruit_dht.DHT11(DHT_PIN)

# === LED FEEDBACK FUNCTION ===
def led_feedback(success):
    if success:
        GPIO.output(GREEN_LED, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(GREEN_LED, GPIO.LOW)
    else:
        GPIO.output(RED_LED, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(RED_LED, GPIO.LOW)

# === SMS SEND FUNCTION ===
def send_sms(temp):
    current_time = datetime.now().strftime("%I:%M %p")
    var1 = f"{LOCATION} at {current_time}"
    var2 = f"{temp}C"
    payload = {
        "mobiles": MOBILE_NUMBER,
        "var1": var1,
        "var2": var2
    }
    headers = {
        "Authorization": API_KEY,
        "Content-Type": "application/json"
    }
    try:
        response = requests.post(API_URL, headers=headers, json=payload)
        if response.status_code == 200:
            print(f"[OK] SMS sent: {var1}, Temp = {var2}")
            print("Response:", response.json())
            led_feedback(True)
        else:
            print(f"[ERROR] SMS failed. Status: {response.status_code}")
            print("Response:", response.text)
            led_feedback(False)
    except requests.exceptions.RequestException as e:
        print("Connection error:", e)
        led_feedback(False)

# === MAIN LOOP ===
print("Monitoring temperature... (Press Ctrl+C to stop)")
try:
    while True:
        try:
            temperature = dht.temperature
            humidity = dht.humidity
            if temperature is not None:
                print(f"Temperature: {temperature}C | Humidity: {humidity}%")
                if temperature > TEMP_THRESHOLD:
                    send_sms(temperature)
                    time.sleep(COOLDOWN_TIME)  # กันส่งซ้ำรัวๆ
            else:
                print("Sensor read failed.")
        except Exception as sensor_error:
            print("Sensor error:", sensor_error)
        time.sleep(READ_INTERVAL)

except KeyboardInterrupt:
    print("Script terminated by user.")
finally:
    GPIO.cleanup()

อ้างอิงและเรียบเรียงข้อมูลจาก: Globalbyteshop Blog

แหล่งที่มาบทความต้นฉบับ: Circuit Digest - Build a Raspberry Pi-Based SMS Alert System Using Cloud API [cite: 1]

ซอร์สโค้ดโปรเจกต์ (GitHub): Circuit-Digest GitHub Repository [cite: 1]

*คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความเทคโนโลยีต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา การปรับแต่งระบบปฏิบัติการ Linux ด้วยการข้ามความปลอดภัย (Bypass environment) อาจส่งผลกระทบต่อระบบในอนาคต แนะนำให้ใช้ Virtual Environment เสมอ สามารถตรวจสอบวิธีการและโค้ดต้นฉบับแบบเต็มได้ที่ เว็บไซต์ต้นฉบับ ก่อนลงมือทำ

 

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี