Make-up für Cyber-Aschenputtel. Arduino Wochenendprojekt. Led Wimpern

Bild

Zum ersten Mal wurden LED-Wimpern von Designer Tien Pham auf der Maker Faire in San Francisco gezeigt. Das war vor zwei Jahren. Nun, und fast sofort in der Alibaba-Höhle begannen die chinesischen Räuber, Analoga für 400 oder sogar 300 Rubel zu verteilen.

In den Bildern sind dies zwei dünne Leiterplatten mit zwölf LEDs, die über dünne Kabel mit einer Batterie mit der Steuerplatine verbunden sind. Leuchtende Wimpern werden mit Spezialkleber über normal oder falsch angebracht, und der Controller und die Batterie sind im Haar versteckt. Technisch auf den ersten Blick nichts kompliziertes. Aber! Wenn Sie sich das Wimpernbrett genau ansehen, befinden sich 12 LEDs und nur drei Drähte in der Schleife. Gleichzeitig leuchten oder blinken die LEDs nicht nur, sondern funktionieren auch wie Lauflichter. Ich fragte mich einen halben Tag, wie sie es machten. Eine Reihe von Werbespots überarbeitet. In Zeitlupe stellte sich heraus, dass LEDs paarweise einen Effekt erzielen. Das heißt, die Aufgabe wurde sofort eingegrenzt, um sechs LEDs auf drei Drähten zu steuern. Aber trotzdem drei! Sechs in drei! Noch einmal - sechs zu drei. Und mehr ... Dann wiederholte er es noch einmal und die Antwort tauchte irgendwie von selbst auf. Hier ist es - die Anzahl aller Permutationen der drei Elemente beträgt 6!

Es stellt sich heraus, dass der Mikrocontroller drei Signale in einer Schleife sortiert hat, die aus drei Leitern besteht: Null, Eins und der dritte Zustand. Wir erhalten sechs Kombinationen / Permutationen, was bedeutet, dass bei jeder der Permutationen eine der sechs LEDs leuchtet. Wenn sie in diesem Schema enthalten sind:



Leuchten Sie beispielsweise die D2-LED auf. Auf A-Null, auf B - der dritte Zustand, auf C-Einheit. Nur die D2 LED leuchtet!

Nun weiter. Null und Eins an den Ausgängen des Mikrocontrollers ist einfach. Und der dritte Staat? Noch einfacher. Stellen Sie den Eingabemodus ein. Jetzt ist der hochohmige Eingang, der weder auf Null noch auf Eins gezogen wird, praktisch vom Steuerkreis getrennt.

Als nächstes folgt der Code, der die Ausgänge des Mikrocontrollers dynamisch steuert und eine beliebige Anzahl von LEDs einschaltet. Wir machen Lauflichter, blinken, funkeln, löschen am Ende.
Unten finden Sie den Code für den Arduino mit mehreren Effekten für zwei Wimpern mit jeweils sechs LED-Gruppen.

Wir öffnen und schauen
#include <PinChangeInt.h> #define LEFT_PIN_1 2 #define LEFT_PIN_2 3 #define LEFT_PIN_3 4 #define RIGHT_PIN_1 5 #define RIGHT_PIN_2 6 #define RIGHT_PIN_3 7 #define KEY_PIN 8 #define EFFECT_0 0 #define EFFECT_1 1 #define EFFECT_2 2 #define EFFECT_3 3 #define EFFECT_4 4 #define EFFECT_5 5 #define EFFECT_6 6 #define EFFECT_7 7 #define EFFECT_LAST EFFECT_7 uint8_t EffectCnt = 0; void setup() { pinMode(LEFT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, OUTPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); pinMode(RIGHT_PIN_3, OUTPUT); pinMode(KEY_PIN, INPUT); digitalWrite(KEY_PIN, HIGH); PCintPort::attachInterrupt(KEY_PIN, &Key_ISR, FALLING); } //------------------------------------------------------ void loop() { void (*EFFECTS[])(void) = { Lashes_0, Lashes_1, Lashes_2, Lashes_3, Lashes_4, Lashes_5, Lashes_6, Lashes_7, }; (*EFFECTS[EffectCnt])();//EffectCnt delay(100); Lashes_Off(); while(!digitalRead(KEY_PIN)); delay(300); PCintPort::attachInterrupt(KEY_PIN, &Key_ISR, FALLING); } //------------------------------------------------------ void Lashes_0() { const uint16_t ViewDelay = 5; while(EffectCnt == EFFECT_0) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); } } //------------------------------------------------------ void Lashes_1() { const uint16_t ViewDelay = 5; const uint8_t LashesON = 27; const uint16_t PauseDelay = ViewDelay * LashesON * 3; while(EffectCnt == EFFECT_1) { for (uint8_t i = 0; i < LashesON; i++) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); } Lashes_Off(); delay(PauseDelay); } } //------------------------------------------------------ void Lashes_2() { const uint16_t ViewDelay = 5; const uint8_t LashesON = 17; while(EffectCnt == EFFECT_2) { for (uint8_t i = 0; i < LashesON; i++) { digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); } Lashes_Off(); for (uint8_t i = 0; i < LashesON; i++) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); delay(ViewDelay); } Lashes_Off(); } } //------------------------------------------------------ void Lashes_3() { const uint16_t ViewDelay = 70; pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_2, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_3, OUTPUT); while(EffectCnt == EFFECT_3) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(RIGHT_PIN_1, INPUT); pinMode(LEFT_PIN_2, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); pinMode(LEFT_PIN_3, INPUT); pinMode(RIGHT_PIN_3, INPUT); pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_2, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); //  delay(ViewDelay); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_2, LOW); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(RIGHT_PIN_1, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_3, OUTPUT); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_2, INPUT); pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); } } //------------------------------------------------------ void Lashes_4() { const uint16_t ViewDelay = 30; randomSeed(analogRead(0)); while(EffectCnt == EFFECT_4) { uint8_t randNumber = random(0, 7); switch(randNumber) { case 0: digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, HIGH); break; case 1: digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); break; case 2: digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, HIGH); break; case 3: digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); break; case 4: digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, HIGH); break; case 5: digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); break; } delay(ViewDelay); Lashes_Off(); } } //------------------------------------------------------ void Lashes_5() { const uint8_t DelayMin = 1; const uint8_t DelayMax = 25; const uint8_t LashesON = 6; int8_t DelayVal = DelayMin; bool Direction = false; while(EffectCnt == EFFECT_5) { for (uint8_t i = 0; i < LashesON; i++) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(DelayVal); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(DelayVal); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(DelayVal); } if (!Direction) { DelayVal++; if (DelayVal == DelayMax + 1) { DelayVal = DelayMax - 1; Direction = true; } } else { DelayVal--; if (DelayVal == DelayMin - 1) { DelayVal = DelayMin + 1; Direction = false; } } } } //------------------------------------------------------ void Lashes_6() { const uint16_t ViewDelay = 5; const uint8_t LashesON_RED = 45; const uint8_t LashesON_RED_BLUE = LashesON_RED; pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_2, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_3, OUTPUT); for (uint8_t i = 0; i < LashesON_RED; i++) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); } for (uint8_t i = 0; i < LashesON_RED_BLUE; i++) { pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_2, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_3, OUTPUT); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(RIGHT_PIN_1, INPUT); pinMode(LEFT_PIN_2, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); } pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); while(EffectCnt == EFFECT_6) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); } } //------------------------------------------------------ void Lashes_7() { const uint16_t ViewDelay = 70; pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_3, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); while(EffectCnt == EFFECT_7) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_2, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(LEFT_PIN_2, OUTPUT); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); pinMode(RIGHT_PIN_1, INPUT); pinMode(RIGHT_PIN_3, OUTPUT); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); pinMode(LEFT_PIN_3, INPUT); pinMode(RIGHT_PIN_2, INPUT); pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); //  delay(ViewDelay); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(RIGHT_PIN_1, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_2, LOW); delay(ViewDelay); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_3, INPUT); pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, HIGH); } } //---------------------------------------- void Key_ISR() { EffectCnt++; if (EffectCnt > EFFECT_LAST) EffectCnt = EFFECT_0; PCintPort::detachInterrupt(KEY_PIN); } //---------------------------------------- void Lashes_Off() { pinMode(LEFT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, OUTPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); pinMode(RIGHT_PIN_3, OUTPUT); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, LOW); } 


Und dieses Mädchen Veronica zeigt diese Effekte.


Wahrscheinlich ist diese Verwaltungsmethode für einige Leute schon lange bekannt und Sie verwenden sie bereits. Aber trotzdem wollte ich wirklich teilen. Arduins sollten es mögen!

Source: https://habr.com/ru/post/de414237/


All Articles