joi, 8 decembrie 2011

Arduino - O metoda de citire si prelucrare date seriale

      Mi-am cumparat de curand o placa Reduino de la ROBOFUN pentru un proiect la scoala - Casa Inteligenta -  si am inceput sa fac diferite teste ca sa ma obisnuiesc cu mediul de programare.
      In proiect trebuie sa citesc date de pe serial bluetooth si sa le prelucrez, in functie de datele primite pe serial sa aprind 3 led-uri cu intensitati luminoase setate de dispozitivul de comanda si transmis prin bluetooth. 
      Ca mediu de programare folosesc softul de pe site-ul ARDUINO, versiunea 1.0.
      Deoarece sunt doar teste am setat sa primesc datele de pe portul serial USB, iar dispozitivul care transmite datele catre placa de dezvoltare este simulat cu Tool-ul Serial Monitor din program.
Mai jos este un cod sursa care citeste date de pe portul seral, verifica datele primite, iar daca primul caracter din string-ul obtinut este litera L, atunci trimite catre led-ul de pe pin-ul 11 valoarea dec al caracterului ASCII care il urmeaza (valoare intre 0..255).
      Mai jos este codul sursa al programului. Nu s-a facut verificarea sirului primit si pentru celelalte 3 led-uri, urmeaza sa updatez acest articol in momentul in care este gata.


const int luminaL = 11; // lumina Living
const int luminaH = 12; // lumina hol
const int luminaD = 13; // lumina dormitor
const int luminaB = 10; // lumina bucatarie

void setup()
{
   Serial.begin(9600); //serialul USB...
   pinMode(luminaL, OUTPUT); //se seteaza pinul 11 (luminaL ) ca pin de iesire
   pinMode(luminaH, OUTPUT); // ----
   pinMode(luminaD, OUTPUT); // ----
   pinMode(luminaB, OUTPUT); // ----
}

void loop() { //functia principala a programului.. de aici apelez altele.... mai bine structurate
serialReader(); //verifica daca exista si citeste date de pe serial
  } //sfarsit loop

void serialReader(){ //citeste de pe portul serial USB... trebuie facut si de pe serial Bluetooth
  int makeSerialStringPosition;
  int inByte;
  char serialReadString[50];
  const int terminatingChar = 13; //Termina liniile cu Carriage Return (CR)

  inByte = Serial.read();
  makeSerialStringPosition=0;

if (inByte > 0 && inByte != terminatingChar) { //Daca avem date la intrare (inByte > 0) si data nu este carriage return (CR)
    delay(100); //o pauza ca sa colecteze datele de pe serial... nu merge fara asta
while (inByte != terminatingChar && Serial.available() > 0){ // Cat timp nu este EOL si exista date... keep reading man :)
      serialReadString[makeSerialStringPosition] = inByte; // Salveaza datele intr-un vector string
      makeSerialStringPosition++; //Incrementeaza pozitia in vector
      //if (inByte > 0) Serial.println(inByte);
      inByte = Serial.read(); // Citeste urmatorul byte (caracter)
    }

if (inByte == terminatingChar) //Daca s-a terminat "corect"
    {
      serialReadString[makeSerialStringPosition] = 0;
      Serial.println(serialReadString);
      if (serialReadString[0]=='L')
           {
             Serial.println("Modific lumina living!"); //trimit inapoi pe serial mesajul ..
           analogWrite(luminaL,serialReadString[1]);
           }
    }
  }
}

2 comentarii:

  1. Da, chiar amator :) Sunt la inceput. Daca puteti sa ma ajutati in vreun fel cu optimizarea codului sau cu idei noi, va stau la dispozitie.
    Va multumesc pentru eventualele idei/critici ;)

    RăspundețiȘtergere