Мазмуну:

Arduino LED маанай кубун жакшыртуу (Жөнөкөй) (Видео камтылган): 4 кадам
Arduino LED маанай кубун жакшыртуу (Жөнөкөй) (Видео камтылган): 4 кадам

Video: Arduino LED маанай кубун жакшыртуу (Жөнөкөй) (Видео камтылган): 4 кадам

Video: Arduino LED маанай кубун жакшыртуу (Жөнөкөй) (Видео камтылган): 4 кадам
Video: Антикризисная замена Arduino - LGT8F328P! Дефицит полупроводников 2024, Июль
Anonim
Arduino LED маанай кубун жакшыртуу (Жөнөкөй) (Видео камтылган)
Arduino LED маанай кубун жакшыртуу (Жөнөкөй) (Видео камтылган)

'Earl тарабынан түзүлгөн LED кичинекей маанай куб долбоорун көргөндөн кийин, мен LED Mood Cubeдун жакшыртылган версиясын жасоону чечтим. Менин версиям оригиналына караганда татаалыраак болот, анткени ал оригиналына караганда бир аз чоңураак болот, баштапкы кубга салыштырмалуу дагы эки түс бар (сары жана ак кошулган), түстөрдүн чексиз өлчөмдө айлануусу ж. LED чырактарын зымдар менен туташтыруу түшүнүгүн түшүнгөндөр үчүн LED чырактарын андан ары колдонуу боюнча практика үчүн жакшы долбоор болушу керек.

1 -кадам: материалдар

Материалдар
Материалдар
Материалдар
Материалдар

Бул Mood Cube жасоо үчүн керек болгон кээ бир материалдар:

  • Breadboard
  • Ардуино - (Менде Леонардо бар)
  • Arduino электр менен камсыздоо / USB кабели
  • Breadboard
  • Jumper Wires (Алардын көбү, мен 29 зым колдондум)
  • Кызыл LED x 2
  • Көк LED x 2
  • Жашыл LED x 2
  • Сары LED x 2
  • Ак LED x 1
  • 9 резистор
  • Куту нанга тактай турганчалык чоң (мен бут кийим кутучасын колдондум)
  • Бычак
  • Кагаз

2 -кадам: Код

Бул жерде берилген код үчүн кээ бир түшүндүрмөлөр:

Долбоордун редактору бул коддорду жараткандыктан, коддордун насыясы менин долбоорумдун баштапкы булагына түшөт. Мен кээ бирлерин татаалдаштыруу менен жакшырттым. Кээ бир коддордо сиз аягында // see көрө аласыз. Бул бул кодду мен түзөткөнүмдү билдирет, ошондуктан ал менин баштапкы булагымдан айырмаланат.

Менде дагы Arduino Creator боюнча коддун версиясы бар.

/* Кайчылаш өчүп бараткан 3 LED, кызыл, жашыл жана көк (RGB) коду Өчүрүү үчүн сиз эки нерсени жасашыңыз керек: 1. Көрсөтүлгүңүз келген түстөрдү сүрөттөңүз 2. Алардын өчүшүн каалаган тартипти тизмектеңиз.

ТҮСТҮ сүрөттөө:

Түс-бул үч пайыздык массив, 0-100, кызыл, жашыл жана көк диоддорду башкарат

Кызыл - толугу менен кызыл LED, көк жана жашыл өчүрүү

int red = {100, 0, 0} Дим ак - бул үч LED тең 30% int dimWhite = {30, 30, 30} ж.

Кээ бир жалпы түстөр төмөндө келтирилген, же өзүңүз жасаңыз

ЗАКАЗДЫ ТИЗҮҮ:

Программанын негизги бөлүгүндө түстөрдүн пайда болушун каалаган тартипти тизмектөө керек, мис. crossFade (кызыл); crossFade (жашыл); crossFade (көк);

Ал түстөр ошол тартипте пайда болуп, өчүп баратат

бир түс жана экинчисине

Мындан тышкары, сиз жөндөй турган 5 кошумча параметр бар:

1. Баштапкы түс кара болуп коюлган (ошондуктан биринчи түс өчөт), бирок сиз баштапкы түсүңүздү башка түстө коюуга болот 2. Ички цикл 1020 интерация үчүн иштейт; "күтүү" өзгөрмөсү бир кесилиштин болжолдуу узактыгын белгилейт. Теориялык жактан алганда, 10 мс болгон "күтүү" ~ 10 секундага созулушу керек. Иш жүзүндө, код башка функцияларды аткарып жатат, бул менин бортто ~ 11 секундга чейин жай. YMMV. 3. Эгерде "кайталоо" 0го коюлса, программа түбөлүккө айланат. эгер ал санга коюлса, ал ошончо ирет айланат, андан кийин катардагы акыркы түскө токтолот. ("Кайтарууну" 1ге коюңуз жана эгер анын аягында өчүп калышын кааласаңыз, акыркы түстү кара кылыңыз.) 4. Түс турганда "кармоо" миллисекундуна программаны өткөрүүчү кошумча "кармоо" өзгөрмөсү бар. толук, бирок кийинки түс башталганга чейин. 5. Эгерде сиз мүчүлүштүктөрдү оңдоону сериялык мониторго жөнөтүүнү кааласаңыз, DEBUG желегин 1ге коюңуз.

Программанын ички түзүлүшү татаал эмес, бирок алар

бир аз түйшүктүү - ички иштөө негизги укуруктун астында түшүндүрүлөт.

Апрель 2007, Клей Ширки

*

/ Output

int ylwPin = 5; // Сары LED, санарип пин 5ке туташкан // 改 int redPin = 6; // Кызыл LED, санарип пин 6га туташкан // 改 int grnPin = 7; // Жашыл LED, санарип пин 7ге туташкан // 改 int bluPin = 8; // Көк LED, санарип пин 8ге туташкан // 改 int whiPin = 9; // Ак LED, санарип пин 9га туташкан // 改 int ylwPin2 = 10; // Сары LED, санарип пинге туташкан 10 // 改 int redPin2 = 11; // Кызыл LED, санарип пинге туташкан 11 // 改 int grnPin2 = 12; // Жашыл LED, санарип пин 12ге туташкан // 改 int bluPin2 = 13; // Көк LED, санарип пинге туташкан 13 // 改

// Түстүү массивдер

int black [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // 改 int white [9] = {100, 100, 100, 100, 100, 100, 100, 100, 100}; // 改 int red [9] = {0, 0, 100, 0, 0, 0, 100, 0, 0}; // green int жашыл [9] = {0, 100, 0, 0, 0, 0, 0, 100, 0}; // 改 int blue [9] = {0, 0, 0, 100, 0, 0, 0, 0, 100}; // 改 int сары [9] = {100, 0, 0, 0, 0, 100, 0, 0, 0}; // кызгылт көк [9] = {0, 50, 0, 50, 0, 0, 50, 0, 50}; // orange int orange [9] = {50, 50, 0, 0, 0, 50, 50, 0, 0}; // pink int pink [9] = {0, 50, 0, 0, 50, 0, 0, 50, 0,}; // 改 // ж.б.

// Баштапкы түсүн коюу

int redVal = black [0]; int grnVal = кара [1]; int bluVal = black [2]; int ylwVal = кара [3]; // wh int whiVal = black [4]; // 改

int wait = 15; // 10ms ички crossFade кечигүүсү; жайыраак өчүү үчүн көбөйтүү // 改

int hold = 1; // Кошумча кармоо, түс бүткөндө, кийинки crossFadeге чейин // 改 int DEBUG = 1; // Мүчүлүштүктөрдү эсептөөчү; эгер 1 деп коюлса, маанилерди кайра катар int int loopCount = 60 аркылуу жазат; // DEBUG канча жолу отчет бериши керек? int repeat = 0; // Токтоодон мурун канча жолу айлануу керек? (0 токтобостон) // 改 int j = 0; // Кайталоо үчүн цикл эсептегичи

// Түс өзгөрмөлөрүн баштоо

int prevR = redVal; int prevG = grnVal; int prevB = bluVal; int prevY = ylwVal; int prevW = whiVal; // 改

// LED чыгууларын орнотуңуз

жараксыз орнотуу () {pinMode (redPin, OUTPUT); // казыктарды pinMode (grnPin, OUTPUT) катары белгилейт; pinMode (bluPin, OUTPUT); pinMode (ylwPin, OUTPUT); // 改 pinMode (whiPin, OUTPUT); // 改 pinMode (grnPin2, OUTPUT); // 改 pinMode (bluPin2, OUTPUT); // 改 pinMode (ylwPin2, OUTPUT); // 改 pinMode (redPin2, OUTPUT); // 改

if (DEBUG) {// Эгерде биз мүчүлүштүктөрдү оңдоо үчүн баалуулуктарды көргүбүз келсе…

Serial.begin (9600); //… сериялык чыгууну орнотуу}}

// Негизги программа: кроссфейддердин тартибин тизмектөө

void loop () {crossFade (red); crossFade (жашыл); crossFade (көк); crossFade (сары); crossFade (ак); crossFade (кызгылт); crossFade (кызгылт); crossFade (кызгылт сары);

if (кайталоо) {// Биз акыркы жолу цикл жасайбызбы?

j += 1; if (j> = repeat) {// Биз али барбызбы? чыгуу (j); // Андай болсо токтот. }}}

/* ТӨМӨНКҮ ТӨМӨНДӨГҮ МАТЕМА - МУНУ НЕГИЗДЕР ҮЧҮН ӨЗГӨРТҮҮНҮН КЕРЕКСИЗ

Программа мындай иштейт:

Кызыл диодду 0-10дон, жашылдан 0-5ке, көктү 10дон 7ге чейин он кадам менен жылдырган кроссфэйдди элестетиңиз. Биз 10 кадамды санап, түстүү баалуулуктарды бирдей кадам менен көбөйтүүнү же азайтууну каалайбыз. Элестетип көрүңүз, а + маанини 1ге жогорулатууну билдирет, а - аны төмөндөтүүгө барабар. Биздин 10 кадамдык өчүүбүз мындай болмок:

1 2 3 4 5 6 7 8 9 10

R + + + + + + + + + + G + + + + + B - - -

Кызыл он кадамда 0дон 10го чейин көтөрүлөт, жашылдан

0-5 5 кадамда, ал эми көк үч кадамда 10дон 7ге чейин түшөт.

Чыныгы программада түс пайыздары которулат

0-255 баалуулуктар, жана 1020 кадам бар (255*4).

Бир же бир ортосунда канчалык чоң кадам болушу керек экенин билүү үчүн

Светодиоддук көрсөткүчтөрдүн биринин ылдый жагын белгилеп, биз calcStep () деп атайбыз, ал башталыш жана аяктоо маанилеринин ортосундагы абсолюттук ажырымды эсептейт, андан кийин маанини жөнгө салуу ортосундагы кадамдын өлчөмүн аныктоо үчүн бул боштукту 1020га бөлөт. */

int calcStep (int prevValue, int endValue) {

int step = endValue - prevValue; // Жалпы ажырым эмнеде? if (step) {// Эгерде анын нөл эмес болсо, step = 1020 / step; // бөлүү 1020} кайтуу кадамы; }

/* Кийинки функция calcVal. Циклдин мааниси болгондо, мен, түстөрдүн бирине ылайыктуу кадамдын өлчөмүнө жетет, ал түстүн маанисин 1ге жогорулатат же азайтат (R, G жана B ар бири өзүнчө эсептелет.) */

int calcVal (int кадам, int val, int i) {

if ((кадам) && i % step == 0) {// Эгерде кадам нөл эмес болсо жана анын маанисин өзгөртүү убактысы, эгер (кадам> 0) {// кадам оң болсо, маанини жогорулатуу… val += 1; } else if (255 -кадам) {val = 255; } else if (val <0) {val = 0; } return val; }

/* crossFade () пайыздык түстөрдү ага айлантат

0-255 диапазону, андан кийин 1020 жолу цикл, маанини ар бир жолу жаңыртуу керекпи же жокпу, текшерип, түстүү баалуулуктарды туура казыктарга жазыңыз. */

жараксыз crossFade (int color ) {// 改

// 0-255ке айландыруу int R = (түс [0] * 255) / 100; int G = (түс [1] * 255) / 100; int B = (түс [2] * 255) / 100; int Y = (түс [3] * 255) / 100; // 改 int W = (түс [4] * 255) /100; // 改

int stepR = эсептөө кадамы (prevR, R);

int stepG = эсептөө кадамы (prevG, G); int stepB = эсептөө кадамы (prevB, B); int stepY = эсептөө кадамы (мурунку, Y); // step int stepW = calcStep (prevW, W); // 改

үчүн (int i = 0; i <= 1020; i ++) {redVal = calcVal (stepR, redVal, i); grnVal = calcVal (stepG, grnVal, i); bluVal = calcVal (stepB, bluVal, i); ylwVal = calcVal (stepY, ylwVal, i); // 改 whiVal = calcVal (stepW, whiVal, i); // 改

analogWrite (redPin, redVal); // LED казыктарына учурдагы маанилерди жазыңыз

analogWrite (grnPin, grnVal); analogWrite (bluPin, bluVal); analogWrite (ylwPin, ylwVal); // 改 analogWrite (whiPin, whiVal); // 改 analogWrite (grnPin2, grnVal); // 改 analogWrite (bluPin2, bluVal); // 改 analogWrite (ylwPin2, ylwVal); // 改 analogWrite (redPin2, redVal); // 改

кечиктирүү (күтүү); // Циклди улантуудан мурун "күтүү" миллисекундуна тыныгуу

if (DEBUG) {// Эгерде биз сериялык чыгарууну кааласак, аны

if (i == 0 же i % loopCount == 0) {// башталышы жана ар бир loopCount жолу Serial.print ("Loop/RGBYW: #"); Serial.print (i); Serial.print ("|"); Serial.print (redVal); Serial.print (" /"); Serial.print (grnVal); Serial.print (" /"); Serial.println (bluVal); Serial.print (" /"); Serial.println (ylwVal); // 改 Serial.print (" /"); // 改 Serial.println (whiVal); // 改 Serial.print (" /"); // 改} DEBUG += 1; }} // Кийинки цикл үчүн учурдагы маанилерди жаңыртуу prevR = redVal; prevG = grnVal; prevB = bluVal; prevY = ylwVal; // 改 prevW = whiVal; // 改 кармоо (кармоо); // Циклди улантуудан мурун кошумча "күтүү" миллисекундуна тыныгуу}

3 -кадам: Орнотуу

Жайгашуу
Жайгашуу
Жайгашуу
Жайгашуу
Жайгашуу
Жайгашуу
  1. Нанды алыңыз.
  2. LED жарыгы жаркырап турушу үчүн зымдарды туташтыруу демосу:

    1. Жарык диодун панелдин үстүнө коюңуз. Узун учун солго, кыска учун оң жагына коюңуз.
    2. Өткөөл зымдын бир учун LEDдин узун учу менен бир катарда турган жерге коюңуз. Башка учун Digital PWM бөлүмүнө коюңуз. Коддо сары диоддор 10 жана 5ке, кызыл түстөр 6 жана 11ге, көк түстөр 8 жана 13кө, жашылдар 7 жана 12ге, акырында ак LED 9га туташтырылган.
    3. Резистордун бир учун LEDдин учу кыска болгон ошол эле катарга коюңуз. Экинчи башын жакын жерге коюңуз.
    4. Светодиоддун кыска учу менен бир катарда эмес, резистордун учу менен бир катардагы башка секирүүчү зымдын учун коюңуз. Зымдын экинчи учун терс заряд катарына коюңуз.
    5. Терс заряддын катарына дагы бир секирүүчү зымдын учун коюп, анын экинчи учун GNDге коюңуз.
  3. 2 -кадамды 8 жолу кайталаңыз, анткени сиз 9 LEDдин жаркырашын каалайсыз
  4. Нан тактасын кутунун ичине коюңуз. Бул жерде бир нече эскертүүлөр:

    1. Мен электр булагын колдондум. Коробкадан өтүп, нан тактасына туташуу үчүн пайдалуу бычактын жардамы менен зымдарыңыз үчүн кичинекей тешик түзүңүз.
    2. Кутунун бир жагы ачык экенин текшериңиз. Бут кийим кутусунун ачык бир жагы бар. Эгерде кутуча толугу менен жабылган болсо, анда боштукту ачуу үчүн кутунун бир тарабын кесип салыңыз.
    3. Капталын эч нерсе менен кагаз менен жаап коюңуз. Бул LED жарыктары кагаз аркылуу жаркыраш үчүн.

Сунушталууда: