Mad_Turnip Postat Martie 30, 2011 Autor Partajează Postat Martie 30, 2011 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
godFather89 Postat Martie 30, 2011 Partajează Postat Martie 30, 2011 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
godFather89 Postat Martie 31, 2011 Partajează Postat Martie 31, 2011 Ai reusit sa il faci sa mearga cum ti-am zis? Link spre comentariu
Mad_Turnip Postat Martie 31, 2011 Autor Partajează Postat Martie 31, 2011 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
godFather89 Postat Martie 31, 2011 Partajează Postat Martie 31, 2011 Da, toate sunt functii. Si main-ul este tot o functie. Toate returneaza ceva si primesc ca parametru ceva (fie si void).Bafta in continuare! Link spre comentariu
Mad_Turnip Postat Martie 31, 2011 Autor Partajează Postat Martie 31, 2011 aha, deci nu faceam o confuzie. incerc sa incropesc ceva si va tin la curent Link spre comentariu
Mad_Turnip Postat Aprilie 2, 2011 Autor Partajează Postat Aprilie 2, 2011 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
godFather89 Postat Aprilie 3, 2011 Partajează Postat Aprilie 3, 2011 Nu pot sa imi dau seama exact ce vrei sa faci dar in principiu cel mai usor ar fi cu timere. Link spre comentariu
Mad_Turnip Postat Aprilie 3, 2011 Autor Partajează Postat Aprilie 3, 2011 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
Mad_Turnip Postat Aprilie 7, 2011 Autor Partajează Postat Aprilie 7, 2011 intr-adevar a mers cu timer, cu ocazia asta m-am prins cum e si cu astea. gata alarma, lipseste carcasa. mersi Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum