duminică, 23 ianuarie 2011

Arduino si 7-segment display

   Pentru a afisa pe un display cu 7 segmente trebuie mai intai sa identificati pinii display-ului de la 1 la 10.
In tabel se gasesc pinii din arduino care corespund fiecarui pin din display. pinii 3 si 8 sunt GND si de aceea nu apar in tabel.  Mai jos aveti imagini informative despre display.




Arduino Pin7 Segment Pin Connection
 27 (A)
 36 (B)
 44 (C)
 52 (D)
 61 (E)
 79 (F)
 8  10 (G)
 9 5 (DP)


COD:

void setup() {            
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, 1);  // aprinde punct
  delay(100);
}

void loop() {
//punct
digitalWrite(9, 0);
delay(500);

// write '9'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '8'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '7'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(10000);
 // write '6'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '5'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '4'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '3'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(10000);
 // write '2'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(10000);
 // write '1'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(10000);
 // write '0'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(4000);


}

Aceasta varianta este foarte usor de inteles, dar avem mult de muncit la cod. Asa ca voi prezenta si o varianta mai compacta de cod, cu acelasi rezultat.

COD:



// 1 = LED on, 0 = LED off
//                                    Arduino pin: 2,3,4,5,6,7,8
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                                           { 0,1,1,0,0,0,0 },  // = 1
                                                           { 1,1,0,1,1,0,1 },  // = 2
                                                           { 1,1,1,1,0,0,1 },  // = 3
                                                           { 0,1,1,0,0,1,1 },  // = 4
                                                           { 1,0,1,1,0,1,1 },  // = 5
                                                           { 1,0,1,1,1,1,1 },  // = 6
                                                           { 1,1,1,0,0,0,0 },  // = 7
                                                           { 1,1,1,1,1,1,1 },  // = 8
                                                           { 1,1,1,0,0,1,1 }   // = 9
                                                           };


void setup() {                
  pinMode(2, OUTPUT);   
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  writeDot(0); 
}


void writeDot(byte dot) 
{
  digitalWrite(9, dot);
}
    
void sevenSegWrite(byte digit)
 {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount)
   {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
   }
}


void loop() 
{
  for (byte count = 10; count > 0; --count) 
{
   delay(1000);
   sevenSegWrite(count - 1); 
  }
  delay(4000);
}





Controlul unui releu cu Arduino

     Puteti controla un motor DC cu arduino prin intermediul unui releu, insa nu recomand aceasta metoda deoarece polaritatea se schimba brusc si nu puteti controla turatia motorului. In locul motorului se poate pune orice altceva, releul care il folosesc poate fi utilizat ca un switch. Cand releul este deschis trece curent pe o punte iar cealalta este inchisa, cand releul este inchis, puntea prin care trecea curent este inchisa si cealalta este deschisa.



   Uitandu-ne de la stanga la dreapta:

  • primul pin deschide si inchide releul
  • al doilea este GND (pinul comun)
  • al treilea este V1
  • al patrulea este V2
 (Pinii au simetrici pe partea cealalta a releului)

COD:



void setup() {              

  pinMode(12, OUTPUT);   // pinul la care este conectat releul
}

void loop() {
  digitalWrite(12, HIGH);   // merge inainte
  delay(10000);            
  digitalWrite(12, LOW);    // merge inapoi
  delay(10000);            
}



sâmbătă, 22 ianuarie 2011

Arduino si senzor de distanta SHARP

In urmatorul montaj folosesc:
  • Arduino Duemilanove
  • SHARP GP2D120
  • LCD Serial 16x2
  • LED
SHARP GP2D120 este un senzor de distanta analog; cu ajutorul valorilor returnate de acesta putem pune diferite conditii.
In montajul meu senzorul afiseaza valoarea pe LCD iar cand valoarea returnata de senzor e mai mica decat 70, se aprinde un LED. 
 Senzorul se conecteaza la 5v, GND si pinul de semnal la un pin analog din arduino.

COD:

#include SoftwareSerial.h

int IRpin = 0;
int LED = 12;
#define rxPin 2                                                          
#define txPin 3

SoftwareSerial LCD =  SoftwareSerial(rxPin, txPin); 

void setup() {
  pinMode(rxPin, INPUT);                                                 
  pinMode(txPin, OUTPUT);                                                
  pinMode(LED, OUTPUT);                                                   
  LCD.begin(9600);   
}

void loop() {
  float volts = analogRead(IRpin)* ((float) 5 / 1024);
  float distance = 65*pow(volts, -1.10);

   LCD.print("$CLEAR\n\r");
   LCD.print("$GO 1 4\n\r");
   LCD.print("$PRINT Distanta: \n\r");
   LCD.print("\n\r");
   LCD.print("$GO 2 1\n\r");
   LCD.print("$PRINT ");
   LCD.print(distance, DEC);
   LCD.print("\n\r");
  
   delay(100);
   
   if (distance<70)
      digitalWrite(LED, HIGH);                                          
   else
      digitalWrite(LED, LOW);
}


vineri, 21 ianuarie 2011

Senzor lumina


Puteti construi un sensor de lumina foarte usor. Aveti nevoie de cateva fire, o fotorezistenta si o rezistenta . Mai jos atasez o schema dupa care puteti construi senzorul.

VCC se conecteaza la pinul de 5V de la arduino, GND la pinul GND si V_OUT la un pin analog de pe placuta arduino.


COD:

int V_OUT = 0; // conectam la pinul analog 0

int LED =13; // conectam led la pinul 13(la arduino duemilanove este integrat in placuta)

void setup()

{

pinMode(LED, OUTPUT); //seteaza pinul 13 ca iesire

Serial.begin(9600);

}

void loop()

{

if (analogRead(V_OUT)<80)// daca valoarea citita la pinul analog 0 este mai mica de 80

digitalWrite(LED, HIGH); // aprinde ledu-ul

else //altfel

digitalWrite(LED, LOW); // stinge led-ul

Serial.print(analogRead(V_OUT));

}

Senzor de temperatura si lumina

Va voi prezenta cum puteti realiza un termometru digital cu mai multe functii.
Pentru asta folosesc:
  • sensor de temperature LM35Z
  • sensor de lumina( facut dintro fotorezistenta si un potentiometru)
  • LCD Serial 16x2
  • LED
  • Switch
  • Arduino Duemilanove
Pe LCD va fi afisata temperature in grade C pe primul rand si valoarea senzorului de lumina pe randul doi. Cand switch-ul este actionat, pe LCD va aparea temperature in grade C (pe linia de sus in stanga), temperature in grade F (pe randul de sus in dreapta), temperature maxima inregistrata( pe randul doi in stanga) si temperature minima inregistrata (pe randul doi dreapta).
Cand valoarea senzorului de lumina scade sub o anumita valoare se aprinde un LED.
Acest proiect poate fi imbunatatit, eu ofer un exemplu, de aici puteti ajunge oriunde; lasati imaginatia sa zboare:P .
(Afisarea datelor pe un ecran LCD Serial sper sa o intelegeti din explicatiile codului, daca nu lasati un comentariu si o sa postez afisarea datelor pe un LCD Serial cu Arduino Duemilanove)
Mai jos o sa scriu codul apoi voi posta un video.
COD:
/*
Este o aplicatie care foloseste un senzor de temperatura LM35Z, un senzor de lumina (alcatuit dintr-o fotorezistenta si un potentiometru), un intrerupator, un led si un LCDSerial. Aceasta aplicatie este deschisa imbunatatirii.
*/
#include // headeru-l interfetei serial pentru lcd
int tpin = 0; // declarare pin analog 2
int lpin = 1; // declarare pin analog 1
int tempc = 0, tempf = 0; // variabile pentru temperatura
int samples [ 8 ]; // variabila pentru a face o precizare mai buna a temperaturii
int maxi = - 100 , mini = 100; // temperatura maxima/minima
int i; // declarare i
int LED = 12; // declarare pin digital 12
boolean s = 4; // declarare pin digital 4
#define rxPin 2 // definire pin digital 2 pe Rx pentru a nu fi nevoit sa scot pinul cand upload-ez codlu
#define txPin 3 // definire pin digital 3 Tx --||--
SoftwareSerial LCD = SoftwareSerial(rxPin, txPin); // definire pinii Rx si Tx pentru interfata serial a lcd-ului
void setup ( ) // functia in care se stabileste ce rol are fiecare pin
{
pinMode(rxPin, INPUT); // stabileste pin-ul 2 ca intrare (nu este folosit, poate sa lipseasca din program si din aplicatie)
pinMode(txPin, OUTPUT); // stabileste pin-ul 3 ca iesire (este necesar afisarii lcd-ului
pinMode(s, INPUT); // stabileste pin-ul 4 ca intrare
pinMode(LED, OUTPUT); // stabileste pin-ul 12 ca iesire
LCD.begin(9600); // porneste comunicarea prin serial
}
void loop ( ) // corpul functiei
{
led();
for ( i = 0 ; i <= 7 ; i ++ ) // ia 8 valori de temperatura
{
samples [ i ] = (( 4.68 * analogRead( tpin ) * 70.6 ) / 1023.0); // temperatura = (voltajul senzorului * voltajul de intrare din senzor * valoarea echivalenta in milivolti a temperaturii) / 1023 de pasi
tempc = tempc + samples [ i ]; // variabila temperaturii tempc ia valoarea temperaturii calculata mai sus
delay ( 100 ); // asteapta 1 minut
}
tempc = tempc / 8.0; // se imparte la 8 pentru o precizie mai buna
tempf = ( tempc * 9 ) / 5 + 32; // transforma in fahrenheit
if ( tempc > maxi ) { maxi = tempc; } // seteaza temperatura maxima inregistrata
if ( tempc < mini) {mini= tempc;}
if (digitalRead(s)==LOW) // daca valoarea lui "s" este low
{
LCD.print("$CLEAR\n\r"); // sterge lcd-ul
LCD.print("$GO 1 1\n\r"); // muta cursorul pe randul 1 caracterul 1
LCD.print("$PRINT "); // afiseaza
LCD.print ( tempc ); // valoarea afisata
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 1 4\n\r"); // muta cursorul pe randul 1 caracterul 4
LCD.print("$PRINT C \n\r"); // afiseaza C (grade celsius)
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 1 8\n\r"); // muta cursorul pe randul 1 caracterul 8
LCD.print("$PRINT "); // afiseaza
LCD.print ( tempf ); // valoarea afisata
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 1 12\n\r"); // muta cursorul pe randul 1 caracterul 12
LCD.print("$PRINT F \n\r"); // afiseaza F
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 2 1\n\r"); // muta cursorul pe randul 2 caracterul 1
LCD.print("$PRINT "); // afiseaza maximul inregistrat in grade celsius
LCD.print ( maxi ); // afiseaza valoarea
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 2 4\n\r"); // muta cursorul pe randul 2 caracterul 4
LCD.print("$PRINT MAX \n\r"); // afiseaza MAX
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 2 8\n\r");
LCD.print("$PRINT ");
LCD.print ( mini );
LCD.print("\n\r");
LCD.print("$GO 2 12\n\r");
LCD.print("$PRINT MIN \n\r");
LCD.print("\n\r");
delay ( 100 ); // intraziera pentru corpul functiei
}
else // daca valoarea lui "s" este high
{
LCD.print("$CLEAR\n\r");
LCD.print("$GO 1 1\n\r");
LCD.print("$PRINT ");
LCD.print ( tempc );
LCD.print("\n\r");
LCD.print("$GO 1 4\n\r");
LCD.print("$PRINT C \n\r");
LCD.print("\n\r");
LCD.print("$GO 2 1\n\r"); // muta cursorul pe randul 2 caracterul 1
LCD.print("$PRINT "); // afiseaza
LCD.print (analogRead(lpin) ); // valoarea citita la pinul analog 1
LCD.print("\n\r");
LCD.print("$GO 2 4\n\r");
LCD.print("$PRINT Candeli \n\r");
LCD.print("\n\r");
delay(100); // intarzie pentru corpul functiei
}
}
void led()
{
if (analogRead(lpin)<80) // daca valoarea citita la pinul analog 1 este mai mica de 80
digitalWrite(LED, HIGH); // aprinde ledu-ul
else //altfel
digitalWrite(LED, LOW); // stinge led-ul
}