在 Processing 中使用 Arduino LDR 传感器切换背景

Using an Arduino LDR Sensor to switch backgrounds in Processing

使用 Arduino 的 LDR 传感器,我想根据 LDR 感应到的光强度在 Processing 中的两个 gif 背景之间切换。我的 Arduino 设置有效,我可以在串行监视器中看到一系列数字,具体取决于照射在传感器上的光量 - 但是我在处理背景之间切换时遇到了麻烦。这是我将 Arduino 与 Processing 相结合的第一个项目,所以如果我犯了任何非常明显的错误,请原谅我。

Arduino 代码

    int sensorPin = A0; // select the input pin for LDR
int sensorValue = 0; // variable to store the value coming from the sensor

void setup() {

  Serial.begin(9600); //sets serial port for communication
}

void loop() {

  sensorValue = analogRead(sensorPin); // read the value from the sensor

  Serial.println(sensorValue); //prints the values coming from the sensor on the screen

  delay(100);

}

处理代码

    //loads gif library for background

import gifAnimation.*;

Gif batmanGotham;

Gif batmanLair;

//loads Arduino 

import processing.serial.*;

Serial myPort;

int sensorValue = 0;


void setup() {

  size(1067, 800); //size of canvas

  batmanGotham = new Gif(this, "background.gif"); //set gif

  batmanGotham.play();

  batmanLair = new Gif(this, "batman_lab.gif");  //set second gif

  batmanLair.play();

  String portName = "/dev/cu.usbmodem14201";

  myPort = new Serial(this, portName, 9600);

  myPort.bufferUntil('\n');
}

void draw() {

}

void serialEvent (Serial myPort) {

  if (sensorValue > 300) {

    image(batmanLair, 0, 0);   //lays down gif background

  } else {

    image(batmanGotham, 0, 0);   //lays down gif background
  }
}

您忘记从串行端口读取数据,请尝试在您的 serialEvent() 例程中添加以下行:

byte[] buffer = new byte[2];
sensorValue   = myPort.readBytes(buffer);

一开始。

如您所见,您必须自己从缓冲区中恢复数据。每当有内容可读但您必须自己从那里获取并存储或处理时,该事件就会自动触发。

您应该一次读取两个字节以说明您从 Arduino 发送的 int 的大小。

Marcos 是对的,通过你将发送超过两个字节。 假设您要发送 1023,实际上是 4 个字符(字节)+ 另一行(来自 println)。

您可以根据读取的数据连续绘制并简单地更新图像,最好进行一些错误检查:

   //loads gif library for background

import gifAnimation.*;

Gif batmanGotham;

Gif batmanLair;

//loads Arduino 

import processing.serial.*;

Serial myPort;

int sensorValue = 0;


void setup() {

  size(1067, 800); //size of canvas

  batmanGotham = new Gif(this, "background.gif"); //set gif

  batmanGotham.play();

  batmanLair = new Gif(this, "batman_lab.gif");  //set second gif

  batmanLair.play();

  String portName = "/dev/cu.usbmodem14201";

  try{
    myPort = new Serial(this, portName, 9600);
    myPort.bufferUntil('\n');  
  }catch(Exception e){
    println("error opening serial port: double check the cable is connected, the portName is right and SerialMonitor anything else trying to access the port is closed");
    e.printStackTrace();
  }


}

void draw() {
  if (sensorValue > 300) {

    image(batmanLair, 0, 0);   //lays down gif background

  } else {

    image(batmanGotham, 0, 0);   //lays down gif background
  }
}

void serialEvent (Serial myPort) {
  try{
    String rawString = myPort.readString();
    if(rawString != null && rawString.length() > 0){
      // remove newline
      rawString = rawString.trim();
      // parse value
      sensorValue = int(rawString);
    }
  }catch(Exception e){
    println("error parsing serial data");
    e.printStackTrace();
  }
}

如果你想让 Processing Serial 部分更简单,你可以在 arduino 上做阈值逻辑,然后简单地向 Processing 发送一个字节,比如 1 或 0,具体取决于你要显示的图像:

int sensorPin = A0; // select the input pin for LDR
int sensorValue = 0; // variable to store the value coming from the sensor

void setup() {

  Serial.begin(9600); //sets serial port for communication
}

void loop() {

  sensorValue = analogRead(sensorPin); // read the value from the sensor

  if(sensorValue > 0){
    Serial.print('1');
  }else{
    Serial.print('0');
  }

  delay(100);

}

然后在处理中:

   //loads gif library for background

import gifAnimation.*;

Gif batmanGotham;

Gif batmanLair;

//loads Arduino 

import processing.serial.*;

Serial myPort;

boolean showLair;


void setup() {

  size(1067, 800); //size of canvas

  batmanGotham = new Gif(this, "background.gif"); //set gif

  batmanGotham.play();

  batmanLair = new Gif(this, "batman_lab.gif");  //set second gif

  batmanLair.play();

  String portName = "/dev/cu.usbmodem14201";

  try{
    myPort = new Serial(this, portName, 9600);
  }catch(Exception e){
    println("error opening serial port: double check the cable is connected, the portName is right and SerialMonitor anything else trying to access the port is closed");
    e.printStackTrace();
  }


}

void draw() {
  // read 1 char
  if(myPort != null && myPort.available() > 0){
    char fromArduino = myPort.read();
    showLair = (fromArduino == '1');
  }
  // update content
  if (showLair) {

    image(batmanLair, 0, 0);   //lays down gif background

  } else {

    image(batmanGotham, 0, 0);   //lays down gif background
  }
}