เก็บ Link และความรู้ด้าน IT เก็บ Prompt

วันจันทร์ที่ 21 กรกฎาคม พ.ศ. 2568

ระบบรายงานอุณภูมิและความชื้นด้วย RPI PICO WH

การส่งข้อมูลอุณหภูมิและความชื้นจาก Raspberry Pi Pico WH ไปยัง Google Sheet เป็นวิธีที่ดีในการเก็บบันทึกข้อมูลและดูแนวโน้มได้ง่าย ๆ ครับ
การจะทำเช่นนี้ได้ Pico WH ต้องเชื่อมต่อ Wi-Fi และส่งข้อมูลผ่านอินเทอร์เน็ตไปยัง Google Sheets API หรือบริการตัวกลางอื่น ๆ
นี่คือขั้นตอนและโค้ดตัวอย่างในการส่งข้อมูล DHT11 ไปยัง Google Sheet โดยใช้ Google Apps Script เป็นตัวกลาง (Web App) ซึ่งเป็นวิธีที่ได้รับความนิยมและค่อนข้างง่ายครับ
ขั้นตอนที่ 1: เตรียม Google Sheet และ Google Apps Script
 * สร้าง Google Sheet ใหม่:
   * ไปที่ Google Drive ของคุณแล้วสร้าง Google Sheet ใหม่ ตั้งชื่อว่า "DHT11_Data" หรือชื่อที่คุณต้องการ
   * ในชีต ให้ตั้งชื่อคอลัมน์แรกเป็น "Timestamp", คอลัมน์ที่สองเป็น "Temperature", และคอลัมน์ที่สามเป็น "Humidity" (ตัวพิมพ์ใหญ่-เล็กต้องตรงเป๊ะ)
 * สร้าง Google Apps Script (Web App):
   * ใน Google Sheet ของคุณ ไปที่ Extensions -> Apps Script
   * หน้าต่าง Apps Script จะเปิดขึ้นมา ลบโค้ดที่มีอยู่ออกทั้งหมด แล้วคัดลอกโค้ดด้านล่างนี้วางลงไป:

   // Google Apps Script Code (Code.gs)
function doGet(e) {
  return handlePost(e); // ใช้ doGet เพื่อให้สามารถทดสอบด้วย URL ได้ง่ายขึ้น
}

function doPost(e) {
  return handlePost(e);
}

function handlePost(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); // เปลี่ยน "Sheet1" เป็นชื่อชีตของคุณ เช่น "Sheet1" หรือ "Data"
  if (!sheet) {
    return ContentService.createTextOutput("Sheet not found").setMimeType(ContentService.MimeType.TEXT);
  }

  var temperature = e.parameter.temperature;
  var humidity = e.parameter.humidity;

  if (temperature && humidity) {
    var timestamp = new Date();
    sheet.appendRow([timestamp, temperature, humidity]);
    return ContentService.createTextOutput("Data logged successfully").setMimeType(ContentService.MimeType.TEXT);
  } else {
    return ContentService.createTextOutput("Missing temperature or humidity parameter").setMimeType(ContentService.MimeType.TEXT);
  }
}

   * สำคัญ: เปลี่ยน "Sheet1" ในโค้ด var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); ให้เป็นชื่อแท็บชีตของคุณจริง ๆ (ปกติคือ "Sheet1" แต่ถ้าคุณเปลี่ยนชื่อแท็บต้องเปลี่ยนให้ตรง)
   * บันทึกสคริปต์ (คลิกไอคอนรูปแผ่นดิสก์ หรือ Ctrl + S)
 * Deploy Apps Script เป็น Web App:
   * คลิกที่ Deploy (มุมขวาบน) -> New deployment
   * เลือก Type เป็น Web app
   * ในช่อง Execute as, เลือก Me
   * ในช่อง Who has access, เลือก Anyone
   * คลิก Deploy
   * ระบบอาจขอให้คุณอนุญาต (Authorize) สคริปต์ ให้คลิก Review permissions และทำตามขั้นตอน (เลือกบัญชี Google ของคุณ -> Allow)
   * เมื่อ Deploy เสร็จสิ้น คุณจะได้ Web app URL คัดลอก URL นี้เก็บไว้ดี ๆ เพราะเราจะใช้มันในโค้ด MicroPython ของเรา
ขั้นตอนที่ 2: โค้ด MicroPython สำหรับ Raspberry Pi Pico WH
โค้ดนี้จะใช้โมดูล urequests เพื่อส่งคำขอ HTTP POST ไปยัง Web app URL ของคุณ
สิ่งที่ต้องเตรียมเพิ่มเติมสำหรับโค้ด:
 * ไลบรารี urequests: Pico WH ไม่มีไลบรารีนี้มาให้โดยตรง คุณต้องติดตั้ง
   * เปิด Thonny IDE
   * ไปที่ Tools -> Manage packages...
   * ค้นหา micropython-urequests
   * คลิก Install
 * ข้อมูล Wi-Fi: ชื่อ Wi-Fi (SSID) และรหัสผ่านของคุณ
 * Web app URL: URL ที่ได้จากขั้นตอนที่ 1
<!-- end list -->
from machine import Pin
import time
import dht
import network # สำหรับเชื่อมต่อ Wi-Fi
import urequests # สำหรับส่ง HTTP requests

# --- กำหนดค่า Wi-Fi และ Google Sheet ---
WIFI_SSID = "ชื่อ_WiFi_ของคุณ" # แก้ไขเป็นชื่อ Wi-Fi ของคุณ
WIFI_PASSWORD = "รหัสผ่าน_WiFi_ของคุณ" # แก้ไขเป็นรหัสผ่าน Wi-Fi ของคุณ

# แก้ไขเป็น Web app URL ที่ได้จาก Google Apps Script ของคุณ
# ตัวอย่าง: "https://script.google.com/macros/s/AKfycbzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/exec"
WEB_APP_URL = "YOUR_GOOGLE_APPS_SCRIPT_WEB_APP_URL_HERE"

# --- กำหนดค่า DHT11 ---
DHT_PIN = 15 # GPIO Pin ที่เชื่อมต่อกับขา DATA ของ DHT11
sensor = dht.DHT11(Pin(DHT_PIN))

# --- ฟังก์ชันเชื่อมต่อ Wi-Fi ---
def connect_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print(f"Connecting to WiFi: {ssid}...")
        wlan.connect(ssid, password)
        max_attempts = 10
        while not wlan.isconnected() and max_attempts > 0:
            print(".", end="")
            time.sleep(1)
            max_attempts -= 1
        if wlan.isconnected():
            print("\nWiFi Connected!")
            print("IP Address:", wlan.ifconfig()[0])
        else:
            print("\nFailed to connect to WiFi.")
    return wlan.isconnected()

# --- เริ่มต้นโปรแกรม ---
print("Starting DHT11 sensor reading and Google Sheet logging...")
print("Press Ctrl+C to stop.")

# เชื่อมต่อ Wi-Fi ก่อนเริ่มลูป
if not connect_wifi(WIFI_SSID, WIFI_PASSWORD):
    print("Cannot proceed without WiFi connection. Please check credentials and try again.")
    # หากเชื่อมต่อไม่ได้ อาจจะทำอะไรบางอย่าง เช่น หยุดโปรแกรม หรือลองใหม่
    exit() # หยุดการทำงานของสคริปต์หากเชื่อมต่อไม่ได้

try:
    while True:
        try:
            # เริ่มต้นการวัดค่าจากเซ็นเซอร์ DHT11
            sensor.measure()
            time.sleep(1) # รอให้เซ็นเซอร์วัดค่าเสร็จ

            # อ่านค่าอุณหภูมิและความชื้น
            temperature = sensor.temperature()
            humidity = sensor.humidity()

            # แสดงผลบน Serial Monitor (สำหรับ Debug)
            print(f"Temperature: {temperature:.1f} °C, Humidity: {humidity:.1f} %")

            # ตรวจสอบว่ามีค่าอุณหภูมิ/ความชื้นที่ถูกต้องหรือไม่ (DHT บางครั้งก็อ่านค่าผิดพลาด)
            if temperature is not None and humidity is not None:
                # สร้าง URL สำหรับส่งข้อมูล
                # Google Apps Script จะรับค่าผ่าน parameters ใน URL
                payload = {
                    "temperature": f"{temperature:.1f}", # ส่งเป็น string
                    "humidity": f"{humidity:.1f}"      # ส่งเป็น string
                }
                # ส่งข้อมูลแบบ GET request
                # urequests.get(url, params=payload)

                # หรือส่งข้อมูลแบบ POST request (แนะนำ)
                # Google Apps Script จะรับข้อมูลจาก e.parameter ใน doGet/doPost
                url_with_params = f"{WEB_APP_URL}?temperature={payload['temperature']}&humidity={payload['humidity']}"
                response = urequests.get(url_with_params)

                if response.status_code == 200:
                    print("Data sent to Google Sheet successfully!")
                else:
                    print(f"Failed to send data. Status code: {response.status_code}")
                    print("Response text:", response.text)
                response.close() # ปิดการเชื่อมต่อ

            else:
                print("Invalid sensor readings (None value). Skipping data upload.")

        except OSError as e:
            print(f"Failed to read sensor: {e}")
            print("Retrying sensor reading in 2 seconds...")
        except Exception as e:
            print(f"An unexpected error occurred: {e}")

        time.sleep(15) # ส่งข้อมูลทุกๆ 15 วินาที (ปรับได้ตามต้องการ)

except KeyboardInterrupt:
    print("\nProgram stopped by user.")
except Exception as e:
    print(f"An error occurred: {e}")

ข้อควรทราบและข้อแนะนำ:
 * ความถี่ในการส่งข้อมูล: Google Apps Script มีข้อจำกัดในการเรียกใช้งาน (quota) อย่าส่งข้อมูลบ่อยเกินไป เช่น ทุก 15-60 วินาทีก็เพียงพอสำหรับข้อมูลสภาพแวดล้อมทั่วไป
 * การจัดการข้อผิดพลาด: โค้ดมีการจัดการ OSError สำหรับ DHT และมีการจัดการ Exception ทั่วไปสำหรับการส่งข้อมูล แต่ในสภาพแวดล้อมจริงคุณอาจต้องเพิ่มการจัดการข้อผิดพลาดการเชื่อมต่อ Wi-Fi ที่ซับซ้อนขึ้น
 * ความปลอดภัย: การส่งข้อมูลโดยตรงไปยัง Web App URL ผ่าน GET request ในลักษณะนี้ ไม่ปลอดภัย สำหรับข้อมูลที่ละเอียดอ่อน เนื่องจากพารามิเตอร์จะปรากฏใน URL ถ้าเป็นโปรเจกต์จริงจัง ควรใช้การส่งข้อมูลแบบ POST body หรือใช้ API Key เพื่อยืนยันตัวตน
 * พลังงาน: การเชื่อมต่อ Wi-Fi และส่งข้อมูลจะใช้พลังงานมากกว่าการอ่านเซ็นเซอร์อย่างเดียว หากใช้แบตเตอรี่ อาจต้องพิจารณาการประหยัดพลังงาน
 * การดีบัก: ใช้ print() และดู output ใน Serial Monitor ของ Thonny เพื่อตรวจสอบว่าโปรแกรมทำงานถูกต้องและข้อมูลถูกส่งไปหรือไม่
หลังจากที่คุณรันโค้ดบน Pico WH และเชื่อมต่อ Wi-Fi สำเร็จ คุณจะเห็นข้อมูลอุณหภูมิและความชื้นปรากฏใน Google Sheet 

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

ระบบรายงานอุณภูมิและความชื้นด้วย RPI PICO WH

การส่งข้อมูลอุณหภูมิและความชื้นจาก Raspberry Pi Pico WH ไปยัง Google Sheet เป็นวิธีที่ดีในการเก็บบันทึกข้อมูลและดูแนวโน้มได้ง่าย ๆ ครับ การจ...