Detecteur ejp

Description

Bonjour,

J'ai developpé un detecteur EJP(Electricité Jour de Pointe) qui pourra être très utile pour reduire votre consommation électrique si vous êtes abonné chez EDF.

Source / Exemple :


/*==========================================================================

  DECODEUR TRAME EJP 
  Programme en Langage C ,Compilateur Hi Tech Ansi Compiler 

==========================================================================*/

#include <htc.h>
#include <stdio.h>

/*==========================================================================

       Configuration Bits:	Oscillateur Interne 4Mhz
							WatchDog Désactivé
							MCLR en interne
							Power Time Up désactivé
							Brown Out Detect désactivé
NB:Cette configuration est à faire dans le menu Configure-->Configure Bits
==========================================================================*/

#define _XTAL_FREQ 4000000  // Necessaire pour le calcul d'une temporisation

/*==========================================================================

       Definition des Variables

==========================================================================*/

#define LEDROUGE   RC0
#define LEDVERTE   RA2

unsigned char c=0;
unsigned char flag_timer=0;
unsigned char flag_sync=1;

unsigned int s=0;
unsigned int k=0;
unsigned int j=0;
unsigned int l=0;
unsigned int m=0;

unsigned char i=1;
unsigned int  seuil=7168;
unsigned int timer_read;
unsigned int delta=0;

unsigned int d=0;
unsigned char calcu_vr=0;

unsigned char front_montant=0;

unsigned char bit_1=0;
unsigned char bit_0=0;
unsigned char start_trame=0;
unsigned char bit_5_sup=0;
unsigned char bit_5_inf=0;
unsigned char bit_15_sup=0;
unsigned char bit_15_inf=0;
unsigned int old_delta=0;

/*==========================================================================

   Configuration de la liaison série RS232 pour debogage

==========================================================================*/

void SetupUART(void){

	SPBRG=0b00011001;BRGH=1;BRG16=0; //9600Bauds
	SYNC=0;SPEN=1;//Asyncrone, com allowed
	TXEN=1;CREN=0;//TX allowed & RX not allowed
	SCKP=0;//invert polarity

}
/*==========================================================================

   Fonction transmission data par la liaison série 

==========================================================================*/

void SendUART(unsigned char tx){
	while (TXIF==0);
		TXREG=tx;

}

/*==========================================================================

   Configuration du convertisseur Analogique Numérique (10 Bits)

==========================================================================*/
void SetupADC(void){

     ANSEL = 0x00; // An0-7  digital
     ANSELH = 0x01;  // AN8 en entrée analogique numerique
     ADCON0 = 0b10100001; // ADC on
     ADCON1 = 0x60; //Fosc/64
}

/*==========================================================================

       Fonction Lecture tension analogique de la Voie 8 pour la tension Trame EJP

==========================================================================*/

unsigned int ConvertADC(){

unsigned int result=0;

     CHS3=1;CHS2=0;CHS1=0;CHS0=0; //Lecture voie AN8
    ADON=1;

	GO_DONE=1;//Start conversion

    while (GO_DONE ); //Wait for end of conversion
    result=ADRESH;
	result<<=8;
	result|=ADRESL;
	
     return result; //Retourne la lecture analogique en numérique
}

/*==========================================================================

		Fonction sortie Etat leds suivant le bit 5 et 15 de la trame EJP

==========================================================================*/
void exploite_visu( unsigned char b_5_s, unsigned char b_15_s, unsigned char b_5_i, unsigned char b_15_i)
{
    unsigned char led_5,led_15;
	led_5=b_5_s+b_5_i;
    led_15=b_15_s+b_15_i;
	if(led_5==1 && led_15==0){LEDROUGE=0;LEDVERTE=0;} 
	else if (led_5==0 && led_15==1) {LEDVERTE=0;LEDROUGE=1;}
	else if (led_5==1 && led_15==1) {LEDROUGE=0;LEDVERTE=1;}
	else{		
			LEDROUGE=1;LEDVERTE=0;}
}

/*==========================================================================

       Routine interruption Timer appelé toutes les 700hz

==========================================================================*/
static void interrupt timer()
{	
		
	 if (RABIF && RB4==1 && flag_sync==1)// Si synchro 50hz detecté 
	{
		flag_sync=1;
		c++;
		if (c==1){
						TMR1H=0;  //Init timer 1 à 0
						TMR1L=0;
		}			
		if (c==2)   // Calcul du Timer séparant une periode secteur 50hz
		{
		
			c=0;
			timer_read=0xFFFF-(TMR1H<<8 |TMR1L)/14;
			TMR1H=(timer_read & 0xFF00)>>8;
	  		TMR1L=timer_read & 0x00FF;
			flag_timer=1; // Autorisation acquisition signal Trame pour la période suivante
			flag_sync=0;
			j=0;
			s=0;	
		}
		RABIF=0;
		
	}
    else{
			RABIF=0;
		}
  if(TMR1IF && flag_timer==1)
  {     
		flag_timer=1;
     
	  TMR1H=(timer_read & 0xFF00)>>8;
	  TMR1L=timer_read & 0x00FF;
	 	

	if (calcu_vr == 0)    // Calcul de la moyenne du seuil sur 20 périodes secteur=20*20ms à la mise sous tension
	{
		l++;
		m++;
	 	s=(ConvertADC())+s;
		if (m<=20)
		{	
				if (l==14){
					if (m == 1)
					{
							if(s< 8000 && s> 6000){seuil=s;} 
							else {m=0;}
					}
					else	
					{
						if(s< 8000 && s> 6000){seuil=(s+seuil)/2;}
					}							
								
				}	
				if (l>=15){
				 	k=0;s=0;	
					j=0;d=0;
					l=0;
					
			    }	
		}
		else{
			    	m=0;
					k=0;s=0;	
					j=0;d=0;
					l=0;
					calcu_vr=1; // Depart traitement Trame EJP
				    flag_sync=1;
				    flag_timer=0;				
		}						
	 } 
	
    
	 else if (calcu_vr==1 )          // Traitement trame EJP
	{
			k++;
			j++;
			calcu_vr=1;
			s=ConvertADC()+s;       // Accumulation des échantillons de la Trame
			
			if (j==14){// Sur 20ms
					
						if (s>seuil){delta=s-seuil;}
						if (s<seuil){delta=seuil-s;}
						if (s==seuil){delta=0;}

						// Si trame detecte incrémente variable d
						if (old_delta>delta){
							
												if (old_delta-delta>0x10){d++;} 
											}							
						if (old_delta<delta){
							
												if (delta-old_delta>0x10){d++;}
											}				
						old_delta=delta;
							
							
			}
			if (j>=15){
														
						j=0;
						s=0;
						flag_sync=1;
						flag_timer=0;
						    
			}
					
					
			if (k== 233 && front_montant==0)// sur 1 sec
			{
				
					front_montant=0;
				
					if (d>=10) {// Si niveau 175hz detecté 

							    	front_montant=1;
									d=0;
									k=0;
									s=0;
									j=0;
									bit_1=1;
															
					}
				
					k=0;
					d=0;		
			}			
		
			if (bit_1==1 && !start_trame && front_montant==1)
			{
				front_montant=1;
				bit_1=1;
				if (k>=641)  // Sur 2.75s à verifier
				{
						
					if (d<=15)
					{
						bit_0=1;
						front_montant=1;
					    
					
					}
					else {
						bit_0=0;
						front_montant=0;
						bit_1=0;
					
					}
					k=0;	j=0;
					s=0;
					d=0;
				}
			}
			
			if (bit_1== 1 && bit_0==1){
										
										
					start_trame=1;
					front_montant=1;
					bit_1=1;
					bit_0=0;
					i=1;
					k=0;
					d=0;
					j=0;
					s=0;
			}						 	
			  
			if (start_trame==1)
			{
					start_trame=1;
					front_montant=1;
					bit_0=0;
				
					if (i==5 || i==15){
									
								
								if (k==233)  // sur 1 sec
								{
												
									if (d>=10)
									{
										d=0;
										s=0;
							 			j=0;
										if (i==5) {bit_5_sup=1;}
										if (i==15) {bit_15_sup=1;}
									}
									else if (d<10){  
										 d=0;
										 s=0;
						 			     j=0;
									    if(i==5) {bit_5_sup=0;}
										if (i==15){bit_15_sup=0;}
									}
											 
											
							    }			
								if (k>=633)  // sur 2.5sec
								{
										

								 	if (d>=10){ 
									    d=0;
									    s=0;
										j=0;
										k=0;
								
									    if (i==5) {bit_5_inf=1;}
										if (i==15) {bit_15_inf=1;}
													
									}
									else if (d<10){
											d=0;
											s=0;
							 
											 j=0;
											 k=0;
										
											if(i==5) {bit_5_inf=0;}
											if (i==15){bit_15_inf=0;}
														
									}			 
										 i++;					
								  }						
					}	
				
				    else if (i==40) // Sin fin de Trame
					{
							
							if (k>=633){
							
								start_trame=0;
								front_montant=0;
							
								k=0;	
								s=0;
								d=0;
								j=0;
								bit_1=0;
								bit_0=0;
								i=1;
							
								exploite_visu(bit_5_sup,bit_15_sup,bit_5_inf,bit_15_inf);
											
								}			
					}
					else {
									
							if (k>=633){
										   k=0;	j=0;
										   i++;
								
										   s=0;
										   d=0;
								
							            }
					}							
			}
		   			
		
	}	
	TMR1IF=0;
  }
  else{
 
		TMR1IF=0;
	}

}

void main(void) {

	
	SetupUART();
	SetupADC();
	TRISC0=0;
	TRISA= 0b00000000;
	WPUB = 0;
	TRISB4=1;
	TRISB5=0;
	TRISB7=0;
	C1ON=0;
	C2ON=0;
    SSPCON=0;
    ADON=0;
	INTE=0;
	INTF=0;
    SSPEN=0; 
	SSPSTAT=0;

	TRISC0=0;
	TRISA2=0;
	LEDVERTE=0;
	LEDROUGE=1;
	SetupADC();
	SetupUART();
	
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	__delay_ms(100);
	
	TRISC0=0;
	TRISB6=0;
	ADIE=0;
	SSPIE=0;
	CCP1IE=0;
	T0IE  = 0 ;
    GIE = PEIE = 1 ;//autorise interruption
	TRISB4=1;
	IOCB4=1; // Activation changement interrupt sur RB4
	IOCB5=1;
	RABIE=1;// Autorise interrupt changement etat  sur RB4
    T0IE  = 0 ;    //  inValid  TMR0  (OPTION = 0x04)
             //  1Mhz   -->  1 µs 
   TMR1ON = 1 ;               //   Validation du TIMER1
   TMR1IE=1;
  
  while (1)
  {   
	// Traitement en tache infini
  }
					            
}

Conclusion :


Pour télécharger le schéma aller sur le lien www.profilkam.fr.vu/rapport.html

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (idpro)