Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека Meter

Домашняя страница на Гитхабе - https://github.com/BillKujawa/meter

Библиотека для Processing Meter позволяет работать выводит данные с платы Arduino в удобном графическом представлении в виде шкалы разных типов - полукруглых или круглых.

Библиотека доступна через меню Sketch | Import Library...| Add Library. Через фильтр ищем meter и устанавливаем библиотеку на компьютер.

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;
}

В режиме реального времени можно наблюдать за показаниями аналогового вывода, получая значения напряжения.

Дополнительные материалы

Processing

Реклама