Plecand de la proiectul precedent(calculatorul implementat cu arduino), am luat-o pe pasi marunti in realizarea unui sistem de securitate.
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;
}
}
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);
}
}
Acest proiect necesita urmatoarele componente HARDWARE:
Acest proiect necesita urmatoarele componente electronice:
-placa arduino
-un potentiometru de 10 Kohmi;
-8 rezistente de 200-300 ohmi;
-8 leduri;
Cei doi pini marginali ai potentiometrului se conecteaza unul 5V respectiv la GND.Cel de-al treilea pin (cel din mijloc) se conecteaza la intrarea analogica A0;
Masa(GND) corespunde pinului GND al placutei arduino.
Functia folosita pentru a citi valoarea rezistentei potentiometrui este: analogRead. Sintaxa acestei functii este urmatoarea: analogRead(pin).
Citirea valorii de tensiune furnizata de potentiometru se face serial si prin functiaurmatoare:
Serial.begin(9600),aceasta realizand o conexiune seriala
intre PC si ARDUINO,conexiune care transmite 9600 biti/sec intre cele 2 termnale.
CODUL SURSA:
Din aplicatia precedenta,cea cu semaforl rutier, mi-a venit ideea sa fac un numarator binar pe 4 biti, conceptul fiind acelasi.
In primul rand,fiind un numarator binar pe 4 biti,sunt necesare 4 leduri pentru a indica toate numerele binare pe 4 biti adica numerele de la 0 la 15(2^4 numere).
Printr-o rezistenta de 270 ohmi mai conectam un led de la pinul digital 6 la masa,schema electronica ramanand aceeasi cu cea a semaforului.
CODUL SURSA:
//program NUMARATOR BINAR
int redPin=2;
int yellowPin=3;
int greenPin=4;
int bluePin=6;
int buttonPin=5;
int state=0;
void setup(){
pinMode(redPin,OUTPUT);
pinMode(yellowPin,OUTPUT);
pinMode(greenPin,OUTPUT);
pinMode(buttonPin,INPUT);
pinMode(bluePin,OUTPUT);
}
void loop(){ if(digitalRead(buttonPin)){
if(state==0){
oscilare(LOW,LOW,LOW,HIGH);
state=1;
}
else if(state==1){
oscilare(LOW,LOW,HIGH,LOW);
state=2;
}
else if(state==2){
oscilare(LOW,LOW,HIGH,HIGH);
state=3;
}
else if(state==3){
oscilare(LOW,HIGH,LOW,LOW);
state=4;
}
else if(state==4){
oscilare(LOW,HIGH,LOW,HIGH);
state=5;
}
else if(state==5){
oscilare(LOW,HIGH,HIGH,LOW);
state=6;
}
else if(state==6){
oscilare(LOW,HIGH,HIGH,HIGH);
state=7;
}
else if(state==7){
oscilare(HIGH,LOW,LOW,LOW);
state=8;
}
else if(state==8){
oscilare(HIGH,LOW,LOW,HIGH);
state=9;
}
else if(state==9){
oscilare(HIGH,LOW,HIGH,LOW);
state=10;
}
else if(state==10){
oscilare(HIGH,LOW,HIGH,HIGH);
state=11;
}
else if(state==11){
oscilare(HIGH,HIGH,LOW,LOW);
state=12;
}
else if(state==12){
oscilare(HIGH,HIGH,LOW,HIGH);
state=13;
}
else if(state==13){
oscilare(HIGH,HIGH,HIGH,HIGH);
state=14;
}
else if(state==14){
oscilare(LOW,LOW,LOW,LOW);
state=0;
}
delay(500);}
}
void oscilare(int blue,int red,int yellow,int green){
digitalWrite(bluePin,blue);
digitalWrite(redPin,red);
digitalWrite(yellowPin,yellow);
digitalWrite(greenPin,green);
}
Persoane interesate
Categories
- arduino (8)
- Electronica Digitala (1)
- Java/Android (1)
- matlab (1)
- MSP 430 (1)








