Първи стъпки с Arduino (SoftUni) – Проектът

Петте седмици от курса отлетяха толкова бързо! И дойде време за проект и защита 🙂

В последния момент и много на бързо (така се стекоха обстоятелствата) успях да сътворя нещо семпло:

Arduino Project

Проектът демонстрира:

  1. Четене от аналогов вход +преобразуване на стойностите от АЦП-то;
    Потенциометърът реализира прост делител на напрежение. Средният изход се подава на A0, къдетостойността се анализира;
  2. Използване на PWM изход;
    Резултатът от измерването (analogRead) се преобразува към числа от диапазона 0-253 и се извежда към пин D10 чрез analogWrite.При завъртане на потенциометъра,яркостта насветодиода (в ляво) се променя;
  3. Декодиране на IR сигнали;
    Чрезбиблиотеката IRLibпрограмата реагира на трите червени бутона от дистанционното.
  4. Управление на цифрови изходи (светодиоди и релета);
    При натискането на един от бутоните на дистанционното съответния светодиод (вдясно) светва/изгасва;
  5. Серийна връзка между компютъра и Arduino чрез XBee;
    Двата XBee модула са конфигурирани в една мрежа (Point-To-Point) чрез XCTU софтуера, което осигурява серийна радио връзка между тях. Единият модул е поставен върху XBee Explorer, а другият е монтиран към комбинираната разширителна платка, от където има връзка към самото Arduino;Терминалният софтуер, който използвах е Tera Term;
  6. Управление и конфигуриране на портовете чрез REST-like команди;
    Това е малката глезотийка, върху която работя. Цяло чудо е, че успях да го докарам до работещ вид по време на изпита. Това е C/C++ библиотека (PkgServers), подобна на aRest, която позволява управление на Arduino чрез (псевдо)REST подобни команди, получени по сериен порт или HTTP. Демонстрацията включвашеуправление на релетата от разширителната платка през портове 4,5,6,7.Примери:

    1. /mode/13/o – конфигурирапорт 13 като изход
    2. /mode/13/i – конфигурирапорт 13 катовход
    3. /digital/13/1 – задава стойност HIGH на порт 13
    4. /digital/13/0 – задава стойност LOWна порт 13

Библиотеката в процес на разработка. Когато стане готова и бъде тествана достатъчно дълго ще я публикувам в GitHub.

Програмата за управление на всичко това беше следната:

#include <IRLib.h>
#include <PkgServers.h>

byte pin_led = 10;
byte pin_ain = A0;
int pin_ain_val = 0;
IRrecv My_Receiver(11);
IRdecode My_Decoder;

byte pin_rled1 = 2;
byte pin_rled2 = 3;
byte pin_rled3 = 12;
byte b1 = 0;
byte b2 = 0;
byte b3 = 0;
long irCode = 0;

PkgCmdSerialSource *cmdSrc = NULL;
PkgHwServer *hwSrv = NULL;

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  while(!Serial);
  Serial.println("READY");
    
  My_Receiver.enableIRIn();

  pinMode(pin_led, OUTPUT);
  pinMode(pin_ain, INPUT);

  pinMode(pin_rled1, OUTPUT);
  pinMode(pin_rled2, OUTPUT);
  pinMode(pin_rled3, OUTPUT);

  digitalWrite(pin_led, LOW);

  cmdSrc = new PkgCmdSerialSource(100);
  hwSrv = new PkgHwServer(cmdSrc, 5, 20);

  //digitalWrite(pin_rled1, HIGH);
  //digitalWrite(pin_rled2, HIGH);
  //digitalWrite(pin_rled3, HIGH);

}

void checkAnalog(){
    pin_ain_val = ((float)analogRead(pin_ain) / 1023) * 254;
    //Serial.println(pin_ain_val);
    analogWrite(pin_led, pin_ain_val);
};

unsigned long processIr(){
  if (My_Receiver.GetResults(&My_Decoder)) {
    My_Decoder.decode();    //Decode the data
    if (My_Decoder.decode_type = NEC && My_Decoder.bits == 32){
      if (My_Decoder.value != REPEAT){
        return (unsigned long)My_Decoder.value;
      } else {
        return REPEAT;
      }
    };
    My_Receiver.resume();     //Restart the receiver
  }
  return 0;
};

void loop() {
  // put your main code here, to run repeatedly:
  checkAnalog();
  
  irCode = processIr();
  if (irCode != 0){
    Serial.println(irCode, HEX);  
    switch (irCode){
      case 0xFD00FF: {
        b1 = !b1;
        digitalWrite(pin_rled1, b1);
      }; break;  
      case 0xFD807F: {
        b2 = !b2;
        digitalWrite(pin_rled2, b2);        
      }; break;
      case 0xFD40BF: {
        b3 = !b3;
        digitalWrite(pin_rled3, b3);        
      }; break;
    }
    
  };

  if (hwSrv->check()){
    hwSrv->result()->print();
  };
  
  delay(100);
}

Проектът – защитен! 🙂

Добър курс, но все пак беше за Arduino basics.Advanced курсът ще бъде доста по-интересен. Той ще включва IoT.

Leave a Reply

Your email address will not be published. Required fields are marked *