Étape 5: L’electonics
Je ne pouvais pas résister à ajouter un peu de tech au lit, j’ai donc installé des bandes de RVB de led et un twinking étoiles champ/glow-worms sur le dessous de la couchette.
Les bandes de led ont été faciles. J’ai opté pour un régulateur fixe hors ebay, comme le montre la photo, que j’ai su qu'une télécommande aurait disparaissent après quelques jours. J’ai mis une bande dans le lit du haut et en dessous un autre pour la lecture.
Le plafond d’étoile a pris un peu d’effort... J’ai adapté ce code (http://playground.arduino.cc/Main/AnalogAndDigital...) pour utiliser les 6 sorties pwm d’un arduino mini. Mon code est ci-dessous (n’hésitez pas à me faire savoir que si vous avez des suggestions, je suis encore à apprendre arduino).
J’ai ajouté un interrupteur et un potentiomètre pour régler la luminosité de la LED dans une petite boîte de contrôle sous la couchette. J’ai câblées ensemble des grappes de 6 LEDs pour chaque sortie PWM de l’arduino et ajouté une résistance d’ohm 1 k à chaque conduit à maintenir le courant vers le bas (ils n’a pas à être tout ce que lumineuse) et s’assurer que tous les voyants ne seraient pas surcharger l’arduino. Je me suis caché tout le désordre de câblage par qui s’étend d’une feuille de polyester noir sur le dessous de la couchette et fixez-la en place avec petits morceaux de moulure de pin. Les LEDs brillent bien à travers le tissu, vous pouvez le voir genre de dans les photos ci-joint.
#define MAX_FIREFLIES_ON 6
int PotPin = A0 ; ** analogique connecté à pot fondu d’int = 0 ;
Modifier ces valeurs pour déterminer combien de temps les séjours LED OFF et combien de temps il restera allumé pour les lucioles analogiques. Ces valeurs sont en millisecondes fois 10 (c'est-à-dire 27 = 270 millisecondes). #define ANALOG_MIN_OFF 41 #define ANALOG_MAX_OFF 300 #define ANALOG_MIN_ON 50 #define ANALOG_MAX_ON 200
Modifier ces valeurs pour déterminer combien de temps les séjours LED OFF et combien de temps il restera allumé pour les lucioles numérique. Ces valeurs sont en millisecondes. #define DIGITAL_MIN_OFF 4410 #define DIGITAL_MAX_OFF 30000 #define DIGITAL_MIN_ON 210 #define DIGITAL_MAX_ON 2100
Le nombre de niveaux de fondu avant que le voyant est éteint avec un PWM numérique. Meilleur à ne pas changer ces #define DIGITAL_FADE_INTERVAL 20 #define DIGITAL_FADE_WAIT 20
Utilisé pour indiquer les 4 États, nous pouvons être po typedef enum {FADEUP, ON, FADEDOWN, OFF} FireflyState ;
typedef struct FireFlyStruct {broche octet ; //PWM broches de sortie sont 3,5,6,9,10 et 11 FireflyState État ; //used pour déterminer ce que la LED d’État est dans, la décoloration jusqu'à/vers le bas ou actif/inactif valeur de type long non signé ; //used que la valeur actuelle de LED
Durée d’int des valeurs analogique ; spécifie combien de temps la led sera marche/arrêt
Numérique des valeurs non signées longtemps ; Utilisé pour les calculs de temps pour voir si il est temps de changer la bascule booléenne État ; Utilisé pour l’activation/désactivation de la LED sur/off avec PWM unsigned long fondu ; utilisé pour calculer combien de temps le voyant lumineux marche/arrêt pour PWM pendant un fondu vers le haut/bas unsigned long fadeWait ; utilisé pour augmenter le temps qu’il faut pour se faner donc ça dure juste un peu plus. } Firefly ;
UNO R3 - 14 broches int analogPins [] = {3, 5, 6, 9, 10, 11} ; int allPins [] = {3, 5, 6, 9, 10, 11} ;
Firefly fireflies[sizeof(allPins)/sizeof(*allPins)] ;
Utilisée pour déterminer si le NIP actuel est un analogue ou une broche numérique. Boolean isAnalog (int NIP) {int longueur = sizeof(analogPins)/sizeof(*analogPins) ; pour (int i = 0; j’ai
À la fin de cette fonction, tous les lucioles seront le programme d’installation //with les données dont ils ont besoin afin de fonctionner correctement. Nous passons également sur les lucioles MAX_FIREFLIES_ON d’abord à nous. void initialize() {pour (int i = 0; j’ai < (sizeof(fireflies)/sizeof(Firefly)); i ++) {//Why je suis en utilisant cette notation de pointeur de prendre l’adresse de l’objet //and puis la référence à elle ? C’était pour montrer à quelqu'un comment faire. Si cela vous dérange, remplacez toutes les occurrences de « ff ->"avec « les lucioles [i]. » et //it se déroulera le même. Firefly * ff = & lucioles [i] ; FF -> code pin = allPins [i] ; Si (j’ai < MAX_FIREFLIES_ON) ff -> état = ON ; sinon ff -> État = OFF ; FF -> valeur = 0 ;
Ff de valeurs analogique -> durée = 0 ;
Ff de valeurs numérique -> temps = 0 ; FF -> Activer/désactiver = true ; FF -> fondu = 0 ; FF -> fadeWait = 0 ;
Si (j’ai < MAX_FIREFLIES_ON) {si (isAnalog (ff -> code pin) == true) ff -> durée = random (ANALOG_MIN_ON, ANALOG_MAX_ON); sinon ff -> valeur = millis() + aléatoire (DIGITAL_MIN_ON, DIGITAL_MAX_ON);} else {si (isAnalog (ff -> code pin) == true) ff -> durée = random (ANALOG_MIN_OFF, ANALOG_MAX_OFF); sinon ff -> valeur = ff -> heure + aléatoire (DIGITAL_MIN_OFF DIGITAL_MAX_OFF) ; } } }
Déterminer combien de LED actuellement sur et si c’est égal à MAX_FIREFLIES_ON, retourner la valeur true. Boolean isMaxFireflies() {ValeurRet booléen = false ; int cnt = 0; pour (int j’ai = 0; j’ai < (sizeof(fireflies)/sizeof(Firefly)); i ++) {Firefly * ff = & lucioles [i]; if (ff -> État! = OFF) cnt ++;} si (cnt > = MAX_FIREFLIES_ON) {ValeurRet = true;} return ValeurRet;}
Utilisé pour notre retard de 10 ms pour analog. unsigned long analogDelayTime = 0 ;
/ * NOTE de lucioles analogique: (il y a un retard de 10 ms sur toutes les lucioles analogiques).
Il y a 4 États en que lucioles peuvent être. ON = garde la LED sur jusqu'à ce que le compteur atteigne la durée définie pour sur. OFF = garde la LED éteint jusqu'à ce que le compteur atteigne la durée définie pour sur. FADEUP = au cours de 500ms, changer les LED luminosité sur 51 fois FADEDOWN = au cours de 500ms, changer les LED luminosité environ 51 fois
Quand la luciole a fini c' est FADEUP, il déterminera une durée aléatoire pendant combien de temps garder le LED sur. De même, FADEDOWN détermine une durée aléatoire pendant combien de temps pour éloigner le LED.
Si une LED est prête à être mis en marche (FADEUP), nous vérifions pour voir si nous arrivons à MAX_FIREFLIES_ON. Si nous avons, alors nous définir si le LED à l’État OFF et lui dire d’attendre encore une fois sans allumer. * / void analogFireflies() {}
Mettre un retard de 10ms sur l’ensemble des commandes analogiques. Si (millis ()-analogDelayTime < 50) return ; analogDelayTime = millis() ;
Parcourir tous les lucioles analogiques pour (int i = 0; j’ai < (sizeof(fireflies)/sizeof(Firefly)); i ++) {Firefly * ff = & lucioles [i] ;
Si (isAnalog (ff -> code pin) == false) continuer ;
Si (ff -> état == ON) {/ / Pin sur analogWrite (ff -> broche, fondu) ;
FF -> valeur += 1 ; Si (ff -> value == ff -> durée) {ff -> Etat = FADEDOWN; ff -> value = fondu;}} ElseIf (ff -> État == OFF) {/ / Pin Off analogWrite (ff -> pin, 0) ;
FF -> valeur += 1 ; Si (ff -> valeur == ff -> durée) {si (isMaxFireflies()) {ff -> valeur = 0; ff -> État = OFF; ff -> durée = random (ANALOG_MIN_OFF, ANALOG_MAX_OFF);} else {ff -> Etat = FADEUP; ff -> valeur = 0;}}} ElseIf (ff -> État == FADEUP) {/ / Pin Fade Up ff -> valeur += 1; //previously 5 analogWrite (ff -> broche, ff -> valeur) ;
Si (ff -> value == fondu) {ff -> valeur = 0; ff -> état = ON; ff -> durée = random (ANALOG_MIN_ON, ANALOG_MAX_ON);}} ElseIf (ff -> État == FADEDOWN) {/ / Pin Fade Down ff -> valeur-=1 ; //previously 5 analogWrite (ff -> broche, ff -> valeur) ;
Si (ff -> value == 0) {ff -> valeur = 0; ff -> État = OFF; ff -> durée = random (ANALOG_MIN_OFF, ANALOG_MAX_OFF);}} } }
//----------------------------------------------------------------------------------------------------
void turnLedOn (int NIP) {}
Si (isAnalog(pin) == true) analogWrite (broches, 255) ; } void turnLedOff (int NIP) {}
Si (isAnalog(pin) == true) analogWrite (broches, 0) ; }
Parcourt toutes les broches (analogiques et numériques) et eux se met en marche (jusqu'à MAX_FIREFLIES_ON). Nous permet une chance de s’assurer que toutes les LED sont connectées et réinitialisation de travail avant que le programme démarre //and lorsque nous sommes sur l’arduino. void caterpillar() {int allcount = (sizeof(allPins)/sizeof(*allPins)) ;
pour (int i = allcount-1; j’ai > = 0; i--) {si (j’ai < allcount-MAX_FIREFLIES_ON) turnLedOff(allPins[MAX_FIREFLIES_ON+i]) ; turnLedOn(allPins[i]) ; delay(250);}
pour (int i = MAX_FIREFLIES_ON-1; i > = 0; i--) {turnLedOff(allPins[i]) ; delay(250);}}
void setup() {//Set toutes les broches numériques de sortie pinMode (entrée, PotPin) ; Serial.Begin(9600) ; pour (int i = 0; j’ai < (sizeof(allPins)/sizeof(*allPins)); i ++) {/ / if (isAnalog(i) == false) / / pinMode (i, sortie); / /}
Caterpillar() ; Initialize() ; }
void loop() {fondu = map(analogRead(PotPin), 0, 1023, 1, 255); / / fade = 255 ; Serial.println(fade) ; analogFireflies() ; }