Welcome to Proiecte Electronice
ChatRoom

Proiectul ChatRoom este implementat pe baza unui server si mai multi clienti TCP-IP.
Server-ul ruleaza concurent, asociind fiecaru client cate un thread.
Serverul primeste mesajele de la client si il transmite la toti ceilalti clienti folosind mecanisme de sincronizare a firelor de executie
Protocolul aplicatiei dispune de comenzi speciale, cum ar fi: mesaje private, meniu help, afisarea tuturor utilizatorilor conectati


Aplicatia client Android:


Sistem de recunoastere a numerelor

 
    Ca prima optiune, programul permite introducerea unui numar de maximum 4 cifre cu polaritate(+ -) de la tastatura, iar apoi, ca raspuns, în dispozitivul conectat la iesirea corespunzatoare a placii de sunet a calculatorului, este redat semnalul vocal corespunzator numarului introdus.
    A doua optiune a programuli este reco(inregistrare) In acest caz se va face mai intati o afisare a tuturor optiunilor permise pentru afisare dupa care, in functie de optiunea introdusa, se va inregistra cuvantul corespunzator.Initial, am ales aceasta functie pentru a face inregistrarea cuvintelor de baza mai usoara.De asemenea am ales sa introduc functia in programul final deoarece permite inregistrarea cuvintelor pe diferite voci sau in diferite voci(pentru aceasta ultima optiune consider ca mai trebuie adaugata o rutina pentru alegere limbii in care sa se afiseze meniul). 


                                          

Sistem De Securitate

      Plecand de la proiectul precedent(calculatorul implementat cu arduino), am luat-o pe pasi marunti in realizarea unui sistem de securitate.




    Principiul de gandire este destul de simplu: Introduci un cod de la tastatura,microcontrolerul il memoreaza in RAM(nu in memoria FLASH,la urmatorul reset codul trebuind rememorat,in caz contrar acesta fiind 0) dupa care verifica codurile introduse ulterior.Daca acesta este introdus corect, sitemul actioneaza deschiderea unui motoras de CDROM sau orice altceva va trece prin cap  sa actionati.In schimb, daca codul introdus ulterior nu se potriveste cu cel memorat ,sistemul actionat va reveni in starea initiala si sirena de securitate isi va incepe recitalul:)).
  Trebuie sa mentionez ca motorasul de CC(din CDROM) si sirena sunt alimentate de la o sursa de alimentare externa microcontrolerului si actionate de catre acesta prin intermediul unor relee de CC de 5V
Alarma am realizat-o cu 2x555IC conform schemei de mai jos:

CODUL SURSA:

#include <Keypad.h>
#include <LiquidCrystal.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {4, 3, 2, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5}; //connect to the column pinouts of the keypad

LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  const int motorPin=16;
  const int alarmPin=17;

unsigned int numar1=0, numar2=0,k=0,p=0;
 boolean nr1citit=false;

void setup(){
  pinMode(motorPin,OUTPUT);
  pinMode(alarmPin,OUTPUT);
  Serial.begin(9600);
  lcd.begin(24, 2);
  lcd.print(" Sistem De Securitate ");
  lcd.setCursor(0,1);
lcd.print("****Claudiu Balacescu****");  
digitalWrite(motorPin,LOW);
digitalWrite(alarmPin,LOW);

}




void loop(){
  char key = keypad.getKey();
  if(key){ 
    
   if((key !='*')&&(key !='#')){ 
                        
                         
                           numar1=(numar1*10)+int(key-'0');
                            lcd.setCursor(0,1);
                          lcd.print(numar1);
                          }
                        
                        

    
    
    
    
  if(key=='*'){  digitalWrite(motorPin,LOW);
                 digitalWrite(alarmPin,LOW);

                 
                     k++;
                    if(k==1){
                      numar1=0;
                     lcd.setCursor(0,0);
                     lcd.print("Introduceti Noul COD:         ");
                      lcd.setCursor(0,1);
                      lcd.print("                              ");
                   
                     
                          }
                    else if(k==2){
                      numar2=numar1;
                      lcd.setCursor(0, 0);
                      lcd.print("       Noul Cod Este:             ");
                       lcd.setCursor(0,1);
                          lcd.print("                              ");
                           lcd.setCursor(5,1); 
                          lcd.print(numar2);
                      k=0;
                      }
                     
                     }
   else if(key=='#'){
                     p++;
                     if(p==1){ 
                     digitalWrite(motorPin,LOW);
                      digitalWrite(alarmPin,LOW);

                     numar1=0;
                     lcd.setCursor(0,0);
                     lcd.print("  INTRODUCETI CODUL:    ");     
                    lcd.setCursor(0,1);
                    lcd.print("                         ");                     
                          }
                     else if(p==2){
                                    if(numar2==numar1){
                                        lcd.setCursor(0,0);
                                      lcd.print("  CODUL INTRODUS CORECT!!!   ");  
                                      
                                      digitalWrite(motorPin,HIGH);
                                      digitalWrite(alarmPin,LOW);

                                                               
                                                             
                                                        }
                                        else if(numar2!=numar1){
                                         digitalWrite(motorPin,LOW);
                                         digitalWrite(alarmPin,HIGH);
                                        lcd.setCursor(0,0);
                                      lcd.print("  COD INTRODUS GRESIT !!!  ");
                                            }                     
                                   p=0;
                                 }
                     }                



  }
   
}

CALCULATOR NUMERIC IMPROVIZAT CU ARDUINO


      Implementarea acestui proiect necesita urmatoarele componente:
-Arduino Board(in cazul meu Arduino UNO);
-tastatura numerica (4x3 keypad);
-Modul  LCD  controlat de un microcontroller HD44780A00 sau echivalent(interfata de comunicatie este de tip paralel);
-rezistente;
-3x push-buttons;










Celor interesati de realizarea acestui proiect le pot oferi toate indicatiile si materialele de care au nevoie(codul sursa si eventual conexiunile daca imaginile de mai jos nu ofera o foarte buna intelegere).

     Cateva demonstratii:
   

   
       

               
CODUL SURSA:




#include <Keypad.h>
#include <LiquidCrystal.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {4, 3, 2, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5}; //connect to the column pinouts of the keypad
const int butonScadere=16;
const int butonInmultire=17;
const int butonImpartire=18;
const int butonRadical=19;
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 

unsigned int numar1=0, numar2=0;
 boolean nr1citit=false,opAdunare=false, opScadere=false, opInmultire=false, opImpartire=false;
void setup(){
  pinMode(butonScadere,INPUT);
  pinMode(butonInmultire,INPUT);
  pinMode(butonImpartire,INPUT);
  pinMode(butonRadical,INPUT);
  Serial.begin(9600);
  lcd.begin(24, 2);
  lcd.print("calculator improvizat");

}
 
void loop(){
  char key = keypad.getKey();
  if(key){
 if((key !='*')&&(key !='#')){
   
                       if(!nr1citit){
                          numar1=(numar1*10)+int(key-'0');
                          lcd.setCursor(0,1);
                          lcd.print(numar1);
                         
                                   }
                        else if(nr1citit){
                         numar2=(numar2*10)+int(key-'0');
                          lcd.setCursor(8,1);
                          lcd.print(numar2);
                       
                        }
                            }
 
  else if(key=='*'){
                   
                     lcd.setCursor(6,1);
                     lcd.print("+");
                     nr1citit=true;
                     opAdunare=true;
                   
                     }
   else if(key=='#'){
                   
                   
                     lcd.setCursor(13,1);
                     lcd.print("=");
                                   if(opAdunare){
                                               
                                                 double suma=numar1+numar2;
                                                 lcd.setCursor(15,1);
                                                 lcd.print(suma);
                                                 delay(10000);
                                                   }
                                     else if(opScadere){
                                                     
                                                      double dif=numar1-numar2;
                                                       lcd.setCursor(15,1);
                                                       lcd.print(dif);
                                                        delay(10000);
                                                       
                                                       }
                                      else if(opInmultire){
                                                            double prod=numar1*numar2;
                                                       lcd.setCursor(15,1);
                                                       lcd.print(prod);
                                                        delay(10000);
                                                           }
                                       else if(opImpartire){
                                                            double cat=numar1/numar2;
                                                       lcd.setCursor(15,1);
                                                       lcd.print(cat);
                                                        delay(10000);
                                                              }
                                     
                    lcd.setCursor(0,1);
                    lcd.print("                         ");                                  
                     numar1=numar2=0;
                     nr1citit=false;
                     opAdunare=opScadere=opInmultire=opImpartire=false;
 
                     }              
 
  }
 else if (digitalRead(butonScadere)){
                                     lcd.setCursor(6,1);
                                     lcd.print("-");
                                     nr1citit=true;
                                     opScadere=true;
                                     }
 
else if (digitalRead(butonInmultire)){
                                     lcd.setCursor(6,1);
                                     lcd.print("*");
                                     nr1citit=true;
                                     opInmultire=true;
                                     }
                                   
else if (digitalRead(butonImpartire)){
                                     lcd.setCursor(6,1);
                                     lcd.print(":");
                                     nr1citit=true;
                                     opImpartire=true;
                                     }
 
}

AFISAJ CU MATRICE DE LEDURI(8X8)

         
              Pentru implementarea acestei aplicatii am folosit o matrice de leduri cu anod comun si un microcontroler ARDUINO UNO.Pentru a comanda matricea de leduri am folosit pinii digital ai microcontrolerului dar cum acesta are doar 13 pini de acest tip( dintre care primii doi sunt folositi si de modulul de transmisie seriala) iar matricea necesita 16 pini (8 linii si 8 coloane) vom folosi (seta)  4 pini ai portului analogic ca pini digitali. 






            Configuratia pinilor dintre cele doua module (pe baza diagramei pinilor matricei)este urmatoarea:
                      













CODUL SURSA:




const int row[8] = {

  2,7,19,5,13,18,12,16 };

const int col[8] = {
  6,11,10,3,17,4,8,9  };

int i,j,k=0;
int pixels[8][8];
int C[8][8]= {
  {1,1,1,1,1,1,1,1},
  {1,1,0,0,0,1,1,1},
  {1,0,1,1,0,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,1,1,0,1,1,1},
  {1,1,0,0,0,1,1,1},
  {1,1,1,1,1,1,1,1}
  };  
int L[8][8]= {
  {1,1,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,0,0,0,0,1,1,1},
  {1,1,1,1,1,1,1,1}
  };  
  int A[8][8]={
  {1,1,1,0,1,1,1,1},
  {1,1,0,1,0,1,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,0,1,0,1,1},
  {1,0,0,0,0,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,1,1,1,1,1,1,1}
  };  
  int U[8][8]= {
  {1,1,1,1,1,1,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,1,0,0,0,1,1,1},
  {1,1,1,1,1,1,1,1}
  }; 
 int D[8][8]= {
  {1,1,1,1,1,1,1,1},
  {1,0,0,0,1,1,1,1},
  {1,0,1,1,0,1,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,1,0,1,1},
  {1,0,1,1,0,1,1,1},
  {1,0,0,0,1,1,1,1},
  {1,1,1,1,1,1,1,1}
  };  
 int I[8][8]= {
  {1,1,1,1,1,1,1,1},
  {1,1,0,0,0,1,1,1},
  {1,1,1,0,1,1,1,1},
  {1,1,1,0,1,1,1,1},
  {1,1,1,0,1,1,1,1},
  {1,1,1,0,1,1,1,1},
  {1,1,0,0,0,1,1,1},
  {1,1,1,1,1,1,1,1}
  };  
  

void setup() {
  Serial.begin(9600);
  
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    pinMode(col[thisPin], OUTPUT); 
    pinMode(row[thisPin], OUTPUT);  
    digitalWrite(col[thisPin], HIGH);    
                                                                   }


}

void loop() {

  

 if(k==0){

 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=C[i][j];}
                  }
 }
 else if(k==1){
 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=L[i][j];}
                  }
 }

  else if(k==2){
 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=A[i][j];}
                  }
 }
   else if(k==3){
 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=U[i][j];}
                  }
 }
   else if(k==4){
 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=D[i][j];}
                  }           
 }
 else if(k==5){
 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=I[i][j];}
                  }           
 }
 else if(k==6){
 for(i=0;i<8;i++){
                  for(j=0;j<8;j++){pixels[i][j]=U[i][j];}
                  }           
 }

  
  for(int x=0;x<1000;x++){
  refreshScreen();}
  delay(50);
  k++;
  if(k>6) {
    delay(1000);
    k=0;
  }
}

void refreshScreen() {

                             for (int thisRow = 0; thisRow < 8; thisRow++) {
                            digitalWrite(row[thisRow], HIGH);
                           for (int thisCol = 0; thisCol < 8; thisCol++) {
                           int thisPixel = pixels[thisRow][thisCol];
                          digitalWrite(col[thisCol], thisPixel);
                          if (thisPixel == LOW) {
                        digitalWrite(col[thisCol], HIGH);
                                                                }
                               }
                digitalWrite(row[thisRow], LOW);
                                                                                                }
}







                                                         
                                             





CEAS DIGITAL IMPLEMENTAT CU MICROCONTROLERUL MSP430 G2553


                                     
        Componentele electronice necesare(hardware-ul):

·         -kitul de dezvoltare MSP430 Launch Pad bazat pe microcontrolerul MSP439 G2553 sau unul compatibil
·         -6 tranzistoare pnp(bc 547);
·         -6 rezitente cu valoarea de 1Kohm
·         -8 rezistente cu valori intre 100 si 200 ohmi;
·         -3 afisaje duble cu segmente;


Pinii portului P1 ai microcontrolerului sunt programati pentru a afisa numere pe un digit al unui afisaj.Tranzistoarele sunt folosite pentru  a aprinde fiecare digit al afisajelor(unul singur la un moment  dat,celelalte fiind stinse).Datorita frecventei de lucru foarte mare a  microprocesorului (8MHz,aceasta frecventa a fost obtinuta configurand modulul generator de tact Basic Clock Module+afisajele sunt percepute de ochiul uman ca fiind toate aprinse .

Schema electronica este prezentata in continuare:



  

Codul sursa(.c) necesar programarii microcontrolerlui este prezentat in continuare:


#include "io430.h"
#include <math.h>

int numere[10][8]={
// a b  c  d  e  f  g  .
{ 1, 1, 1, 1, 1, 1, 0,0}, // 0
{ 0, 1, 1, 0, 0, 0, 0,0}, // 1
{ 1, 1, 0, 1, 1, 0, 1,0}, // 2
{ 1, 1, 1, 1, 0, 0, 1,0}, // 3
{ 0, 1, 1, 0, 0, 1, 1,0}, // 4
{ 1, 0, 1, 1, 0, 1, 1,0}, // 5
{ 1, 0, 1, 1, 1, 1, 1,0}, // 6
{ 1, 1, 1, 0, 0, 0, 0,0}, // 7
{ 1, 1, 1, 1, 1, 1, 1,0}, // 8
{ 1, 1, 1, 1, 0, 1, 1,0}  // 9
};

void genereaza(int n){
for(int i=0;i<8;i++){
int a=pow(2,i);
if (numere[n][i]==1) {
P1OUT=a^255;}
else if (numere[n][i]==0) P1OUT=255;
}
}
void afisare(int val1,int val2,int val3,int val4,int val5,int val6){
P2OUT=0x3f^0X01;
genereaza(val1);
P2OUT=0x3f^0X02;
genereaza(val2);
P2OUT=0x3f^0X04;
genereaza(val3);
P2OUT=0x3f^0x08;
genereaza(val4);
P2OUT=0X3f^0X10;
genereaza(val5);
P2OUT=0x3f^0X20;
genereaza(val6);
}
int main( void )
{
BCSCTL1=0x8D;
DCOCTL=0x86;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
int valoare1=0,valoare2=0,valoare3=0,valoare4=0,valoare5=0,valoare6=0,k=0;
P1DIR=0XFF;
P2DIR=0X3f;
TACCR0=0XF3F1;
TACTL=0x2D0;
for(;;){
if(TACTL&0X01)k++;
if(k%50==0){valoare1++;k=0;}
if (valoare1>9) {valoare1=0;
valoare2++;
valoare1=0;

}
if(valoare2>5){
valoare1=0;
valoare2=0;
valoare3++;
}
if(valoare3>9){
valoare1=0;
valoare2=0;
valoare3=0;
valoare4++;
}
if(valoare4>5){
valoare1=0;
valoare2=0;
valoare3=0;
valoare4=0;
valoare5++;
}
if(valoare5>9){

valoare1=0;
valoare2=0;
valoare3=0;
valoare4=0;
valoare5=0;
valoare6++;
}
if(valoare6>9){

valoare1=0;
valoare2=0;
valoare3=0;
valoare4=0;
valoare5=0;
valoare6=0;
}

afisare(valoare1,valoare2,valoare3,valoare4,valoare5,valoare6);
}

}




Girofar

           
         Componenta cea mai importanta a acestui girofar este numaratorul decadic 4017 care functioneaza pe baza unor impulsuri de tact.Aceste impulsuri sunt generate de catre integratul 555 care impreuna cu o rezistenta externa si un condensator extern poate fi folosit ca un monostabil sau astabil.Frecventa sau perioada impulsurilor de tact se poate modifica odata cu modificarea valorii rezistentei sau a condensatorului extern. 
        Pentru a ajusta frecventa impusrilor de tact, in locul rezistentei de 22Kohmi se poate pune un potentiometru reglabil(10Mohmi) sau condensatorul de 2.2uF poate fi inlocuit cu unul reglabil.
       Deoarece integratele sunt realizate in tehnologie CMOS,tensiunea de alimentare a acestora este cuprinsa intre 3V-16V.


       Schema electronica pe care am folosit-o este cea alaturata: