begin process at 2012 05 27 15:35:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > DETECTEUR EJP

DETECTEUR EJP


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :detecteur trame, detecteur EJP, Microcontroleur PIC, Pulsadis, Tarif EDF Niveau :Initié Date de création :13/01/2012 Date de mise à jour :18/01/2012 11:08:28 Vu / téléchargé :1 710 / 75

Auteur : idpro

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 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

  • /* DECODEUR TRAME EJP */
  • /* Programme en Langage C ,Compilateur Hi Tech Tools */
  • #include <htc.h>
  • #include <stdio.h>
  • /*==========================================================================
  • Configuration Bits
  • ==========================================================================*/
  • #define _XTAL_FREQ 4000000
  • __CONFIG(INTIO & WDTDIS & MCLREN & PWRTDIS & BORDIS);
  • /*==========================================================================
  • Definition des Variables
  • ==========================================================================*/
  • #define LEDROUGE RC0
  • #define LEDVERTE RA2
  • unsigned int s=0;
  • unsigned int k=0;
  • unsigned int j=0;
  • unsigned int vref;
  • unsigned char i=0;
  • unsigned int seuil;
  • unsigned int delta;
  • unsigned int d=0;
  • unsigned char calcu_vr=0;
  • unsigned char calcul_seuil=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;
  • /*==========================================================================
  • Configuration du convertisseur Analogique Numérique (10 Bits)
  • ==========================================================================*/
  • void SetupADC(void){
  • ANSEL = 0x00; // An0-7 digital
  • ANSELH = 0x01; // AN8 en entrée analog numerique
  • ADCON0 = 0b10100001; //CH0, ADC on
  • ADCON1 = 0x60; //Fosc/64
  • }
  • /*==========================================================================
  • Fonction Lecture tension numérique de la Voie 8
  • ==========================================================================*/
  • unsigned int ConvertADC(){
  • unsigned int result;
  • CHS3=1;CHS2=0;CHS1=0;CHS0=0; //Lecture voie AN8
  • ADON=1;//Start conversion
  • GODONE=1;
  • while (GODONE ); //Attente fin de conversion;
  • result<<=8;
  • result|=ADRESL;
  • return result; //Return ADC reading
  • }
  • /*=========================================================================
  • Fonction sortie Etat leds suivant le bit 5 et 15 de la trame
  • ==========================================================================*/
  • 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 && !led_15){LEDROUGE=0;LEDVERTE=0;} // a voir pourquoi les deux leds ne marchent pas en meme temps
  • else if (!led_5 && led_15) {LEDVERTE=0;LEDROUGE=1;}
  • else if (led_5 && led_15) {LEDROUGE=0;LEDVERTE=1;}
  • else{
  • LEDROUGE=1;LEDVERTE=0;
  • }
  • }
  • /*==========================================================================
  • Routine interruption Timer appelé toutes les 700hz
  • ==========================================================================*/
  • static void interrupt timer()
  • {
  • if(TMR1IF)
  • {
  • TMR1H = 0xFA; TMR1L = 0x85 ; // Rechargement du Timer pour l'interruption suivante
  • k++;
  • j++;
  • if (calcu_vr == 0) // Calcul du seuil sur une periode secteur=20ms
  • {
  • s=(ConvertADC())+s;
  • if (k==14){
  • s=(ConvertADC())+s;
  • vref=s;
  • k=0;s=0;calcu_vr=1;calcul_seuil=1;j=0;
  • }
  • }
  • else if(calcul_seuil==1)
  • {
  • s=ConvertADC()+s;
  • if (k==14) {
  • seuil=s;s=0;k=0;calcul_seuil=0;
  • s=0;k=0;
  • j=0;d=0;
  • }
  • }
  • else if (calcu_vr && !calcul_seuil)
  • {
  • s=ConvertADC()+s;
  • if (j==14){// sur 20ms
  • if (s>seuil){delta=s-seuil;}
  • if (s<seuil){delta=seuil-s;}
  • if (s==seuil){delta=0;}
  • if (delta>=12){d++;} //
  • s=0;
  • j=0;
  • }
  • if (k== 700 && front_montant==0)// sur 1 sec
  • {
  • if (d>=50)
  • {
  • front_montant=1;
  • }
  • else{
  • front_montant=0;
  • k=0;
  • j=0;
  • s=0;
  • d=0;
  • }
  • }
  • if (front_montant== 1 && bit_1==0)
  • {
  • if (k==700) // Detecte si bit de start
  • {
  • if (d>=50 )
  • {
  • bit_1=1;
  • front_montant=1;
  • k=0;
  • s=0;
  • d=0;
  • j=0;
  • }
  • else{
  • bit_1=0;
  • front_montant=0;
  • LEDVERTE=0;
  • LEDROUGE=1;
  • }
  • k=0;
  • j=0;
  • s=0;
  • d=0;
  • }
  • }
  • if (bit_1==1 && !start_trame)
  • {
  • if (k==1925) // Sur 2.75s
  • {
  • if (d<137)
  • {
  • bit_0=1;
  • front_montant=0;
  • LEDROUGE=1;
  • LEDVERTE=0;
  • }
  • else {
  • bit_0=0;
  • front_montant=0;
  • bit_1=0;
  • LEDROUGE=0;
  • LEDVERTE=1;
  • }
  • 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;
  • }
  • if (start_trame==1)
  • {
  • if (i==5 || i==15)
  • {
  • if (k==700)
  • {
  • if (d>=50)
  • {
  • if (i==5) {bit_5_sup=1;}
  • if (i==15) {bit_15_sup=1;}
  • }
  • else{
  • if(i==5) {bit_5_sup=0;}
  • if (i==15){bit_15_sup=0;}
  • }
  • s=0;
  • d=0;
  • }
  • if (k==1750)
  • {
  • if (d>=75){
  • if (i==5) {bit_5_inf=1;}
  • if (i==15) {bit_15_inf=1;}
  • }
  • else{
  • if(i==5) {bit_5_inf=0;}
  • if (i==15){bit_15_inf=0;}
  • }
  • s=0;
  • k=0;
  • j=0;
  • d=0;
  • i++;
  • }
  • }
  • if (i!=5 && i!=15 && i!=40){
  • if (k==1750)
  • {
  • k=0;
  • j=0;
  • i++;
  • s=0;
  • d=0;
  • }
  • }
  • if (i==40)
  • {
  • if (k==1750){
  • start_trame=0;
  • front_montant=0;
  • k=0;
  • s=0;
  • d=0;
  • j=0;
  • bit_1=0;
  • bit_0=0;
  • exploite_visu(bit_5_sup,bit_15_sup,bit_5_inf,bit_15_inf);
  • }
  • }
  • }
  • // fin start_trame
  • }
  • }
  • TMR1IF=0;
  • }
  • void main(void) {
  • SetupADC();
  • TRISC0=0;
  • TRISA2=0;
  • TRISB= 0b00000000; // PORTB en sortie RB7-4
  • IOCB = 0;
  • WPUB = 0;
  • C1ON=0;
  • C2ON=0;
  • SSPCON=0;
  • ADON=0;
  • RABIE=0;
  • INTE=0;
  • INTF=0;
  • IOCB4=0;
  • SSPEN=0;
  • SSPSTAT=0;
  • TRISC0=0;
  • TRISA2=0;
  • LEDVERTE=1;
  • LEDROUGE=1;
  • SetupADC();
  • __delay_ms(100);
  • TRISC0=0;
  • TRISA2=0;
  • ADIE=0;
  • SSPIE=0;
  • CCP1IE=0;
  • T0IE = 0 ;
  • GIE = PEIE = 1 ;//autorise interrupt
  • T0IE = 0 ; // inValid TMR0 (OPTION = 0x04)
  • TMR1ON = TMR1IE = 1 ; // Validation du TIMER1
  • TMR1H = 0xFA ; TMR1L = 0x85; // ~ 1.42 ms pour echantillon à 700hz
  • while (1)
  • {
  • }
  • }
/* DECODEUR TRAME EJP */
/* Programme en Langage C ,Compilateur Hi Tech Tools */


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

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

       Configuration Bits

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



#define _XTAL_FREQ 4000000
__CONFIG(INTIO & WDTDIS & MCLREN & PWRTDIS & BORDIS);

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

       Definition des Variables

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

#define LEDROUGE   RC0
#define LEDVERTE   RA2

unsigned int s=0;

unsigned int k=0;
unsigned int j=0;
unsigned int  vref;
unsigned char i=0;
unsigned int  seuil;

unsigned int delta;
unsigned int d=0;
unsigned char calcu_vr=0;
unsigned char calcul_seuil=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;


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

   Configuration du convertisseur Analogique Numérique (10 Bits)

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

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

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

       Fonction Lecture tension numérique de la Voie 8

==========================================================================*/
unsigned int ConvertADC(){

unsigned int result;

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

    GODONE=1;

    while (GODONE ); //Attente fin de conversion;
	result<<=8;
	result|=ADRESL;
	
     return result; //Return ADC reading
}
/*=========================================================================

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

==========================================================================*/
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 && !led_15){LEDROUGE=0;LEDVERTE=0;} // a voir pourquoi les deux leds ne marchent pas en meme temps
	else if (!led_5 && led_15) {LEDVERTE=0;LEDROUGE=1;}
	else if (led_5 && led_15) {LEDROUGE=0;LEDVERTE=1;}
	else{		
			LEDROUGE=1;LEDVERTE=0;
		}
}
/*==========================================================================

       Routine interruption Timer appelé toutes les 700hz

==========================================================================*/
static void interrupt timer()
{
    if(TMR1IF)
  {     
	
      TMR1H = 0xFA;  TMR1L = 0x85 ; // Rechargement du Timer pour l'interruption suivante
	
	 	
	k++;
	j++;

	if (calcu_vr == 0)    // Calcul du seuil sur une periode secteur=20ms
	{
		s=(ConvertADC())+s;
	
		if (k==14){
						s=(ConvertADC())+s;
						vref=s;
						k=0;s=0;calcu_vr=1;calcul_seuil=1;j=0;
				  }			
	}
	else if(calcul_seuil==1)
	{
		s=ConvertADC()+s;
		if (k==14) {
					seuil=s;s=0;k=0;calcul_seuil=0;
				
					s=0;k=0;
					j=0;d=0;
					}
	
		
	}
	else if (calcu_vr && !calcul_seuil)
	{
			s=ConvertADC()+s;
			if (j==14){// sur 20ms
						if (s>seuil){delta=s-seuil;}
						if (s<seuil){delta=seuil-s;}
						if (s==seuil){delta=0;}

						if (delta>=12){d++;} //
						s=0;
						j=0;
			}
			if (k== 700 && front_montant==0)// sur 1 sec
			{
					
					if (d>=50) 
					{
						front_montant=1;
													
					}
					else{
						front_montant=0;
						k=0;
						j=0;
						s=0;
						d=0;				
								
					}
			}			
			if (front_montant== 1 && bit_1==0)
			{
				if (k==700)  // Detecte si bit de start
				{
					if (d>=50 )
					{
						bit_1=1;
						front_montant=1;
						
						k=0;
						s=0;
						d=0;
						j=0;
					

					}
					else{
							bit_1=0;
							front_montant=0;
							LEDVERTE=0;
							LEDROUGE=1;
					   }
					k=0;
					j=0;
					s=0;
					d=0;
					
				}
			}		
			if (bit_1==1 && !start_trame)
			{
				if (k==1925)  // Sur 2.75s 
				{
						
					if (d<137) 
					{
						bit_0=1;
						front_montant=0;
						LEDROUGE=1;
						LEDVERTE=0;
					
					}
					else {
						bit_0=0;
						front_montant=0;
						bit_1=0;
						LEDROUGE=0;
						LEDVERTE=1;
					}
					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;
			}						 	
			  
			if (start_trame==1)
			{
					
				if (i==5 || i==15)
				{
							
				if (k==700)
				{
								
					if (d>=50)
					{
							if (i==5) {bit_5_sup=1;}
							if (i==15) {bit_15_sup=1;}
					}
					else{
							if(i==5) {bit_5_sup=0;}
							if (i==15){bit_15_sup=0;}
					}
							 s=0;
							 d=0;
							
				}			
				if (k==1750)
				{
							
				 	if (d>=75){
					    if (i==5) {bit_5_inf=1;}
						if (i==15) {bit_15_inf=1;}
								
							  }
					else{
						if(i==5) {bit_5_inf=0;}
						if (i==15){bit_15_inf=0;}
								
						}
							 s=0;
							 k=0;
						     j=0;
							 d=0;
							 i++;
				  }						
				}	
				if (i!=5 && i!=15 && i!=40){
					if (k==1750)
					{
					   k=0;
					   j=0;
					   i++;
					   s=0;
						d=0;
					}
				}							
				if (i==40)
				{
						
				if (k==1750){
				start_trame=0;
				front_montant=0;
				k=0;	
				s=0;
				d=0;
				j=0;
				bit_1=0;
				bit_0=0;
			
				exploite_visu(bit_5_sup,bit_15_sup,bit_5_inf,bit_15_inf);
							}			
				}
			}
		   // fin start_trame
			
			
				
			}
  }
 
TMR1IF=0;
}


void main(void) {
  	

	SetupADC();
	TRISC0=0;
	TRISA2=0;
	TRISB= 0b00000000; // PORTB en sortie RB7-4   
	IOCB = 0;
	WPUB = 0;


	C1ON=0;
	C2ON=0;
    SSPCON=0;
    ADON=0;
    RABIE=0;
	INTE=0;
	INTF=0;
    IOCB4=0; 
    SSPEN=0; 
	SSPSTAT=0;
    
  	
	TRISC0=0;
	TRISA2=0;
	LEDVERTE=1;
	LEDROUGE=1;
	SetupADC();

	__delay_ms(100);
	TRISC0=0;
	TRISA2=0;
	ADIE=0;
	SSPIE=0;
	CCP1IE=0;
	T0IE  = 0 ;
    GIE = PEIE = 1 ;//autorise interrupt
    T0IE  = 0 ;    //  inValid  TMR0  (OPTION = 0x04)
  
   TMR1ON = TMR1IE   = 1 ;               //   Validation du TIMER1
   TMR1H = 0xFA ;  TMR1L = 0x85;  // ~ 1.42 ms  pour echantillon à 700hz
  
  
  

  while (1)
 {
   
   
 }
					
            

  
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Detecteur pulsadis
    •   Soft_Pulsadis
      • electro.depTélécharger ce fichier [Réservé aux membres club]505 octets
      • electro.p1Télécharger ce fichier [Réservé aux membres club]77 967 octets
      • electro.preTélécharger ce fichier [Réservé aux membres club]20 276 octets
      • funclistTélécharger ce fichier [Réservé aux membres club]148 octets
      • main.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier7 319 octets
      • main.p1Télécharger ce fichier [Réservé aux membres club]77 169 octets
      • main.preTélécharger ce fichier [Réservé aux membres club]20 270 octets
      • Pulsadis.cofTélécharger ce fichier [Réservé aux membres club]44 482 octets
      • Pulsadis.hexTélécharger ce fichier [Réservé aux membres club]5 983 octets
      • Pulsadis.hxlTélécharger ce fichier [Réservé aux membres club]3 149 octets
      • Pulsadis.lstTélécharger ce fichier [Réservé aux membres club]184 362 octets
      • Pulsadis.mapTélécharger ce fichier [Réservé aux membres club]28 535 octets
      • Pulsadis.mcpTélécharger ce fichier [Réservé aux membres club]1 500 octets
      • Pulsadis.mcsTélécharger ce fichier [Réservé aux membres club]39 190 octets
      • Pulsadis.mcwTélécharger ce fichier [Réservé aux membres club]88 576 octets
      • Pulsadis.objTélécharger ce fichier [Réservé aux membres club]25 880 octets
      • Pulsadis.rlfTélécharger ce fichier [Réservé aux membres club]242 558 octets
      • Pulsadis.sdbTélécharger ce fichier [Réservé aux membres club]18 931 octets
      • Pulsadis.symTélécharger ce fichier [Réservé aux membres club]13 495 octets
    • Notes_EJP.docTélécharger ce fichier [Réservé aux membres club]328 192 octets

Télécharger le zip


 Historique

13 janvier 2012 15:16:05 :
Erreurs d'orthographes
18 janvier 2012 08:57:30 :
Orthographes

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974

Commentaires et avis

Commentaire de CptPingu le 13/01/2012 16:42:26 administrateur CS

Bonjour.

Quelques remarques:
- Pourrais-tu améliorer la description de ton projet ? Que fait ton programme ? Qu'est-ce qu'un EJP ? Y a-t-il des contraintes particulières pour le faire fonctionner ? etc... (En l'état, c'est très très maigre, et c'est dommage parce que ça à l'air intéressant).
- Ce n'est pas du code .Net (à modifier).
- Pourquoi y a-t-il autant de variables globales ? (Je dirais même: pourquoi y a-t-il des variables globales ?)
- À quoi sert la boucle infinie en fin de programme ?
- Le main standard (et propre) est: "int main(void)" (+ un return 0) et non "void main(void)".

Commentaire de jfrancois le 14/01/2012 09:58:45

EJP = Effacement Jour de Pointe

Commentaire de jfrancois le 14/01/2012 10:49:02

Pour ceux qui se posent des questions, je viens de trouver ce très bon article explicatif sur l'EJP (et autres signaux EDF) : http://matthieu.benoit.free.fr/pulsadis.htm

Commentaire de DarkNemesis le 16/01/2012 08:40:01

En lisant rapidement la source, je pense que ce code s'adresse à un micro contrôleur (la source est taggué Microcontroleur PIC d'ailleurs).

La boucle infini en fin de programme sert justement à garder le programme actif en attendant l'interruption provoquer par le signal EJP.

Commentaire de micbric le 17/01/2012 23:16:51

Ce montage est plus simple que celui de Mathieu benoit, mais il y a aussi la "version en ligne" sur :
http://bleuciel.edf.com/abonnement-et-contrat/les-prix/les-prix-de-l-electricite/option-ejp/l-observatoire-52417.html
avec l'historique de la saison en cours.
Pour ma part j'ai installé un simple système à relais qui me coupe les trois phases du chauffage au niveau des fusibles sur le tableau électrique, leurs voyants EJP  (à EDF) ne fonctionne qu'en mode "plein tarif" le préavis ne marche pas malgré plusieurs interventions EDF et changement du boitier EJP.
Je vais testé ce montage...en utilisant des capas X2 en 630V.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales