สารบัญ:

โฆษณาบล็อก Neopixels: 11 ขั้นตอน
โฆษณาบล็อก Neopixels: 11 ขั้นตอน

วีดีโอ: โฆษณาบล็อก Neopixels: 11 ขั้นตอน

วีดีโอ: โฆษณาบล็อก Neopixels: 11 ขั้นตอน
วีดีโอ: 3 Disney Lightsabers VS a Neopixel 2024, กรกฎาคม
Anonim
Neopixels ที่ปิดกั้นโฆษณา
Neopixels ที่ปิดกั้นโฆษณา

ฉันต้องการสร้างเว็บไซต์ง่ายๆ เป็นรีโมทสำหรับแถบนีโอพิกเซลที่เชื่อมต่อกับศูนย์ Raspberry Pi ของฉัน และใช้งานต่อไปเพื่อบล็อกโฆษณาบนเครือข่ายของฉันโดยใช้ Pi-Hole อันดับแรก ฉันแค่ต้องการเพิ่มไฟ LED ในห้องของฉัน แต่การเดินสายไฟทุกอย่าง ฉันรู้ว่าฉันไม่มีทางควบคุมมันได้สะดวก ดังนั้นฉันจึงตัดสินใจสร้างเว็บไซต์อย่างง่ายพร้อมตัวเลือกการควบคุมพื้นฐานโดยใช้เซิร์ฟเวอร์ apache ที่ตัวติดตั้ง Pi-hole ตั้งค่าไว้แล้ว ฉันให้สิทธิ์รูท www-data ซึ่งเป็นความเสี่ยงด้านความปลอดภัย ดังนั้นคุณควรทำให้เว็บเซิร์ฟเวอร์ไม่พร้อมใช้งานกับโลกภายนอก สิ่งนี้เริ่มต้นสำหรับเอกสารของฉันเป็นหลักและกลายเป็นคำสั่งแรกของฉัน;) ดังนั้นฉันจะขอบคุณมากถ้าคุณสามารถชี้ให้เห็นว่ามีบางอย่างไม่ชัดเจนหรือถ้าฉันพลาดบางสิ่งบางอย่างไปโดยสมบูรณ์

ขั้นตอนที่ 1: วัสดุที่ใช้แล้ว

  • Raspberry Pi (ฉันเริ่มบน Pi 2 แล้วเปลี่ยนเป็น WH หมุด gpio อาจแตกต่างกันเล็กน้อย แต่ไม่เช่นนั้นทุกรุ่นก็ใช้ได้)

    • หากคุณมี RPi ที่ไม่มี wifi ในตัว อะแดปเตอร์ wifi ก็มีประโยชน์เช่นกัน
    • ทางเลือกกรณีสำหรับราสเบอร์รี่pi
  • สายจัมเปอร์ตัวผู้-ตัวเมีย 2 เส้น (ตัวอย่าง)
  • Neopixels ws2811 (ฉันใช้สิ่งเหล่านี้)
  • 1 แหล่งจ่ายไฟ 10W สำหรับ RPi (ที่ชาร์จโทรศัพท์แบบเก่าจะทำได้)
  • แหล่งจ่ายไฟ 1 ~ 50W สำหรับ Neopixels (ฉันใช้แบบนี้ แต่อาจน้อยกว่านี้ก็พอเพียง แต่ถ้าคุณต้องการไฟ LED มากกว่านี้ คุณมีพื้นที่เหลือให้ขยาย)
  • ปลั๊กขั้วต่อแจ็คตัวเมีย (แบบนี้)

ขั้นตอนที่ 2: เตรียมระบบปฏิบัติการ

เตรียมระบบปฏิบัติการ
เตรียมระบบปฏิบัติการ

ดาวน์โหลด Rasbian เวอร์ชันล่าสุดจาก raspberrypi.org เวอร์ชัน lite นั้นใช้ได้สำหรับโปรเจ็กต์นี้ หากคุณวางแผนที่จะใช้ raspberry pi สำหรับอย่างอื่นด้วย คุณอาจพิจารณาติดตั้งเวอร์ชันเต็มด้วย gui จากนั้นฉันก็เผาภาพด้วย Etcher หลังจากนั้นเพื่อให้แน่ใจว่ามันจะเชื่อมต่อกับเครือข่าย wifi ของฉัน ฉันได้เพิ่ม wpa_supplicant.conf ในไดเร็กทอรีสำหรับบูตของ sd card เนื้อหาของไฟล์ควรมีลักษณะดังนี้:

~~~

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1

เครือข่าย={

ssid="SSID"

psk="รหัสผ่าน"

key_mgmt=WPA-PSK }

~~~

ในการเปิดใช้งาน ssh ฉันได้สร้างไฟล์ชื่อ ssh (ไม่มีนามสกุล) ในไดเร็กทอรีเดียวกัน เพื่อให้แน่ใจว่าคุณสามารถกำหนดค่าทุกอย่างจากคอมพิวเตอร์เครื่องอื่นใน lan ของคุณ

ขั้นตอนที่ 3: เชื่อมต่อ Neopixels

การเชื่อมต่อ Neopixels
การเชื่อมต่อ Neopixels
การเชื่อมต่อ Neopixels
การเชื่อมต่อ Neopixels

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

ประการที่สองฉันเชื่อมต่อที่ปลายขั้วบวกของแจ็คต่อสายเคเบิล 5v จากไฟ LED (สายสีแดง) ผู้นำของฉันคือขั้วต่อสายจัมเปอร์บนสายกราวด์เพิ่มเติมและสายดาต้า (สายสีขาว) ฉันไม่สนใจสายกราวด์เพิ่มเติม ไม่จำเป็นสำหรับการตั้งค่าของฉัน บนสายเคเบิลข้อมูลฉันเชื่อมต่อสายจัมเปอร์ตัวผู้กับตัวเมียกับ gpio pin 12 อีกครั้งที่คุณควรใช้พินที่แน่นอนขึ้นอยู่กับ RPi ของคุณ จากนั้นฉันก็เสียบแหล่งจ่ายไฟสำหรับ RPi และพิกเซล ไฟ LED สว่างขึ้นชั่วขณะหนึ่ง หากทุกอย่างถูกต้อง

ขั้นตอนที่ 4: เริ่ม RPi

เริ่ม RPi
เริ่ม RPi

หลังจากที่ให้ RPi หนึ่งนาทีหรือมากกว่านั้นในการบู๊ต ฉันก็ค้นหาที่อยู่ IP จากราสเบอร์รี่ด้วย nmap แต่เครื่องสแกนเครือข่ายใดๆ แผงข้อมูลของเราเตอร์ของคุณ หรือในกรณีส่วนใหญ่ "raspberrypi.local" เท่านั้นที่ทำได้ ด้วยข้อมูลนั้น ฉันเชื่อมต่อกับ RPi ผ่าน ssh ผู้ใช้เริ่มต้นคือ pi ที่มีรหัสผ่านราสเบอร์รี่ นั่นคือสิ่งแรกที่ฉันเปลี่ยนโดยใช้ "passwd" โดยตรงหลังจากการเข้าสู่ระบบครั้งแรก หากคุณต้องการเข้าถึง pi ของคุณผ่าน ssh จากภายนอกเครือข่ายท้องถิ่นของคุณ คุณควรตรวจสอบ fail2ban และการตรวจสอบคีย์ โดยส่วนตัวแล้วฉันไม่มีกรณีการใช้งานนั้น ดังนั้นฉันจะปล่อยให้มันเป็นแค่รหัสผ่าน

ประการที่สอง ฉันอัปเดตซอฟต์แวร์โดยใช้ `sudo apt update && sudo apt upgrade -Y` ฉันยังต้องการซอฟต์แวร์เพิ่มเติมเพื่อรวบรวม libery `sudo apt-get install scons swig git python-dev build-essential -Y` จากนั้นฉันก็คัดลอกเสรีภาพที่ยอดเยี่ยมจาก Jeremy Garff บน github `git clone https://github.com/jgarff/rpi_ws281x.git` หลังจากนั้น libery ถูกโคลน ฉันไปที่ไดเร็กทอรี rpi_ws281x ใช้ scons แล้วติดตั้ง libary ด้วย `sudo python python/setup.py install` ใน python/examples เป็นการสาธิตที่ดี "strandtest.py" ที่มีภาพเคลื่อนไหวที่ประณีตมาก ซึ่งคุณสามารถเริ่มต้นด้วย `sudo python python/examples/strandtest.py`

ขั้นตอนที่ 5: Pi-Hole

Pi-Hole
Pi-Hole

ในการสร้างตัวบล็อกการเพิ่มทั่วทั้งเครือข่าย Pi-Hole นั้นสมบูรณ์แบบ ติดตั้งเพียง `sudo curl -sSL https://install.pi-hole.net | ทุบตี' ส่วนที่ดีคือมันจะตั้งค่าเว็บเซิร์ฟเวอร์ด้วย

หลังจากเรียกใช้ตัวติดตั้ง คุณจะต้องลงชื่อเข้าใช้ไซต์ผู้ดูแลระบบของเราเตอร์ของคุณและให้ที่อยู่ IP แบบคงที่ RPi ของคุณและตั้งค่าเป็นเซิร์ฟเวอร์ DHCP หากคุณตั้งเวลาเช่าต่ำกว่า PI-hole ของคุณควรใช้งานได้ในขณะนี้

ขั้นตอนที่ 6: ควบคุมไฟ

ควบคุมไฟ
ควบคุมไฟ
ควบคุมไฟ
ควบคุมไฟ
ควบคุมไฟ
ควบคุมไฟ

วิธีที่ง่ายที่สุดในการควบคุมนีโอพิกเซลคือการใช้โปรแกรมหลามขนาดเล็ก แต่การใช้ ssh ทุกครั้งที่คุณต้องการเปิดไฟนั้นไม่สะดวก โดยเฉพาะบนอุปกรณ์พกพา ดังนั้นฉันจึงตัดสินใจใช้เว็บไซต์ขนาดเล็กเป็นรีโมทคอนโทรล นี่เป็นความเสี่ยงด้านความปลอดภัย เพราะฉันให้สิทธิ์รูท www-data โดยไม่มีการตรวจสอบรหัสผ่าน คุณไม่ควรเผยแพร่ไซต์นี้นอกเครือข่ายของคุณ

เพื่อให้ง่ายต่อการเลือกระหว่างแดชบอร์ดของ PI-hole และรีโมตแบบเบา ฉันให้ผู้ใช้ pi เข้าถึงการเขียน /var/www/html ด้วย `sudo chown -R pi /var/www.html` และฉันได้สร้าง ไฟล์ index.php ใน /var/www/html/ สิ่งที่ง่ายเช่น:

~~~

รูดัชนี Pi รีโมทแสง

~~~

ไม่เป็นไร จากนั้นฉันก็สร้างโฟลเดอร์ใหม่ชื่อ light เพื่อให้ทุกอย่างตั้งแต่นีโอพิกเซลมารวมกัน ที่นี่ฉันสร้าง colour.py ตาม strandtest.py จากเสรีภาพ

~~~

จากการนำเข้า neopixel * # นำเข้าบางไลบรารี

นำเข้าsys

def led (แถบ, สี, เริ่ม, สิ้นสุด): # สร้างฟังก์ชันเพื่อเรียก leds

สำหรับฉันอยู่ในช่วง (เริ่ม, สิ้นสุด):

strip.setPixelColor(i, สี)

แถบ.show()

ความสว่าง = int(sys.argv[4]) # พารามิเตอร์ที่สี่ในบรรทัดคำสั่งจะเป็นความสว่าง (1-255)

COUNT = 50 # จำนวนพิน LED = 12 # พินที่ใช้กับ RPi

FREQ_HZ = 800000 # ความถี่สัญญาณ LED เป็นเฮิรตซ์ (ปกติ 800khz)

DMA = 5 # ช่อง DMA ที่ใช้สำหรับสร้างสัญญาณ (ลอง 5)

INVERT = False # True เพื่อกลับสัญญาณ (เมื่อใช้ทรานซิสเตอร์ NPN level

แถบ = Adafruit_NeoPixel (COUNT, PIN, FREQ_HZ, DMA, INVERT, ความสว่าง)

แถบ.begin()

R = int(sys.argv[1]) # จำนวนสีแดงคือพารามิเตอร์ตัวแรก

G = int(sys.argv[2]) # จำนวนสีเขียวคือพารามิเตอร์ที่สอง

B = int(sys.argv[3]) # จำนวนสีน้ำเงินคือพารามิเตอร์ตัวที่สาม

ลอง:

ไฟ LED (แถบสี, สี (R, G, B), 0, 49) #จะเริ่มต้นการอนุญาตด้วยสีและความสว่างที่เลือก

ยกเว้น KeyboardInterrupt:

สี(แถบ, สี(0, 0, 0), 0, 49)

~~~

หากคุณเรียกใช้สิ่งนี้ด้วย sudo บนเทอร์มินัล ไฟควรติดเป็นสีที่ระบุ เพื่อให้อนุญาต www-data sudo ฉันได้เพิ่ม `www-data ALL=(ALL) NOPASSWD:ALL)` ลงในไฟล์ sudoers (/etc/sudoers) ใต้ผู้ใช้รูทโดยตรง

ขั้นตอนที่ 7: เปิดไฟด้วยเบราว์เซอร์

จากนั้นฉันก็สร้าง index.php อื่น คราวนี้ใน /lights ~~~

< ?php $R = 100; $G = 100; $B = 100; $BRIGHTNESS = 100; exec("sudo python colour.py $R $G $B $BRIGHTNESS"); ?>

~~~

เมื่อฉันไปที่ raspberrypi.local/lights/index.php ไฟ LED จะเปลี่ยนเป็นสีขาว แม้ว่านี่จะเป็นการเริ่มต้นที่ดี แต่ฉันชอบที่จะมีปุ่มบางปุ่มบนรีโมตเป็นอย่างน้อย

ขั้นตอนที่ 8: ควบคุมไฟจากเบราว์เซอร์

ฉันสร้างส่วนต่อประสานกับปุ่มโดยใช้รูปแบบ html ฉันไม่ชอบทำสิ่งที่ไม่จำเป็น ดังนั้นฉันจึงสร้างโฟลเดอร์ชื่อ templates ที่มีส่วนหัว ส่วนท้าย และโค้ด php หลักของฉัน สุดท้ายของฉัน (สำหรับตอนนี้) /lights/index.php มีลักษณะดังนี้:

~~~

~~~

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

~~~< ?php

$ฉัน = 100;

$R = 0;

$G = 0;

$B = 0;

if (isset($_POST['strandtest_start'])) { exec("sudo python strandtest.py"); }

อื่น if (isset($_POST['strandtest_stop'])) { exec("sudo pkill -9 -f strandtest.py"); }

อื่น if (isset($_POST['red']))) { $R = 255; $G = 0; $B = 0; exec("sudo python colour.py $R $G $B $I"); }

อื่น if(isset($_POST['green']))) { $R = 0; $G = 255; $B = 0; exec("sudo python colour.py $R $G $B $I"); }

อื่น if(isset($_POST['blue']))) { $R = 0; $G = 0; $B = 255; exec("sudo python colour.py $R $G $B $I"); }

อื่น if(isset($_POST['white']))) { $R = 255; $G = 255; $B = 255; exec("sudo python colour.py $R $G $B $I"); }

อื่น if(isset($_POST['off'])) { shell_exec('sudo python off.py'); }

อื่น if(isset($_POST['reboot'])) { shell_exec('sudo reboot now'); } ?>

~~~

ขั้นตอนที่ 9: สร้างเทมเพลตสำหรับส่วนหัวและส่วนท้าย

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

ส่วนหัว.php:

~~~

ไฟ

Lampjes

การควบคุมพื้นฐาน

การควบคุมขั้นสูง

~~~

และส่วนท้าย.php:

~~~

~~~

ขั้นตอนที่ 10: Css บางส่วนเพื่อทำให้ทุกอย่างดูดีขึ้นเล็กน้อย

Css บางส่วนเพื่อทำให้ทุกอย่างดูดีขึ้น
Css บางส่วนเพื่อทำให้ทุกอย่างดูดีขึ้น

อย่างที่คุณอาจสังเกตเห็น ฉันกำลังใช้ไฟล์ css เพื่อควบคุมเลย์เอาต์ เพื่อให้แน่ใจว่ารีโมตของฉันสามารถใช้งานได้บนหน้าจอขนาดเล็กเช่นกัน ฉันใช้ css flexboxes บางตัวพร้อม autowrap

~~~

/* สไตล์ชีตสำหรับอินเทอร์เฟซการควบคุมแสง *

* ใช้ได้กับทุกหน้า */

ร่างกาย { สีพื้นหลัง: f9fcfa; ตระกูลแบบอักษร: Arial; ระยะขอบ: 0; }

h1 { สี: ขาว; จัดข้อความ: ศูนย์; }

p { ตระกูลฟอนต์: เวอร์ดานา; ขนาดตัวอักษร: 20px; }

ชั่วโมง2 { }

/* ส่วนหัว */

.header (ความสูง: 10%; จอแสดงผล:ดิ้น; justify-content:flex-เริ่ม; จัดรายการ:ศูนย์; ระยะขอบ: 0px; ช่องว่างภายใน-ซ้าย: 5%; พื้นหลัง:#3F51B5; จัดรายการ: ศูนย์; }

. HeaderLinks { สี: ขาว; }

.navbar { แสดง: ดิ้น; ดิ้น: 30%; justify-content:ช่องว่างรอบ; สีพื้นหลัง: #3F51B5; สี: ขาว; }

/* ส่วนท้าย */

.footer { สีพื้นหลัง: #3F51B5; ความสูง: 10%; จัดข้อความ: ศูนย์; }

/* Index.php */

.buttons { แสดง: ดิ้น; ทิศทางดิ้น: แถว; flex-wrap: ห่อ; justify-content:ช่องว่างระหว่าง; ความสูง: 80%; align-items:flex-เริ่ม; }

.buttons_index { ช่องว่างภายใน: 0%; ความกว้างของเส้นขอบ: บาง; สไตล์เส้นขอบ: แข็ง; ขอบสี: สีดำ; สีพื้นหลัง: #3949ab; สี: ขาว; ตระกูลแบบอักษร: sans-serif; ความกว้าง: 24%; ความสูง: 20%; }

.buttons_index:โฮเวอร์{ padding:0%; ความกว้างของเส้นขอบ: บาง; สไตล์เส้นขอบ: แข็ง; ขอบสี: สีดำ; สีพื้นหลัง: #536DFE; สี: ขาว; ตระกูลแบบอักษร: sans-serif; ความกว้าง: 24%; ความสูง: 20%; }

~~~

ขั้นตอนที่ 11: ขอบคุณ

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

ฉันหวังว่าคุณจะสนุกกับการอ่านทุกอย่าง หากคุณมีข้อเสนอแนะฉันชอบที่จะได้ยินมัน!

แนะนำ: