Valentin napi szív - második próbálkozás
2018. február 17. írta: hahópihehh

Valentin napi szív - második próbálkozás

Hát, az első, hirtelen ötlettől vezérelve gyorsan összedobott Valentin napi szivecske leginkább a totális felsülés mintafeladata volt, úgyhogy nekifutok még egyszer, most jobban átgondolva és segítséget is igénybevéve, hátha nem néz majd úgy ki az egész, mintha aznap láttam volna először ledet.

Megpróbáltam úgy bekötni a vezetékeket, hogy majd lehetőleg látni is lehessen valamit belőle:

img_2747_1.JPG

Ez nagyjából meg is volna, úgyhogy a következő lépés, hogy felviszem az összes ledet ON-ra, hogy megnézzem, működnek-e.

Nyilván nem, úgyhogy mutatom, hogy hol toltam el a dolgokat: a piros vízszintes csíkok jelzik, hogy a breadboard-on hol válik el egymástól a két rész, úgyhogy minden földet, amelyikhez tartozó led a nyúlon vonalon túl van, át kellett helyeznem a túloldalra. Ezt helyes nyilacskákkal jelzem az alábbi képen (ismét kiemelném, hogy már önállóan keresem meg és javítom a tévedéseket):

javitva.jpg

Más dolgom most ehhez nem volt, csak meghatározni, hogy melyik led melyik portra van kötve, azokat OUTPUT-nak beállítani, aztán az összeset ON-ra kapcsolni. Legalább ezek már mennek három hét után :)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int F = 10;
int BF = 12;
int BK = 9;
int JF = 11;
int JK = 8;
int BL = 2;
int A = 3;
int JL = 4;

void setup() {
 pinMode(F, OUTPUT);
 pinMode(BF, OUTPUT);
 pinMode(BK, OUTPUT);
 pinMode(JF, OUTPUT);
 pinMode(JK, OUTPUT);
 pinMode(BL, OUTPUT);
 pinMode(A, OUTPUT);
 pinMode(JL, OUTPUT);
}

void loop() {
digitalWrite (F, HIGH);
digitalWrite (BF, HIGH);
digitalWrite (BK, HIGH);
digitalWrite (JF, HIGH);
digitalWrite (JK, HIGH);
digitalWrite (BL, HIGH);
digitalWrite (A, HIGH);
digitalWrite (JL, HIGH);
}


Azért tettem minden ledet külön, mert most szeretnék hozzákapcsolni egy infrás távirányítót, és azon beprogramozni, hogy attól függően, hogy melyik számot nyomom meg a távirnyán, az ahhoz rendelt programban megírt sorrendben kapcsolódjanak fel a ledek. Csak előbb találjam meg, hogyan kell bekötni az infrát :)

Jó, hát ennél gyorsabban se találhattam volna meg :D rákerestem a hátoldalán lévő azonosítóra, és a barátom, google már dobta is az eredményt. A bekötési rajzok szerint sima digital port-ot használ, úgyhogy én a hetest választottam neki.infra.jpgRövid keresgélés után megtaláltam, hogyan állítsam be a távirányítót, újabb büszkeséghullám töltötte el szívemet, mert ugyan többször kellett nekifutnom, hogy meglegyen a végleges verzió, amivel a megnyomott gombokat visszaküldi a serial monitorra, de ML segítő kérdéseivel már ki tudtam másolni a szükséges sorokat :)

Ehhez is le kellett töltenem egy library-t, amit aztán az #include-dal hívtam meg, ezen az oldalon rögtön az első válaszban pedig megtaláltam a beállításokat az IR és a távirányító összepasszintásához: meghatároztam a 7-es portot, ahova az IR-t kötöttem, a példányosításnál hozzá kellett még írnom a portot is, amire vissza tud hivatkozni a könyvtár (referenception :DDD ), a decode_result osztály példánya pedig (ami amúgy a .h library-ben van részletesen kifejtve, itt csak hivatkozunk arra) a "signals" elnevezést kapta. A setup-ban kellett még a serial port és az, hogy engedélyezzem az IR-t, a pinMode-hoz még hozzácsaptam, hogy az IR pin-t olvassa, és már készen is voltunk.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include "IRremote.h"

int F = 10;
int BF = 12;
int BK = 9;
int JF = 11;
int JK = 8;
int BL = 2;
int A = 3;
int JL = 4;

int RECV_PIN = 7;

IRrecv irrecv(RECV_PIN);
decode_results signals;

void setup() {
Serial.begin(9600);
irrecv.enableIRIn();

pinMode (RECV_PIN, INPUT);


Ha még hozzáadok néhány sort a loop-hoz, egy "if" függvénnyel visszaküldi a lenyomott gombok adatát a serial monitorra - jelen esetben DEC, azaz a tizes számrendszerben azt, hogy a kettest nyomtam meg, ha HEX-re javítom, akkor a tizenhatos szerint jeleníti meg a képernyőn. Ez jól is jött, amikor próbáltuk megfejteni, hogy miért érzékeli hektikusan a lenyomott gombot - ekkor derült ki, hogy valami eléggé zavarja a távirányítót, és össze-vissza mutatott mindenféle számot. 

ir_javitott.JPG

A következő részfeladat az, hogy beállítsam azt, hogy ha valamelyik gombot megnyomom a távirányítón, akkor mit csináljon, ez sem volt igazából nagy művészet, csak létre kellett hoznom függvényeket a hozzá tartozó programmal :)

Első lépés:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void szivecske () {
digitalWrite (F, HIGH);
digitalWrite (BF, HIGH);
digitalWrite (BK, HIGH);
digitalWrite (JF, HIGH);
digitalWrite (JK, HIGH);
digitalWrite (BL, HIGH);
digitalWrite (A, HIGH);
digitalWrite (JL, HIGH);
}

void villogas () {
digitalWrite (F, LOW);
digitalWrite (BF, LOW);
digitalWrite (BK, LOW);
digitalWrite (BL, LOW);
digitalWrite (A, LOW);
digitalWrite (JL, LOW);
digitalWrite (JK, LOW);
digitalWrite (JF, LOW);
delay (1000);
digitalWrite (F, HIGH);
delay (100);
digitalWrite (BF, HIGH);
delay (100);
digitalWrite (BK, HIGH);
delay (100);
digitalWrite (BL, HIGH);
delay (100);
digitalWrite (A, HIGH);
delay (100);
digitalWrite (JL, HIGH);
delay (100);
digitalWrite (JK, HIGH);
delay (100);
digitalWrite (JF, HIGH);
delay (1000);
}

void kikapcs(){
digitalWrite (F, LOW);
digitalWrite (BF, LOW);
digitalWrite (BK, LOW);
digitalWrite (BL, LOW);
digitalWrite (A, LOW);
digitalWrite (JL, LOW);
digitalWrite (JK, LOW);
digitalWrite (JF, LOW);
}

 
Utána beleírtam a loop-ba, hogy melyik gombnyomás melyik függvényt hozza be - ehhez kellett a serial monitort figyelni, hogy milyen számot ír ki (először az egyest, utána a kettest, végül a hármast nyomtam meg):

sorrend.JPG

Innentől viszont már csak egy ugrásra vagyunk attól, hogy elkészüljön a végleges program, még egy függvénypointert kellene létrehozni, hogy a sok zaj miatt figyelje, hogy mikor kap valid jelet, és akkor tegye azt, ami a gombhoz rendeltem hozzá. Fun fact: végül nem a készletben érkezett távirányítót használtuk, hanem a UPC set top box távirányítóját, mert a másik túl sok hibás jelet küldött.

- TECHNIKAI SZÜNET -

Este 11-kor nemes egyszerűséggel lezárt az agyam, úgyhogy ezt az ugrást inkább reggel folytatjuk, mert öt percig ültem a gép előtt, mikor megkaptam feladatnak, hogy hozzak létre egy "int" változót. Igazából már ott elakadtam, hogy nevet adjak neki, ezért megelőzvén egy különköltözést elraktuk a feladatot reggelre.

Kellemes szombati reggelt mindenkinek :)

Szóval mára igazából már csak annyi maradt, hogy írjunk egy kis kozmetikai függvényt arra, hogy ha túl zajos a környezet, akkor ne vegyen mindent a távirányító, hanem csak akkor reagáljon, ha értelmes számot kap, így kiszűrhető az, ha túl hosszan, túl röviden, esetleg duplázva nyomom meg a gombokat. Ez a függvénypointer.

A változók között létrehoztam magát a függvénypointert egy roppant sokatmondó "fp" névvel, a setup-ban pedig meghatároztam, hogy az alapértéke a "kikapcs" függvény legyen. 

1
2
3
4
5
6
7
void (*fp)();

void setup() {
Serial.begin(9600);
irrecv.enableIRIn();

fp = kikapcs;


Ezek után már csak a loop-ba kellett beírni, hogy a szivecske, a villogás és a kikapcs függvényekre hivatkozzon a cselekménybe újonnan belekevert "fp"-m. Ez azért aranyos és hasznos, mert ugyan a "kikapcs" függvénnyel indít, mint alapérték (program legeleje), a loop-ban viszont miután a függvényeket hozzárendeljük az "fp"-hez, az fog meghívódni, amelyik a legutóbbi gombnyomáshoz tartozik.

Long story short: az "fp" lehet a szivecske, a villogás vagy a kikapcs is, attól függ, hogy melyik gombot nyomtuk meg utoljára, mert a loop végén az üres függvény arra fog mutatni a következő gombnyomásig.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void loop() {

if (irrecv.decode(&signals)) {
        Serial.println(signals.value, DEC);
        ertek=signals.value;
        irrecv.resume();
    }
if (ertek == 21091169) {
  fp=szivecske;
  }
if (ertek == 3399574119){
  fp=villogas;
  }
if (ertek == 3142558661){
  fp=kikapcs;
  }

fp();
}


És ezennel alig három nap csúszással meg is alkottam azt, amit kigondoltam :) Amúgy nem volt rossz ötlet az első próbálkozás sem, mert legalább végig tudtam gondolni, hogy mit hol rontottam el, ki tudtam javítani ezeket a hibákat, és még új dolgot is tanultam :) 

Van egy teljes programom itt, és egy videó a kész műről alább :) Bocs az állófelvételért, de csak így tudtam tartani a telót úgy, hogy minden látszódjon...

Méghogy felesleges dolog a Valentin nap :D

E.

A bejegyzés trackback címe:

https://nemertekalovakhozdeazertvanegy.blog.hu/api/trackback/id/tr3013675540

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása