User Tools

Site Tools


minuteur_intelligent

Introduction

FIXME: Bientôt une nouvelle version sans transformateur mais avec un alim à base de condo.

Le but de ce minuteur intelligent est principalement d'économiser de l'énergie. En gros, quand vous allumez la lumière, ce super minuteur 1) l'éteindra automatiquement au bout d'un nombre de minutes que vous définirez. Aussi, couplé à un dispositif de distinction jour/nuit comme un périphérique 1-wire), il permet d'avoir deux temps d'extinction différents. En gros, le minuteur a les fonctions suivantes:

  • Permet d'allumer une lumière comme un interrupteur classique
  • Supporte jusqu'à 4 interrupteurs (2 * 2 en mode navette)
  • Supporte deux temps d'extinction différents

J'ai divisé le minuteur en trois parties:

  • Partie d'approvisionnement en courant: un bête transfo 12V 200mA
  • Partie logique: Un 7805 (et ses condos) couplé à un Attiny13 ainsi que deux leds (Power ON et Lumière ON)
  • Partie de puissance: un optotriac (MOC3041) et un triac (BTB12)

Partie logique

Comme dit plus haut, la partie logique est composée par un 7805 (ainsi que deux condos de filtrage de 1µF). Ce régulateur est connecté à l'µC ainsi qu'aux interrupteurs.
Le microcontroleur est connecté aux prises ainsi qu'à l'interface de puissance. Je n'ai malheureusement pas fait de schéma du fait qu'il est très facile à réaliser et que tout à été fait en improvisation.
Voici une photo de l'interface logique:


De gauche à droite, les câbles noirs correspondent respectivement à: +5V pour les interrupteurs, +12V (au transfo), 0V (au transfo).
Le groupe de câbles à droite correspond au cables pour les deux interrupteurs et à un qui permet une extinction forcée de la lampe.
Le groupe de câbles gris à gauche correspond aux câbles d'allumage de l'optotriac et au câble de détection de nuit.

Voici une photo de la partie logique dans sa boite avec le transfo: \\

Partie puissance

La partie puissance est composée par un opto-triac (un MOC3041) qui s'occupe d'isoler galvaniquement la partie puissance (230VAC) de la partie logique (5VDC). L'autre partie de cet opto-triac est connectée à un BTB12: un triac de puissance pouvant débiter 12A.
Vous pouvez voir un schéma de connexion de cette partie de puissance ici: charges_resistives_microcontroleur
Voici une photo de cette partie de puissance:

Le montage

Une fois monté, ça donne ça:
Voici un schéma de branchement très sommaire:
Et on teste:

Installation

On va installer le minuteur dans le grenier pour qu'il puisse contrôler la lumière du hall.
Premièrement, on ouvre la boite de jonction (et on découvre aussi le joyeux bordel qui règne à l'intérieur):
On sépare les cables qui nous intéressent:
Et on installe finalement le minuteur:

Le code source

/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <frank[ASCII:64]villaro-dixon.eu> wrote this file. As long as you retain this
 * notice, you can do whatever you want with this stuff. If we meet some day,
 * and you think this stuff is worth it, you can buy me a beer in return.
 * Frank Villaro-Dixon
 * ----------------------------------------------------------------------------
 */
 
/*
 * ----------------------------------------------------------------------------
 * MINI PROGRAMMATEUR DE LUMIÈRE INTELLIGENT - V1.0
 * Ce programme permet d'allumer une lumière (un output) à partir d'un->4
 * interrupteurs. Il supporte un deadtime, un mode jour/nuit et une extinction
 * forcée. Fonctionne bien sous un Attiny13A couplé à un MOC3041 pour la partie
 * puissance.
 * http://wiki.villaro-dixon.eu
 * ----------------------------------------------------------------------------
 */
 
#include <avr/io.h>
#include <util/delay.h>
#define _BV(bit) (1 << (bit))
 
#define INTER1  PB0 //E - Interrupteur 1.
#define INTER2  PB1 //E - Interrupteur 2.
#define GO_OFF  PB2 //E - Extinction forcée.
#define NUIT    PB3 //E - Pour dire à l'µC si on est le jour ou la nuit. NUIT < JOUR. Si NUIT est On, alors on est dans la nuit
#define LAMPE   PB4 //S - La sortie vers l'optotriac qui va commander la lampe (pas de PWM [ampoules écolo]).
 
//Un cycle de boucle dure +- 4.46 x 10^-5 sec.
 
#define TEMPS_JOUR 20179372 //15min - En cycles de boucle pour le jour
#define TEMPS_NUIT 13452914 //10min - Idem pour la nuit
 
//#define TEMPS_JOUR 2017900
//#define TEMPS_NUIT 1345200
 
void allumer(int port)
{
    PORTB |= 1<<port;
    asm("NOP");
}
 
void eteindre(int port)
{
    PORTB &= ~(1<<port);
    asm("NOP");
}
 
int main(void)
{
 
    /*LES I/O */
    DDRB |= 1<<LAMPE; //EN S
 
    DDRB |= _BV(INTER1); //EN E
    DDRB |= _BV(INTER2); //EN E
    DDRB |= _BV(GO_OFF); //EN E
    DDRB |= _BV(NUIT); //EN E
 
    /* LES VAR */
    unsigned long int temps = 0;
    unsigned int state_inter1 = bit_is_set(PINB, INTER1);
    unsigned int state_inter2 = bit_is_set(PINB, INTER2);
    unsigned int i = 0;
 
 
    while(i < 6) //Routine d'allumage, pour voire quand ca plante. DEBUG-like
    {
        allumer(LAMPE);
        _delay_ms(300); //Pas vraiment des ms m'enfin bon; Une longue attente pour pas flinguer l'ampoule écolo
        eteindre(LAMPE);
        _delay_ms(300);
        i++;
    }
 
    state_inter1 = bit_is_set(PINB, INTER1); //Pour si on appuye sur l'interr pdt la routine d'allumage
    state_inter2 = bit_is_set(PINB, INTER2);
 
 
    /*LE LOOP*/
    while(1)
    {
 
        if(bit_is_set(PINB, LAMPE)) //Pour les secs pdt le jour et la nuit. NUIT < JOUR
        {
            temps++;
            if(bit_is_set(PINB, NUIT))
            {
                if(temps > TEMPS_NUIT)
                {
                    eteindre(LAMPE);
                    temps = 0;
                }
            }
            else
            {
                if(temps > TEMPS_JOUR) //Pour éviter un allumage rapide de l'ampoule, ce qui pourrait l'endommager.
                {
                    eteindre(LAMPE);
                    temps = 0;
                }
            }
        }
 
 
        if((bit_is_set(PINB, INTER1) != state_inter1) || (bit_is_set(PINB, INTER2) != state_inter2)) //L'état de l'interrupteur a changé
        {
            _delay_ms(2); //Anti-rebond
                        // --Mettre une grande valeur pour des vas-et-vient (~500ms ('fin j'en sais rien)) et mettre le delay _apres_ le if(...)else (vive l'attente sinon).
            if(bit_is_set(PINB, LAMPE))
            {
                eteindre(LAMPE);
            }
            else
            {
                if(!bit_is_set(PINB, GO_OFF)) //Sinon, bien sur, on allume pas
                {
                    allumer(LAMPE);
                    temps = 0;
                }
            }
 
 
            state_inter1 = bit_is_set(PINB, INTER1);
            state_inter2 = bit_is_set(PINB, INTER2);
        }
        _delay_us(1);
 
        if(bit_is_set(PINB, GO_OFF))
        {
            temps = 0;
            eteindre(LAMPE);
        }
 
    }
 
 
    return 0;
}
1) ^^

Discussion

Enter your comment. Wiki syntax is allowed:
RFZTY
 
minuteur_intelligent.txt · Last modified: 2011/12/26 20:51 (external edit)