Sari la conținut
ELFORUM - Forumul electronistilor

proiect alarma


Mad_Turnip

Postări Recomandate

am pus steluta, cum il bag in priza si apas o tasta, imi apare ori ca in poza, ori stringul dinainte. am scos si programatorul, l-am scos si din priza, dar cumva reuseste sa tina uneori minte ce era inainte. mi-e neclar aici.

Link spre comentariu
  • Răspunsuri 24
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mad_Turnip

    13

  • godFather89

    11

  • Liviu M

    1

Da, era o greseala evidenta care nu am observat-o. Problema e ca il gandisem doar pentru citire, ulterior am scris si de afisare... se rezolva asa:

 

//citeste o parola in bufferul pswd de lungime maxLengthvoid ReadPassword(char *pswd, uint8_t maxLength){   uint8_t pos = 0;   uint8_t c = 1; //flag pentru continuare   pswd[pos] = 0;   while (c)   {      char key;      do      {         key = kb_read(); //citeste tasta apasata         _delay_ms(10);      }      while (key == 0); //repeta citirea pana cand se apasa o tasta      while (kb_read()); //asteapta pana cand tasta este eliberata           switch (key)      {      case '#':         c = 0; //interpretam #-ul ca si enter deci terminam citirea         break;      case '*':         //consideram * ca si backspace (sterge ultimul caracter)         if (pos) //daca exista caractere (pos>0)         {            pos--; //decrementam            pswd[pos] = 0; //stergem         }         break;      default:         pswd[pos++] = key; //salveaza tasta apasata in vector si incrementeaza pozitia         pswd[pos] = 0; //marcheaza sfarsitul stringului         if (pos == maxLength) c = 0; //daca s-au citit deja numarul maxim de caractere, terminam citirea fara sa mai asteptam #-ul         break;      }           /*      Aici poti face afisarea parolei curente din pswd      Practic este un string      */     lcd_goto(0x40);      lcd_puts("           "); //mai intai afisezi spatii goale pentru a sterge ce era afisat     lcd_goto(0x40);      lcd_puts(pswd); //afisezi ce s-a introdus pana acum de la tastatura        }}
Link spre comentariu

da, tocmai postam. functioneaza ok. am incercat sa-l fac sa reactioneze in alte directii daca parola este corecta, dar continua sa faca ce ii zice ReadPassword. deci cred ca liniile cu strcmp ar trebui mutate intr-o functie (apropo, cum se cheama "functiile" astea definite inafara main-ului care apoi sunt chemate, pt ca eu vin din PHP unde asa se cheama si mi-e sa nu fac vreo greseala de exprimare) care sa fie chemata intr-un while daca armat = 1 si apoi sa nu mai fie chemat dupa ce armat = 0 ca sa poti opera tastatura . cam asa ceva gandeam, dar inca nu am o directie clara. pentru ca vreau ca la armare sa ma intrebe ce mod vreau: - mod cu toti senzorii sau - mod doar cu contactul magnetic de la usa (asta ca sa o pot tine activa si pe timpul noptii)

Link spre comentariu

mi-a iesit asa:

#include<avr/io.h>#include <util/delay.h>#include <hd44780.h>#include <string.h>//returneaza 0 daca nu s-a apsat nici o tasta, //altfel codul ASCII al tastei apasatechar kb_read(void){DDRB = 0b00000111;   char key = 0;   PORTB = 0b01111110;   _delay_ms(20);   if ((PINB & (1<<3)) == 0) key = '1';   if ((PINB & (1<<4)) == 0) key = '4';   if ((PINB & (1<<5)) == 0) key = '7';   if ((PINB & (1<<6)) == 0) key = '*';   PORTB = 0b01111101;                _delay_ms(20);                      if ((PINB & (1<<3)) == 0) key = '2';    if ((PINB & (1<<4)) == 0) key = '5';    if ((PINB & (1<<5)) == 0) key = '8';    if ((PINB & (1<<6)) == 0) key = '0';    PORTB = 0b01111011;                _delay_ms(20);                      if ((PINB & (1<<3)) == 0) key = '3';    if ((PINB & (1<<4)) == 0) key = '6';    if ((PINB & (1<<5)) == 0) key = '9';    if ((PINB & (1<<6)) == 0) key = '#';   _delay_ms(110);   return key;}//citeste o parola in bufferul pswd de lungime maxLengthvoid ReadPassword(char *pswd, uint8_t maxLength){   uint8_t pos = 0;   uint8_t c = 1; //flag pentru continuare   pswd[pos] = 0;      while (c)   {      char key;      do      {         key = kb_read(); //citeste tasta apasata         _delay_ms(10);      }      while (key == 0); //repeta citirea pana cand se apasa o tasta      while (kb_read()); //asteapta pana cand tasta este eliberata            switch (key)      {      case '#':         c = 0; //interpretam #-ul ca si enter deci terminam citirea         break;      case '*':         //consideram * ca si backspace (sterge ultimul caracter)         if (pos) //daca exista caractere (pos>0)         {            pos--; //decrementam            pswd[pos] = 0; //stergem         }         break;      default:         pswd[pos++] = key; //salveaza tasta apasata in vector si incrementeaza pozitia		 pswd[pos] = 0; //marcheaza sfarsitul stringului         if (pos == maxLength) c = 0; //daca s-au citit deja numarul maxim de caractere, terminam citirea fara sa mai asteptam #-ul         break;      }            /*      Aici poti face afisarea parolei curente din pswd      Practic este un string      */	  lcd_goto(0x40);      lcd_puts("                    "); //mai intai afisezi spatii goale pentru a sterge ce era afisat	  lcd_goto(0x40);      lcd_puts(pswd); //afisezi ce s-a introdus pana acum de la tastatura         }   pswd[pos] = 0; //marcheaza sfarsitul stringului}char CheckPass(void){char *pswd_DeIntrodus = "12345";   char pswd_DeCitit[10];   char *check;		   ReadPassword(pswd_DeCitit, 9); //citeste parola in pswd_DeCitit cu o lungime maxima de 9 caractere		   if (strcmp(pswd_DeIntrodus, pswd_DeCitit) == 0)		   {			check = "1";			   }		   else		   {		   	check = "0";		   }return check;}void delay_pir(){	lcd_goto(2);	lcd_puts("* INITIALIZARE *");	lcd_goto(0x40);	lcd_puts("Initializare PIR-uri      2 minute");	_delay_ms(10000);	lcd_clrscr();}void night(){int tip;		lcd_goto(0x54);	lcd_puts("                    ");	lcd_goto(0x54);	lcd_puts("Senzori: Contact usa");	while(kb_read()==0){	if ((PIND & (1<<0)) == 1) {			lcd_goto(0x54);			lcd_puts("                    ");			lcd_goto(0x54);			lcd_puts("Usa deschisa  10 sec");			PORTD &= (0<<5);			tip = 0;	}	}}void day(){int tip;	lcd_goto(0x14);	lcd_puts("Delay 10 secunde    ");	lcd_goto(0x54);	lcd_puts("                    ");	lcd_goto(0x54);	lcd_puts("Senzori: PIR");	_delay_ms(50000);	lcd_goto(0x14);	lcd_puts("                    ");	while(kb_read()==0){	if ((PIND & (1<<0)) == 1) {			lcd_goto(0x54);			lcd_puts("                    ");			lcd_goto(0x54);			lcd_puts("Usa deschisa  10 sec");			PORTD &= (0<<5);			tip = 0;	}	}}void dezarmare(){PORTD |= (1<<5)|(1<<6)|(1<<7);}int main(void){DDRD = 0b11100000;PORTD = 0b11111111;	int armat=0,read=1;	char *line2[20];	char *check;	lcd_init();	delay_pir();	lcd_puts("11:14:23  22.03.2011");	lcd_goto(0x40);	lcd_puts("Introduceti parola");	int tip=0;	while(1){		if(read==1)		{			if(strcmp(CheckPass(),"1")==0){				if(armat==0){					armat = 1;				}				else if(armat==1){					armat = 0;				}			}			else			{				*line2="error";			}					}		if(armat==1){			read=0;			lcd_goto(0x40);			lcd_puts("                    ");			lcd_goto(0x40);			lcd_puts("mod 1-night 2-day");		uint8_t c=1;		while (c)   			{		      char key;		      do		      {		         key = kb_read();		         _delay_ms(10);		      }		      while (key == 0);		      while (kb_read());				 switch (key)		      		{				      case '1':				         *line2="Status: NIGHT";						 tip = 1;						 c=0;						 read=1;						 check=0;				         break;				 					case '2':						 *line2="Status: DAY";						 tip = 2;						 c=0;						 read=1;						 check=0;				         break;					}		}	}		if(armat==0&&check==0){			*line2 = "Status: DEZARMAT";			tip=0;			dezarmare();		}		else if(armat==0){			*line2 = "Eroare";		}	lcd_clrscr();	lcd_puts("11:14:23  22.03.2011");	lcd_goto(0x40);	lcd_puts(*line2);	if(tip==1){		night();	}	if(tip==2){		day();	}	}}

nu stiu cum sa introduc un delay intre verificarea PD0 si PD5. daca ii dau cu delay_ms atunci perioada aceea este moarta si nu ma lasa sa introduc nimic de la tastatura, deci nu as avea cum sa dezactivez alarma.

Link spre comentariu

vreau ca PD0 - contactul magnetic sa fie temporizat, ca sa-mi dea voie sa dezactivez alarma. Sirena este pe PD5 si atata timp cat PD5 este 1 nu suna, cum PD5 este 0 suna sirena. PIR-urile sunt PD1, PD2, PD3 si PD4. cand vor fi 0 sirena suna direct. dar daca PD0 este 0 vreao o temporizare, dar care sa ma lasa sa rulez programul ca sa pot verifica parola.o sa incerc cu un timer

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări