สารบัญ:
- ขั้นตอนที่ 1: ตัวควบคุมอุณหภูมิทำงานอย่างไร
- ขั้นตอนที่ 2: เตรียม Sonoff Basic Ready
- ขั้นตอนที่ 3: NodeRED
- ขั้นตอนที่ 4: บทสรุป
วีดีโอ: รังเครื่องควบคุมอุณหภูมิเครื่องเก่าของคุณ: 4 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
ระบบทำความร้อนในบ้านของฉันน่าจะเก่าพอๆ กับตัวบ้าน มันมีอายุประมาณ 30 ปี ซึ่งถือว่าดีในแง่ของอายุบ้าน แต่ค่อนข้างติดอยู่ในยุคน้ำแข็งเท่าที่เกี่ยวข้องกับเทคโนโลยี มี 2 ปัญหาหลักในการแก้ปัญหาเชิงพาณิชย์:
- ราคาต้องห้าม
- สินค้าเป็นบริการ
เราทุกคนจำสิ่งที่เกิดขึ้นกับ Revolv ได้ และฉันไม่กระตือรือร้นที่จะให้สิ่งนี้เกิดขึ้นกับฉันในช่วงกลางฤดูหนาว ด้วยเหตุนี้ ฉันขอนำเสนอตัวควบคุม NEST-Alike ที่ดูน่าสงสัยแต่ใช้งานได้จริงสำหรับตัวควบคุมอุณหภูมิเก่าของคุณ ไม่ต้องกังวล ฉันกำลังวางแผนที่จะเพิ่มตู้ที่ดีกว่านี้ในเร็วๆ นี้!
คุณสมบัติ:
- ความสามารถในการใช้เทอร์โมสตัทที่มีอยู่ (ในกรณีที่ภรรยาคร่ำครวญถึงเรื่องนี้)
- การเข้าถึงระยะไกล
- โหมด AWAY
- ตัวบ่งชี้อุณหภูมิที่เหมาะสม
- ทำงานร่วมกับ Alexa
เร็วๆ นี้ (ตรวจสอบที่นี่สำหรับการอัปเดต)
- หน้าแรกของ Google
- Google ปฏิทิน
- เซ็นเซอร์หลายตัว
- ตัวควบคุมหม้อน้ำ
- การบูรณาการ ITT
- การสนับสนุนทาซเคอร์
- คำขอ
- ตู้ที่ดูดีขึ้นมาก
ขั้นตอนที่ 1: ตัวควบคุมอุณหภูมิทำงานอย่างไร
ตัวควบคุมอุณหภูมิน่าจะเชื่อมต่อกับแรงดันสูง! อย่าพยายามทำอะไรเว้นแต่คุณจะแน่ใจว่าวงจรปิดอยู่ คุณสามารถทำร้ายตัวเองและทำให้เกิดความเสียหายต่ออุปกรณ์ที่เชื่อมต่อ พิจารณาปรึกษาช่างไฟฟ้าที่มีคุณสมบัติเหมาะสมเพื่อความปลอดภัยของคุณ
เทอร์โมสตัทของ Honeywell เป็นหน่วยติดผนังซึ่งขับเคลื่อนโดยแหล่งจ่ายไฟหลัก (พื้นฐาน Sonoff ต้องการขั้นต่ำ 90V วงจรของฉันมี 230V) กล่องเชื่อมต่อกับหน่วยควบคุมหลัก (ซึ่งเป็นกล่องขั้นสูง) และจะส่งสัญญาณเมื่ออุณหภูมิลดลงต่ำกว่าระดับเป้าหมาย แม้ว่าหน่วยของคุณอาจแตกต่างกัน แต่หลักการก็เหมือนกันมากที่สุด หากคุณมีสายไฟ 3 เส้นและไม่มีการเชื่อมต่อวิทยุระหว่างหน่วยติดผนัง – นี่คือบทช่วยสอนสำหรับคุณ
ฉันรู้ว่าเทอร์โมสแตทแบบ 3 สายทำงานอย่างไรในหลักการ ซึ่งไม่ได้หยุดฉันจากการเป่าฟิวส์โดยการลัดวงจร 2 สายโดยไม่ได้ตั้งใจ! ฉันมีสายไฟ 3 เส้นต่อเข้ากับตัวเครื่อง (สายที่ 4 คือสายดิน) ตัวควบคุมอุณหภูมิ Honeywell ของฉันไม่ใช่แบบไร้สาย ฉันจึงสามารถใช้ Sonoff Basic เพื่อเปลี่ยนสัญญาณได้ ได้เวลาแยกชิ้นส่วนและดูว่าสัญญาณถูกส่งไปยังยูนิตอย่างไร เมื่อตรวจสอบอย่างใกล้ชิดแล้ว เทอร์มินัลจะเชื่อมต่อด้วยวิธีต่อไปนี้:
- (สีน้ำเงิน) – กราวด์
- (สีเหลือง) – สัญญาณ เมื่อดึงขึ้นสูง เครื่องทำความร้อนจะเปิดขึ้น
- ไม่ได้ใช้งาน
- (สีแดง) – สายสดที่ใช้ดึงสัญญาณสูง
เพื่อให้บรรลุเป้าหมาย ฉันต้องลัดวงจรสายสัญญาณสดด้วยสายสัญญาณเมื่อฉันต้องการเปิดเครื่องทำความร้อน หากคุณมีเทอร์โมสตัทที่เชื่อมต่อในลักษณะเดียวกัน คุณโชคดีเพราะ Sonoff Basic ก็เพียงพอที่จะทำเคล็ดลับนี้
ขั้นตอนที่ 2: เตรียม Sonoff Basic Ready
ก่อนที่เราจะเริ่มเชื่อมต่อสายไฟ เราต้องเพิ่มเซ็นเซอร์อุณหภูมิ (DHT11) ลงในส่วนผสม ตรวจสอบให้แน่ใจว่าคุณมีเฟิร์มแวร์ Tasmota ที่แฟลชไปยังอุปกรณ์ Sonoff ของคุณ (ฉันมีคู่มือการกะพริบที่ยอดเยี่ยมที่นี่) และ Sonoff ที่เปิดใช้งาน Tasmota ของคุณได้รับการกำหนดค่าอย่างถูกต้อง (ซึ่งฉันครอบคลุมอยู่แล้ว) ตอนนี้ สิ่งที่คุณเหลือคือเชื่อมต่อเซ็นเซอร์ DHT11 กับ Sonoff และกำหนดค่าสำหรับการรายงานอุณหภูมิ
DHT11 มาพร้อมกับ 3 พินแบบมีสาย: สัญญาณ - GPIO14Vcc - 3.3VGND - GND
ฉันเจาะรูเข้าไป ฉันไม่ได้สนใจว่าตอนนี้มันจะเป็นอย่างไร ทั้งหมดที่ฉันต้องการคือข้อพิสูจน์ของแนวคิดและการตรวจสอบ ฉันจะสร้างกล่องที่สวยงามและแวววาวเมื่อเครื่องพิมพ์ 3D ของฉันมาถึง ฉันให้ความสนใจเป็นพิเศษกับวิธีการต่อสาย Sonoff เนื่องจากฉันต้องตรวจสอบให้แน่ใจว่าสายสดเชื่อมต่อกับสายสัญญาณที่ปลายอีกด้านของอุปกรณ์ Sonoff หน่วย Honeywell มีตัวต้านทานโหลด (R) อยู่ภายในซึ่งจำกัดกระแส ในขณะที่วงจรได้รับการป้องกันโดยฟิวส์ 3A การจับคู่ความต้านทานเดียวกันเพื่อการป้องกันพิเศษนั้นนับว่าฉลาด เมื่อฉันเตรียมสายไฟแล้ว ก็ถึงเวลาปิดสวิตช์หลักและต่อสาย Sonoff กลับ
Sonoff Tasmota - เทอร์โมสตัทของ Honeywell
INPUT Live - เทอร์มินัลที่ 4 Live
INPUT GND - เทอร์มินัลที่ 1 GND
สัญญาณขาออก - สัญญาณขั้วที่ 2
ฉันได้กล่าวไว้ก่อนหน้านี้ว่าตอนนี้ฉันจะไม่เครียดกับรูปลักษณ์ของสิ่งนี้ ภรรยาได้รับความเชื่อมั่นและฉันสามารถมุ่งเน้นไปที่การทำงานและล้างข้อบกพร่องที่จะเกิดขึ้น ข้อดีคือเทอร์โมสตัทแบบเดิมยังใช้งานได้ ถ้าฉันเปิดใช้งาน มันจะแทนที่ Sonoff Tasmota ตามหนึ่ง นี่ควรเป็นตัวสำรองที่ดีสำหรับเหตุการณ์ที่ไม่คาดคิด
ขั้นตอนที่ 3: NodeRED
โปรดทราบว่าวิดีโออาจมีการอ้างอิง NodeRed ที่เก่ากว่า ฉันกำลังปรับปรุงการออกแบบอย่างต่อเนื่อง นี่เป็นการเปลี่ยนแปลงเล็กน้อยและไฟล์บทความจะได้รับการอัปเดตอยู่เสมอ
ฉันเจอการออกแบบนี้ทางออนไลน์ มันดูดีมาก แต่เมื่อตรวจสอบอย่างใกล้ชิด วิดเจ็ตนี้ไม่เหมาะกับ NodeRED จริงๆ ต้องมีการตั้งค่าเพย์โหลด 5 รายการ ซึ่งไม่ใช่วิธีการทำงานของโหนดที่เหมือนกัน ฉันต้องใช้เวลาพอสมควรในการค้นหาวิธีที่ดีที่สุดในการส่งข้อมูลทั้งหมดนั้นไปเพื่ออัปเดตวิดเจ็ตและทำให้มันทำงานต่อไปได้ ฉันแน่ใจว่าเมื่อเวลาผ่านไปฉันจะใช้เวลามากขึ้นในการออกแบบเพื่อที่ฉันจะได้ผลักดันการอัปเดตที่จำเป็นทั้งหมดด้วยวัตถุ msg เดียว สำหรับตอนนี้มันคือสิ่งที่มันเป็น
กระแสอุณหภูมิ
DHT11 รายงานทุก ๆ X วินาทีกลับไปยังเซิร์ฟเวอร์ NodeRED ฉันเพิ่มความถี่นี้ผ่านคอนโซลของ Tasmota เพียงเรียกใช้คำสั่งเพื่อตั้งค่าความถี่เป็นวินาที:
TelePeriod ตั้งระยะเวลาการวัดและส่งข้อมูลทางไกลระหว่าง 10 ถึง 3600 วินาที
การดำเนินการนี้ทำเพื่อการทดสอบเป็นส่วนใหญ่ เนื่องจากฉันไม่ต้องการรอสักครู่เพื่อดูว่าการแก้ไขข้อผิดพลาดของฉันได้ผลหรือไม่ การรักษาความถี่ให้สูงจะทำให้ระบบทำความร้อนติดไฟบ่อยขึ้นในช่วงเวลาที่สั้นลง ดังนั้นอย่าตั้งไว้ที่ 10 วินาทีสำหรับวัตถุประสงค์อื่นนอกเหนือจากการทดสอบ โหนด MQTT ดึงข้อมูลจาก:
sonoff/เทเล/เซ็นเซอร์
และเก็บข้อมูลที่เป็นประโยชน์มากที่สุดในวัตถุต่อไปนี้:
msg.payload. DHT11. Temperature msg.payload. DHT11.ความชื้น
เพื่อจำกัดข้อผิดพลาด ฉันได้เพิ่มโหนดที่ราบรื่นเพื่อเฉลี่ยผลลัพธ์และอัปเดตตัวแปรโฟลว์: NodeRED:
โหนดฟังก์ชัน - อัปเดต 'TempAmbient'
flow.set('TempAmbient', msg.payload. DHT11. Temperature); return msg;
อัปเดตวิดเจ็ต
ฉันตัดสินใจว่า 5 วินาทีเป็นอัตราการรีเฟรชที่ดี ดังนั้นฉันจึงผลักดันค่าที่จำเป็นทั้งหมดด้วยความถี่นี้ ข้อยกเว้นเพียงอย่างเดียวคือตัวเลื่อนซึ่งตอบสนองทันทีด้วยเหตุผลที่ชัดเจน
แต่ละโหนดที่สอดคล้องกันจะส่งเพย์โหลดที่มีหัวข้อที่กำหนดไปยังวิดเจ็ตที่เหมือนกันที่ซ้อนกัน
- สี (ความร้อน | ความเย็น * | ปิด & hvac_state)
- ใบไม้ (จริง|เท็จ & has_leaf)
- ห่างออกไป (จริง | เท็จ & ห่างออกไป)
- อุณหภูมิแวดล้อม (ตัวเลข & ambient_temperature)
- อุณหภูมิเป้าหมาย (ตัวเลข & target_temperature)
*ไม่ได้ใช้งาน
NodeRED: โหนดฟังก์ชัน - อัปเดตวิดเจ็ต
สี
x = flow.get('TempTarget'); //targetz = flow.get('TempAmbient'); //บรรยากาศ
ถ้า (z = x){
flow.set('heatingState', "ปิด"); flow.set('สวิตช์ทำความร้อน', "ปิด"); } msg.payload = z; msg.topic = "ambient_temperature"; กลับผงชูรส;
ใบไม้
x = flow.get('TempAmbient'); if (x > 17 && x < 23){ flow.set('leaf', true); msg.payload = จริง; msg.topic = "has_leaf"; กลับผงชูรส; } อื่น{flow.set('ใบไม้', เท็จ); msg.payload = เท็จ; msg.topic = "has_leaf"; กลับผงชูรส; }
ลบล้างสี
x = flow.get('ไม่อยู่'); ถ้า (x === จริง){ msg.topic = "hvac_state"; msg.payload = "ปิด"; กลับผงชูรส; }
msg.topic = "hvac_state";
msg.payload = flow.get('สถานะความร้อน');
กลับผงชูรส;
ห่างออกไป
x = flow.get('ไม่อยู่'); ถ้า (x === จริง){ flow.set('heatingSwitch', "OFF"); flow.set('heatingState', "ปิด"); }
msg.topic = "ไม่อยู่";
msg.payload = flow.get('ไม่อยู่'); กลับผงชูรส;
อุณหภูมิเป้าหมาย
if (msg.topic === "update"){ msg.topic = "target_temperature"; msg.payload = flow.get('TempTarget'); กลับผงชูรส; }
if (msg.command === "SetTargetTemperatureRequest") {
flow.set('ห่างออกไป', เท็จ); msg.topic = "target_temperature"; flow.set('TempTarget', msg.payload); }
if (msg.topic === "ตัวเลื่อน") {
flow.set('ห่างออกไป', เท็จ); msg.topic = "target_temperature"; flow.set('TempTarget', msg.payload); }
if (msg.command === "GetTemperatureReadingRequest"){}
กลับผงชูรส;
อย่างที่คุณเห็น ฉันเลือกไม่ใช้ตัวแปรโฟลว์ ดังนั้นฉันจึงสามารถจำค่าได้ตลอดเวลา ฉันมีโฟลว์การดีบักซึ่งโดยทั่วไปจะอ่านค่าที่เก็บไว้ทั้งหมด
- ‘TempAmbinet‘– เก็บอุณหภูมิปัจจุบัน
- 'TempTarget' - เก็บค่าเป้าหมายชั่วคราว
- ‘ใบไม้’ – แสดงใบไม้หากต้องการ
- ‘ไม่อยู่‘– แสดงสถานะไม่อยู่หากจำเป็น
- 'heatingState' - เปลี่ยนสีของจอแสดงผล
- 'heatingSwitch' - ควบคุมสถานะของรีเลย์
ความท้าทายคือต้องตรวจสอบให้แน่ใจว่าข้อมูลได้รับการอัปเดตใน "อัปเดต" และเมื่อมีการร้องขอด้วยวิธีการอื่น (Alexa เป็นต้น) นี่คือเหตุผลที่คุณจะเห็นเงื่อนไขต่างๆ ใน JavaScript ทุกครั้งที่อัปเดตค่า จะถูกส่งไปยังตัวแปรโฟลว์และวิดเจ็ตจะรีเฟรช
ตัวเลื่อน
การทดสอบพบว่าจำเป็นต้องมีการอัปเดตตัวเลื่อนเพิ่มเติม (ตัวเลื่อนดันอุณหภูมิเป้าหมาย) สไลเดอร์ส่งเพย์โหลด (หมายเลข) พร้อมหัวข้อที่เกี่ยวข้อง “สไลเดอร์) เมื่อมันถูกย้าย ยิ่งไปกว่านั้น ฉันต้องการให้ตัวเลื่อนอยู่ในตำแหน่งที่ถูกต้อง หากมีอินเทอร์เฟซเว็บหลายรายการ ในการทำเช่นนี้ ทุกๆ 5 วินาที ฉันเพียงแค่อัปเดตตำแหน่งตัวเลื่อนเป็นอุณหภูมิเป้าหมายปัจจุบัน
NodeRED: โหนดฟังก์ชัน - ตัวเลื่อนอัปเดต '
msg.payload = flow.get('TempTarget');ส่งคืน msg;
การควบคุมรีเลย์
ตัวควบคุมรีเลย์นั้นเรียบง่าย ใช้ (สำหรับตอนนี้) สองอินพุต จริง|เท็จของ Alexa และการโต้ตอบที่ตามหลังการอัปเดตตัวแปรโฟลว์ "สวิตช์ทำความร้อน" ไม่จำเป็นต้องมีการดำเนินการทันที ดังนั้นเพื่อความเรียบง่าย มันทำงานบนความถี่การอัปเดต 5 วินาทีเดียวกันกับขั้นตอนที่เหลือ
รีเลย์เชื่อมต่อผ่าน MQTT โหนดกำลังโพสต์คำสั่ง ON|OFF ไปที่หัวข้อ:
sonoff/cmnd/POWER1
โหนดฟังก์ชันยอมรับจริง|เท็จจาก Alexa และยังเปลี่ยนสถานะของอินพุตตามตัวแปรการไหลของ 'heatingSwitch'
NodeRED: โหนดฟังก์ชัน - รีเลย์ควบคุม'
if (msg.command === "TurnOffRequest"){ msg.payload = "OFF"; กลับผงชูรส; }
if (msg.command === "TurnOnRequest"){
msg.payload = "เปิด"; flow.set('TempTarget', 21); กลับผงชูรส; } if (msg.topic === "update"){ msg.payload = flow.get('heatingSwitch'); } ส่งคืน msg;
การรวม Alexa
นี่เป็นอุปกรณ์แรกที่ฉันต้องปิด "ตอบรับอัตโนมัติ" แทนที่จะสมมติว่ามีการตอบสนองโดยอัตโนมัติ ฉันได้สร้างคำตอบขึ้นมาเนื่องจากฉันต้องการความสามารถในการค้นหาอุณหภูมิที่ตั้งไว้ โดยหลักการแล้ว msg.payload = true|false จะระบุว่าคำขอสำเร็จหรือไม่ และเทมเพลตที่พบที่นี่จะจัดการส่วนที่เหลือเอง หากคุณยังใหม่กับ Alexa และ NodeRed อย่าลืมอ่านสิ่งนี้
ฉันตัดสินใจส่งต่อการรับทราบต่างหาก (ฉันรู้ว่านี่ไม่ใช่วิธีที่ดีที่สุด) เพื่อให้สามารถควบคุมทุกอย่างได้ดีขึ้นเล็กน้อย ควรให้การตอบสนองแต่ละครั้งอย่างเหมาะสมที่ส่วนท้ายของสายการบังคับบัญชา ของฉันมีความเสี่ยงที่จะไม่ส่งคืนข้อผิดพลาดหากสิ่งเหล่านี้เกิดขึ้น โปรดทราบว่าเพื่อให้สอดคล้องกัน ฉันจะอัปเดตตัวแปรเท่านั้น ในขณะที่ลูปการรีเฟรช ดันค่าใหม่ไปที่วิดเจ็ต
NodeRED: โหนดฟังก์ชัน - ประมวลผลการตอบสนองของ Alexa
// อุณหภูมิเป้าหมายของตัวควบคุมอุณหภูมิคืออะไรif (msg.command === "GetTemperatureReadingRequest"){ x =flow.get('TempTarget'); msg.extra = { "temperatureReading": { "value": x}, "applianceResponseTimestamp": new Date().toISOString()}; msg.payload = จริง; กลับผงชูรส; } // ตั้งค่าอุณหภูมิเป็น (ไม่ต่ำกว่า 10 หรือมากกว่า 30) if (msg.command === "SetTargetTemperatureRequest"){ if (msg.payload 30) { var range = { min: 10.0, max: 30.0 } msg.payload = เท็จ; msg.extra = ช่วง; } อื่น ๆ { msg.extra = { targetTemperature: { ค่า: msg.payload } }; msg.payload = จริง; } ส่งคืน msg; } // เปิดใช้งานหาก (msg.command === "TurnOnRequest"){ msg.payload = true; flow.set('ห่างออกไป', เท็จ); flow.set('TempTarget', 21); กลับผงชูรส; } // ปิดถ้า (msg.command === "TurnOffRequest"){ msg.payload = true; flow.set('ออกไป', จริง); กลับผงชูรส;
ขั้นตอนที่ 4: บทสรุป
หากคุณเปิดเผยแดชบอร์ด NodeRED กับ WAN ระบบทำความร้อนทั้งหมดสามารถควบคุมได้จากระยะไกล เราขอแนะนำให้คุณอ่านบทความต่อไปนี้เพื่อรับทราบข้อมูลความปลอดภัยของ NodeRED และ NodeRED
- NodeRED สำหรับผู้เริ่มต้น
- การรักษาความปลอดภัย NodeRED
นอกจากนี้ หากคุณต้องการทราบเกี่ยวกับการอัปเดตของโปรเจ็กต์นี้ โปรดติดตามฉันบนแพลตฟอร์มที่คุณเลือก:
- เฟสบุ๊คก็ได้
- ทวิตเตอร์
- อินสตาแกรม
- YouTu be
และถ้าคุณรู้สึกอยากซื้อกาแฟให้ฉันหรือสนับสนุนฉันอย่างต่อเนื่องกว่านี้:
- Paypal
- Patreon
ฉันหวังว่าคุณจะสนุกกับโครงการ!
แนะนำ:
DIY 37 Leds เกมรูเล็ต Arduino: 3 ขั้นตอน (พร้อมรูปภาพ)
DIY 37 Leds เกมรูเล็ต Arduino: รูเล็ตเป็นเกมคาสิโนที่ตั้งชื่อตามคำภาษาฝรั่งเศสหมายถึงวงล้อเล็ก
หมวกนิรภัย Covid ส่วนที่ 1: บทนำสู่ Tinkercad Circuits!: 20 ขั้นตอน (พร้อมรูปภาพ)
Covid Safety Helmet ตอนที่ 1: บทนำสู่ Tinkercad Circuits!: สวัสดีเพื่อน ๆ ในชุดสองตอนนี้ เราจะเรียนรู้วิธีใช้วงจรของ Tinkercad - เครื่องมือที่สนุก ทรงพลัง และให้ความรู้สำหรับการเรียนรู้เกี่ยวกับวิธีการทำงานของวงจร! หนึ่งในวิธีที่ดีที่สุดในการเรียนรู้คือการทำ ดังนั้น อันดับแรก เราจะออกแบบโครงการของเราเอง: th
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): 6 ขั้นตอน (พร้อมรูปภาพ)
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): การชาร์จแบบเหนี่ยวนำ (เรียกอีกอย่างว่าการชาร์จแบบไร้สายหรือการชาร์จแบบไร้สาย) เป็นการถ่ายโอนพลังงานแบบไร้สาย ใช้การเหนี่ยวนำแม่เหล็กไฟฟ้าเพื่อจ่ายกระแสไฟฟ้าให้กับอุปกรณ์พกพา แอปพลิเคชั่นที่พบบ่อยที่สุดคือ Qi Wireless Charging st
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: CPE 133, Cal Poly San Luis Obispo ผู้สร้างโปรเจ็กต์: Jayson Johnston และ Bjorn Nelson ในอุตสาหกรรมเพลงในปัจจุบัน ซึ่งเป็นหนึ่งใน “instruments” เป็นเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภท ตั้งแต่ฮิปฮอป ป๊อป และอีฟ
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: 13 ขั้นตอน (พร้อมรูปภาพ)
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: ทำป้ายโฆษณาแบบพกพาราคาถูกด้วยตัวเอง ด้วยป้ายนี้ คุณสามารถแสดงข้อความหรือโลโก้ของคุณได้ทุกที่ทั่วทั้งเมือง คำแนะนำนี้เป็นการตอบสนองต่อ/ปรับปรุง/เปลี่ยนแปลงของ: https://www.instructables.com/id/Low-Cost-Illuminated-