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 (ага, прекрасно быть европейцем).