
สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12

Child Behavior Modifier จะบันทึกจำนวนครั้งที่บุตรหลานของคุณประสบปัญหา (หรือที่เรียกว่า Strikes) และเมื่อถึงสามครั้ง ออดจะดังขึ้นและหน้าจอ LCD จะแจ้งว่ามีการต่อสายดิน
ขั้นตอนที่ 1: เริ่มอย่างง่าย: เพิ่มปุ่ม

ขั้นตอนแรกในโครงการนี้เป็นเรื่องง่าย เพิ่ม 1 ปุ่ม ในขั้นตอนนี้คุณต้องมี 4 สายชายกับชาย, 1 220 Resisitor และปุ่มกด
- เชื่อมต่อ 5V ที่ด้านพลังงานเข้ากับแถวบวกบนเขียงหั่นขนม
-
เชื่อมต่อ GND กับด้านลบของเขียงหั่นขนม
- ใส่ปุ่มกดลงบนเขียงหั่นขนม
-
ต่อไฟที่แถวบวกกับส่วนล่างซ้ายของปุ่มกด
- กราวด์ปุ่มโดยใช้ตัวต้านทานที่ด้านล่างขวาของปุ่มกดไปยังแถวเชิงลบของเขียงหั่นขนม
- เชื่อมต่อ #13 ด้านดิจิทัลของ Arduino กับด้านบนขวาของปุ่ม
ยืนยันด้วยรหัสของคุณว่าปุ่มกำลังลงทะเบียน:
int child1ButtonPin = 13;//นี่คือพินที่ปุ่มกดของเราเชื่อมต่อกับ
int child1ButtonState = 0; // อ่านสถานะของปุ่ม (เปิด/ปิด)
int child1Strike = 0; // ลูกตีได้กี่ลูก
// ฟังก์ชั่นการตั้งค่าจะทำงานหนึ่งครั้งเมื่อคุณกดรีเซ็ตหรือเปิดเครื่อง
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); โหมดพิน (child1ButtonPin, INPUT); } // ฟังก์ชันลูปทำงานซ้ำแล้วซ้ำอีก void loop () {// อ่านสถานะของปุ่ม (เปิดหรือปิด) child1ButtonState = digitalRead (child1ButtonPin); ถ้า (child1ButtonState == สูง) // กดปุ่ม { Serial.println ("สูง"); ล่าช้า (5000); }
ถ้า (child1ButtonState == ต่ำ)
{ Serial.println ("ต่ำ"); ล่าช้า (5000); } }
ขั้นตอนที่ 2: แก้ไขรหัสเพื่อลงทะเบียนการกดปุ่ม


แก้ไขรหัสเพื่อลงทะเบียนกดปุ่ม:
int child1ButtonPin = 13;//นี่คือพิน ปุ่มกดของเราเชื่อมต่อกับ child1ButtonState = 0;// อ่านสถานะของปุ่ม (เปิด/ปิด) int child1PreviousState = 0; // ปุ่มก่อนหน้าระบุ int child1Strike = 0;
// ฟังก์ชั่นการตั้งค่าจะทำงานหนึ่งครั้งเมื่อคุณกดรีเซ็ตหรือเปิดเครื่อง
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); โหมดพิน (child1ButtonPin, INPUT); } // ฟังก์ชันลูปทำงานซ้ำแล้วซ้ำอีก void loop () {// อ่านสถานะของปุ่ม (เปิดหรือปิด) child1ButtonState = digitalRead (child1ButtonPin); if (child1ButtonState != child1PreviousState) { if (child1ButtonState == HIGH) // กดปุ่ม { child1Strike ++; Serial.println (child1Strike); ล่าช้า (1000); } }
}
ถัดไป แก้ไขรหัสเพื่อให้เด็กได้รับการนัดหยุดงาน 3 ครั้ง หลังจากนั้นพวกเขาจะได้รับข้อความว่าถูกกักบริเวณ:
int child1ButtonPin = 13;//นี่คือพิน ปุ่มกดของเราเชื่อมต่อกับ child1ButtonState = 0;// อ่านสถานะของปุ่ม (เปิด/ปิด) int child1PreviousState = 0; int child1Strike = 0;
// ฟังก์ชั่นการตั้งค่าจะทำงานหนึ่งครั้งเมื่อคุณกดรีเซ็ตหรือเปิดเครื่อง
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); โหมดพิน (child1ButtonPin, INPUT); } // ฟังก์ชันลูปทำงานซ้ำแล้วซ้ำอีก void loop () {// อ่านสถานะของปุ่ม (เปิดหรือปิด) child1ButtonState = digitalRead (child1ButtonPin); if (child1ButtonState != child1PreviousState) { if (child1ButtonState == HIGH) // กดปุ่ม { child1Strike ++; Serial.println (child1Strike);
ถ้า(child1Strike >=3)
{ Serial.println("ลูก 1 ถูกต่อสายดิน!"); } ล่าช้า (3000); } }
}
Serial Monitor ควรมีลักษณะเหมือนภาพด้านบน
หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณพอใจกับความล่าช้า ล่าช้าเล็กน้อยและมันจะลงทะเบียน 1 ปุ่มกดเป็นมากกว่าหนึ่ง!
ขั้นตอนที่ 3: เพิ่มปุ่มให้มากที่สุดเท่าที่คุณมีลูก


ในขั้นตอนนี้ เราเพียงแค่คัดลอกสองสามขั้นตอนสุดท้าย เพิ่มปุ่มให้มากที่สุดเท่าที่คุณทำเด็ก ๆ ในกรณีของฉันฉันเพิ่มสี่ ตรวจสอบให้แน่ใจว่าได้เปลี่ยนรหัสของคุณเป็นพินดิจิทัลที่ต่อปุ่มไว้ ในกรณีของฉัน ฉันใช้พิน 12 ถึง 10 เพื่อเพิ่มปุ่ม ในกรณีที่คุณต้องการเตือนนี่คือขั้นตอนที่ 1:
- เชื่อมต่อ 5V ที่ด้านพลังงานเข้ากับแถวบวกบนเขียงหั่นขนม
-
เชื่อมต่อ GND กับด้านลบของเขียงหั่นขนม
- ใส่ปุ่มกดบนเขียงหั่นขนมเชื่อมต่อพลังงานบนแถว postive ไปที่ส่วนล่างซ้ายของปุ่มกด
-
กราวด์ปุ่มโดยใช้ตัวต้านทานที่ด้านล่างขวาของปุ่มกดไปยังแถวเชิงลบของเขียงหั่นขนม
- เชื่อมต่อ (หมายเลขพินของคุณ) ที่ด้านดิจิทัลของ Arduino ไปที่ด้านขวาบนของปุ่ม
คุณจะต้องแก้ไขโค้ดเพื่อจัดการกับปุ่มทั้งหมดของคุณ โปรดทราบว่าหากคุณจำเป็นต้องระมัดระวัง Strings ที่คุณใช้ คุณไม่สามารถเพิ่มเป็นตัวพิมพ์เล็กด้วยกัน เป็นการดีที่สุดที่จะประกาศ 1 เป็นวัตถุสตริง
int child1ButtonPin = 13; // นี่คือพิน ปุ่มกดของเราเชื่อมต่อกับ toint child2ButtonPin = 12; int child3ButtonPin = 11; int child4ButtonPin = 10; int child1ButtonState = 0; // อ่านสถานะของปุ่ม (เปิด/ปิด) int child2ButtonState = 0; int child3ButtonState = 0; int child4ButtonState = 0; int child1PreviousState = 0; int child2PreviousState = 0; int child3PreviousState = 0; int child4PreviousState = 0; int child1Strike = 0; int child2Strike = 0; int child3Strike = 0; int child4Strike = 0;
// ฟังก์ชั่นการตั้งค่าจะทำงานหนึ่งครั้งเมื่อคุณกดรีเซ็ตหรือเปิดเครื่อง
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); โหมดพิน (child1ButtonPin, INPUT); โหมดพิน (child2ButtonPin, INPUT); โหมดพิน (child3ButtonPin, INPUT); โหมดพิน (child4ButtonPin, INPUT); } // ฟังก์ชันลูปทำงานซ้ำแล้วซ้ำอีก void loop () {// อ่านสถานะของปุ่ม (เปิดหรือปิด) child1ButtonState = digitalRead (child1ButtonPin);
child2ButtonState = digitalRead (child2ButtonPin);
child3ButtonState = digitalRead (child3ButtonPin);
child4ButtonState = digitalRead (child4ButtonPin);
ถ้า (child1ButtonState != child1PreviousState)
{ ถ้า (child1ButtonState == สูง) // กดปุ่ม { child1Strike ++; Serial.println(String("Child 1 Has: ") + child1Strike + " การนัดหยุดงาน");
ถ้า(child1Strike >=3)
{ Serial.println("ลูก 1 ถูกต่อสายดิน!"); } ล่าช้า (3000); } } if (child2ButtonState != child2PreviousState) { if(child2ButtonState == HIGH)// กดปุ่ม { child2Strike ++; Serial.println(String("Child 2 has: ") + child2Strike + " การนัดหยุดงาน");
ถ้า(child2Strike >=3)
{ Serial.println("ลูก 2 ถูกต่อสายดิน!"); } ล่าช้า (3000); } }
ถ้า (child3ButtonState != child3PreviousState)
{ ถ้า (child3ButtonState == สูง) // กดปุ่ม { child3Strike ++; Serial.println(String("Child 3 has: ") + child3Strike + " การนัดหยุดงาน");
ถ้า(child3Strike >=3)
{ Serial.println("ลูก 3 ถูกต่อสายดิน!"); } ล่าช้า (3000); } }
ถ้า (child4ButtonState != child4PreviousState)
{ ถ้า (child4ButtonState == สูง) // กดปุ่ม { child4Strike ++; Serial.println(String("Child 4 has: ") + child4Strike + " การนัดหยุดงาน");
ถ้า(child4Strike >=3)
{ Serial.println("ลูก 4 ถูกต่อสายดิน!"); } ล่าช้า (3000); } } }
ขั้นตอนที่ 4: เพิ่ม Buzzer


ตอนนี้ ให้ตรวจสอบให้แน่ใจว่าบุตรหลานของคุณรู้ว่าพวกเขามีเหตุผล มาเพิ่มออดกันเถอะ ในการเชื่อมต่อออด ให้ทำตามขั้นตอนง่าย ๆ เหล่านี้
- เพิ่ม Buzzer ไปที่เขียงหั่นขนมของคุณ วางแผนสำหรับพื้นที่เนื่องจากหน้าจอ LCD กำลังจะมา
- เชื่อมต่อด้านบวก (ออดควรมี + ด้านบวก) กับพินที่คุณเลือก ฉันทำ 9
- เชื่อมต่ออีกด้านหนึ่งเข้ากับรางที่มีสายกราวด์ของเขียงหั่นขนมของคุณ
ถัดไป แก้ไขรหัสของคุณเพื่อปิดเสียงเตือนเมื่อเด็กถูกต่อสายดิน มีหลายวิธีในการเขียนโค้ดสำหรับ buzzer ของคุณ แต่ฉันชอบ tone (buzzerName, hertz, duration) เพื่อความง่าย ดังนั้นตัวอย่างนี้จะเป็น tone (buzzer, 4000, 300)
int child1ButtonPin = 13; // นี่คือพิน ปุ่มกดของเราเชื่อมต่อกับ toint child2ButtonPin = 12; int child3ButtonPin = 11; int child4ButtonPin = 10; int child1ButtonState = 0; // อ่านสถานะของปุ่ม (เปิด/ปิด) int child2ButtonState = 0; int child3ButtonState = 0; int child4ButtonState = 0; int child1PreviousState = 0; int child2PreviousState = 0; int child3PreviousState = 0; int child4PreviousState = 0; int child1Strike = 0; int child2Strike = 0; int child3Strike = 0; int child4Strike = 0; const int ออด = 2;
// ฟังก์ชั่นการตั้งค่าจะทำงานหนึ่งครั้งเมื่อคุณกดรีเซ็ตหรือเปิดเครื่อง
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); โหมดพิน (child1ButtonPin, INPUT); โหมดพิน (child2ButtonPin, INPUT); โหมดพิน (child3ButtonPin, INPUT); โหมดพิน (child4ButtonPin, INPUT); pinMode (ออด, เอาต์พุต); } // ฟังก์ชันลูปทำงานซ้ำแล้วซ้ำอีก void loop () {// อ่านสถานะของปุ่ม (เปิดหรือปิด) child1ButtonState = digitalRead (child1ButtonPin);
child2ButtonState = digitalRead (child2ButtonPin);
child3ButtonState = digitalRead (child3ButtonPin);
child4ButtonState = digitalRead (child4ButtonPin);
ถ้า (child1ButtonState != child1PreviousState)
{ if(child1ButtonState == HIGH)//ปุ่มถูกกด { child1Strike ++; Serial.println(String("Child 1 Has: ") + child1Strike + " การนัดหยุดงาน");
ถ้า(child1Strike >=3)
{ Serial.println("ลูก 1 ถูกต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); // ส่งเสียง 5 เฮิรตซ์เป็นเวลา 5 มิลลิวินาที
}
ล่าช้า (3000); } } if (child2ButtonState != child2PreviousState) { if(child2ButtonState == HIGH)// กดปุ่ม { child2Strike ++; Serial.println(String("Child 2 has: ") + child2Strike + " การนัดหยุดงาน");
ถ้า(child2Strike >=3)
{ Serial.println("ลูก 2 ถูกต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); } ล่าช้า (3000); } }
ถ้า (child3ButtonState != child3PreviousState)
{ ถ้า (child3ButtonState == สูง) // กดปุ่ม { child3Strike ++; Serial.println(String("Child 3 has: ") + child3Strike + " การนัดหยุดงาน");
ถ้า(child3Strike >=3)
{ Serial.println("ลูก 3 ถูกต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); } ล่าช้า (3000); } }
ถ้า (child4ButtonState != child4PreviousState)
{ ถ้า (child4ButtonState == สูง) // กดปุ่ม { child4Strike ++; Serial.println(String("Child 4 has: ") + child4Strike + " การนัดหยุดงาน");
ถ้า(child4Strike >=3)
{ Serial.println("ลูก 4 ถูกต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); } ล่าช้า (3000); } } }
ขั้นตอนที่ 5: เพิ่มหน้าจอ LCD



ตอนนี้ให้หน้าจอ LCD สำหรับการอ่านที่ชัดเจนและง่ายดาย
- ขั้นแรก ให้เพิ่มโพเทนชิออมิเตอร์ลงในเขียงหั่นขนมของคุณเพื่อควบคุมหน้าจอ LCD ระวังตำแหน่งที่คุณวางไว้เนื่องจากคุณอาจไม่มีที่ว่างแล้ว
- ใช้ด้านหน้าซ้ายเพื่อเชื่อมต่อโพเทนชิออมิเตอร์ของคุณกับรางไฟฟ้า
- ใช้ด้านหน้าขวาเพื่อกราวด์โพเทนชิออมิเตอร์ของคุณ
- ด้านหลังจะเชื่อมต่อกับหน้าจอ LCD
- เพิ่มหน้าจอ LCD ลงในเขียงหั่นขนมของคุณ
- กราวด์พินหน้าจอแรกกับรางกราวด์
- ต่อพินที่สองเข้ากับรางไฟ
- ขา LCD ตัวที่สามไปที่ Pin 8 บน Arduino
- ขา LCD ที่สี่ไปที่ Pin 7 บน Arduino
- ที่ห้าไปที่ Pin 6 บน Arduino
- พินที่หกไปที่พิน 5 บน Arduino
- หมุด 7 ถึง 10 บนหน้าจอ LCD ว่างเปล่า
- พิน 11 ไปที่พิน 5 บน Arduino
- พิน 12 ไปที่รางกราวด์
- พิน 13 ไปที่พิน 4 บน Arduino
- พิน 14 ไปที่ด้านหลังของโพเทนชิออมิเตอร์
- พิน 15 ไปที่รางไฟฟ้า
- Pin 16 ไปที่ Ground Rail
ตอนนี้คุณจะต้องอัปเดตรหัสของคุณเพื่อใช้หน้าจอ LCD เพื่อที่คุณจะใช้ libary Liquid Crystal ระวังข้อความสั่งพิมพ์ LCD ของคุณ อย่าลืมล้างหน้าจอเมื่อคุณต้องการข้อความใหม่ อย่าลืมตั้งเคอร์เซอร์เมื่อคุณต้องการใช้สองบรรทัด
#รวม
LiquidCrystal LCD (3, 4, 5, 6, 7, 8); //ตั้งค่าหน้าจอ LCD
int child1ButtonPin = 13; // นี่คือพินที่ปุ่มกดของเราเชื่อมต่อกับ int child2ButtonPin = 12; int child3ButtonPin = 11; int child4ButtonPin = 10; int child1ButtonState = 0; // อ่านสถานะของปุ่ม (เปิด/ปิด) int child2ButtonState = 0; int child3ButtonState = 0; int child4ButtonState = 0; int child1PreviousState = 0; // สถานะก่อนหน้าของปุ่มที่กด int child2PreviousState = 0; int child3PreviousState = 0; int child4PreviousState = 0; int child1Strike = 0; //จำนวนครั้งที่เด็กมี int child2Strike = 0; int child3Strike = 0; int child4Strike = 0; const int ออด = 9; //เสียงออด
// ฟังก์ชั่นการตั้งค่าจะทำงานหนึ่งครั้งเมื่อคุณกดรีเซ็ตหรือเปิดเครื่อง
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); lcd.begin(16, 2); lcd.print("เด็ก"); lcd.setCursor(0, 1); lcd.print("ตัวดัดแปลงพฤติกรรม"); โหมดพิน (child1ButtonPin, INPUT); โหมดพิน (child2ButtonPin, INPUT); โหมดพิน (child3ButtonPin, INPUT); โหมดพิน (child4ButtonPin, INPUT); pinMode (ออด, เอาต์พุต); } // ฟังก์ชันลูปทำงานซ้ำแล้วซ้ำอีกตลอดไป void loop() { lcd.setCursor(0, 0); // อ่านสถานะของปุ่ม (เปิดหรือปิด) child1ButtonState = digitalRead (child1ButtonPin);
child2ButtonState = digitalRead (child2ButtonPin);
child3ButtonState = digitalRead (child3ButtonPin);
child4ButtonState = digitalRead (child4ButtonPin);
ถ้า (child1ButtonState != child1PreviousState)
{ ถ้า (child1ButtonState == สูง) // กดปุ่ม { lcd.clear (); child1Strike ++; Serial.println(String("Child 1 Has: ") + child1Strike + " การนัดหยุดงาน"); lcd.print("ลูก 1 มี:"); lcd.setCursor(0, 1); lcd.print(child1Strike); lcd.print(" สไตรค์!");
ถ้า(child1Strike >=3)
{ Serial.println("ลูก 1 ถูกต่อสายดิน!"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ลูก 1 คือ"); lcd.setCursor(0, 1); lcd.print("ต่อสายดิน!");
โทนเสียง (ออด, 5000, 500); // ส่งเสียง 5 เฮิรตซ์เป็นเวลา 5 มิลลิวินาที
}
ล่าช้า (3000); } } if (child2ButtonState != child2PreviousState) { lcd.clear (); ถ้า (child2ButtonState == สูง) // กดปุ่ม { child2Strike ++; Serial.println(String("Child 2 has: ") + child2Strike + " การนัดหยุดงาน"); lcd.print("ลูก 2 มี:"); lcd.setCursor(0, 1); lcd.print (child2Strike); lcd.print(" สไตรค์!"); if(child2Strike >=3) { Serial.println("ลูก 2 ถูกต่อสายดิน!"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ลูก 2 คือ"); lcd.setCursor(0, 1); lcd.print("ต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); } ล่าช้า (3000); } }
ถ้า (child3ButtonState != child3PreviousState)
{ จอแอลซีดีชัดเจน (); ถ้า (child3ButtonState == สูง) // กดปุ่ม { child3Strike ++; Serial.println(String("Child 3 has: ") + child3Strike + " การนัดหยุดงาน"); lcd.print("ลูก 3 มี:"); lcd.setCursor(0, 1); lcd.print (child3Strike); lcd.print(" สไตรค์!"); if(child3Strike >=3) { Serial.println("ลูก 3 ถูกต่อสายดิน!"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ลูก 3 คือ"); lcd.setCursor(0, 1); lcd.print("ต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); } ล่าช้า (3000); } }
ถ้า (child4ButtonState != child4PreviousState)
{ จอแอลซีดีชัดเจน (); ถ้า (child4ButtonState == สูง) // กดปุ่ม { child4Strike ++; Serial.println(String("Child 4 has: ") + child4Strike + " การนัดหยุดงาน"); lcd.print("ลูก 4 มี:"); lcd.setCursor(0, 1); lcd.print (child4Strike); lcd.print(" สไตรค์!");
ถ้า(child4Strike >=3)
{ Serial.println("ลูก 4 ถูกต่อสายดิน!"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ลูก 4 คือ"); lcd.setCursor(0, 1); lcd.print("ต่อสายดิน!"); โทนเสียง (ออด, 5000, 500); } ล่าช้า (3000); } } } และนั่นคือทั้งหมดที่คุณต้องการเพื่อสร้าง Modifer พฤติกรรมเด็กของคุณเอง
แนะนำ:
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-