sisteme cu microcontroler

18
1 if ( digitalRead(eastButton) == HIGH ) // { if ( trafficWest == true ) //continua numai dacă fluxul de trafic este în opus (est) direc ia ț { trafficWest = false! // dela"(flo#$ime)! // digitalWrite(#estGreen% &'W)! // sc im ă spre est lumina din gal en în ro u ș digitalWrite(#est*ello#% HIGH)! dela"(c ange+ela")! digitalWrite(#est*ello#% &'W)! digitalWrite(#estRed% HIGH)! dela"(c ange+ela")! for ( int a = , ! a - . ! a ) // gal en intermintent { digitalWrite(east*ello#% &'W)! dela"("ello#Blin0$ime)! digitalWrite(east*ello#% HIGH)! dela"("ello#Blin0$ime)! 1 digitalWrite(east*ello#% &'W)! digitalWrite(eastRed% &'W)! // sc im ă repede lumina din erde ro u în er ș digitalWrite(eastGreen% HIGH)! 1 1 Schi ț a noastră începe prin utilizarea #define pentru a f digitală. Numerele sunt cu etichete pentru toate LED-urile utiliz i ș pentru cele două utoane. !"em LED-uri ro ii, galene, precum i "erzi i un uton pentru ș ș ș fiecare latură "estică i ș latură estică a podului. raffic$est "ariailă oo este utilizat pentru a urmări în ce fel traficul merge %flo&ing' "est la est, i ș fals este la est la "est. Notă ' sera i că traficul 2est are o singură aria ilă ooleană cu direc ia t ț ț sta ilit% fie adeărat% fie fals3 Beneficiind de o singură aria ilă în loc pentru est i una pentru est) se asigură că am ele directii nu poate fi acciden ș

Upload: adrianosas

Post on 08-Oct-2015

19 views

Category:

Documents


0 download

DESCRIPTION

edfg

TRANSCRIPT

if ( digitalRead(eastButton) == HIGH ) // cere traficul east>west

if ( digitalRead(eastButton) == HIGH ) //

{

if ( trafficWest == true )

//continua numai dac fluxul de trafic este n opus (vest) direcia

{

trafficWest = false; //

delay(flowTime); //

digitalWrite(westGreen, LOW);

// schimb spre vest lumina din galben n rou digitalWrite(westYellow, HIGH);

delay(changeDelay);

digitalWrite(westYellow, LOW);

digitalWrite(westRed, HIGH);

delay(changeDelay);

for ( int a = 0 ; a < 5 ; a++ ) // galben intermintent

{

digitalWrite(eastYellow, LOW);

delay(yellowBlinkTime);

digitalWrite(eastYellow, HIGH);

delay(yellowBlinkTime);

}

digitalWrite(eastYellow, LOW);

digitalWrite(eastRed, LOW); // schimb repede lumina din verde rou n verde digitalWrite(eastGreen, HIGH);

}

}

Schia noastr ncepe prin utilizarea #define pentru a fi asociat cu o dat digital. Numerele sunt cu etichete pentru toate LED-urile utilizate, precum i pentru cele dou butoane. Avem LED-uri roii, galbene, precum i verzi i un buton pentru fiecare latur vestic i latur estic a podului. TrafficWest variabil boolean la v este utilizat pentru a urmri n ce fel traficul merge (flowing) - adevrat este de la vest la est, i fals este la est la vest.

Not

Observai c traficul Vest are o singur variabil boolean cu direcia traficului stabilit, fie adevrat, fie fals. Beneficiind de o singur variabil n loc de dou (una pentru est i una pentru vest) se asigur c ambele directii nu poate fi accidental adevrate n acelai timp, fapt ce contribuie la evitarea unui accident!

ntreg timpul de debit variabil la west este perioada minim de timp n care vehiculele trebuie s traverseze podul. Atunci cnd un vehicul accelereaz la lumina roie, sistemul ntrzie aceast perioad pentru a da timp traficului din sens opus s traverseze podul. ntreg sistemul schimbare Delay, variabil la x, este perioada de timp dedicat schimbrii culorii semaforului de la verde, la galben, la rou. nainte ca schia s intre n seciunea de gol bucl (), este stabilit pentru trafic s curg de la vest la est, n configurare nul ().

Rularea Schiei:

Dup ce ruleaz, schia nu face nimic pn cnd unul dintre butoane este apsat. Cnd butonul de est este apsat, linia:

if (trafficWest == true)

asigur c se schimb luminile doar n cazul n care traficul se ndreapt n direcia opus. Restul seciunii codului este compus dintr-o simpl secven de marcat pornirea i oprirea a diverse LED-uri pentru a simula operaia luminrii traficului.

Semnale analogice vs. digitale

n aceast seciune, vei afla diferena ntre semnalele digitale i analogice, i vei nva cum se msoar semnalele analogice cu analogul cu pini de intrare.

Pn n prezent, schitele noastre au folosit semnale electrice digitale, cu doar dou niveluri distincte. Mai exact, am folosit digitalWrite (pin, HIGH) i digitalWrite (pin, LOW) s clipeasc un LED i digitalRead () pentru a msura dac o dat digital a avut o tensiune aplicat la ea (HIGH) sau nu (LOW). Figura 4-28 este o reprezentare vizual a unui semnal digital, care alterneaza intre mare si mic.

Figura 4-28: Un semnal digital, cu maxime care apar linii orizontale ca n partea de sus, i minime care apar n partea de jos

Spre deosebire de semnalele digitale, semnalele analogice pot varia orict ntre treptele high i low. De exemplu, Figura 4-29 prezint un semnal de und sinusoidal. Observaii n figur c, timpul progreseaza, tensiunea se mic fluid ntre nivelurile nalte i joase.

Figura 4-29: Un semnal analogic de und sinusoidal

Cu Arduino, mare este mai aproape de 5 V i sczut este mai aproape de 0 V, sau GND. Putem msura valorile de tensiune ale unui semnal analog cu Arduino folosind cele ase intrri analogice prezentate n Figura 4-30. Aceste intrri analogice pot msura n condiii de siguran tensiuni de la 0 (GND) pn la 5 V. Dac utilizai analogRead funcia (), dect Arduino va reveni un numr ntre 0 i 1023 proporional cu tensiunea aplicat la pinul analogic. De exemplu, ai putea utiliza analogRead () pentru a stoca valoarea analog dat la zero n variabila A.

a = analogRead (0); // Citeste intrare analog dat 0 (A0)

// Revine 0-1023, care este, de obicei, 0.000-4.995 voli

Proiect # 6: crearea unui tester de baterie cu o singur celul

Dei popularitatea i utilizarea de baterii cu celule a sczut, cei mai muli oameni nc au dispozitive din jurul casei care folosesc AA, AAA, C, D sau celul baterii, cum ar fi telecomenzi, ceasuri, sau jucrii pentru copii. Aceste baterii transporta mult mai puin dect 5 V, astfel nct s putem msura o celul de tensiune cu Arduino nostru pentru a determina starea celulei. In acest proiect vom crea un tester baterie.

Obiectivul

Bateriile cu celule unice, cum ar fi AA, de obicei, ncep de la aproximativ 1,6 V cnd sunt noi i apoi scad odat cu utilizarea lor. Vom msura tensiunea i vom exprima condiia bateriei vizual cu LED-uri. Vom folosi citirea din analogRead () i apoi vom converti citirea n voli. Tensiunea maxim care poate fi citit este de 5 V, asa c am mpri 5 la 1024 (numrul de valori posibile), care este egal 0.0048. Prin urmare, dac analogRead () ntoarce 512, atunci vom multiplica cu 0.0048, care este egal cu 2.4576 V.

Iat algoritmul de funcionare al bateriei noastre tester:

1. Citii din pinul analogic zero.

2. Inmulii citirea de 0.0048 pentru a crea o valoare de tensiune.

3. Dac tensiunea este mai mare sau egal cu 1,6 V, apoi pornii scurt LED ul verde.

4. n cazul n care tensiunea este mai mare de 1,4 V i mai puin de 1,6 V, atunci porniti LED ul galben.

5. n cazul n care tensiunea este mai mic de 1,4 V, apoi pornii scurt LED ul rou.

6. Repetai pe termen nelimitat.

Iat ce vei avea nevoie pentru a crea acest proiect:

Trei rezistori de 560 W (R1 la R3)

Un rezistor 2,2 kW (R4)

Un LED verde (LED1)

Un LED galben (LED2)

Un LED rou (LED3)

Un breadboard

Diverse fire de conectare

Un Arduino i cablu USB

Schema pentru circuitul tester baterie este prezentat n Figura 4-31.

Pe partea stng, observai cele dou terminale, marcat + i -. Conectai prile ce se potrivesc de o parte i de alta a bateriei formate dintr-o singur celul, pentru a fi testate n acele puncte. Pozitiv ar trebui s se conecteze la pozitiv, i negativ trebuie s se conecteze la negativ. AVERTISMENT n nici un caz nu ar trebui s v msoare mai mult de 5 V, nici s conectai pozitivul la negativ, sau invers. Fcnd aceste lucruri se va deteriora produsul Arduino bord.

Figura 4-31: Schema Proiectului 6

Schia#define newLED 2 //

#define okLED 4 //

#define oldLED 6 //

int analogValue = 0;

u float voltage = 0;

int ledDelay = 2000;

void setup()

{

pinMode(newLED, OUTPUT);

pinMode(okLED, OUTPUT);

pinMode(oldLED, OUTPUT);

}

void loop()

{

v analogValue = analogRead(0);

w voltage = 0.0048*analogValue;

x if ( voltage >= 1.6 )

{

digitalWrite(newLED, HIGH);

delay(ledDelay);

digitalWrite(newLED, LOW);

}

else if ( voltage < 1.6 && voltage > 1.4 )

{

digitalWrite(okLED, HIGH);

delay(ledDelay);

digitalWrite(okLED, LOW);

}

else if ( voltage Mai mare

= Mai mare sau egal cu

Am folosit aceti operatori de comparaie pentru a compara numerele n linii x, n schia de proiect 6, descris mai devreme. mbuntirea preciziei de msurare analog cu un referin de tensiune. Aa cum sa demonstrat n proiect 6, funcia analogRead () returneaz o valoare proporional cu o tensiune ntre 0 i 5 V. Valoarea superioar (5 V) este tensiunea de referin, tensiunea maxim acceptat de intrrile analogice Arduino va accepta i va reveni la cea mai mare valoare de (1023). Pentru a spori precizia n timp ce se citesc tensiuni chiar mai mici, putem folosi o tensiune de referin inferioar. De exemplu, atunci cnd tensiunea de referin este de 5 V, analogRead () reprezint acest lucru cu o valoare de la 0 la 1023. Cu toate acestea, dac avem nevoie s msurm doar o tensiune cu un maxim de (de exemplu) 2 V, atunci se poate modifica ieirea Arduino pentru a reprezenta 2 V, folosind valoarea gama 0-1,023 pentru a permite msurarea mai precis. Putei face acest lucru folosind o tensiune de referin extern sau intern.

Prima metod const n a folosi o tensiune de referin Aref (de referin analog) PIN-ului, aa cum se arat n Figura 4-32. Putem introduce o nou referin de tensiune la conectarea tensiunii n PIN-ul AREF i o potrivire GND la GND ul Arduino. Reinei c acest lucru poate reduce tensiunea de referin, dar nu se va ridica, pentru c tensiunea de referin conectat la un Arduino Uno nu trebuie s depeasc 5 V. Un mod simplu de a stabili o tensiune de referin inferioar este prin crearea unei divizor de tensiune cu dou rezistene, aa cum se arat n Figura 4-33.

Figura 4-33: Divizor de tensiune

Valorile R1 i R2 va determina tensiunea de referin conform urmtoarei formule:

V out este tensiunea de referin, i V in este tensiunea de intrare n acest caz de 5 V. R1 i R2 sunt valorile rezistorilor n ohmi. Cel mai simplu mod de a mpri tensiunea este de a diviza V la jumtate prin stabilirea R1 i R2 dup acelai exemplu avnd valoarea pentru fiecare de 10 kW . Cnd faci acest lucru, cel mai bine este s utilizai rezistene de toleran mai mici, cum ar fi de 1; se confirma valorile lor de rezisten reale cu un multimetru. Valorile sunt confirmate n calcul. Mai mult dect att, este, de asemenea, o idee foarte bun de a plasa un condensator nF de 100 dintre AREF i GND, pentru a evita un AREF zgomotos i pentru a preveni instabilitatea analogului readings. Cnd folosim o tensiune de referin extern, introducei urmtoarea linie n partea de void setup () din schia dumneavoastr:

analogReference(EXTERNAL); // select AREF pin for reference voltage

Utilizarea referinei de tensiune intern

Arduino Uno are, de asemenea, un 1.1 V tensiune de referin intern. Dac aceast satisface nevoile dumneavoastra, sunt necesare modificri hardware. Doar adugai aceast linie la void setup():

analogReference(INTERNAL); // select internal 1.1 V reference voltage

Rezistori variabiliRezistorii variabili, de asemenea, cunoscui sub numele de poteniometre, pot fi, n general, ajustai de la 0 W pn la valoarea lor nominal. Simbol lor schematic este prezentat n Figura 4-34. Rezistenele variabile au trei conexiuni cu pini: unul din PIN centru i unul pe fiecare parte. Pe msur ce arborele de un rezistor variabil transform, aceasta crete rezistena ntre o parte i centru i scade rezistena ntre centru i n partea opus.

Rezistene variabile sunt disponibile ca liniar i logaritmic. Rezistena de modele liniare se schimb ntr-un ritm constant, atunci cnd ia o cotitur, n timp ce rezistena de modele logaritmice se schimb ncet la nceput i apoi crete repede. Poteniometre logaritmice sunt folosite mai des ca amplificator audio n circuite, pentru a modela rspunsul auzului uman. Proiectele Arduino folosesc cele mai variabile rezistene liniare, cum ar fi cel prezentat n figura 4-35.

Figura 4-34:

Figura 4-35:

Simbolul unui rezistor variabil

Poteniometru

Putei obine, de asemenea, versiuni in miniatura ale rezistene variabile, cunoscut sub numele de trimpots sau trimmere (a se vedea figura 4-36). Din cauza dimensiunii lor, trimpots sunt mai utili pentru a face ajustri n circuite, dar sunt, de asemenea, foarte utili pentru munca breadboard, deoarece acestea pot fi crestate .

Figura 4-36: Diferite tipuri de trimmeri

Buzzere piezoelectrice

Un element piezoelectric (piezo pentru scurt), sau soneria, este un dispozitiv mic, rotund care poate fi folosit pentru a genera zgomote puternice i enervante, care sunt perfecte pentru alarme-sau pentru distracie. Figura 4-37 prezint un exemplu comun, TDK PS1240, alturi de un sfert american, pentru a v oferi o idee de dimensiunea sa. Figura 4-37: TDK PS1240 Piezo conine o plac foarte subire n interiorul carcasei care se mic atunci cnd o se aplic curent electric.

Figura 4-37: Buzzer Piezoelectric

Cnd curentul alternativ este aplicat (cum ar fi pe. . . off. . . pe. . . off), placa vibreaz i genereaz unde sonore. Este simplu de utilizat piezos cu Arduino, deoarece acestea pot fi pornite i de pe la fel ca un LED. Elementele piezo nu sunt polarizate i poate fi conectate n orice direcie. Simbolul schematic pentru piezo arata ca un difuzor (Figura 4-38), ceea ce l face uor de recunoscut.

Figura 4-38 - Simbolul unui Buzzer Piezoelectric

Proiectul # 7: ncercarea unui buzzer piezo

#define PIEZO 3 // pin 3 PWM

int del = 500;

void setup()

{

pinMode(PIEZO, OUTPUT);

}

void loop()

{

analogWrite(PIEZO, 128); //

delay(del);

digitalWrite(PIEZO, LOW); //

delay(del);

}

Aceast schi utilizeaz modulaie puls-lime pe trei date digitale. Dac modificai ciclul de lucru n funcia de analogWrite () (n prezent este 128, care este de 50 la sut pe) la u puteti modifica volumul buzzer.To creterea volumului piezo ta, crete tensiunea aplicat ea. Tensiunea este n prezent limitat la 5 V, dar soneria ar fi mult mai tare la 9 sau 12 V. Pentru tensiuni mai mari nu pot fi obinute de la Arduino, va trebui s utilizai o surs de alimentare extern pentru buzzer, cum ar fi o baterie de 9 V, iar apoi trece puterea n soneria cu ajutorul unui tranzistor ca un comutator electronic. Putei folosi aceeai schita prezentat schematic n figura 4-39.

Figura 4-39

Schema electric a Proiectului 7.

Proiectul # 8: Crearea unui termometru cu citire rapid

Temperatura poate fi reprezentat de un semnal analogic. Putem msura temperatura folosind tensiunea TMP36 Senzor de temperatur de ieire fcute de Analog Devices (http://www.analog.com/tm 36/), se arat n figura 4-40. Observai c TMP36 arata la fel ca BC548 tranzistor am lucrat cu n circuitul de comand al releului n Capitolul 3. TMP36 emite o tensiune care este proportional cu temperatura, astfel nct s putei stabili temperatura curent folosind o conversie simpl. De exemplu, la 25 de grade Celsius, tensiunea de ieire este de 750 mV, iar fiecare schimbare a temperaturii de 1 grad conduce la o schimbare de 10 mV.TMP36 poate msura temperaturi cuprinse ntre -40 i 125 de grade Celsius. Funcia analogRead () va ntoarce o valoare ntre 0 i 1023, ceea ce corespunde la o tensiune ntre 0 i aproape 5.000 mV (5 V). Dac ne multiplica producia de analogRead () cu (5.000 / 1.024), atunci vom primi tensiunea efectiv returnat de senzor. Mai departe, scdem 500 (un offset utilizate de TMP36 pentru a permite temperaturi sub zero) i apoi mprii cu 10, care ne las cu temperatura n grade Celsius. Dac lucrai n Fahrenheit, apoi multiplica valoarea cu 1.8 grade Celsius i se adaug 32 la rezultat.

Figura 4-40

Senzor de temperatur

Obiectivul

n acest proiect, vom folosi TMP36 pentru a crea un termometru rapid de citit. Cnd temperatura scade sub 20 de grade Celsius, un LED albastru se transform pe. Cnd temperatura este cuprins ntre 20 i 26 de grade, un LED verde se aprinde, iar cnd temperatura este de peste 26 de grade, un LED rou se aprinde.

Hardware

Iat ce vei avea nevoie pentru a crea acest proiect:

Trei 560 W rezistori (R1 la R3)

Un LED rou (LED1)

Un LED verde (LED2)

Un LED albastru (LED3)

Un senzor de temperatur TMP36

Un breadboard

Diverse fire de conectare

Arduino i USB cableThe schematic

Circuitul este simplu. Cnd te uii la partea inscripionat a TMP36,

pinul din stnga se conecteaz la intrarea 5 V, pinul central este tensiunea

ieire, iar tiftul din dreapta se conecteaz la GND aa cum se arat n Figura 4-41.

Figura 4-41

Schema electric a Proiectului 8

#define HOT 6

#define NORMAL 4

#define COLD 2

float voltage = 0;

float celsius = 0;float hotTemp = 26;

float coldTemp = 20;

float sensor = 0;

void setup()

{

pinMode(HOT, OUTPUT);

pinMode(NORMAL, OUTPUT);

pinMode(COLD, OUTPUT);

}

void loop()

{

// citirea temperaturii

sensor = analogRead(0);

voltage = (sensor*5000)/1024; //

voltage = voltage-500; //

celsius = voltage/10; //

// act on temperature range

v if ( celsius < coldTemp )

{

digitalWrite(COLD, HIGH);

delay(1000);

digitalWrite(COLD, LOW);

}

w else if ( celsius > coldTemp && celsius hotTemp

digitalWrite(HOT, HIGH);

delay(1000);

digitalWrite(HOT, LOW);

}

}.

Schia citete mai nti tensiunea de la TMP36 i l transform n Temperatura n grade Celsius, la u. Urmatoarea, utiliznd, dac-altceva funcioneaz la v i w, codul compar temperatura curent mpotriva valorile pentru cald i la rece i apoi pe corespunztoare LED. ntrziere (1000) situaiile sunt folosite pentru a preveni luminile de intermitent pe i n afara prea repede daca Temperatura fluctueaz rapid ntre dou intervale. Hacking Sketch Dei aceast schi a fost destul de simplu, ai putea folosi ca baz pentru ING alte tipuri de lecturi. S-ar putea aduga o coada PowerSwitch, de exemplu, aa cum se arat n Figura 4-42.

Figura 4-42

Power Switch

Cu cu PowerSwitch, putei controla n condiii de siguran un aparat care ruleaza de la priza de perete, cum ar fi o surs de nclzire, lamp, sau un alt dispozitiv cu o ieire digital de la Arduino ta. (Pentru mai multe informaii, vizitai http://www.adafruit.com/products/268/.)

De exemplu, ai putea utiliza un PowerSwitch pentru a construi un sistem de nclzire cu temperatur controlat sau ventilator, controla o lumin garaj astfel, ruleaza un timp i apoi se stinge, sau controla de la distan n aer liber Lumini de Craciun.

Privind n perspectiv

Cu aceasta se ncheie i capitolul 4. Acum avei mult mai multe instrumente pentru a lucra cu, inclusiv intrri i ieiri digitale, noi tipuri de variabile, si diverse funcii matematice. n capitolul urmtor, vei avea o mult mai distractiv cu LED-uri, s nvee s creai propriile funcii, s construiasc un joc pe calculator i zaruri electronice, si multe altele.