กลับไปหน้ารวมไฟล์
flowerpot-monitor-997a64.md

ภาพรวม

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

เจ้า FlowerPot Monitor ตัวนี้แหละ จะเป็นผู้ช่วยคอยเฝ้าติดตามสภาพแวดล้อมของต้นไม้ และส่งข้อมูลสถานะของต้นไม้ให้น้องแบบไร้สาย (wireless) น้องจะรู้ได้ในทันทีว่าต้นไม้ต้องการการดูแลหรือยัง ด้วยวิธีนี้ ต้นไม้ของน้องจะปลอดภัยตลอดไป!

FlowerPot Monitor

เจ้า FlowerPot เนี่ย ประกอบด้วย 2 ส่วนหลักๆ คือ ตัวส่งสัญญาณ (transmitter) และตัวรับสัญญาณ (receiver) ตัวส่งจะทำหน้าที่เก็บค่าต่างๆ จากเซนเซอร์ แล้วส่งต่อไปยังตัวรับ

การทำงาน

FlowerPot จะคอยเฝ้าติดตามสภาพแวดล้อมที่วางต้นไม้นั้นๆ ไว้ ไม่ว่าจะในร่มหรือกลางแจ้ง โดยอุปกรณ์จะตรวจวัด:

  • ความชื้นในดิน (Soil Moisture)
  • ความชื้นในอากาศ (Atmosphere Humidity)
  • อุณหภูมิอากาศ (Atmosphere Temperature)

หลังจากที่ตัวส่ง (Arduino Uno ที่อ่านค่าและส่งค่า) เก็บค่าจากเซนเซอร์ทั้งหมดแล้ว มันจะส่งข้อมูลไปยังตัวรับ (Arduino Uno ที่รับค่าและแสดงผล) ผ่านคลื่นวิทยุ (RF - Radio Frequency) จากนั้นข้อมูลก็จะถูกแสดงบนหน้าจอ LCD นี่คือภาพรวมโค้ดของเรา:

ฝั่งตัวส่งต้องทำการ "แพ็ก" ตัวแปรทั้งสามตัวที่เป็น int (จำนวนเต็ม) ให้กลายเป็นตัวแปรประเภท unit8_t เดียว แล้วค่อยส่งข้อมูลผ่านการสื่อสาร RF ไปยัง Arduino Uno อีกตัวที่ติดตั้งตัวรับไว้ นี่คือไดอะแกรมที่แสดงขั้นตอนนี้

โปรโตคอลการส่งข้อมูล (Transmitting Protocol)

เมื่อข้อมูลถูกส่งมาถึง ฝั่งตัวรับต้องทำการประมวลผลข้อมูลและแปลงมันกลับมาเป็นตัวแปรสามตัวที่ถูกส่งมาในตอนแรก

การจัดเรียงแพ็กเกจ (Package Configuration)

อุปกรณ์ทั้งสองตัวทำงานด้วยแบตเตอรี่ ตัวรับสามารถอยู่ห่างจากตัวส่งได้ไม่เกิน 20 เมตร (โดยไม่มีอะไรมาขวางทางสัญญาณ เช่น ประตู) ดังนั้นน้องจะสามารถเฝ้าดูต้นไม้จากที่ไหนในบ้านก็ได้ นี่คือรูปที่ถ่ายตอนรดน้ำต้นไม้

การตรวจวัดสุขภาพพืชทางไกล (Botanical Health Telemetry)

FlowerPot Monitor คือเครื่องมือทำสวนอัจฉริยะแบบ IoT ที่จะทำให้แน่ใจว่าต้นไม้ของน้องได้รับน้ำและแสงในปริมาณที่เหมาะสมที่สุด

  • การวิเคราะห์ความต้านทานของดิน (Soil Impedance Analysis): ใช้เซนเซอร์วัดความชื้นในดินแบบเฉพาะทางเพื่อตรวจสอบปริมาณน้ำ Arduino จะตรวจจับ "จุดเหี่ยวเฉา (Wilting Point)" และแจ้งเตือนผู้ใช้เมื่อดินแห้งเกินไปจนเป็นอันตราย
  • ประสิทธิภาพ (Efficiency): เพื่อป้องกันการกัดกร่อนของเซนเซอร์ (อิเล็กโทรลิซิส) Arduino จะจ่ายไฟให้เซนเซอร์วัดความชื้นเพียง 100 มิลลิวินาที ในทุกๆ 1 ชั่วโมง ในช่วงที่ทำการสุ่มตัวอย่าง

ประโยชน์

  • รับรู้สภาพปัจจุบันของต้นไม้ได้ทันที
  • รับรู้สภาพแวดล้อมโดยรอบของต้นไม้

ขั้นตอนการประกอบโปรเจค

ขั้นตอนที่ 1: อุปกรณ์ที่ต้องใช้

โปรเจคนี้ต้องการวงจรสองชุด; หนึ่งชุดสำหรับตัวส่ง และอีกชุดสำหรับตัวรับ

สำหรับตัวรับ (Receiver)

  • สายจัมเปอร์ (jumper wires)
  • 1, ตัวรับสัญญาณ RF 433Mhz
  • 1, ตัวต้านทาน (Resistor) 220Ω
  • 1, LED
  • 1, จอ LCD แบบ I2C (16x2)
  • 1, แบตเตอรี่ 9V
  • 1, ตัวถือแบตเตอรี่ 9V
  • สำหรับฝั่งตัวส่งสัญญาณ (Transmitter)

    • สายจัมเปอร์ (jumper wires)
    • 1, ตัวส่งสัญญาณวิทยุ 433Mhz (RF transmitter)
    • 1, เซ็นเซอร์วัดอุณหภูมิและความชื้น DHT11
    • 1, เซ็นเซอร์วัดความชื้นในดิน (Soil Moisture Sensor)
    • 1, แบตเตอรี่ 9V
    • 1, ตัวถือแบตเตอรี่ 9V

    ขั้นตอนที่ 2: ต่อวงจรให้เรียบร้อย

    ถึงเวลาต่อวงจรแล้วจ้า งานนี้พี่ใช้เบรดบอร์ดสำหรับทั้งสองฝั่ง (ตัวส่งกับตัวรับ) สำหรับฝั่งตัวรับ พี่ใช้ Arduino Uno กับเบรดบอร์ดที่มากับชุดเริ่มต้น เพราะมันกะทัดรัดดี งานนี้จัดไปวัยรุ่น!

    แผนภาพวงจรฝั่งตัวรับ
    แผนภาพวงจรฝั่งตัวส่ง

    ขั้นตอนที่ 3: มาดูโค้ดกันดีกว่า

    โปรเจคนี้มีสเก็ตช์สองอันแยกกันนะน้อง อันหนึ่งสำหรับตัวรับ อีกอันสำหรับตัวส่ง ทั้งสองอันมีฟังก์ชันหลายตัว มาดูกันว่ามันทำอะไรบ้าง

    • ฟังก์ชันอ่านค่า (ฝั่งตัวรับ)
    void readValues() 
    {
    uint8_t buf[VW_MAX_MESSAGE_LEN]; // create buffer where the data is received
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    if (vw_get_message(buf, &buflen)) // if we receive a message
    {
    for (int i = 0; i < buflen; i++)
    {
    data[i] = buf[i]; // store message
    }
    if(buflen == 4)
    {
    temperature = data[1]; // store temperature
    humidity = data[2]; // store humidity
    soilMoisture = data[3]; // store soil moisture
    }
    }
    }

    ลูปนี้จะอ่านค่าจากตัวแปร unit8_t ที่ตัวส่งมาส่ง แล้วแปลงมันเป็นตัวแปรสามตัว: อุณหภูมิ, ความชื้น และความชื้นในดิน ห้ามช็อตนะตัวนี้!

    • ฟังก์ชันแสดงผลอุณหภูมิ, ความชื้น และความชื้นในดิน (ฝั่งตัวรับ)
    void displayTempAndHum() 
    {
    lcd.setCursor(0,1);
    lcd.print("Temp ");
    lcd.setCursor(5,1);
    lcd.print(temperature);
    lcd.setCursor(7,1);
    lcd.print("C");
    lcd.setCursor(9,1);
    lcd.print("Hum ");
    lcd.setCursor(13,1);
    lcd.print(humidity);
    lcd.setCursor(15,1);
    lcd.print("%");
    }
    void displaySoilMoisture()
    {
    lcd.setCursor(1,0);
    lcd.print("Soil Moist ");
    lcd.setCursor(12,0);
    lcd.print(soilMoisture);
    lcd.setCursor(14,0);
    lcd.print("%");
    }

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

    • อ่านค่าอุณหภูมิ ความชื้น และความชื้นในดิน (ฝั่งส่งข้อมูล)
    void readTempAndHum() 
    {
    chk = DHT.read11(11);
    temperature = DHT.temperature;
    humidity = DHT.humidity;
    }
    void readSoilMoisture()
    {
    int sensorValue = analogRead(A0); // read the raw value
    soilMoisture = map(sensorValue,550,0,0,100); // map the received value
    }

    ฝั่งส่งข้อมูลจะอ่านค่าจากเซ็นเซอร์ DHT11 และเซ็นเซอร์วัดความชื้นในดินก่อนเป็นอันดับแรก

    • ส่งข้อมูล (ฝั่งส่งข้อมูล)
    // Send these values 
    valueToSend[1] = temperature; // send temperature
    valueToSend[2] = humidity; // send humidity
    valueToSend[3] = soilMoisture; // send soil moisture
    valueToSend[4] = 0; // this data does not represent anything
    vw_send((uint8_t *) valueToSend, 4); // send the message
    vw_wait_tx(); // Wait until the message is sent

    โค้ดส่วนนี้เป็นส่วนหนึ่งของ void loop ครับ หลังจากที่ฝั่งส่งอ่านค่าจากเซ็นเซอร์เสร็จแล้ว ไมโครคอนโทรลเลอร์จะแพ็กข้อมูลทั้งหมดลงในตัวแปร unit8_t แล้วส่งออกไปทางคลื่นวิทยุ (RF) ไปยังฝั่งรับ valueToSend[4] ตั้งค่าเป็น '0' ไว้เพราะค่าสุดท้ายมักจะเกิด timeout แล้วฝั่งรับไม่ได้รับค่าไปน่ะครับ

    ไลบรารีที่ใช้

    virtualWire - copyright (c) 2018 Mike McCauley GNU General Public Licence this library is in the public domain

    wire - copyright (c) 2006 Nicholas Zambetti GNU Lesser General Public Licence this library is in the public domain

    DHT - Author Rob Tillaart this library is in the public domain

    liquidCrystal_I2C - author DFROBOT, posted on GitHub by fdebrabander

    ขั้นตอนเซ็ตอัพ

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

    ขั้นตอนสุดท้าย - ทำกล่องใส่บอร์ด

    พี่ออกแบบกล่องใส่บอร์ดฝั่งรับจากกระดาษแข็งให้นะ ส่วนฝั่งส่งพี่ไม่ทำกล่องแล้ว เพราะสายไฟแถวหน้าต่างมันก็ดูเท่ดี (หรือขี้เกียจทำก็ว่าไป 555) วิธีทำง่ายมากๆ

    • ขั้นตอนที่ 1: เตรียมอุปกรณ์

    สิ่งที่ต้องใช้มีแค่ กรรไกร เทป และกระดาษแข็งบางๆ ขนาดประมาณ 200mm x 180mm

    • ขั้นตอนที่ 2: ตัดชิ้นส่วน

    ดูจากไดอะแกรมในรูปด้านล่าง แล้วใช้กรรไกรหรือคัตเตอร์ตัดกระดาษแข็งออกเป็นชิ้นเล็กๆ ตามแบบเลย

    ชิ้นส่วนที่ตัดแล้ว

    ชิ้นส่วนก้นกล่อง

    ฝาด้านขวา

    ฝั่งซ้ายจ้า

    ของแถม

    ข้อมูล Frontmatter ดั้งเดิม

    apps:
      - "1x Arduino Web Editor"
    author: "andreiflorian"
    category: "Sensors & Environment"
    components:
      - "1x SparkFun Soil Moisture Sensor (with Screw Terminals)"
      - "1x LED (generic)"
      - "1x DHT11 Temperature & Humidity Sensor (4 pins)"
      - "1x 9 Volts Battery Box"
      - "1x 433Mhz RF transmitter"
      - "1x Jumper wires (generic)"
      - "1x Resistor 221 ohm"
      - "1x I2C 16x2 LCD"
      - "1x 433Mhz RF Transmitter"
      - "2x Arduino UNO"
      - "1x 9 Volts Battery"
    description: "ดูแลต้นไม้สุดรักแบบไร้สายด้วยเซนเซอร์เทพๆ งานง่ายแต่หล่อ รู้ทันทุกการเปลี่ยนแปลงของดินและแสง วัยรุ่นสายช่างต้องจัดไป!"
    difficulty: "Intermediate"
    documentationLinks: []
    downloadableFiles:
      - "https://create.arduino.cc/editor/LightPro/e54e12ce-7548-4a89-991d-47b9cde07770"
      - "https://create.arduino.cc/editor/LightPro/a39c451a-a0a2-4061-8eb8-21d7bac2da1e"
      - "https://create.arduino.cc/editor/LightPro/a39c451a-a0a2-4061-8eb8-21d7bac2da1e"
      - "https://create.arduino.cc/editor/LightPro/e54e12ce-7548-4a89-991d-47b9cde07770"
    encryptedPayload: "U2FsdGVkX19XrqwpZp25uktC2D4H38QzUYuvMOk0wD0lGVeKasZAUzn3XRlfF81M7N7yfQUVXSsc01rPH6oIFZRtUoyMlSGDz+uRwsKekp0="
    heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/flowerpot-monitor-997a64_cover.JPG"
    lang: "en"
    likes: 16
    passwordHash: "c86a72baa6171cbaec00e527b446268720acc7bfa5f642e234676667898efa59"
    price: 2450
    seoDescription: "Wireless FlowerPot Monitor for plants. Track health using Arduino and Sensor for optimal growth. Your smart plant care solution."
    tags:
      - "data collection"
      - "monitoring"
      - "garden"
    title: "หม้อดอกไม้สายเฝ้า! (Wireless FlowerPot Monitor)"
    tools: []
    videoLinks: []
    views: 11868