Arduino Uno + TM1638 + Light sensorius

27 06 2012

Jau aptariau Arduino Uno developerio board’a, aptariau 7 segmentų (ir ne tik) modulį, liko tik kažką naudingo nuveikti su jais abiem. Stalčiuje kaip tik mėtėsi fotorezistorius, taigi kodėl nepabandžius pažaisti su analoginiu įėjimu. Pajungimas:

63347132

Naudota 10kOm varža, o gaunamą signalą jungiame prie A0 įėjimo. Papildomai prijunkime potenciometrą prie A1 įėjimo. Kam jis? Ogi pabandysime reguliuoti TM1638 modulio ryškumą priklausomai nuo potenciometro padėties. Kadangi potenciometras yra analoginis įrenginys, jį jungiame ir valdysime analogiškai kaip foto rezistorių.

Programavimas

Pirmoje vietoje aptarkime analoginio signalo nuskaitymą. Jis atliekamas su funkcija analogRead():

int sensorInput = analogRead(sensorPin);

Gražinama reikšmė išsaugoma nurodytam kintamajam ir ji yra lygi nuo 0 iki 1023 priklausomai nuo analoginio įtaiso siunčiamų parodymų. Bet mums šis kaičius nieko nesako.. Suteikti prasme galime su map() funkciją:

int sensorValue = map(sensorInput, 0, 1023, 0, 100);

Mes nurodome, kad norime gauti sureikšminimą nuo sensorInput kintamojo dydžio, ir jis gali buti nuo 0 iki 1023. Paskutiniai tu skaičiai pasako, kokio dydžio norime gauti realią reikšmę. Šiuo atveju aš sugalvojau pamatuoti kiek procentų šviesumo yra kambaryje. Mano atveju kai foto rezistorius man gražina tarkime 200 reikšmę, šis funkcija konvertuoja ją į 19% automatiškai. Deja, bet prie normalių sąlygų 100 procentų neįmanomą išgauti, tad galime funkcijai nurodyti, kad daugiausiai įmanomas įėjimas gali būti tarkime 1000. Šiuo atveju funkcija 200 reikšmę apskaičiuos kaip 20%, pasiektą didžiausią įėjimą iš foto rezistoriaus 1000 kaip 100%.

Sekantis dalykas ką galime daryti tai tiesiog nusiusti šiuos parodymus į kompiuterį per Serial sąsaja:

Serial.print(“Input: ” ); // spausdiname reiksmes
Serial.print(sensorInput);
Serial.print(“\t Value: ” );
Serial.println(sensorValue);

Bet mūsų tikslas yra šiuos parodymus pateikti TM1638 ekranėlyje.
Naudojantis http://code.google.com/p/ tm1638 -library/ biblioteka nesunkiai galime išvesti norimą skaičių į ekranėlį su komanda setDisplayToDecNumber(unsigned long number, byte dots). Tai ir padariau o rezultatai štai tokie:

images1td

Daugybės nulių rodymas manęs netenkino, tad nusprendžiau pats sugeneruoti simbolių eilutę kurią noriu patyti. Tam sukūriau šią funkciją:

void messageConstr(int count, String name1, int num1, String name2, int num2)
{
int i;
for (i=0;i<8;i++)
re[i]=’ ‘;
int ln=0;
int pos;
String str;
switch (count)
{
case 1:
for (i=0; i<name1.length(); i++)
re[i]=name1[i];
str = String(num1);
pos=7;
for (i=str.length()-1; i>=0; i–)
{
re[pos]=str[i];
pos–;
}
break;
case 2:
for (i=0; i<name1.length(); i++)
re[i]=name1[i];
str = String(num1);
pos=3;
for (i=str.length()-1; i>=0; i–)
{
re[pos]=str[i];
pos–;
}
for (i=0; i<name2.length(); i++)
re[i+4]=name2[i];
str = String(num2);
pos=7;
for (i=str.length()-1; i>=0; i–)
{
re[pos]=str[i];
pos–;
}
break;
}
}

Pastarosios funkcijos paskirtis: sudėlioti simbolius ten kur reikią. Yra du funkcijos panaudojimo būdai priklausomai nuo to, kiek parodymų vienu metu norime parodyti:
1. Parodymas: funkcijai nusiuntus Count kintamąjį lygų vienam funkcija suformuoja 8 simbolių eilutę su Name1 užrašų lygiuoti š kairę pusę, o Num1 į dešinę (programoje 2 ir 3 rėšimai). Name2 ir Num2 kintamieji turėtu būti palikti tušti, nes jie tiesiog nebus naudojami. Funkcijos panaudojimo pavyzdys:

messageConstr(1,”IN”,sensorInput,””,0);

2. Parodymai: funkcijai nusiuntus Count kintamąjį lygų dviem funkcija suformuoja 8 simbolių eilutę su Name1 užrašų lygiuoti š kairę pusę, o Num1 į dešinę nuo cento. Name2 užrašas bus lygiuotas į kairę nuo centro, o Num2 į dešinę nuo dėšiniojo krašto. Esmė tame, kad pirmojo parodymo užrašas ir reikšmė vaizduojam pirmuose 4 simboliuose, o antrojo reikšmės sekančiuose 4. Esant reikšmėms didesnės ir jei jos nebetelpa į likusį nuo užrašo plotą, pastarasis yra ignoruojamas ir jo vietą užima skaitmenys. Šis būdas programoje naudotas 1 rėžime, kai norėtasi viename ekrane rodyti tiek signalą, tiek jo procentinę dalį. Funkcijos panaudojimo pavyzdys:

messageConstr(2,”S”,sensorInput,”V”,sensorValue);

Beje, ši funkcija negražina jokios reikšmės, nes Arduino naudojama programavimo sintaksė neleidžia gražinti masyvo. Būtent todėl funkcija redaguoja kintamąjį “re” kuris yra 8 char tipo kintamųjų masyvas. Kai ji pakeičia “re” į norimą, tuomet pastarajį riunčiame į diplėsu su TM1638 funkcija:

module.setDisplayToString(re);

Toliau aprodojame potenciometro parodyma. Nusiskaitęs reikšmę ja konvertuoju į reikiamą (nuo 0 iki 7):

int p = map(sensor2Input, 0, 1023, 0, 7);

Iškarto po to, kai jau turime nauja šviesumo reikšmę ją siunčiame į TM1638 modulį:

module.setupDisplay(1, p);

Tuomet liko paskutinis dalykas – norėčiau kad 8 LED’ai būtų panaudoti. Taigi dar karta perskaičiuoju įėjimo signalą ir priklausomai nuo jo uždegu reikiamą kiekį žalių LED’ų:
int p = map(sensorInput, 0, 1023, 0, 7);
module.setLEDs(((0xFF<<(7-p)) << | (0×0));

Leputes žinoma galima perjunginėti po vieną atskirai, bet šitaip sutaupome resursų ir išvengiame LED mirgėjimo.

Ir galiausiai įrenginys atlieka šias funkcijas:

  • Displėjuje vaizduoja aplinkos šviesumą vienu iš trijų rėžimu (pastarieji perjungiami su 1..3 mygtukais ir pasirinkto rėžimo LED mirksi raudonai):
  1. visos reikšmės viename ekrane;
  2. analoginio įėjimo reikšmė;
  3. analoginio signalo perskaičiuota į procentus reikšmė;
  • LED’ai taip pat vaizduoja šviesos intensyvumą grafiškai.
  • Potenciomentro pagalbą galime keisti TM1638 ryškumą.

Video:


Veiksmai

Information

One response

12 12 2013
Šviesos loginimas su Arduino | Mindaugas Markauskas

[…] paprasčiausias 10k fotorezistorius. Jau seniau esu su juo žaidęs tad sename įrašę galite pamatyti kaip jį pasijungti. Jungiu jį prie A0 įėjimo ir galvos sau […]

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti / Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti / Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti / Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti / Keisti )

Connecting to %s




%d bloggers like this: