يمكن فتح المصباح الأصلي الذي صنعته Instructables تحت الاسم المستعار tuenhidiy وسيضيء من الداخل. يتم تعديل لون التوهج باستخدام المقاوم المتغير وزر.
يتضمن تصميم وحدة الإنارة: غلاف كروي من مزدوج حراري صناعي ، غلاف من عمود ضغط ، غدة كابل ... انظر ، أي غلاف جميل:
حالة وظيفة الزر من Schneider ، اكتب XAPM1501H29. وهي مصنوعة من سبائك الزنك. يمكنك بالطبع استخدام شيء أبسط أيضًا ، ولن تكون النتيجة أسوأ. بالنسبة للجمال ، يتم إرفاق غدة من البولي أميد أو النيكل 20 مم بالجسم ، يتم تثبيتها في حفرة موجودة.
يحكم كل شيء
اردوينو نانو. هناك نوعان من مصادر الضوء: وحدة Neopixel Ring 16 و 16 RGB LEDs مع أنود مشترك. لا تزال هناك حاجة إلى ست دوائر دقيقة: ثلاث نوبات تسجيل 74HC595 وثلاث مجموعات من الترانزستورات المركبة ULN2803. حسنًا ، الأشياء الصغيرة: ثلاث مكثفات عند 0.1 μF ، 24 مقاومات عند 100 أوم ، ترانزستور A1013 ومقبس طاقة واحد. يستخدم اللوح لوحًا من نوع اللوح ، والجهاز مدعوم بمصدر طاقة بجهد خمسة فولت.
يبدو المخطط في البداية معقدًا ، ولكن إذا نظرت إليه ، يصبح كل شيء واضحًا:
يبدل الزر الأوضاع ، ويسمح لك المقاوم المتغير باختيار ألوان التوهج لكل من حلقة LED ومصابيح RGB المنفصلة.
يأخذ السيد الغلاف من المزدوجات الحرارية:
يوجد فيه ثقبان ، أحدهما بقطر 21 مم ، والآخر في 32. يستخدم الأول tuenhidiy لتوصيل الغلاف بجسم عمود الزر ، والثاني - مع "رأس رجل الثلج" الذي يوجد عليه الزر.
على قطعة من لوحة توصيل من نوع لوح مثالي ، يقوم المعلم بتجميع هيكل من طابقين من مصابيح LED RGB من خلال الجمع بين الأنودات الخاصة بهم. يتم إخراج الأسلاك من جميع الكاثودات ونقاط اتصال الأنودات إلى الموصلات. تثبيت الناشر:
قم بلحام الكبل باستخدام الموصل بوحدة NeoPixel Ring 16:
تجميع لوحة تسجيل المناوبة وفقًا للمخطط:
يتم تكوين مخرجات اردوينو المتصلة بلوحة التسجيل على النحو التالي: الدقة - 3 ، المزلاج - 2 ، تسجيل الوقت - 13 ، البيانات - 11.
ثم يقوم المعالج الموجود على قطعة أخرى من لوحة التوصيل بإنشاء المحول لـ Arduino Nano:
يجعل رأس ما يسميه رجل ثلج ، برقبة من قطعة من الأنابيب البلاستيكية ، يضع زرًا بداخله ويعرض كابلًا منه:
فهو يجمع بين رأس رجل الثلج ، والغطاء من المزدوجات الحرارية وغطاء عمود الزر:
يثبت مقاوم متغير بمقبض تحكم وختم زيت وشريط طرفي في مبيت عمود الزر:
محاولة كيفية احتواء Arduino Nano ولوحة تسجيل المناوبة:
كل شيء متصل ، كيف يعزل الألواح من العلبة المعدنية - ليس من الواضح:
وميض:
// ******************************************* .... ******************************************************* ********** //
# تشمل
# تشمل
#define blank_pin 3 // يحدد BIT الفعلي لـ PortD للفراغ - هو Arduino UNO pin 3
#define latch_pin 2 // يحدد BIT الفعلي لـ PortD للمزلاج - هو Arduino UNO pin 2
#define clock_pin 13 // المستخدمة بواسطة SPI ، يجب أن تكون 13 SCK 13 في Arduino UNO
#define data_pin 11 // المستخدمة بواسطة SPI ، يجب أن تكون دبوس MOSI 11 على Arduino UNO
# تعريف الصف 4
# تحديد زر 5
# تعريف PIN 6
# تحديد بوتين 7
Adafruit_NeoPixel strip = Adafruit_NeoPixel (16، PIN، NEO_GRB + NEO_KHZ800) ؛
// ******************************************* .... ********************************************* .... ********** //
بايت أحمر [4] ؛
بايت الخضراء [4] ؛
بايت أزرق [4] ؛
int BAM_Bit، BAM_Counter = 0 ؛
// ******************************************* .... ********************************************* .... ********** //
# تعريف BAM_RESOLUTION 4
# تعريف COLOR_WHEEL_LENGTH 256
uint8_t colourR [COLOR_WHEEL_LENGTH] ،
uint8_t colourG [COLOR_WHEEL_LENGTH] ،
uint8_t colourB [COLOR_WHEEL_LENGTH] ،
int16_t ColPos = 0 ؛
uint16_t colourPos ؛
uint8_t R ، G ، B ؛
# تعريف myPI 3.14159265358979323846
# تعريف myDPI 1.2732395
# تحديد myDPI2 0.40528473
int buttonPushCounter = 0 ؛
int buttonState = 0 ؛
int lastButtonState = 0 ؛
int POT ؛
int OLD_POT ،
إعداد باطل ()
{
strip.begin () ؛
السطوع (50) ؛
التعري () ؛ // تهيئة جميع وحدات البكسل على "إيقاف"
SPI.setBitOrder (MSBFIRST) ؛
SPI.setDataMode (SPI_MODE0) ؛
SPI.setClockDivider (SPI_CLOCK_DIV2) ؛
المقاطعات () ؛
TCCR1A = B00000000 ؛
TCCR1B = B00001011 ؛
TIMSK1 = B00000010 ؛
OCR1A = 8 ؛
pinMode (latch_pin ، OUTPUT) ؛
pinMode (data_pin، OUTPUT) ؛
pinMode (clock_pin ، OUTPUT) ؛
pinMode (ROW ، OUTPUT) ؛
pinMode (BUTTON، INPUT_PULLUP) ؛
SPI.begin () ؛
المقاطعات () ؛
fill_colour_wheel () ؛
clearfast () ؛
}}
حلقة فارغة ()
{
buttonState = قراءة رقمية (BUTTON) ؛
إذا (buttonState! = lastButtonState) {
if (buttonState == HIGH) {
buttonPushCounter ++ ؛
}}
آخر {
}}
}}
lastButtonState = buttonState ؛
التبديل (buttonPushCounter٪ 5)
{
الحالة 0:
POT = خريطة (analogRead (POTPIN) ، 0 ، 1023 ، 0 ، 255) ؛
إذا (POT & lt؛ (OLD_POT * 0.95) || POT & gt؛ (OLD_POT * 1.05))
{
OLD_POT = POT ، // احفظ القيمة المتغيرة
fillTable_colorwheelRGB (POT، R، G، B) ؛
قوس قزح (بوت) ؛
}}
استراحة
الحالة 1:
POT = خريطة (analogRead (POTPIN) ، 0 ، 1023 ، 0 ، 255) ؛
إذا (POT & lt؛ (OLD_POT * 0.95) || POT & gt؛ (OLD_POT * 1.05))
{
OLD_POT = POT ،
get_colour (POT، & R، & G، & B) ؛
جدول التعبئة (R ، G ، B) ؛
ملء (POT) ؛
}}
استراحة
الحالة 2:
POT = خريطة (analogRead (POTPIN) ، 0 ، 1023 ، 0 ، 255) ؛
إذا (POT & lt؛ (OLD_POT * 0.95) || POT & gt؛ (OLD_POT * 1.05))
{
OLD_POT = POT ،
get_colour (POT، & R، & G، & B) ؛
جدول التعبئة (R ، G ، B) ؛
fullWhite () ؛
}}
استراحة
الحالة 3:
POT = خريطة (analogRead (POTPIN) ، 0 ، 1023 ، 0 ، 255) ؛
إذا (POT & lt؛ (OLD_POT * 0.95) || POT & gt؛ (OLD_POT * 1.05))
{
OLD_POT = POT ،
fillTable (0 ، 0 ، 0) ؛
قوس قزح (بوت) ؛
}}
استراحة
الحالة 4:
clearfast () ؛
fullWhite () ؛
استراحة
}}
}}
LED فارغ (int Y ، int R ، int G ، int B)
{
Y = التقييد (Y ، 0 ، 7) ؛
R = تقييد (R ، 0 ، 15) ؛
G = تقييد (G ، 0 ، 15) ؛
B = التقييد (B ، 0 ، 15) ؛
for (byte BAM = 0؛ BAM & lt؛ BAM_RESOLUTION؛ BAM ++)
{
bitWrite (أحمر [BAM] ، Y ، bitRead (R ، BAM)) ؛
bitWrite (أخضر [BAM] ، Y ، bitRead (G ، BAM)) ؛
bitWrite (أزرق [BAM] ، Y ، bitRead (B ، BAM)) ؛
}}
}}
ISR (TIMER1_COMPA_vect) {
PORTD | = ((1 & lt؛ myPI) {
س - = 2 * myPI ؛
g هي 1 ؛
}}
بينما (! g & (x & lt؛ -myPI)) {
س + = 2 * myPI ؛
}}
sinr = myDPI * x - myDPI2 * x * myAbs (x) ؛
sinr = 0.225 * (sinr * myAbs (sinr) -sinr) + sinr ؛
عودة سينر
}}
// نموذج كوسين سريع
تعويم myCos (تعويم x) {
إرجاع mySin (x + myPI / 2) ؛
}}
تعويم myTan (تعويم x) {
إرجاع mySin (x) / myCos (x) ؛
}}
// SQUARE ROOT APPROX
تعويم mySqrt (تعويم في) {
int16_t d = 0 ؛
int16_t in_ = في ؛
نتيجة تعويم = 2 ؛
for (d = 0؛ in_ & gt؛ 0؛ in_ & gt؛ & gt؛ = 1) {
د ++ ؛
}}
for (int16_t i = 0؛ i & lt؛ d / 2؛ i ++) {
النتيجة = النتيجة * 2 ؛
}}
for (int16_t i = 0؛ i & lt؛ 3؛ i ++) {
النتيجة = 0.5 * (في / نتيجة + نتيجة) ؛
}}
نتيجة العودة ؛
}}
// القيمة المطلقة
تعويم myAbs (تعويم للداخل) {
return (in) & gt؛ 0؟ (in) :-( in)؛
}}
ملء الفراغ_اللون (فارغ)
{
تطفو الأحمر والأخضر والأزرق.
تعويم ج ، ق ؛
int32_t phase = 0 ؛
int16_t I = 0 ؛
بينما (المرحلة & lt ؛ COLOR_WHEEL_LENGTH)
{
s = (1 & lt؛ & lt؛ BAM_RESOLUTION) * mySin (myPI * (3 * phase - I * COLOR_WHEEL_LENGTH) / (2 * COLOR_WHEEL_LENGTH)) ؛
c = (1 & lt؛ & lt؛ BAM_RESOLUTION) * myCos (myPI * (3 * phase - I * COLOR_WHEEL_LENGTH) / (2 * COLOR_WHEEL_LENGTH)) ؛
red = (I == 0؟ 1: 0) * s + (I == 1؟ 1: 0) * c ؛
green = (I == 1؟ 1: 0) * s + (I == 2؟ 1: 0) * c ؛
أزرق = (I == 2؟ 1: 0) * s + (I == 0؟ 1: 0) * ج ؛
colourR [phase] = أحمر ؛
colourG [phase] = أخضر ؛
colourB [المرحلة] = الأزرق ؛
if (++ stage & gt؛ = (1 + I) * COLOR_WHEEL_LENGTH / 3)
I ++ ؛
}}
}}
void get_colour (int16_t p، uint8_t * R، uint8_t * G، uint8_t * B)
{
if (p & gt؛ = COLOR_WHEEL_LENGTH)
ع - = COLOR_WHEEL_LENGTH ؛
* R = colourR [p] ؛
* G = colourG [p] ؛
* B = colourB [p] ؛
}}
void get_next_colour (uint8_t * R، uint8_t * G، uint8_t * B)
{
if (++ ColPos & gt؛ = COLOR_WHEEL_LENGTH)
ColPos - = COLOR_WHEEL_LENGTH ؛
* R = colourR [ColPos] ؛
* G = colourG [ColPos] ؛
* B = colourB [ColPos] ؛
}}
باطلة increment_colour_pos (uint8_t i)
{
colourPos + = i ؛
بينما (colourPos & gt؛ = COLOR_WHEEL_LENGTH)
{
colourPos - = COLOR_WHEEL_LENGTH ؛
}}
}}
// أدخل قيمة من 0 إلى 255 للحصول على قيمة لون.
// الألوان عبارة عن انتقال r - g - b - رجوع إلى r.
عجلة uint32_t (byte WheelPos) {
WheelPos = 255 - WheelPos ؛
if (WheelPos & lt؛ 85) {
شريط العودة. اللون (255 - WheelPos * 3 ، 0 ، WheelPos * 3) ؛
}}
if (WheelPos & lt؛ 170) {
WheelPos - = 85 ؛
شريط العودة. اللون (0 ، WheelPos * 3 ، 255 - WheelPos * 3) ؛
}}
WheelPos - = 170 ؛
شريط العودة. اللون (WheelPos * 3 ، 255 - WheelPos * 3 ، 0) ؛
}}
الشيكات:
تم:
يمكنك على الحائط:
وتمكين:
كرر التصميم؟ قارن عملها بما يظهر في الفيديو:
VIDEO