Accéder au contenu principal

Serrure numerique


OBJECTIF :
Realiser un systeme de controle de mot de passe a base de microcontroleur. on utilisera un clavier téléphonique pour recevoir le code et des LED pour indiquer l'état..

DETAILS
L'utilisateur tape sur '*' du clavier et le système écoute alors le mot de passe de 4 chiffres qui est par défaut 1234 (ce mot de passer se conserve dans l'EEPROM);
Si le mot de passe est faut, la LED rouge flash et le systeme revient en veille
Si le mot de passe est correct, le systeme une commance du clavier:
  • '*' pour executer l'action relatif a la protection. Par exemple commander une gache. Dans notre cas nous faisons flasher la led vert
  • '#' pour changer le mot de passe. Le systeme attend qu'on entre deux fois de suite le nouveau mot de passe (pour verifier). si les deux mots de passe sont identiques, le mot de passe est mis a jour dans l'EEPROM, sinon, le systeme ignore l'etape

SCHEMAS



CODE :
Voici le code pour le microcontroleur PIC16F876. Je compile avec PICC de HI-TECH, inclut dans MPLAB, l'IDE de Microship



#include
#include
#define _XTAL_FREQ 1000000;
 __EEPROM_DATA(0x11,0x12,0x14,'!',NULL ,0x05,0x06,0x07);
char mot[5]; //entree clavier 
char mot2[5]; // pour la sauvegarde pour une 2nd lecture 
char smot[5];
char onechar;
void init();
char get1ch(); // attend et recupere un carater du clavier
void getmot(); // recupere 4 char et les sauve dans mot[4] 
void error(int code); // traite les erreurs 
void readpw();// recupere le mot de passe dans l'eeprom 
void savepw(); // enregistre le mot de passe dans l'eeprom 
void action(); // action a realiser
int main(){
init();
readpw(); // on charge le mot de passe enregistre au demarrage 
 while(1){
onechar=get1ch();
if(onechar==0b10000001){
//on ecoute le mot de passe 
 getmot();
if(strcmp(smot, mot)==0){
// the pw is good                 
onechar=get1ch();
if(onechar==0b10000001){
// on deverouille temporairement la protection                   
PORTC = 1;
_delay(100000);
PORTC = 0;
action();
}else if (onechar=0b00100001){ 
//changement de mot depasse                   
PORTC = 5; // reading                     
_delay(100000);
PORTC = 0; // reading                    getmot();
strcpy(mot2, mot);
getmot();
if(strcmp(mot, mot2)==0){
//mot de passe id, on peut sauver 
 savepw();
PORTC = 1; // reading                    _delay(100000);
PORTC = 0; // reading 
 }else{
// mots de passe non identiques           error(2); // mot de pass diff       PORTC = 4; // reading                    _delay(100000);
PORTC = 0; // reading 
 }
}else{
//pas d'action valide 
 }
}else{ 
//bad pw                PORTC= 4; // reading 
 _delay(100000);
PORTC= 0; // reading               
//error(1); // to do: codes d'erreurs 
 }
}
}
return 0;
}
void init(){
TRISC = 0; // PORTC  en entree     
TRISB= 0XF0; //    PORTC = 0x0F; // reading     
_delay(100000);
PORTC = 0; // reading 
}
char get1ch(){
PORTC=2; // LED JAUNE    char tmp;
char tmp2;
char lum;
while(1){
tmp = 1;
PORTB = tmp;
if  (PORTB!=tmp){
tmp = PORTB;
tmp2 = PORTB;
while(tmp == PORTB);
PORTC=0;
return tmp2;
}
tmp = 2;
PORTB = tmp;
if  (PORTB!=tmp){
tmp = PORTB;
tmp2 = PORTB;
while(tmp == PORTB);
PORTC=0;
return tmp2;
}
tmp = 4;
PORTB = tmp;
if  (PORTB!=tmp){
tmp = PORTB;
tmp2 = PORTB;
while(tmp == PORTB);
PORTC=0;
return tmp2;
}
}
}
void getmot(){
int i;
PORTC=2;
_delay(100000);
PORTC=0;
_delay(100000);
PORTC=2;
_delay(100000);
PORTC=0;
_delay(100000);
for(i=0;i<4;i++){
mot[i]=get1ch();
}
}
void error(int code){
if (code==1){
//erreur d'authentification     
}else if (code=2){
//echec de verification mot de pass a sauvegarder 
 }
PORTC = 4; _delay(100000);
PORTC = 0;  _delay(100000);
PORTC = 4;  _delay(100000);
PORTC = 0;  
}
void readpw(){
// devra lire dans l'eeprom     
int i;
for(i=0;i<5;i++){
smot[i] = eeprom_read (i);
}
}

void savepw(){
// devra ecrire dans l'eeprom 
 int i;
for(i=0;i<5;i++){
eeprom_write (i, mot[i]);
}
strcpy(smot, mot); // actualise le pw dans la RAM}
void action(){
PORTC=1;
_delay(100000);
_delay(100000);
PORTC=0;
}







Commentaires

Posts les plus consultés de ce blog

Gérer les requêtes USSD sur un MoDem avec les commandes AT

Introduction L'USSD (Universal Structured Service D) est un service des réseaux télécoms defini dans 3GPP TS 02.90 et dans 3GPP TS 23.090. Il permet à un terminal mobile d'effectuer des requetes ou une suite de requete à l'operateur. Il est courament utiliser pour consulter le solde. Dans ce tutoriel nous apprendrons à effectuer des requetes USSD depuis une connection serie avec une modem. Pré requis Pour utiliserons pour ce faire: un modem GSM (Huawei E1552) bien sur avec une carte SIM (AIRTEL Burkina) un ordinateur auquel sera connecte le modem un terminal (minicom) pour dialoger avec le modem depuis l'ordinateur perl, pour encoder et decoder les PDU Demarche Nous allons consulter le solde du compte de l'utilisateur. Pour l'opérateur courant il faut composer le code USSD *160#. connecter le modem Connectez le modem au port USB de l'ordinateur et retrouvez ses port series logiciels. Notre modem créé trois ports series (/dev/t

IANA TCP UDP Ports

Port TCP UDP Description Status 0 UDP Reserved Official 0 TCP Programming technique for specifying system-allocated (dynamic) ports[2] Unofficial 1 TCP UDP TCP Port Service Multiplexer (TCPMUX) Official 2 TCP UDP CompressNET[3] Management Utility[4] Official 3 TCP UDP CompressNET[3] Compression Process[5] Official 4 TCP UDP Unassigned Official 5 TCP UDP Remote Job Entry Official 7 TCP UDP Echo Protocol Official 8 TCP UDP Unassigned Official 9 UDP Wake-on-LAN Unofficial 9 TCP UDP Discard Protocol Official 10 TCP UDP Unassigned Official 11 TCP UDP Active Users (systat service)[6][7] Official 12 TCP UDP Unassigned Official 13 TCP UDP Daytime Protocol (RFC 867) Official 14 TCP UDP Unassigned Official 15 TCP UDP Previously netstat service[6] Unofficial 16 TCP UDP Unassigned Official 17 TCP UDP Quote of the Day Official 18 TCP UDP Message Send Protocol Official 19 TCP UDP Character Generator Protocol (CHARGEN) Official 20 TCP UDP FTP data transfer Official 21 TCP FTP 

INTERUPTEUR CREPUSCULAIRE

BUT : contrôler l’allumage et l’institution d’une lampe électrique en fonction de l’intensité de la lumière ambiante. FONCTIONNEMENT : le potentiomètre RV2 règle la sensibilité à la lumière. S’il fait assez noir, la lampe s’allume. Si par contre,s' il y’a assez de lumière alors la lampe s’éteint. La résistance variable RV1 permet de régler le décalage entre le seuil d’allumage et le seuil d’instinction. INTERET : sécurité, automatisation et économie d’énergie. SCHEMAS :