Выбрать главу

    if (inByte != 10) { // if byte is not newline

      buffer = buffer + char(inByte); // just add it to the buffer

    }

    else {

      // newline reached, let's process the data

      if (buffer.length() > 1) { // make sure there is enough data

        // chop off the last character, it's a carriage return

        // (a carriage return is the character at the end of a

        // line of text)

        buffer = buffer.substring(0,buffer.length() -1);

       // turn the buffer from string into an integer number

       light = int(buffer);

       // clean the buffer for the next read cycle

       buffer = "";

       // We're likely falling behind in taking readings

       // from Arduino. So let's clear the backlog of

       // incoming sensor readings so the next reading is

       // up-to-date.

       port.clear();

     }

   }

 }

}

void fetchData() {

  // we use these strings to parse the feed

  String data;

  String chunk;

  // zero the counters

  love = 0;

  peace = 0;

  arduino = 0;

  try {

    URL url = new URL(feed); // An object to represent the URL

    // prepare a connection

    URLConnection conn = url.openConnection();

    conn.connect(); // now connect to the Website

    // this is a bit of virtual plumbing as we connect

    // the data coming from the connection to a buffered

    // reader that reads the data one line at a time.

    BufferedReader in = new

      BufferedReader(new InputStreamReader(conn.getInputStream()));

    // read each line from the feed

    while ((data = in.readLine()) != null) {

      StringTokenizer st =

        new StringTokenizer(data,"\"<>,.()[] ");// break it down

      while (st.hasMoreTokens()) {

        // each chunk of data is made lowercase

        chunk= st.nextToken().toLowerCase() ;

        if (chunk.indexOf("love") >= 0 ) // found "love"?

          love++; // increment love by 1

        if (chunk.indexOf("peace") >= 0) // found "peace"?

          peace++; // increment peace by 1

        if (chunk.indexOf("arduino") >= 0) // found "arduino"?

          arduino++; // increment arduino by 1

     }

    }

    // Set 64 to be the maximum number of references we care about.

    if (peace > 64) peace = 64;

    if (love > 64) love = 64;

    if (arduino > 64) arduino = 64;

    peace = peace * 4;     // multiply by 4 so that the max is 255,

    love = love * 4;       // which comes in handy when building a

    arduino = arduino * 4; // colour that is made of 4 bytes (ARGB)

  } 

  catch (Exception ex) { // If there was an error, stop the sketch

    ex.printStackTrace();

    System.out.println("ERROR: "+ex.getMessage());

  }

}

Есть две вещи, которые вам потребуются для правильного запуска скетча Processing. Во-первых, вы должны указать Processing создать шрифт, который мы будем использовать для скетча. Чтобы сделать это, создайте и сохраните этот скетч. Затем, при открытом скетче, щёлкните меню "Tools" и выберите "Create Font". Выберите шрифт с именем "HelveticaNeue-Bold", выберите 32 для размера шрифта, а затем щёлкните "ОК".

Во-вторых, вам требуется удостовериться в том, что скетч использует правильный последовательный порт для связи с Arduino. Вам надо подождать, пока мы не соберём схему с Arduino и загрузим в неё скетч. На большинстве систем скетч Processing будет работать нормально. Однако если вы видите что на плате Arduino ничего не происходит и на экран не выводится никаких данных от датчика света, найдите комментарий "IMPORTANT NOTE (ВАЖНОЕ ЗАМЕЧАНИЕ)" в скетче Processing и следуйте следующим инструкциям.

  // IMPORTANT NOTE:

  // The first serial port retrieved by Serial.list()

  // should be your Arduino. If not, uncomment the next

  // line by deleting the // before it, and re-run the

  // sketch to see a list of serial ports. Then, change

  // the 0 in between [ and ] to the number of the port

  // that your Arduino is connected to.

  // ВАЖНОЕ ЗАМЕЧАНИЕ

  // Первый последовательный порт, полученный функцией Serial.list(),

  // должен быть подключён к Arduino. Если это не так, раскомментируйте следующую

  // строку удалением // перед ней, и перезапустите

  // скетч чтобы увидеть список последовательных портов. Затем измените

  // 0 в между скобками [ и ] на номер порта, к которому

  // подключена ваша Arduino.

  //println(Serial.list());

Вот скетч для Arduino (также доступен на www.makezine.com/getstartedarduino):

Пример 6-2. Сетевая лампа с Arduino

#define SENSOR 0 

#define R_LED 9

#define G_LED 10

#define B_LED 11

#define BUTTON 12

int val = 0; // variable to store the value coming from the sensor

int btn = LOW;

int old_btn = LOW;

int state = 0;

char buffer[7] ;

int pointer = 0;

byte inByte = 0;

byte r = 0;

byte g = 0;

byte b = 0;

void setup() {

  Serial.begin(9600); // open the serial port

  pinMode(BUTTON, INPUT);

}

void loop() {

  val = analogRead(SENSOR); // read the value from the sensor

  Serial.println(val); // print the value to

                            // the serial port

if (Serial.available() >0) {

  // read the incoming byte:

  inByte = Serial.read();

  // If the marker's found, next 6 characters are the colour

  if (inByte == '#') {

    while (pointer < 6) { // accumulate 6 chars

      buffer[pointer] = Serial.read(); // store in the buffer

      pointer++; // move the pointer forward by 1

    }

      // now we have the 3 numbers stored as hex numbers

      // we need to decode them into 3 bytes r, g and b

      r = hex2dec(buffer[1]) + hex2dec(buffer[0]) * 16;

      g = hex2dec(buffer[3]) + hex2dec(buffer[2]) * 16;

      b = hex2dec(buffer[5]) + hex2dec(buffer[4]) * 16;

      pointer = 0; // reset the pointer so we can reuse the buffer

    }

  }

  btn = digitalRead(BUTTON); // read input value and store it

  // Check if there was a transition

  if ((btn == HIGH) && (old_btn == LOW)){

    state = 1 - state;

  }

  old_btn = btn; // val is now old, let's store it

  if (state == 1) { // if the lamp is on

    analogWrite(R_LED, r); // turn the leds on

    analogWrite(G_LED, g); // at the colour

    analogWrite(B_LED, b); // sent by the computer

  } else {

    analogWrite(R_LED, 0); // otherwise turn off

    analogWrite(G_LED, 0);

    analogWrite(B_LED, 0);

   }

  delay(100); // wait 100ms between each send

}

int hex2dec(byte c) { // converts one HEX character into a number

    if (c >= '0' && c <= '9') {

      return c - '0';

    } else if (c >= 'A' && c <= 'F') {

      return c - 'A' + 10;

    }

}

6.4 Сборка схемы

Рис. 6-2 показывает как собрать схему. Вам понадобится резисторы на 10 кОм (все резисторы, показанные на схеме, хотя для резисторов, подключённых к светодиодам, можно использовать меньшие значения).

Вспомните пример с ШИМ из главы 5: светодиоды имеют полярность: в этой схеме длинный вывод (анод) подключается справа, а короткий (катод) - слева. (большинство светодиодов имеют фаску со стороны катода, как показано на рисунке).

Рис. 6-2. Схема сетевой лампы с Arduino

Соберите схему как показано на рисунке, используя один красный, один зелёный и один синий светодиоды. Затем загрузите скетчи в Arduino и Processing и запустите их. Если случились какие-то проблемы, см. главу 7. Устранение неполадок.

Теперь давайте завершим устройство, поместив макетную плату в стеклянный шар. Самый простейший и дешёвый выход - купить настольную лампу "FADO" в магазине IKEA. Сейчас она продаётся за US$14.99/€14.99/£8.99 (ага, прекрасно быть европейцем).