Solar-powered remote sensor node with LILYGO TTGO LoRa32 board, mini solar panel, 18650 battery holder, and AHT20 sensor mounted outdoors

ระดับกลาง

สร้างโหนดเซนเซอร์ระยะไกลที่ใช้พลังงานแสงอาทิตย์

เซ็นเซอร์ไร้สายIoT

นำ LoRa Sensor Node ออกจากผนังทั้งหมด: แผงโซลาร์เซลล์ขนาดเล็กและแบตเตอรี่ช่วยให้ทำงานได้อย่างต่อเนื่องกลางแจ้ง โดยรายงานข้อมูลสิ่งแวดล้อมจริงผ่านวิทยุระยะไกลโดยไม่มีสายเคเบิลให้เห็น

รวมชิ้นส่วนจริง 4 รายการ

ราคารวมชุดนี้: 1,435.00 ฿

ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน

สิ่งที่คุณต้องใช้

เป้าหมายของโปรเจกต์

โปรเจกต์นี้ต่อยอดจากโครงสร้าง LoRa Sensor Node ที่มีอยู่แล้วให้มีความเป็นอิสระอย่างแท้จริง: แผงโซลาร์เซลล์จะชาร์จแบตเตอรี่ให้เต็มในระหว่างวัน เพื่อให้โหนดสามารถรายงานค่าสภาพแวดล้อมได้จากทุกที่กลางแจ้ง ไม่ว่าจะเป็นในเพิง ในสวน ตามแนวรั้ว โดยไม่ต้องใช้สายไฟเลย

ตัวควบคุมทำหน้าที่อะไร

ด้วยวงจรการหลับ-ตื่นที่ยาวนานเพื่อประหยัดแบตเตอรี่ ตัวควบคุมจะอ่านค่าเซ็นเซอร์ ส่งค่าที่อ่านได้ผ่านวิทยุ LoRa และกลับไปสู่โหมดหลับอีกครั้ง ประสิทธิภาพการใช้พลังงานมีความสำคัญมากกว่าในโปรเจกต์ที่ใช้ไฟจากผนัง เนื่องจากทุกๆ มิลลิแอมป์ที่สูญเสียไปคืออายุแบตเตอรี่ที่การชาร์จด้วยแสงอาทิตย์จะต้องชดเชยในวันถัดไป

เซ็นเซอร์ทำหน้าที่อะไร

รายงานอุณหภูมิและความชื้นจริงตามต้องการผ่าน I2C ซึ่งเป็นเซ็นเซอร์เดียวกันที่ได้รับการพิสูจน์แล้วในรุ่นที่ใช้ไฟจากผนังของโครงสร้างนี้

วิทยุ LoRa ทำหน้าที่อะไร

ส่งค่าที่อ่านได้แต่ละค่าผ่านวิทยุระยะไกลกลับไปยังสถานีฐาน ซึ่งเป็นลิงก์ระยะไกลเดียวกันกับที่ใช้โดยโหนดเดิมที่ใช้ไฟจากผนัง โดยไม่ได้รับผลกระทบว่าปลายทางที่ส่งข้อมูลนั้นใช้พลังงานจากแบตเตอรี่หรือไฟหลัก

แผงโซลาร์เซลล์และแบตเตอรี่ทำหน้าที่อะไร

แผงโซลาร์เซลล์จะชาร์จแบตเตอรี่แบบหยดในช่วงเวลากลางวัน และแบตเตอรี่คือสิ่งที่จ่ายไฟให้กับโหนดตลอด 24 ชั่วโมง รวมถึงช่วงกลางคืนที่แผงโซลาร์เซลล์ไม่ได้ผลิตอะไรเลย จงซื่อสัตย์กับตัวเองเกี่ยวกับผลผลิตจริงของแผงโซลาร์เซลล์: แผงโซลาร์เซลล์ขนาดเล็กเช่นนี้มักจะให้กระแสไฟที่น้อยกว่าอย่างเห็นได้ชัดเมื่ออยู่กลางแจ้งจริง ๆ เมื่อเทียบกับค่าวัตต์ที่พิมพ์ไว้ โดยเฉพาะอย่างยิ่งในวันที่มีเมฆมาก หรือเมื่อไม่ได้หันหน้าเข้าหาดวงอาทิตย์โดยตรง ควรเลือกขนาดแบตเตอรี่ให้เหมาะสมและถือว่าแผงโซลาร์เซลล์เป็นการชาร์จแบบเติมช้า ๆ ไม่ใช่การชาร์จเต็มที่รับประกันทุกวัน และควรตรวจสอบกระแสไฟชาร์จจริงด้วยมัลติมิเตอร์ก่อนที่จะปล่อยให้โหนดทำงานโดยไม่ดูแลเป็นเวลานาน

แนวคิดซอฟต์แวร์และไลบรารี

เริ่มต้นจากโค้ด LoRa Sensor Node ที่ใช้ไฟจากผนังที่ใช้งานได้แล้ว จากนั้นเพิ่ม deep-sleep ระหว่างการอ่านค่า การเปลี่ยนแปลงเพียงอย่างเดียวนี้นั้นส่งผลกระทบมากที่สุดต่อระยะเวลาที่แบตเตอรี่ใช้งานได้จริง

การทดสอบและการแก้ไขปัญหา

  • แบตเตอรี่จะค่อยๆ หมดลงแม้ว่าจะเชื่อมต่อแผงโซลาร์เซลล์อยู่ก็ตาม ให้วัดกระแสไฟชาร์จจริงในแสงกลางแจ้งด้วยมัลติมิเตอร์แทนที่จะสมมติจากค่าวัตต์ที่พิมพ์ไว้ จากนั้นเพิ่มช่วงเวลาการหลับระหว่างการอ่านค่าหากแผงโซลาร์เซลล์ไม่สามารถทำงานได้จริง
  • การอ่านค่าหยุดส่งในเวลากลางคืนหรือในวันที่มีเมฆมาก ซึ่งเป็นเรื่องปกติหากความจุของแบตเตอรี่มีขนาดเล็กเกินไปสำหรับสภาพอากาศในท้องถิ่น นี่เป็นปัญหาเรื่องขนาด ไม่ใช่ข้อผิดพลาดในการเดินสาย
  • ไม่มีการชาร์จเลย ให้ตรวจสอบขั้วของแผงโซลาร์เซลล์และตรวจสอบให้แน่ใจว่าได้รับแสงแดดโดยตรงและไม่มีสิ่งกีดขวางจริง ๆ ไม่ใช่แค่ในที่ร่มที่สว่าง

การอัปเกรดเสริม

เพิ่มการอ่านค่าแรงดันแบตเตอรี่ลงในข้อมูลที่ส่ง เพื่อให้สถานีฐานสามารถตรวจสอบสุขภาพพลังงานของโหนดจากระยะไกลได้โดยไม่ต้องเดินทางไปตรวจสอบด้วยตัวเอง

การเดินสาย

  • AHT20 VCC → LILYGO TTGO LoRa32 3V3
  • AHT20 GND → LILYGO TTGO LoRa32 GND
  • AHT20 SDA → LILYGO TTGO LoRa32 GPIO4 — ใช้บัส I2C ของ OLED ออนบอร์ดร่วมกัน (SDA=4/SCL=15); ปลอดภัยเพราะที่อยู่ I2C ของ AHT20 (0x38) ไม่ชนกับที่อยู่ SSD1306 ของ OLED (0x3C)
  • AHT20 SCL → LILYGO TTGO LoRa32 GPIO15
  • 18650 Battery Holder (+/−) → LILYGO TTGO LoRa32 คอนเนคเตอร์แบตเตอรี่ JST-PH 2 พินออนบอร์ด (หรือแผ่น BAT/5V + GND ของบอร์ดหากไม่มีคอนเนคเตอร์ JST ในเวอร์ชันของคุณ) — นี่คือสิ่งที่จ่ายไฟให้กับบอร์ดจากแบตเตอรี่จริง ๆ
  • 6V Mini Solar Panel (+/−) → ห้ามต่อโดยตรงเข้ากับช่องใส่แบตเตอรี่/เซลล์ — ดูหมายเหตุ

โครงสร้างนี้ใช้บอร์ด TTGO LoRa32 V1 ซึ่งมีพินเอาต์ออนบอร์ดที่กำหนดไว้สำหรับวิทยุ LoRa (SX127x) และ OLED V2/V2.1 ย้ายพินบางส่วน (โดยเฉพาะสาย LoRa CS/RST/IRQ) ดังนั้นโปรดยืนยันเวอร์ชันที่แน่นอนของคุณกับ silkscreen/schematic ก่อนที่จะเชื่อถือ `#define`s เหล่านี้

หมายเหตุด้านความปลอดภัยที่ซื่อสัตย์เกี่ยวกับการเดินสายโซลาร์/แบตเตอรี่: รายการชิ้นส่วนที่นี่คือแผงโซลาร์เซลล์ 6V ~1W และช่องใส่แบตเตอรี่ 18650 แบบเปลือย 2 ช่องพร้อมสวิตช์ — ไม่มี IC ควบคุมการชาร์จอยู่ในรายการ การเดินสายแผงโซลาร์เซลล์ดิบโดยตรงไปยังเซลล์ 18650 แบบเปลือยไม่มีการป้องกันการชาร์จเกิน กระแสเกิน หรือกระแสย้อนกลับ และอาจทำให้เซลล์ชาร์จเกิน/เสียหาย หรือแม้กระทั่งระเบิดได้ โดยเฉพาะอย่างยิ่งในวันที่มีแดดจัดเมื่อแรงดันไฟฟ้าวงจรเปิดของแผงโซลาร์เซลล์อาจเกินกว่าที่เซลล์ Li-ion เดี่ยวควรรับได้ บอร์ด TTGO LoRa32 V1 จำนวนมากมีชิปจัดการการชาร์จในตัว (โดยทั่วไปคือประเภท TP4054) ที่จ่ายไฟให้กับคอนเนคเตอร์แบตเตอรี่ JST แต่วงจรนั้นออกแบบมาสำหรับการชาร์จผ่านพอร์ต USB ของบอร์ด ไม่ใช่สำหรับแผง 6V ที่ไม่ได้รับการควบคุมที่ต่อเข้ากับสายแบตเตอรี่ โซลูชันที่ถูกต้องตามหลักวิชาการและซื่อสัตย์: เพิ่มโมดูลควบคุมการชาร์จโซลาร์/LiPo ขนาดเล็ก (เช่น สไตล์ TP4056 หรือตัวควบคุมการชาร์จโซลาร์โดยเฉพาะ) ระหว่างแผงโซลาร์เซลล์และแบตเตอรี่ และจ่ายไฟจากเอาต์พุตแบตเตอรี่ที่ได้รับการควบคุมของตัวควบคุมเท่านั้นไปยังช่องใส่/บอร์ด ถือว่า "แผง + เซลล์เปล่า + สวิตช์" เพียงอย่างเดียวไม่ใช่วงจรชาร์จแบบสแตนด์อโลนที่ปลอดภัย และแจ้งให้ลูกค้าทราบเรื่องนี้แทนที่จะแสร้งทำเป็นว่าไม่ใช่

โค้ดด้านล่างเน้นไปที่ส่วนของโครงสร้างที่สามารถใช้งานได้จริงและตรวจสอบได้กับชิ้นส่วนที่ระบุ: การอ่านค่า AHT20 ผ่าน I2C และการส่งค่าที่อ่านได้ผ่าน LoRa โดยใช้ไลบรารี `LoRa` โดย sandeepmistry ซึ่งเป็นไลบรารีมาตรฐานที่แท้จริงสำหรับวิทยุ SX127x มันจะหลับระหว่างการส่งเพื่อประหยัดแบตเตอรี่ — ซึ่งสำคัญสำหรับโหนดระยะไกลที่ใช้พลังงานแสงอาทิตย์

แผนภาพการต่อสาย

VCC → 3V3 GND SDA → GPIO4 SCL → GPIO15 LILYGO TTGO LoRa32 AHT20 18650 Battery Holder

โค้ดเริ่มต้น

#include <Wire.h>
#include <Adafruit_AHTX0.h>
#include <SPI.h>
#include <LoRa.h>

// TTGO LoRa32 V1 onboard pinout — confirm against your board's specific
// revision/silkscreen if anything doesn't match.
#define OLED_SDA   4
#define OLED_SCL   15
#define LORA_SCK   5
#define LORA_MISO  19
#define LORA_MOSI  27
#define LORA_CS    18
#define LORA_RST   14
#define LORA_IRQ   26

// Set to the frequency your LoRa radio module/region uses, e.g. 915E6 (US),
// 868E6 (EU), 433E6 — check the radio module's marking/your local regs.
#define LORA_FREQUENCY 915E6

Adafruit_AHTX0 aht;

void setup() {
  Serial.begin(115200);
  Wire.begin(OLED_SDA, OLED_SCL);

  if (!aht.begin()) {
    Serial.println("AHT20 not found — check wiring/I2C address");
    while (1) delay(1000);
  }

  SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
  LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);

  if (!LoRa.begin(LORA_FREQUENCY)) {
    Serial.println("LoRa init failed — check wiring/frequency");
    while (1) delay(1000);
  }
}

void loop() {
  sensors_event_t humidity, temp;
  aht.getEvent(&humidity, &temp);

  LoRa.beginPacket();
  LoRa.print("T:");
  LoRa.print(temp.temperature);
  LoRa.print(",H:");
  LoRa.print(humidity.relative_humidity);
  LoRa.endPacket();

  Serial.printf("Sent T=%.2fC H=%.2f%%\n", temp.temperature, humidity.relative_humidity);

  delay(60000); // once per minute — tune for your power budget
}

ไม่แน่ใจขั้นตอนไหน? ถามเรา