สารบัญ:

Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์: 12 ขั้นตอน (พร้อมรูปภาพ)
Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์: 12 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์: 12 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์: 12 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: [Mini Project] ตู้จดหมายแจ้งเตือน (Mailbox Notification) | IOT 2024, กรกฎาคม
Anonim
Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์
Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์
Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์
Letterbox ที่เชื่อมต่อพลังงานแสงอาทิตย์

สำหรับ Ible ที่สองของฉัน ฉันจะอธิบายผลงานของฉันเกี่ยวกับกล่องจดหมายที่เชื่อมต่อของฉัน

หลังจากอ่านคำแนะนำนี้แล้ว (+ อื่นๆ อีกมากมาย) และเนื่องจากกล่องจดหมายของฉันไม่ได้อยู่ใกล้บ้าน ฉันจึงต้องการสร้างแรงบันดาลใจให้ฉันทำงานของ Open Green Energy เพื่อเชื่อมต่อกล่องไปรษณีย์ของฉันกับเซิร์ฟเวอร์ Domoticz

เป้าหมาย

  • ได้รับคำแนะนำจากโทรเลขเมื่อมีจดหมายมา
  • ได้รับคำแนะนำจากโทรเลขเมื่อมีพัสดุมา
  • ตรวจสอบว่าได้รับจดหมาย / พัสดุแล้วหรือไม่

ข้อจำกัดหลักของฉัน

ตู้จดหมายอยู่ค่อนข้างไกลจากบ้าน และเป็นไปไม่ได้ที่จะดึงสายไฟขึ้นมาเพื่อจ่ายไฟให้กับสิ่งใด

ฉันต้องหาวิธีแก้ปัญหาอื่น: พลังงานแสงอาทิตย์เป็นทางออกที่ดี!

เดอะบอม

  • Raspberry Pi (เพื่อโฮสต์ชิ้นส่วน MQTT และ Domoticz - ไม่ได้อธิบายไว้ที่นี่)
  • บัญชีบอทโทรเลข
  • Lolin D1 mini (หรือ Wemos …)
  • ขั้วต่อขั้วต่อสกรูแบบเสียบปลั๊ก
  • TP4056 แท่นชาร์จแบตเตอรี่ลิเธียม
  • 6V 2W แผงโซลาร์เซลล์พลังงานแสงอาทิตย์
  • แบตเตอรี่ Li-Ion 18650
  • ที่ใส่แบตเตอรี่ Li-Ion
  • PCB DIY การประสาน ทองแดง ต้นแบบ แผงวงจรพิมพ์
  • เซอร์โวอนาล็อก SG90
  • สวิตช์กก 3 อัน (หนึ่งอันสำหรับจดหมาย หนึ่งอันสำหรับพัสดุ และอีกอันสำหรับการชำระเงิน)
  • แม่เหล็ก
  • สายบางๆ
  • ลังไม้: เนื่องจากไม่มีเครื่องพิมพ์ 3 มิติ ฉันจึงได้ตระหนักถึงบ้านหลังเล็กๆ ของตัวเองที่มีไม้เพื่อรับชิ้นส่วนอิเล็กทรอนิกส์ …
  • สายอีเทอร์เน็ตสำรอง
  • บอร์ดฝ่าวงล้อมตัวเชื่อมต่อ RJ45 อีเธอร์เน็ต

  • เจบีเวล
  • ลูกปืนบางส่วน
  • สกรู น็อต แหวนรอง

ขั้นตอนที่ 1: โครงการระดับโลก

โครงการระดับโลก
โครงการระดับโลก
โครงการระดับโลก
โครงการระดับโลก

ภาพวาดที่สวยงามย่อมดีกว่าการกล่าวสุนทรพจน์ยาวๆ เสมอ;-)

แต่คำอธิบายเล็กน้อยเกี่ยวกับ MQTT, Domoticz และ Telegram นั้นยินดีต้อนรับเสมอ!

MQTT (Message Queuing Telemetry Transport) เป็นโปรโตคอลการส่งข้อความที่ใช้ในการส่งข้อมูลระหว่างอุปกรณ์และระบบอื่นๆ ในโลกของ IoT (Internet of Things)

การดำเนินการจะขึ้นอยู่กับหลักการของลูกค้าที่เชื่อมต่อกับเซิร์ฟเวอร์โดยไม่ต้องลงรายละเอียดมากเกินไป ใน MQTT ไคลเอ็นต์จะเรียกว่า Subscriber หรือ Publisher และเซิร์ฟเวอร์เรียกว่า Broker

ในคำแนะนำนี้ ฉันใช้ผู้เผยแพร่เพียงรายเดียว Lolin ต่อสายเข้ากับตู้ไปรษณีย์ของฉัน: เมื่อตรวจพบจดหมายหรือพัสดุผ่านผู้ติดต่อกกที่ติดตั้งในแถบดำ (ขั้นตอนที่ 1 ใน shematic) มันจะส่งข้อความ MQTT ผ่าน WIFI ไปยังนายหน้า (ขั้นตอนที่ 2).

ส่วนนายหน้าทำโดย Mosquitto ซึ่งติดตั้งบน Raspberry Pi (ขั้นตอนที่ 3)

เกี่ยวกับ Domoticz:

ตามที่อธิบายไว้ในหน้าต้นทาง Domoticz เป็น "ระบบอัตโนมัติในบ้าน" ซึ่งช่วยให้คุณควบคุมอุปกรณ์ต่างๆ และรับอินพุตจากโปรโตคอลต่างๆ: MQTT เป็นหนึ่งในโปรโตคอลที่รองรับ …

ทันทีที่ข้อมูลส่งถึงเขา (ขั้นตอนที่ 4) คุณสามารถกำหนดเหตุการณ์ได้: ในกรณีของกล่องข้อความ ฉันเลือกที่จะส่งการแจ้งเตือนทางโทรเลข (ขั้นตอนที่ 5)

ในที่สุดไคลเอนต์ Telegram ได้รับการกำหนดค่าบนโทรศัพท์ของฉัน (และภรรยาของฉันด้วย! - ขั้นตอนที่ 6): บรรลุเป้าหมายสุดท้ายแล้ว…

ขั้นตอนที่ 2: Shematic / Wiring

Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ
Shematic / การเดินสายไฟ

หนึ่งคำเกี่ยวกับอนาล็อกอ่าน:

ก่อนอื่น ฉันสังเกตเห็นหลังจากการวิจัยบางอย่างว่า Lolin mini D1 (ในชื่อ Wemos รุ่นเก่า) ได้สร้างตัวแบ่งแรงดันไฟฟ้าสำหรับพิน A0 (พิจารณาจาก220KΩสำหรับ R1 และ100KΩสำหรับ R2 - ดูทางด้านขวาของแผ่นข้อมูลที่เชื่อมโยง) อนุญาตให้ 3.2 โวลต์ เป็นแรงดันอินพุตอนาล็อกสูงสุด

เมื่อพิจารณาจากแรงดันไฟขาออกสูงสุดจากแบตเตอรี่คือ 4, 2v (จำกัดโดยแผงชาร์จ) และในทางทฤษฎี คุณเพียงแค่เพิ่มตัวต้านทานภายนอก (ในซีรีย์ที่มี R1) เพื่อเพิ่มช่วงแรงดันไฟอินพุตสูงสุด จากนั้น หากคุณเพิ่ม 100K ตามลำดับด้วย R1 คุณจะได้ผลลัพธ์นี้:

Vin * R1/(R1+R2) = Vout

4, 2 * 320K/(320K+100K) = 3, 2

ในวงจรของฉัน ฉันเลือกที่จะปรับค่าของมันได้ ฉันจึงชอบที่จะใช้ตัวต้านทานแบบปรับได้ในวงจรของฉัน: บางทีมันอาจจะไม่มีประโยชน์สำหรับคุณ แต่ในสถานการณ์ของฉัน ฉันตั้งค่าของมันไว้ที่ประมาณ 10KΩ เพื่อให้มีค่า ค่าที่สอดคล้องกันใน Domoticz …

โปรดทราบว่าพิน A0 มีความละเอียด 10 บิต: หมายความว่าในสเก็ตช์ของคุณ การอ่านแบบอะนาล็อกจะส่งคืนค่าระหว่าง 0 ถึง 1024

เนื่องจากฉันต้องการส่งค่าเปอร์เซ็นต์ไปยัง Domoticz ฉันต้องหารผลการอ่านแบบแอนะล็อกด้วย 10, 24

ขั้นตอนที่ 3: การจัดการพลังงาน

การจัดการพลังงาน
การจัดการพลังงาน
การจัดการพลังงาน
การจัดการพลังงาน

แน่นอน ฉันต้องการให้กล่องจดหมายเป็นอิสระ เพื่อให้บรรลุเป้าหมาย ฉันใช้องค์ประกอบเหล่านี้:

  • แบตเตอรี่ Li-Ion 18650 ขนาด 4000mAh;
  • แผงโซลาร์เซลล์ที่สามารถจ่ายไฟได้ 6V / 2W;
  • บอร์ดชาร์จแบตเตอรี่ลิเธียม TP4056

ในการเลือกแผงโซลาร์เซลล์ที่เหมาะสมที่สุด ฉันได้ดูตัวอย่างบางส่วน รวมถึงตัวอย่างนี้ ในตัวอย่างนี้ มีการใช้แผงโซลาร์เซลล์ 5.5V / 0.66W และอาจเพียงพอสำหรับวัตถุประสงค์ดังกล่าว ในกรณีของฉันและเนื่องจาก ESP8266 ต้องเปิดทิ้งไว้ในระหว่างวันและต้องสามารถใช้เซอร์โวมอเตอร์เพื่อให้บ้านหันหน้าไปทางดวงอาทิตย์ ฉันจึงเลือกรุ่นแผงโซลาร์เซลล์ที่ทรงพลังกว่า (6V / 2W) - นอกจากนี้ยังช่วยให้ฉัน เพื่อคาดการณ์ช่วงฤดูหนาวที่มืดและวันที่มีเมฆมาก;-)

นอกจากนี้ และเพื่อลดการใช้พลังงานให้สูงสุด ฉันได้เลือกสถานการณ์ต่อไปนี้:

  • เมื่อรู้ว่าบุรุษไปรษณีย์ผ่านมาระหว่างเวลา 07:00 น. ถึง 20:00 น. ESP จะถูกวางไว้ใน DeepSleep ในช่วงที่เหลือของคืน
  • ปัจจัยไม่ผ่านระหว่างเที่ยงวันเสาร์และเช้าวันจันทร์: ESP ยังอยู่ในโหมด DeepSleep ในช่วงเวลานี้
  • สำหรับช่วงเวลาระหว่าง 7.00 น. ถึง 20.00 น. และเพื่อลดการใช้พลังงานฉันเพียงแค่ปิดการใช้งานอินเทอร์เฟซเครือข่ายของ ESP: เครือข่ายจะเริ่มต้นใหม่เฉพาะเมื่อมาถึงพัสดุหรือจดหมายเพียงมีเวลาพอที่จะส่งข้อมูลไปยัง Domoticz. I ไม่จำเป็นต้องได้รับการเตือนทันทีและอีกไม่กี่วินาทีที่จำเป็นในการรีสตาร์ทอินเทอร์เฟซเครือข่ายนั้นไม่เป็นอันตราย!

ค่าบางอย่างเกี่ยวกับการบริโภคในโหมด differents ที่ฉันใช้สำหรับ Lolin - ดูแผ่นข้อมูล p18:

  • ในโหมดปกติ (ด้วยการทำงานของ RF) การใช้พลังงานจะเพิ่มขึ้นเป็น 170mA ! เนื่องจากตู้ไปรษณีย์ของฉันอยู่ห่างจากบ้านของฉันประมาณ 50 เมตร (และเมื่อถึงขีดจำกัดของสัญญาณ WIFI …) ฉันคิดว่าพลังงานที่ใช้ในการรักษาการเชื่อมต่ออยู่ที่ระดับสูงสุด …
  • ใน Modem-sleep การใช้พลังงานจะลดลงเหลือ 15mA แต่อย่างที่คุณเห็นในแผ่นข้อมูล โมเด็มไม่ได้หยุดโมเด็มอย่างสมบูรณ์ เนื่องจาก ESP "กำลังรักษาการเชื่อมต่อ Wi-Fi โดยไม่มีการรับส่งข้อมูล"
  • ใน Deep-sleep พลังงานจะลดลงเหลือ 20uA

เพื่อให้แน่ใจว่า wifi จะไม่ทำงานโดยไม่จำเป็น ฉันต้องการปิดการใช้งานด้วยคำสั่งต่อไปนี้ สังเกตการเรียกล่าช้า () จำนวนมาก … หากไม่มีพวกเขา ESP พัง:

WiFi. ตัดการเชื่อมต่อ ();

ล่าช้า (1000); WiFi.mode (WIFI_OFF); ล่าช้า (1000); WiFi.forceSleepBegin(); ล่าช้า(1);

โดยรวมแล้ว หลังจากดำเนินการมาหลายวัน ดูเหมือนว่าจะใช้งานได้และโดยเฉพาะอย่างยิ่งการโหลดอย่างถูกต้อง:

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

ขั้นตอนที่ 4: การติดตั้งแม่เหล็กและหน้าสัมผัสกก

การติดตั้งแม่เหล็กและหน้าสัมผัสกก
การติดตั้งแม่เหล็กและหน้าสัมผัสกก
การติดตั้งแม่เหล็กและหน้าสัมผัสกก
การติดตั้งแม่เหล็กและหน้าสัมผัสกก
การติดตั้งแม่เหล็กและหน้าสัมผัสกก
การติดตั้งแม่เหล็กและหน้าสัมผัสกก

ตามปกติแล้ว ฉันใช้ Proxxon เพื่อสร้างสถานที่ของ Reed ให้เป็นชิ้นไม้

ในการแก้ไขหน้าสัมผัสกกในรู ฉันใช้การเชื่อม J-B เล็กน้อย

สำหรับพัสดุและผลลัพธ์ เทปชิ้นเล็ก เลื่อยเลือยตัดโลหะเล็กน้อย และบรรลุเป้าหมาย !

ข้อดีของกล่องจดหมายของฉันคือ มันเป็นโลหะ ซึ่งช่วยอำนวยความสะดวกในการวางตำแหน่งของแม่เหล็ก เพื่อให้มันโต้ตอบอย่างเหมาะสมกับหน้าสัมผัสกก

ขั้นตอนที่ 5: เชื่อมต่อกับ My Little House

เชื่อมต่อกับบ้านเล็กของฉัน
เชื่อมต่อกับบ้านเล็กของฉัน
เชื่อมต่อกับบ้านเล็กของฉัน
เชื่อมต่อกับบ้านเล็กของฉัน

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

คุณสามารถใช้โมเดลนี้หรือใช้ Arduino Ethernet shield เก่า ๆ ที่แขวนอยู่ในลิ้นชักของฉัน: เขาไม่ทน เขากล้าหาญต่อหน้าเลื่อย ความตายของเขาเร็วมาก ^^

บอกได้คำเดียวเกี่ยวกับ Arduino Ethernet shield นี้: อย่าคาดหวังว่าจะมีไดรเวอร์แยกกัน 8 ตัว … สายเคเบิลถูกจับคู่โดย 2 ตัวในชีลด์ … มันทำให้ฉันแทบบ้ามานานเกินไป !!!

ขั้นตอนที่ 6: ในบ้าน …

ในบ้าน …
ในบ้าน …
ในบ้าน …
ในบ้าน …

มีที่เพียงพอสำหรับยึดที่ใส่แบตเตอรี่ การตั้งค่าเซอร์โว และขั้วต่อ RJ45 ตัวเมีย

ขั้นตอนที่ 7: ปล่อยให้มันหมุน …

ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …
ปล่อยให้มันหมุน …

วัตถุประสงค์คือให้หันหน้าเข้าหาดวงอาทิตย์ …

เพื่อให้สามารถหมุนได้ ฉันใช้สกรูยาวเป็นเพลา โดยมีน๊อตและลูกปืนสองตัว …

จนถึงตอนนี้ ฉันใช้เซอร์โว SG90 (แรงบิด: 1.8 กก./ซม. ที่ 4.8 โวลต์)

หมุนบ้าน (และไม่กี่กรัม) ก็เพียงพอแล้ว ในทางกลับกัน ฉันไม่แน่ใจว่าเฟืองพลาสติกของมันทนทานต่อลมกระโชกแรงในภูมิภาคของฉันเป็นเวลานาน

ฉันสั่งอีกอันหนึ่ง (แรงบิด MG995: 9.4 กก./ซม. ที่ 4.8 โวลต์) ไม่แพงมากเหมือนกัน แต่มีเกียร์โลหะ

สิ่งที่ควรทำต่อไปเมื่อได้รับ: ฉันใช้กล่องจดหมายที่เชื่อมต่อเพื่อแจ้งให้ฉันทราบว่าเขามาถึงแล้ว!

ขั้นตอนที่ 8: การทดสอบบางอย่าง

Image
Image

หมายเหตุสองสาม:

สเก็ตช์นี้เป็นเพียงการจำลองการเปลี่ยนแปลงของชั่วโมงในระหว่างวันเพื่อให้ฉันควบคุมตำแหน่งของเซอร์โวได้

  • ด้วย SG90: ไม่ต้องการอะไรเป็นพิเศษ มันสามารถทำงานกับแรงดัน OUT ที่มาจากตัวควบคุมแบตเตอรี่ได้
  • แต่ด้วย MG 995:

    • มุมการหมุนทั้งหมดไม่เท่ากัน (กว้างกว่า): ฉันต้องใช้ฟังก์ชันพิเศษเพื่อลดขนาด (Servo_Delta())
    • ต้องการ DC/DC Step up เพื่อให้แรงดันไฟเพียงพอกับเซอร์โว … เพื่อดำเนินการต่อ …

/*

- ทดสอบกับ SG90: ไม่ต้องการอะไรเพิ่มเติม มันสามารถทำงานกับแรงดัน OUT ที่มาจากตัวควบคุมแบตเตอรี่ - สำหรับ MG 995: - ใช้ฟังก์ชัน Servo_Delta() … - ต้องการ DC/DC Step up เพื่อให้แรงดันไฟเพียงพอกับเซอร์โว … ถึง ต่อ: */ #include bool Logs = true; เซอร์โว myservo; #define PIN_SERVO D2 // ตำแหน่งเซอร์โวสำหรับ: 7h, 8h, 9h, 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h, 20h, 21h //int Arr_Servo_Pos = {177, 173, 163, 148, 133, 118, 100, 80, 61, 41, 28, 15, 2, 2, 2}; int Arr_Servo_Pos = {180, 175, 165, 150, 135, 120, 102, 82, 63, 43, 30, 15, 0, 0, 0}; ภายในเก่า; ตำแหน่งภายใน; int ฉัน; การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); } void loop() { สำหรับ (i = 7; i <= 22; i++){ old = i; if (i == 7){ if (Logs) Serial.println ("ตำแหน่งเซอร์โวเท 7 Heure"); myservo.attach (PIN_SERVO); for(int index = Arr_Servo_Pos[(sizeof(Arr_Servo_Pos) / sizeof(Arr_Servo_Pos[0])) -1]; index 7 && i = Arr_Servo_Pos[i-7]; index--){ if (Logs) Serial.println (ดัชนี); ถ้า (บันทึก) Serial.print ("ค่าที่ปรับปรุง: "); ถ้า (บันทึก) Serial.println (Servo_Delta (ดัชนี)); ล่าช้า(200); //myservo.write(Servo_Delta(ดัชนี)); myservo.write (ดัชนี); } ล่าช้า(15); myservo.write(Arr_Servo_Pos[i-7]); // เขียนค่าสุดท้ายอีกครั้งเพื่อหลีกเลี่ยงการกระตุกเมื่อ datach myservo.detach(); } } } ล่าช้า (2000); } } int Servo_Delta (ค่า int) { int Temp_val; Temp_val = (ค่า*0.80)+9; ส่งคืน Temp_val; }

ขั้นตอนที่ 9: บ้านเล็ก

บ้านน้อย
บ้านน้อย
บ้านน้อย
บ้านน้อย
บ้านน้อย
บ้านน้อย

อย่างที่ฉันบอกไปก่อนหน้านี้ ฉันไม่ได้รับเครื่องพิมพ์ 3 มิติ เลยตัดสินใจใช้ลังผักเก่าๆ …

บางทีมันอาจจะไม่นานในสภาพอากาศ แต่เมื่อถึงเวลานั้นฉันจะมีเวลาพิจารณาวิธีแก้ปัญหาอื่น (หรือเพื่อนที่เป็นเจ้าของเครื่องพิมพ์ 3D): เพื่อปกป้องไม้ ฉันเพิ่มสารเคลือบเงาจำนวนมากทุกที่ …

เห็น "ผ้าม่านสวย" ได้ … นี่แหละที่จะเกิดขึ้น เมื่อคุณชวนภรรยาทำงาน ^^

ขั้นตอนที่ 10: ร่าง

อยู่ระหว่างดำเนินการ … แต่ดูเหมือนว่าจะมีเสถียรภาพ

ฉันยังคงทำงานกับโค้ดอยู่: เนื่องจากนี่ไม่ใช่เวอร์ชันสุดท้าย เรายินดีต้อนรับความคิดเห็น / คำแนะนำของคุณ;-)

ข้อสังเกตบางประการ:

  • มีความล่าช้ามากมาย () ในโค้ด: นี่คือเพื่อหลีกเลี่ยงความผิดพลาดของ Lolin โดยเฉพาะอย่างยิ่งในขณะที่หยุดเครือข่ายเริ่มต้น …
  • ฉันไม่พบวิธีที่ง่ายและเชื่อถือได้ในการรับดวงอาทิตย์ azimuth นั่นเป็นเหตุผลที่ฉันแก้ไขค่าเซอร์โวในฟังก์ชันของสิ่งที่ฉันสังเกตเห็น … ฉันมีวิธีที่ดี (และเรียบง่าย) ในการได้มัน ฉันสนใจ !อาจจะ เส้นทางที่จะศึกษาที่นี่ แม้ว่าฉันจะชอบ API ออนไลน์ แต่ให้แอซิมัทโดยตรงตามวันที่ ชั่วโมง และตำแหน่งทางภูมิศาสตร์ …
  • เกี่ยวกับเทคนิคการนอนหลับ: เนื่องจาก Lolin เป็น Tensilica Processor แบบ 32 บิต ค่าสูงสุดของมันคือ 32-bit unsigned integer คือ 4294967295 … จากนั้นจะใช้เวลาประมาณ 71 นาทีสำหรับช่วงการนอนหลับลึก เลยทำให้นอน l'ESP หลายๆ รอบ ประมาณ 60 นาที …

แก้ไข - 2018-10-08:

ฉันพบว่าเซอร์โวมีการเคลื่อนไหวกระตุกมาก โดยเฉพาะอย่างยิ่งก่อนการแนบ (), detach() และทุกครั้งที่ Lolin ตื่นจาก deepSleep()

ในขณะที่ศึกษาเอกสารข้อมูลอีกเล็กน้อย ฉันได้ตระหนักถึงสองสิ่ง:

  • บนแผ่นข้อมูล Lolin เอาต์พุต D4 เชื่อมต่อกับ BUILTIN_LED แล้ว …
  • ในแผ่นข้อมูล ESP8266ex เราเรียนรู้ว่าเอาต์พุต D4 ถูกใช้เป็น UART 1/U 1 TXD (ตัวรับส่งสัญญาณแบบอะซิงโครนัสสากล) นอกจากนี้ยังระบุด้วยว่า UART1 นี้ใช้สำหรับบันทึกการพิมพ์

เมื่ออ่านข้อมูลเหล่านี้ ฉันจึงรู้ว่าเอาต์พุต D4 ไม่ใช่ความคิดที่ดี โดยเฉพาะอย่างยิ่งในการจัดการเซอร์โวมอเตอร์!

ดังนั้น ตอนนี้เอาต์พุตที่ใช้ควบคุมเซอร์โวมอเตอร์คือ D2 โค้ดด้านล่างได้รับการอัปเดตตามลำดับ

//****************************************

วันที่สร้าง: 08/Date mise en prod: 08/Version: 0.9.4 Version IDE Arduino: 1.8.6 ความเร็วในการอัพโหลด: 921600 Type de carte dans l'IDE: "LOLIN(WEMOS) D1 R2 & mini" Carte physiqueployée: LOLIN(WEMOS) D1 R2 & mini (https://www.amazon.fr/gp/product/B01ELFAF1S/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1) Pin Function ESP-8266 Pin Utilization locale ------- -------------------------------------------------- ------------------------------------ TX TXD TXD RX RXD RXD A0 อินพุตแบบอะนาล็อก, อินพุตสูงสุด 3.3V A0 ความตึงเครียด d'alimentaion D0 IO GPIO16 เชื่อมต่อ à RST (เท le deep.sleep) D1 IO, SCL GPIO5 D2 IO, SDA GPIO4 เซอร์โว moteur D3 IO, 10k ดึงขึ้น GPIO0 D4 IO, 10k ดึงขึ้น, BUILTIN5 LED GPIO2 GPIO2, SCK GPIO14 Reed relève D6 IO, MISO GPIO12 Reed lettre D7 IO, MOSI GPIO13 Reed colis D8 IO, 10k pull-down, SS GPIO15 G Ground GND 5V 5V – 3V3 3.3V 3.3V RST Reset RST Connecté à D0 (เทลึกลงไป.sleep) ************************************************/ #include bool Logs = true; // wifi const char* ssid = "ฮ่า ๆ"; รหัสผ่าน const char* = "ฮ่า ๆ"; IPAddress ip(192, 168, 000, 000); IPAddress dns (192, 168, 000, 000); IPAddress เกตเวย์(192, 168, 000, 000); IPAddress ซับเน็ต (255, 255, 000, 000); ไคลเอนต์ WiFiClient; // Servo #include #define PIN_SERVO D2 เซอร์โว myservo; // ตำแหน่งเซอร์โวสำหรับ: 7 ชม. 8 ชม. 9 ชม. 10 ชม. 11 ชม. 12 ชม. 13 ชม. 14 ชม. 15 ชม. 16 ชม. 17 ชม. 18 ชม. 19 ชม. 20 ชม. 21 ชม. int Arr_Servo_Pos = {179, 175, 165, 150, 135, 120, 102, 82, 63, 43, 30, 15, 1, 1, 1}; // กก #define PIN_SWITCH_OUT D5 ไบต์ Old_Switch_State_OUT; ไบต์ Switch_State_OUT; #define PIN_SWITCH_IN_PARCEL D6 ไบต์ Old_Switch_State_IN_PARCEL; ไบต์ Switch_State_IN_PARCEL; #define PIN_SWITCH_IN_LETTER D7 ไบต์ Old_Switch_State_IN_LETTER; ไบต์ Switch_State_IN_LETTER; switchPressTime แบบยาวที่ไม่ได้ลงนาม; const ยาวที่ไม่ได้ลงนาม DEBOUCE_TIME = 200; // Analog #define PIN_ANALOG A0 // MQTT #include const char* MQTT_Server_IP = "ที่อยู่ MQTT ของคุณ"; const int MQTT_Server_Port =; int IDX_Letter_Box =; int IDX_Parcel_Box =; int IDX_Letter_Box_Battery =; PubSubClient ClientMQTT(ไคลเอนต์); ถ่าน MQTT_Message_Buff[70]; สตริง MQTT_Pub_String; // ความตึงเครียดลอย vcc; // NTP #include time_t เลย; int Old_Time = 0; int Int_Heures = 0; int Int_Minutes = 0; int Int_Sleep_Duration = 63; การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); เครือข่าย (จริง); โหมดพิน (PIN_SWITCH_OUT, INPUT_PULLUP); Old_Switch_State_OUT = digitalRead (PIN_SWITCH_OUT); โหมดพิน (PIN_SWITCH_IN_LETTER, INPUT_PULLUP); Old_Switch_State_IN_LETTER = digitalRead (PIN_SWITCH_IN_LETTER); โหมดพิน (PIN_SWITCH_IN_PARCEL, INPUT_PULLUP); Old_Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL); ส่งระดับแบตเตอรี่ (); เครือข่าย(เท็จ); // NTP ตั้งค่า tnow = เวลา (nullptr); Int_Heures = String(ctime(&tnow)).substring(11, 13).toInt(); Int_Minutes = String(ctime(&tnow)).substring(14, 16).toInt(); // Deepsleep สำหรับคืนนี้ if(!((Int_Heures >= 7) && (Int_Heures <= 20))){ Serial.print("Sleep pour la nuit ("); Serial.print(Int_Sleep_Duration - Int_Minutes); Serial. println("นาที)"); สลีป(Int_Sleep_Duration - Int_Minutes); } } โมฆะลูป () { // NTP ตั้งค่า tnow = เวลา (nullptr); Int_Heures = String(ctime(&tnow)).substring(11, 13).toInt(); Int_Minutes = String(ctime(&tnow)).substring(14, 16).toInt(); //Serial.println(String(ctime(&tnow))); //Serial.println ("Heure: " + String(ctime(&tnow)).substring(11, 13)); //Serial.println (String(ctime(&tnow)).substring(11, 13).toInt()); // การจัดการเซอร์โวถ้า (Old_Time != Int_Heures) { Old_Time = Int_Heures; if (Int_Heures == 7){ if (Logs) Serial.println ("ตำแหน่ง le servo ริน 7 Heure"); myservo.attach (PIN_SERVO); for(int index = Arr_Servo_Pos[(sizeof(Arr_Servo_Pos) / sizeof(Arr_Servo_Pos[0])) -1]; index 7 && Int_Heures = Arr_Servo_Pos[Int_Heures-7]; index--){ if (Logs) Serial.println (ดัชนี); ล่าช้า(200); myservo.write (ดัชนี); } ล่าช้า(15); myservo.write(Arr_Servo_Pos[Int_Heures-7]); // เขียนค่าสุดท้ายอีกครั้งเพื่อหลีกเลี่ยงการกระตุกเมื่อแยก myservo.detach(); } เครือข่าย (จริง); ส่งระดับแบตเตอรี่ (); เครือข่าย(เท็จ); } } } // Deepsleep ถ้าวันเสาร์หลัง 13h if((String(ctime(&tnow)).substring(0, 3) == "Sat") && (Int_Heures >= 13)){ if (Logs) Serial.print("Sleep pour le Samedi aprés midi ("); if (Logs) Serial.print(Int_Sleep_Duration - Int_Minutes); if (Logs) Serial.println(" minutes)"); สลีป(Int_Sleep_Duration - Int_Minutes); } // Deepsleep ถ้าวันอาทิตย์ if(String(ctime(&tnow)).substring(0, 3) == "Sun"){ if (Logs) Serial.print("Sleep pour le dimanche ("); if (Logs) Serial.print(Int_Sleep_Duration - Int_Minutes); if (บันทึก) Serial.println(" minutes)"); สลีป(Int_Sleep_Duration - Int_Minutes); } // การจัดการกก Switch_State_OUT = digitalRead (PIN_SWITCH_OUT); if (Switch_State_OUT != Old_Switch_State_OUT){ ถ้า (มิลลิวินาที () - switchPressTime >= DEBOUCE_TIME) { switchPressTime = มิลลิวินาที (); ถ้า (Switch_State_OUT == สูง){ Serial.println ("courrier relevé !"); เครือข่าย (จริง); ล่าช้า (5000); MQTT_Pubilsh(IDX_Letter_Box, 0, "0"); ล่าช้า (5000); MQTT_Pubilsh(IDX_Parcel_Box, 0, "0"); ล่าช้า (5000); เครือข่าย(เท็จ); } } Old_Switch_State_OUT = Switch_State_OUT; } Switch_State_IN_LETTER = digitalRead (PIN_SWITCH_IN_LETTER); if (Switch_State_IN_LETTER != Old_Switch_State_IN_LETTER){ ถ้า (มิลลิวินาที () - switchPressTime >= DEBOUCE_TIME){ switchPressTime = มิลลิวินาที (); ถ้า (Switch_State_IN_LETTER == สูง){ Serial.println ("จัดส่งมาถึง!"); เครือข่าย (จริง); ล่าช้า (5000); MQTT_Pubilsh(IDX_Letter_Box, 1, "ผู้จัดส่ง"); ล่าช้า (5000); เครือข่าย(เท็จ); } } Old_Switch_State_IN_LETTER = Switch_State_IN_LETTER; } Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL); if (Switch_State_IN_PARCEL != Old_Switch_State_IN_PARCEL){ ถ้า (มิลลิวินาที () - switchPressTime >= DEBOUCE_TIME){ switchPressTime = มิลลิวินาที (); ถ้า (Switch_State_IN_PARCEL == สูง){ Serial.println ("colis มาถึง!"); เครือข่าย (จริง); ล่าช้า (5000); MQTT_Pubilsh(IDX_Parcel_Box, 1, "โคลิส"); ล่าช้า (5000); เครือข่าย(เท็จ); } } Old_Switch_State_IN_PARCEL = Switch_State_IN_PARCEL; } } เป็นโมฆะ SendBatteryLevel(){ ล่าช้า (5000); vcc = analogRead (PIN_ANALOG)/10.24; if (บันทึก) Serial.println ("\tTension relevée: " + String(vcc, 0)); MQTT_Pubilsh(IDX_Letter_Box_Battery, 0, สตริง(vcc, 0)); ล่าช้า (5000); } โมฆะสลีป (int Min_Duration) { ESP.deepSleep (Min_Duration * 60e6); } เครือข่ายเป็นโมฆะ (บูลขึ้นลง){ ถ้า (ขึ้นลง) { Serial.print ("เครือข่ายเริ่มต้น"); WiFi.forceSleepWake(); ล่าช้า(1); // init WIFI WiFi.config (ip, dns, เกตเวย์, ซับเน็ต); WiFi.begin(ssid, รหัสผ่าน); ในขณะที่ (WiFi.status () != WL_CONNECTED) { ล่าช้า (500); Serial.print("."); } ล่าช้า (5000); Serial.println("."); Serial.print("\tConnected - ที่อยู่ IP: "); Serial.println(WiFi.localIP()); // init MQTT ClientMQTT.setServer(MQTT_Server_IP, MQTT_Server_Port); // เริ่มต้น NTP Serial.print("\tTime Sync."); configTime(0, 0, 0, "fr.pool.ntp.org"); setenv("TZ", "CET-1CEST, M3.5.0, M10.5.0/3", 0); while(time(nullptr)) <= 100000) { Serial.print ("."); ล่าช้า (100); } Serial.println ("."); } อื่น ๆ { Serial.println ("เครือข่ายหยุด"); WiFi.disconnect (); ล่าช้า (1000); WiFi.mode (WIFI_OFF); ล่าช้า (1000); WiFi.forceSleepBegin (); ล่าช้า (1); } } เป็นโมฆะการเชื่อมต่อใหม่ () { ในขณะที่ (!ClientMQTT.connected ()) { Serial.print (" \tAttempting MQTT connection…"); // พยายามเชื่อมต่อถ้า (ClientMQTT.connect("ESP8266ClientBAL")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(ClientMQTT.state()); Serial.println(" ลองอีกครั้งใน 5 วินาที"); // รอ 5 วินาทีก่อนที่จะลองดีเลย์ (5000); } } } เป็นโมฆะ MQTT_Pubilsh(int Int_IDX, int N_Value, String S_Value) { if (!ClientMQTT.connected()) reconnected(); vcc = analogRead(PIN_ANALOG)/10.24; Serial.println("\tส่งข้อมูลไปยัง MQTT …"); MQTT_Pub_String = "{ "idx\": " + String (Int_IDX) + ", \"Battery\": " + String(vcc, 0) + ", \"nvalue\": " + N_Value + ", \"svalue \": \"" + S_Value + "\"}"; MQTT_Pub_String.toCharArray(MQTT_Message_Buff, MQTT_Pub_String.length()+1); ClientMQTT.publish("domoticz/in", MQTT_Message_Buff); ClientMQTT. ตัดการเชื่อมต่อ (); }

ขั้นตอนที่ 11: Domoticz

Domoticz
Domoticz
Domoticz
Domoticz
Domoticz
Domoticz

ใน Domoticz:

สำหรับการใช้งานทั่วไป:

  • สร้างสอง "Dummy (ไม่ทำอะไรเลย ใช้สำหรับสวิตช์เสมือน)":

    1. ตัวแรกสำหรับตัวอักษร …
    2. ที่สองสำหรับพัสดุ …
  • สำหรับแต่ละรายการ ให้ปรับแต่งการแจ้งเตือนในแบบของคุณ
  • แน่นอน คุณต้องตั้งค่าโทเค็น Tegegram ของคุณ

ทางเลือก:

คุณสามารถเพิ่ม "เซ็นเซอร์ยูทิลิตี้" เพื่อควบคุมระดับประจุแบตเตอรี่ของคุณ

เคล็ดลับ: คุณจะพบไอคอนที่กำหนดเองได้ฟรีมากมายที่นี่ …

ขั้นตอนที่ 12: บทสรุป

บทสรุป
บทสรุป
บทสรุป
บทสรุป

หวังว่าคำแนะนำนี้จะช่วยคุณ:

  • ไม่ว่าจะสร้างกล่องไปรษณีย์เชื่อมต่อของคุณเองหรือไม่
  • หรือเพียงเพื่อให้แนวคิดสำหรับโครงการของคุณ!

หากคุณมีแนวคิดในการปรับปรุง ฉันรับฟัง!

PS: ขออภัยสำหรับภาษาอังกฤษของฉัน การแปลโดย Google ช่วยฉันได้มาก แต่อาจไม่สมบูรณ์แบบ;-)

แนะนำ: