Simulateur d’aube LED bleu pour alarme soleil Soleil (9 / 11 étapes)

Étape 9: Programme microcontrôleur

Le code et le makefile sont rédigés pour travailler avec avr-gcc. Brièvement, il calcule le facteur de marche de l’horloge, calcule le niveau désiré de contrôle LED et crache un signal PWM. Il y a quelques avec une moyenne des valeurs d’entrée et de sortie pour réduire les indésirable clignotement de la LED (comme quand ils commencent tout juste un lever de soleil). Essentiellement, le microcontrôleur agit comme un filtre non linéaire de PWM.

Code: (Télécharger le fichier .c plutôt que de couper et de coller ce texte ; il y a quelques problèmes de formatage avec la syntaxe)

 /* LED microcontroller dimmer for use with Soleil Sun AlarmWritten for Atmel ATMega8 and avr-gccEric J. WilhelmSquid Labs, LLCAttribution-NonCommercial-ShareAlike 2.5You are free: * to copy, distribute, display, and perform the work * to make derivative worksUnder the following conditions:by Attribution. You must attribute the work in the manner specified by the author or licensor.Noncommercial. You may not use this work for commercial purposes.Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one. * For any reuse or distribution, you must make clear to others the license terms of this work. * Any of these conditions can be waived if you get permission from the copyright holder.*/#include <inttypes.h>#include <avr/io.h>#include <avr/interrupt.h>#include <avr/signal.h>#include <math.h># define OC1 PB1# define DDROC DDRB# define OCR OCR1Avolatile uint16_t xtimer;volatile uint16_t timer0;volatile uint8_t status;SIGNAL(SIG_OVERFLOW0){ timer0++; TCNT0=96; // preload the timer with 96 to make this interrupt occur every 20 us.}SIGNAL(SIG_OVERFLOW1){ //The interrupts don't work properly without this definition.}// falling edge PWM signal (rising edge at clock; reversed due to optoisolator)SIGNAL(SIG_INTERRUPT1) { // Zero timer0 to count the length of the positive pulse timer0=0; status=1;}//rising edge PWM signal (falling edge at clock; reversed due to optoisolator)SIGNAL(SIG_INTERRUPT0) { //record the length of the positive pwm signal in xtimer // if timer0 is greater than approximately 263 (at 20 us per interrupt) than the pulse was missed if(timer0<270) xtimer=timer0; status=0;}voidioinit (void){ // Timer1 does ~16-bit PWM TCCR1A = _BV (COM1B1) | _BV (WGM11) | _BV (COM1A1); TCCR1B = _BV (WGM13) | _BV (WGM12) | _BV (CS10); ICR1 = 65535; //Timer0 counts TCCR0 = _BV (CS00); TCNT0 = 96; timer0=0; // set PWM value to 0 OCR = 0; //enable OC1 as output DDROC = _BV (OC1); //enable external interrupts GICR = _BV (INT1) | _BV (INT0); //INT0 is rising edge, INT1 is falling edge MCUCR = _BV (ISC01) | _BV (ISC00) | _BV(ISC11); xtimer=0; status=0; //enable timers timer_enable_int (_BV (TOIE1) | _BV (TOIE0) ); // enable interrupts sei ();}intmain (void){ #define B -0.00325 #define C -11.09 #define D 0.396503 int i,on=0, oncounter=0; unsigned int x(100), y; long t(100), u; ioinit (); for (;;) { //average xtimer over samples because it jumps around alot for(i=99;i>0;i--) { x(i) = x(i-1); } x(0) = xtimer; y=0; for(i=0;i<100;i++) { y = y+x(i); } y=y/100; //divide by 5 because the clock has 120 us resolution on its PWM y=y/5; // average the output so it doesn't jump around for(i=99;i>0;i--) { t(i) = t(i-1); } //determine what to do if(timer0>270 && status == 1 && on == 1) { //Turn light on t(0) = 0; on=1; } else if(timer0>270 && status == 0) { //Turn light off t(0) = 65535; xtimer=0; on=0; oncounter=0; } else if(timer0<270){ t(0) = 65535*(1-exp((B*y + D)*y + C)); if(t(0)>65535) t(0) = 65535; if(t(0)<0) t(0) = 0; } //oncounter prevents the light from turning on suddenly from an off state if timer0>270, but there's a positive pulse on the PWM //this happens during the very start of a sunrise, when the clock's PWM hasn't quite turned on at the right frequency else if(timer0>270 && status == 1) { if(++oncounter==5) { on = 1; oncounter=0; } } // average the output so it doesn't jump around u=0; for(i=0;i<100;i++) { u=u+t(i); } //Change the output PWM OCR = u/100; } return (0);} 

Articles Liés

Boîte à lumière LED bleue

Boîte à lumière LED bleue

construire votre propre boite à lumière LED bleue au combat SAD et blues de l'hiver. Mieux dormir et se réveiller avec plus d'énergie tout en explorant le monde des LEDs de haute puissance. Si 18 watts de puissance de LED n'est pas suffisant pour vou
Arduino contrôlée RGB LED strip pour le salon

Arduino contrôlée RGB LED strip pour le salon

L'idée derrière ce petit projet était d'avoir une lumière d'ambiance assez indirecte dans le salon. Elle est contrôlée par le serveur openHAB (ce projet est toujours sur la liste à ajouter à ce site) installé sur une facture pro forma de framboise. B
Comment construire un canal 5 simulateur de bougie LED flamme sans

Comment construire un canal 5 simulateur de bougie LED flamme sans

ce Instructable explique comment construire et modifier un pilote Bougie LED 5 canal « flamme-moins ».Notre hackerspace « The Rabbit Hole » est d'avoir une citrouille découpant la nuit et nous avons voulu essayer quelque chose de différent à la lumiè
En utilisant une LED RGB pour détecter les couleurs

En utilisant une LED RGB pour détecter les couleurs

je vais vous montrer comment vous pouvez utiliser une LED RVB et une cellule photoélectrique de CD comme un capteur de couleur pour un micro-contrôleur. Je vais illustrer la méthode pour récupérer une couleur à l'aide d'Arduino, et je vais vous montr
La souris LED bleue

La souris LED bleue

fatigué de cette lumière rouge standard sous votre souris ? Commuter dehors !tout ce dont vous avez besoin est un fer à souder (et préférence un fer à dessouder ainsi), un multimètre et la couleur led vous voulez (et éventuellement une résistance).J'
Système de LED interactif pour tout-petits (en cours)

Système de LED interactif pour tout-petits (en cours)

Je travaille sur deux projets en parallèle et je veux organiser ce que j'ai sur ce projet avant de commencer à documenter l'autre projet.Système de LED interactif pour tout-petits (en cours)Estimé : toutes les 50 %.Lorsque vous avez terminé la volont
Faire une lampe de LED bleu fantaisie (par Brad Justinen)

Faire une lampe de LED bleu fantaisie (par Brad Justinen)

faire une fantaisie bleu LED lampe de goutte d'eau sur un morceau de 2 x 4, certains acrylique plexiglass et quelques LEDs bleues.Voici une liste des outils que j'ai utilisé, vous pouvez être en mesure de s'en tirer à l'aide de moins :-Scie à chantou
FanBus numérique ventilateur et LED Interface pour PC

FanBus numérique ventilateur et LED Interface pour PC

l'année dernière, j'ai modifié un ventilateur LED bleu avec LED RGB pour améliorer l'aspect de mon cas de serveur.  L'été dernier, j'ai construit un ordinateur de jeu et depuis que j'ai voulu l'éclaire avec multiple contrôlée s'allume et les fans.  J
Transilluminateur de LED bleu

Transilluminateur de LED bleu

cette instructable décrit comment faire un Transilluminateur LED (470nm) bleu pour l'imagerie d'ADN à l'aide de colorants sûrs SYBR. Le transilluminateur a un 6 x 7 cm zone pour les gels d'agarose petit de visualisation.Le transilluminateur peut égal
Mini projecteur LED DIY pour les modèles d’illumination

Mini projecteur LED DIY pour les modèles d’illumination

Comment construire un mini-projecteur LED de 5mm et faire un spectacle de lumière sur un modèleComment construire un mini projecteur à LED 5mm et faire un spectacle de lumière sur une maquetteMatériel :tube électrique PVC diamètre 16 mm tuyau de cond
Plafonnier a déclenché l’éclairage LED collecteur pour un 2010 Honda Fit

Plafonnier a déclenché l’éclairage LED collecteur pour un 2010 Honda Fit

Cette instructable détaille l'installation de rouge-vert-bleu (RVB) LED collecteur d'éclairage dans un 2010 Honda Fit. Pour ce type d'application, contrôleurs et kits de RVB LED sont facilement disponibles à l'achat sur des sites comme amazon.com. J'
Modifier un kit LED RGB pour alimenter des LEDs plus

Modifier un kit LED RGB pour alimenter des LEDs plus

La réponse est: « Oui » et « Non ».C'est en effet possible de modifier un kit LED RGB pour accueillir une plus longue longueur de bande de RVB. Cependant, il existe deux types de limites :(a) la limitation de l'alimentation électrique se trouvant à l
BRICOLAGE | 3 x 3 x 3 LED Cube pour Arduino Nano +

BRICOLAGE | 3 x 3 x 3 LED Cube pour Arduino Nano +

Salut tout le monde !Mon nom est RGBFreak et j'ai créé une chaîne YouTube tout récemment.J'aime le bricolage et j'aime surtout le LED, c'est pourquoi j'ai décidé de faire mon propre 3 x 3 x 3 LED Cube !Vous aurez besoin des éléments suivants pour fai
Meilleur LED RGB pour n’importe quel projet (WS2812, aka NeoPixels)

Meilleur LED RGB pour n’importe quel projet (WS2812, aka NeoPixels)

Quand nous travaillons en collaboration avec LEDs, nous aimons souvent contrôler leur état (marche/arrêt), la luminosité et la couleur. Il y a beaucoup, beaucoup de différentes façons d'aller à ce sujet, mais aucun n'est qu'une solution comme la WS28