การใช้พลังงานเป็นปัญหาสำคัญสำหรับอุปกรณ์ที่ทำงานอย่างต่อเนื่องเป็นเวลานานโดยไม่ได้ปิดเครื่อง ดังนั้นเพื่อเอาชนะปัญหานี้คอนโทรลเลอร์เกือบทุกตัวจะมาพร้อมกับโหมดสลีปซึ่งช่วยให้นักพัฒนาออกแบบอุปกรณ์อิเล็กทรอนิกส์เพื่อการใช้พลังงานที่เหมาะสม โหมดสลีปทำให้อุปกรณ์อยู่ในโหมดประหยัดพลังงานโดยการปิดโมดูลที่ไม่ได้ใช้งาน
ก่อนหน้านี้เราได้อธิบายโหมด Deep-sleep ใน ESP8266 สำหรับการประหยัดพลังงาน วันนี้เราจะมาเรียนรู้เกี่ยวกับArduino Sleep Modesและสาธิตการใช้พลังงานโดยใช้ Ammeter โหมด Arduino นอนยังเรียกว่าเป็นArduino โหมดประหยัดพลังงานหรือโหมดสแตนด์บาย Arduino
โหมดสลีป Arduino
โหมดสลีปอนุญาตให้ผู้ใช้หยุดหรือปิดโมดูลที่ไม่ได้ใช้งานในไมโครคอนโทรลเลอร์ซึ่งจะช่วยลดการใช้พลังงานลงได้มาก Arduino UNO, Arduino Nano และ Pro-mini มาพร้อมกับ ATmega328P และมี Brown-out Detector (BOD) ซึ่งจะตรวจสอบแรงดันไฟฟ้าในขณะที่โหมดสลีป
ATmega328P มีหกโหมด:
สำหรับการเข้าสู่โหมดสลีปใด ๆ เราจำเป็นต้องเปิดใช้งานบิตสลีปใน Sleep Mode Control Register (SMCR.SE) จากนั้นโหมดสลีปเลือกบิตเลือกโหมดสลีประหว่าง Idle, ADC noise reduction, Power-Down, Power-Save, Standby และ External Standby
การขัดจังหวะ Arduino ภายในหรือภายนอกหรือการรีเซ็ตสามารถปลุก Arduino จากโหมดสลีปได้
โหมดไม่ได้ใช้งาน
สำหรับการเข้าสู่โหมด Idle sleep ให้เขียน SM bits ของคอนโทรลเลอร์ '000' โหมดนี้จะหยุด CPU แต่อนุญาตให้ SPI, 2-wire serial interface, USART, Watchdog, counters, analog comparator ทำงาน โหมดปกติโดยทั่วไปหยุด CLK CPUและ CLK FLASH Arduino สามารถปลุกได้ตลอดเวลาโดยใช้การขัดจังหวะภายนอกหรือภายใน
รหัส Arduino สำหรับโหมด Idle Sleep:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
มีไลบรารีสำหรับตั้งค่าโหมดพลังงานต่ำต่างๆใน arduino ก่อนอื่นให้ดาวน์โหลดและติดตั้งไลบรารีจากลิงค์ที่กำหนดและใช้รหัสด้านบนเพื่อทำให้ Arduino อยู่ในโหมด Idle Sleep ด้วยการใช้รหัสด้านบน Arduino จะเข้าสู่โหมดสลีปแปดวินาทีและปลุกโดยอัตโนมัติ ดังที่คุณเห็นในรหัสว่าโหมดไม่ได้ใช้งานจะปิดตัวจับเวลาทั้งหมด SPI, USART และ TWI (อินเทอร์เฟซ 2 สาย)
ADC โหมดลดเสียงรบกวน
ในการใช้โหมดสลีปนี้ให้เขียน SM bit เป็น '001' โหมดหยุด CPU แต่อนุญาตให้ ADC, การขัดจังหวะภายนอก, USART, อินเทอร์เฟซแบบอนุกรม 2 สาย, Watchdog และตัวนับเพื่อทำงาน ADC โหมดลดเสียงรบกวนพื้นหยุด CLK CPU, CLK I / Oและ CLK FLASH เราสามารถปลุกคอนโทรลเลอร์จากโหมด ลดเสียงรบกวน ADC โดยวิธีการต่อไปนี้:
- รีเซ็ตภายนอก
- รีเซ็ตระบบ Watchdog
- Watchdog ขัดจังหวะ
- รีเซ็ตเป็นสีน้ำตาล
- ที่อยู่อินเทอร์เฟซแบบอนุกรม 2 สายตรงกัน
- ระดับภายนอกขัดจังหวะบน INT
- ปักหมุดเปลี่ยนขัดจังหวะ
- จับเวลา / ตัวนับขัดจังหวะ
- SPM / EEPROM พร้อมขัดจังหวะ
โหมดปิดเครื่อง
โหมดปิดเครื่องจะหยุดนาฬิกาที่สร้างขึ้นทั้งหมดและอนุญาตเฉพาะการทำงานของโมดูลอะซิงโครนัส สามารถเปิดใช้งานได้โดยเขียน SM bits เป็น '010' ในโหมดนี้ออสซิลเลเตอร์ภายนอกจะปิด แต่อินเทอร์เฟซแบบอนุกรม 2 สายสุนัขเฝ้าบ้านและอินเตอร์รัปต์ภายนอกยังคงทำงาน สามารถปิดใช้งานได้ด้วยวิธีใดวิธีหนึ่งด้านล่าง:
- รีเซ็ตภายนอก
- รีเซ็ตระบบ Watchdog
- Watchdog ขัดจังหวะ
- รีเซ็ตเป็นสีน้ำตาล
- ที่อยู่อินเทอร์เฟซแบบอนุกรม 2 สายตรงกัน
- ระดับภายนอกขัดจังหวะบน INT
- ปักหมุดเปลี่ยนขัดจังหวะ
รหัส Arduino สำหรับโหมด Power-Down เป็นระยะ:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
รหัสนี้ใช้เพื่อเปิดโหมดปิดเครื่อง ด้วยการใช้รหัสด้านบน Arduino จะเข้าสู่โหมดสลีปแปดวินาทีและปลุกโดยอัตโนมัติ
นอกจากนี้เรายังสามารถใช้โหมดปิดเครื่องด้วยอินเทอร์รัปต์ซึ่ง Arduino จะเข้าสู่โหมดสลีป แต่จะตื่นขึ้นเมื่อมีการขัดจังหวะภายนอกหรือภายในเท่านั้น
รหัส Arduino สำหรับโหมดขัดจังหวะการปิดเครื่อง:
void loop () { // อนุญาตให้ปลุกพินเพื่อทริกเกอร์ขัดจังหวะในระดับต่ำ attachInterrupt (0 ปลุกต่ำ); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // ปิดการใช้งานการขัดจังหวะพินภายนอกบนพินปลุก detachInterrupt (0); // ทำอะไรที่นี่ }
โหมดประหยัดพลังงาน
ในการเข้าสู่โหมดประหยัดพลังงานเราต้องเขียนพิน SM ไปที่ '011' โหมดสลีปนี้คล้ายกับโหมดปิดเครื่องโดยมีข้อยกเว้นเพียงอย่างเดียวคือหากเปิดใช้งานตัวจับเวลา / ตัวนับจะยังคงอยู่ในสถานะทำงานแม้ในเวลาที่อยู่ในโหมดสลีป อุปกรณ์สามารถปลุกได้โดยใช้ตัวจับเวลามากเกินไป
หากคุณไม่ได้ใช้เวลา / ตัวนับขอแนะนำให้ใช้โหมดปิดเครื่องแทนโหมดประหยัดพลังงาน
โหมดสแตนด์บาย
โหมดสแตนด์บายจะเหมือนกับโหมดปิดเครื่องข้อแตกต่างเพียงอย่างเดียวคือออสซิลเลเตอร์ภายนอกที่ยังคงทำงานในโหมดนี้ สำหรับการเปิดใช้งานโหมดนี้ให้เขียนหมุด SM ไปที่ '110'
โหมดสแตนด์บายแบบขยาย
โหมดนี้คล้ายกับโหมดประหยัดพลังงานโดยมีข้อยกเว้นประการเดียวที่ออสซิลเลเตอร์ทำงานต่อไป อุปกรณ์จะเข้าสู่โหมด Extended Standby เมื่อเราเขียนหมุด SM ไปที่ '111' อุปกรณ์จะใช้เวลาหกนาฬิกาในการปลุกจากโหมดสแตนด์บายแบบขยาย
ด้านล่างนี้เป็นข้อกำหนดสำหรับโครงการนี้หลังจากเชื่อมต่อวงจรตามแผนภาพวงจร อัปโหลดรหัสโหมดสลีปไปยัง Arduino โดยใช้ Arduino IDE Arduino จะเข้าสู่โหมดสลีปไม่ได้ใช้งาน จากนั้นตรวจสอบการใช้กระแสในแอมป์มิเตอร์ USB นอกจากนี้คุณยังสามารถใช้แคลมป์มิเตอร์ได้เช่นเดียวกัน
ส่วนประกอบที่จำเป็น
- Arduino UNO
- DHT11 เซ็นเซอร์อุณหภูมิและความชื้น
- แอมป์มิเตอร์ USB
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการใช้ DHT11 กับ Arduino ให้ไปที่ลิงค์ ที่นี่เรากำลังใช้แอมป์มิเตอร์ USB เพื่อวัดแรงดันไฟฟ้าที่ Arduino ใช้ในโหมดสลีป
แอมป์มิเตอร์ USB
แอมป์มิเตอร์ USB เป็นอุปกรณ์พลักแอนด์เพลย์ที่ใช้วัดแรงดันและกระแสจากพอร์ต USB ใด ๆ ดองเกิลเสียบระหว่างแหล่งจ่ายไฟ USB (พอร์ต USB ของคอมพิวเตอร์) และอุปกรณ์ USB (Arduino) อุปกรณ์นี้มีตัวต้านทาน 0.05ohm ในแนวเดียวกับพินเพาเวอร์ซึ่งใช้วัดค่าของกระแสที่ดึงออกมา อุปกรณ์นี้มาพร้อมกับหน้าจอเจ็ดส่วนสี่ส่วนซึ่งจะแสดงค่าของกระแสและแรงดันไฟฟ้าที่ใช้โดยอุปกรณ์ที่เชื่อมต่อทันที ค่าเหล่านี้จะพลิกเป็นช่วง ๆ ทุกๆสามวินาที
ข้อมูลจำเพาะ:
- ช่วงแรงดันไฟฟ้าที่ใช้งาน: 3.5V ถึง 7V
- พิกัดกระแสสูงสุด: 3A
- ขนาดกะทัดรัดพกพาสะดวก
- ไม่จำเป็นต้องใช้อุปกรณ์ภายนอก
ใบสมัคร:
- การทดสอบอุปกรณ์ USB
- กำลังตรวจสอบระดับโหลด
- การดีบักเครื่องชาร์จแบตเตอรี่
- โรงงานผลิตภัณฑ์อิเล็กทรอนิกส์และของใช้ส่วนตัว
แผนภูมิวงจรรวม
ในการตั้งค่าด้านบนเพื่อสาธิตโหมด Arduino Deep sleep Arduino จะเสียบเข้ากับแอมป์มิเตอร์ USB จากนั้นเสียบแอมป์มิเตอร์ USB เข้ากับพอร์ต USB ของแล็ปท็อป หมุดข้อมูลของเซ็นเซอร์ DHT11 ติดอยู่กับขา D2 ของ Arduino
คำอธิบายรหัส
รหัสที่สมบูรณ์สำหรับโครงการพร้อมวิดีโอจะได้รับในตอนท้าย
รหัสเริ่มต้นด้วยการรวมไลบรารีสำหรับเซ็นเซอร์ DHT11 และไลบรารี LowPower สำหรับการดาวน์โหลดไลบรารี Low Power ตามลิงค์ จากนั้นเราได้กำหนดหมายเลขพิน Arduino ที่พินข้อมูลของ DHT11 เชื่อมต่อและสร้างวัตถุ DHT
# รวม
ในฟังก์ชัน การตั้งค่าโมฆะ เราได้เริ่มต้นการสื่อสารแบบอนุกรมโดยใช้ serial.begin (9600) ซึ่ง 9600 คืออัตราการส่งข้อมูล เราใช้ LED ในตัวของ Arduino เป็นตัวบ่งชี้สำหรับโหมดสลีป ดังนั้นเราจึงตั้งค่าพินเป็นเอาต์พุตและดิจิตอลเขียนต่ำ
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); pinMode (LED_BUILTIN, เอาท์พุท); digitalWrite (LED_BUILTIN, LOW); }
ในฟังก์ชัน void loop เรากำลังสร้าง LED ในตัวสูงและอ่านข้อมูลอุณหภูมิและความชื้นจากเซ็นเซอร์ ที่นี่ DHT.read11 (); คำสั่งกำลังอ่านข้อมูลจากเซ็นเซอร์ เมื่อคำนวณข้อมูลแล้วเราสามารถตรวจสอบค่าโดยบันทึกลงในตัวแปรใดก็ได้ ที่นี่เรามีการดำเนินการทั้งสองชนิดลอยตัวแปร t '' และ'H'ดังนั้นข้อมูลอุณหภูมิและความชื้นจะถูกพิมพ์แบบอนุกรมบนจอภาพแบบอนุกรม
void loop () { Serial.println ("รับข้อมูลจาก DHT11"); ล่าช้า (1,000); digitalWrite (LED_BUILTIN สูง); int readData = DHT.read11 (dataPin); // DHT11 ลอย t = อุณหภูมิ DHT; ลอย h = DHT ความชื้น; Serial.print ("อุณหภูมิ ="); Serial.print (เสื้อ); Serial.print ("C -"); Serial.print ("ความชื้น ="); Serial.print (h); Serial.println ("%"); ล่าช้า (2000);
ก่อนที่จะเปิดใช้งานโหมดสลีปเรากำลังพิมพ์ "Arduino: - ฉันกำลังจะงีบ" และสร้าง LED ในตัวให้ต่ำ หลังจากนั้น Arduino โหมดสลีปจะเปิดใช้งานโดยใช้คำสั่งที่ระบุไว้ด้านล่างในโค้ด
โค้ดด้านล่างนี้จะเปิด ใช้งานโหมดสลีปเป็นระยะ ของ Arduino และให้เวลาสลีปแปดวินาที เปลี่ยน ADC, Timers, SPI, USART, อินเทอร์เฟซแบบ 2 สายให้อยู่ในสภาพ OFF
จากนั้นจะปลุก Arduino โดยอัตโนมัติจากโหมดสลีปหลังจาก 8 วินาทีและพิมพ์ “ Arduino: - เฮ้ฉันเพิ่งตื่น”
Serial.println ("Arduino: - ฉันกำลังจะ Nap"); ล่าช้า (1,000); digitalWrite (LED_BUILTIN, LOW); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - เฮ้ฉันเพิ่งตื่น"); Serial.println (""); ล่าช้า (2000); }
ดังนั้นการใช้รหัสนี้Arduino จะปลุกเพียง 24 วินาทีในหนึ่งนาทีและจะยังคงอยู่ในโหมดสลีปตลอด 36 วินาทีซึ่งจะช่วยลดพลังงานที่ใช้โดยสถานีตรวจอากาศ Arduino ได้อย่างมาก
ดังนั้นถ้าเราใช้ Arduino ด้วยโหมดการนอนหลับเราสามารถประมาณสองเท่ารันไทม์อุปกรณ์