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...

Testing crossplane on Digital ocean

  Crossplane brings the management of external resources into kubernetes through kubernetes APIs. This can in some situations be an alternative to other IaC such as terraform.  In the example below, we will create a droplet on DO by applying a kubernetes manifest using kubectl. The exemple suppose the kubernetes cluster in which crossplane will be installed is already up. ```bash kubectl create namespace crossplane-system helm repo add crossplane-stable https://charts.crossplane.io/stable helm repo update # install crossplane helm install crossplane --namespace crossplane-system crossplane-stable/crossplane # install the upjet digital ocean provider cat << EOF | kubectl apply -f - apiVersion: pkg.crossplane.io/v1 kind: Provider metadata: name: provider-upjet-digitalocean spec: package: crossplane-contrib/provider-upjet-digitalocean:v0.3.0 EOF # create the upjet digital ocean provider secret kubectl apply -f - << EOF apiVersion: v1 kind: S...

Ajouter un dépôt dans linux

La méthode traditionnel consiste a éditer le fichier /etc/apt/sources.list . Mais il est possible avec la commande add-apt-repository, pour peu qu'elle soit installe dans votre système d'exploitation (eg Ubuntu, Linux Mint ...), de le faire plus facilement. voici la syntaxe: apt-add-repository 'deb uri distribution [component1] [component2] [...]'  ou apt-add-repository  ppa: