Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Домашняя страница на Гитхабе - https://github.com/BillKujawa/meter
Библиотека для Processing Meter позволяет работать выводит данные с платы Arduino в удобном графическом представлении в виде шкалы разных типов - полукруглых или круглых.
Библиотека доступна через меню Sketch | Import Library...| Add Library. Через фильтр ищем meter и устанавливаем библиотеку на компьютер.
В состав библиотеки входят несколько примеров. С небольшими изменениями приведу один из них для знакомства.Сначала напишем скетч для Arduino. Будем считывать показания с аналогового вывода A0 (менять значения будем при помощи потенциометра). В примере можно задействовать три светодиода, но я закомментировал их использование.
const int analogInPin = A0; // считываем потенциометром с вывода A0
// Светодиоды. Не обязательны для примера
//const int whiteLed = 7;
//const int redLed = 10;
//const int greenLed = 11;
int sensorValue = 0; // показания с вывода A0
// Label each sensor to determine which data to return to Processing.
int sensorNumber = 0;
// Setup data buffer.
String inString;
int inByte = 0; // Incoming serial data byte.
int outputValue; // Sensor data to send to Processing.
boolean firstContact = false; // No valid data in buffer.
int i;
void setup() {
//pinMode(whiteLed, OUTPUT); // valid sensor request received
//pinMode(redLed, OUTPUT); // invalid sensor request
//pinMode(greenLed, OUTPUT); // valid sensor request, sent sensor data
Serial.begin(9600);
// Wait for serial port to connect. Needed for native USB port only.
while (!Serial)
{
; // Do nothing until connection established.
}
// Establish contact by sending initial data to Processing.
// Loop on this until Processing responds by sending a request for sensor data.
// Then start the loop().
while (Serial.available() <= 0) // No data received.
{
Serial.println("0,0"); // Initial hello to Processing.
Serial.flush();
delay(500);
}
//digitalWrite(redLed, LOW); // Error if lit.
}
void loop()
{
if (Serial.available() > 0)
{
//digitalWrite(greenLed, LOW);
// Read serial data
inByte = Serial.read();
if (inByte > 0 && isDigit(inByte)) // Expecting a "1" from Processing.
{
inString = (char)inByte;
sensorNumber = inString.toInt();
//digitalWrite(whiteLed, HIGH); // Sensor data request received.
// Считываем показания
sensorValue = analogRead(analogInPin);
// Переводим в диапазон 0-255
outputValue = map(sensorValue, 0, 1023, 0, 255);
// Send back the requested results
Serial.print("1,");
Serial.println(outputValue);
//digitalWrite(greenLed, HIGH);
//digitalWrite(whiteLed, LOW);
}
else
{
// Error handling statements
//digitalWrite(redLed, HIGH);
}
}
// wait 20 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(20);
}
Нужно запустить скетч и потенциометром менять значения.
После запуска скетча на Arduino, можно запустить скетч на Processing.
import meter.*;
import processing.serial.*;
Meter meter;
boolean deBug = false;
int i = 0;
boolean dataReceived = false;
int sensorNumber = 1; // Expected by microprocessor.
int sensorValue = 0; // Default for starting.
Serial port1;
void setup() {
size(500, 350);
background(255, 255, 200);
// Open the port that the board is connected to and use the same speed.
// println(Serial.list()); // Uncomment to find port name for your computer.
String port = Serial.list()[0];
port1 = new Serial(this, port, 9600);
// Set condition to read bytes into a buffer until a newline is received.
port1.bufferUntil('\n');
meter = new Meter(this, 25, 25);
meter.setDisplayDigitalMeterValue(true);
meter.setTitle("Вольтметр");
}
void draw() {
// Request new sensor data from microprocessor if previous data has been processed
if (dataReceived == true) {
port1.write('1'); // Send request for sensorNumber data
dataReceived = false; // Waiting for new data
meter.updateMeter(sensorValue);
}
}
void serialEvent(Serial port1) {
// The microprocessor should send initial zero value data to begin contact.
// The draw() loop will then request data from the microprocessor.
if (deBug == true) {
println("serialEvent entered");
}
String serialIn = port1.readStringUntil('\n');
// Remove anything but data and commas
serialIn = trim(serialIn);
if (deBug == true) {
println("serialIn: " + serialIn);
}
// Process data from the microprocessor
// Split the line at the commas and convert the data to integers
int sensorData[] = int(split(serialIn, ','));
int sensorDataArrayLength = sensorData.length;
sensorNumber = sensorData[i];
sensorValue = sensorData[i+1];
if (deBug == true) {
println("sensorDataArrayLength: " + sensorDataArrayLength);
for (int i = 0; i < sensorDataArrayLength; i += 2) {
println("Sensor: " + sensorData[i] + " SensorValue: " + sensorData[i+1]);
}
}
dataReceived = true;
}
В режиме реального времени можно наблюдать за показаниями аналогового вывода, получая значения напряжения.