[020] Pilot - żartowniś

[020] Pilot - żartowniś

O tym jak zrobić pilota z Arduino, pisałem niedawno. Dzisiaj pora na przyjemne z pożytecznym, czyli żarcik i trochę wiedzy. Głównym moim celem jest przedstawienie nowej instrukcji, chyba najcenniejszej – patrząc z perspektywy udawania przez komputer organizmu żywego. Mowa o funkcji losowej, elemencie będącym podstawą zachowań urządzeń przypominających pewną nieobliczalność i nieprzewidywalność charakterystyczną dla świata istot żywych. Złożone algorytmy mające zaimplementowane w różnym stopniu elementy nieokreśloności stają się bliższe człowiekowi i wydają się obdarzone w jakimś stopniu humanizmem.


Ale to nie ta skala, w tym artykule poznamy jedynie podstawy. Będzie to urządzenie, które będzie miało na celu przeprowadzenie terapii odwykowej telemaniakom. Chcąc zrobić komuś dowcip, urządzenie takie będzie trzeba położyć w niewidocznym miejscu, tak by mogło sterować telewizorem. Nasz wesoły pilot co kilkadziesiąt sekund będzie zmieniał losowo wybrany kanał. Zniechęcony psującym się telewizorem widz być może na chwilę zrezygnuje z marnowania czasu i chwyci za książkę albo pójdzie na spacer :)

A więc do roboty. Sprzętowo wymagania będą bardzo skromne: jakiekolwiek Arduino i dioda podczerwieni podłączona przez rezystor do pinu trzeciego. O tym wszystkim pisałem w pierwszym artykule o pilotach. Przyjrzyjmy się szkicowi.

#define SEND_PWM_BY_TIMER  // Definicja niezbędna dla Arduino Uno
#include <IRremote.h>      // Biblioteka obsługi nadajnika podczerwieni.

const unsigned int adres = 32512;  // Adres urządzenia, którym będziemy sterować.
const byte pstryczek1 = 14;        // Kod emulowanych przycisków pilota
const byte pstryczek2 = 6;
const byte pstryczek3 = 15;
const byte pstryczek4 = 18;
const byte pstryczek5 = 7;
const byte pstryczek6 = 19;
const byte pstryczek7 = 22;
const byte pstryczek8 = 2;
const byte pstryczek9 = 23;

byte przycisk;         // losowy przycisk na pilocie.
unsigned int przerwa;  // losowa przerwa pomiędzy zmianami programów.

void setup() {
  IrSender.begin();  // Inicjacja biblioteki
}

void loop() {
  przycisk = random(1, 10);  // Losuj liczbę z zakresu 1-9

  switch (przycisk) {                          // Zestaw listę poleceń związanych z wylosowaną liczbą.
    case 1:                                    // Wylosowano jedynkę.
      IrSender.sendNEC(adres, pstryczek1, 0);  // Wyślij w standardzie NEC: adres, komendę i bit braku autorepetycji.
      break;                                   // Zakończ obsługę tego przycisku
    case 2:
      IrSender.sendNEC(adres, pstryczek2, 0);
      break;
    case 3:
      IrSender.sendNEC(adres, pstryczek3, 0);
      break;
    case 4:
      IrSender.sendNEC(adres, pstryczek4, 0);
      break;
    case 5:
      IrSender.sendNEC(adres, pstryczek5, 0);
      break;
    case 6:
      IrSender.sendNEC(adres, pstryczek6, 0);
      break;
    case 7:
      IrSender.sendNEC(adres, pstryczek7, 0);
      break;
    case 8:
      IrSender.sendNEC(adres, pstryczek8, 0);
      break;
    case 9:
      IrSender.sendNEC(adres, pstryczek9, 0);
      break;
    default:
      break;
  }
  przerwa = random(0, 65536);  // Losuj liczbę z zakresu 0-65535
  delay(przerwa);              // Czekaj przez wylosowany czas.
}

A więc do roboty. Początek nie różni się – deklarujemy znaną już bibliotekę i inicjujemy ją. Tym razem nie będzie klawiatury, więc odpadnie wszystko, co jest z nią związane. Będziemy za to emulować dziewięć pstryczków z numerami kanałów, zatem definicji będzie tyleż. Na potrzeby tego szkicu zeskanowałem pewnego pilota telewizyjnego. On także pracuje w standardzie NEC-a, więc sprawa będzie prosta. Budując własny układ, należy zeskanować własnego pilota, o czym pisałem w artykule o odbiornikach podczerwieni.

Przydadzą się nam jeszcze zmienne: przycisk, czyli losowana wartość wysyłana do telewizora i przerwa – także losowana ilość czasu pomiędzy kolejnymi akcjami. W głównej pętli na początku pojawia się funkcja random.

przycisk = random(1, 10);  // Losuj liczbę z zakresu 1-9

Zwraca ona losową liczbę z przedziału wyrażoną w nawiasie, a ściślej o jeden mniejszą od tej, która znajduje się na drugim miejscu. Czyli w tym przypadku przy każdym odwołaniu otrzymamy liczbę naturalną z przedziału od 1 do 9. Nie jest ona tak naprawdę losowa, lecz pseudolosowa, aczkolwiek przy takich zastosowaniach nie ma to znaczenia. Dla ciekawości dodam, że random zwraca liczbę w formacie long, więc druga pozycja może mieć wartość nawet nieco ponad dwa miliardy.

Następnie mamy znaną nam już listę warunków switch – case. Naszą zmienną poddawaną analizie w tym przypadku jest ów losowy przycisk, który może przyjmować wartości od 1 do 9. Przypomnę, formuła rozpoczyna się słowem switch i argumentem w nawiasach, który będzie rozważany. Następnie pojawiają się bloki rozpoczynające się od słowa case i wartości owego argumentu, który – jeśli będzie właśnie taki, pozwoli wykonać się instrukcjom znajdującym się poniżej. Jeśli argument będzie mieć inną wartość, program przeskoczy do kolejnej instrukcji case.

Jak widać, gdy wartość wylosowanego przycisku odpowiada konkretnemu case, zostaje wyemitowany związany z nim sygnał, podobnie jak to było w poprzednim szkicu. Mamy tutaj tylko jeden mały problem. Otóż gdy to nastąpi, program przestaje badać kolejne warunki, tylko leci dalej, jak gdyby nie było kolejnych case. Oznaczałoby to, że gdyby wylosowany przycisk osiągnął wartość trzy, zaraz za nim poleciały by komendy: czwarta, piąta i tak dalej. Dlatego pojawiają się tutaj instrukcje break. Sprawiają, że program opuszcza cały ten blok warunków i ląduje dopiero za nawiasem klamrowym.

I jeszcze jedno, tutaj w zasadzie jest to zbędne, ale wypada rzecz taką umieszczać: a co byłoby, gdyby wartość nie odpowiadała żadnemu warunkowi? W konkretnych przypadkach może się tak zdarzyć i czasem sprawia to problemy. Od tego mamy na końcu instrukcję default. Wyłapuje ona wszystkie niewykryte wartości. U mnie oczywiście nic nie robi, ale zawsze można tam zorganizować obsługę takich nietypowych przypadków.

Na samym końcu mamy jeszcze jedno losowanie.

przerwa = random(0, 65536);  // Losuj liczbę z zakresu 0-65535
delay(przerwa);              // Czekaj przez wylosowany czas.

Tym razem wartość została ograniczona do zdecydowanie szerszego przedziału, który jest bezpośrednim argumentem funkcji delay. Wyznacza ona przerwę między kolejnymi zmianami kanałów i ta może nastąpić równie dobrze natychmiast, jak po ponad 65 sekundach, doprowadzając telemaniaka do furii. Nie bądźcie jednak zbyt okrutni i po chwili zabawy pokażcie mu źródło żartów :)

Pilot zbudowany na Arduino nie za bardzo nadaje się do pracy bateryjnej. Jednak przy użyciu na przykład modułu mini, można zbudować pilota, który, z wykorzystaniem baterii litowej, będzie pracował długie lata. Ale o tym napiszę innym razem.

Powiązane tematy

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2025 arduino.pl