Джеймс здесь. У меня были проблемы при попытке заставить мою программу работать, которая включает в себя Arduino и Processing. То, что я хочу сделать, это отобразить информацию с фоторезистора и датчика ультразвука c отдельно.
Код обработки:
/*
Home Security System
*/
color backButton = color(252, 108, 133);
color colorChangeUltrasonic = color(252, 108, 133);
color colorChangePhotoresistor = color(252, 108, 133);
int screenStatus; // used to define screen state
color goodbye = color(252, 108, 133);
int goodbyeX; // used to control goodbye screentime
import processing.serial.*;
Serial port;
String val;
void setup() {
size(1100, 800); // Sets the size to 1600-by-1000 pixels.
screenStatus = 1;
String portName = Serial.list()[1]; // Change depending on port (0 onwards)
port = new Serial(this, portName, 9600);
}
void draw() {
if (screenStatus == 1) {
controlPanel();
} else if (screenStatus == 2) {
doorSensor();
port.clear();
port.write(2);
} else if (screenStatus == 3) {
nightLight();
port.clear();
port.write(3);
} else if (screenStatus == 4) {
goodbye();
}
}
int m;
void check() {
if (port.available() > 0) {
val = port.readStringUntil('\n');
println(val);
m++;
println(m);
}
}
void controlPanel() {
background(3, 190, 111);
fill(colorChangeUltrasonic);
rect(150, 50, 500, 300);
fill(colorChangePhotoresistor);
rect(150, 400, 500, 300);
fill(goodbye);
rect(750, 550, 250, 150);
fill(0);
textSize(50);
text("Door Sensor", 250, 225);
text("Night Light", 250, 565);
if (screenStatus == 1 && mouseX >=150 && mouseX<=650 && mouseY >=50 && mouseY <= 350) {
colorChangeUltrasonic = color(255, 0, 0);
if (mousePressed) {
screenStatus = 2;
} else {
colorChangeUltrasonic = color(252, 108, 133);
}
}
if (screenStatus == 1 && mouseX >=150 && mouseX<=650 && mouseY >=400 && mouseY <= 700) {
colorChangePhotoresistor = color(255, 0, 0);
if (mousePressed) {
screenStatus = 3;
} else {
colorChangePhotoresistor = color(252, 108, 133);
}
}
if (screenStatus == 1 && mouseX >=750 && mouseX<=1000 && mouseY >=550 && mouseY <= 700) {
goodbye = color(255, 0, 0);
if (mousePressed) {
screenStatus = 4;
} else {
goodbye = color(252, 108, 133);
}
}
}
int kee;
void sending(int mm) {
if ( kee != mm ) {
kee = mm;
port.write(mm);
}
}
void doorSensor() {
background(173, 216, 230);
if (screenStatus == 5) {
sending(2);
check();
if (val !=null) {
String bob = trim(val);
fill(0);
textSize(80);
text("Door Sensor and Buzzer", 90, 100);
textSize(50);
text("Distance in cm from object: "+ val, 125, 300);
if (screenStatus == 5 && int(bob) <= 15 && bob != null) {
text("Buzzer's Status: ON", 125, 400);
} else {
text("Buzzer's Status: OFF", 125, 400);
}
}
fill(backButton);
rect(0, 700, 200, 100);
fill(255, 255, 0);
text("<<Back", 0, 767);
if (mousePressed && mouseX >= 0 && mouseX <= 200 && mouseY >= 700 && mouseY <= 800) {
screenStatus = 1;
port.clear();
}
}
}
void nightLight() {
background(173, 216, 230);
if (screenStatus == 6) {
check();
sending(3);
if (val !=null) {
String jimmie = trim(val);
fill(0);
textSize(80);
text("Photoresistor and LED", 110, 100);
textSize(50);
text("Photoresistor's reading: "+ val, 205, 300);
if (screenStatus == 6 && int(jimmie) <= 20 && jimmie != null) {
text("LED's Status: HIGH", 205, 400);
} else {
text("LED's Status: LOW", 205, 400);
}
}
fill(backButton);
rect(0, 700, 200, 100);
fill(255, 255, 0);
text("<<Back", 0, 767);
if (mousePressed && mouseX >= 0 && mouseX <= 200 && mouseY >= 700 && mouseY <= 800) {
screenStatus = 1;
port.clear();
}
}
}
void goodbye() {
background(255, 189, 228);
sending(4);
text("System will EXIT", 360, 100);
text("Made using Arduino, and Processing", 120, 300);
goodbyeX+=2;
sending(4);
if (goodbyeX >= 1162) {
System.exit(0);
}
}
Код Arduino
// Ultrasonic Display and Photoresistor
int incomingByte = 0;
int segPins[] = {8, 7, 6, 5, 4, 3, 2 };
#define led A0
#define buzz A1
#define res A5
#define echo A3
#define trig A2
#define switch1 13
#define switch2 12
#define switch3 11
long duration;
int distance;
int pRes;
int s1state;
int s2state;
int s3state;
byte segNumber[10][7] = {
{ 1, 1, 1, 1, 1, 0, 1}, // 9 change
{ 1, 1, 1, 1, 1, 1, 1}, // 8
{ 1, 1, 0, 1, 1, 0, 0}, // 7
{ 0, 1, 1, 1, 1, 1, 1}, // 6
{ 0, 1, 1, 1, 1, 0, 1}, // 5
{ 1, 0, 1, 1, 1, 0, 0}, // 4
{ 1, 1, 1, 0, 1, 0, 1}, // 3
{ 1, 1, 1, 0, 0, 1, 1}, // 2
{ 1, 0, 0, 0, 1, 0, 0}, // 1
{ 1, 1, 0, 1, 1, 1, 1}, // 0
};
void segDisplay(int num)
{
for (int i = 0; i < 7; i++)
{
digitalWrite(segPins[i], segNumber[num][i]);
}
}
void setup() {
Serial.begin(9600);
pinMode(switch1, INPUT);
pinMode(switch2, INPUT);
pinMode(switch3, INPUT);
pinMode(led, OUTPUT); // Declare the LED as an output
pinMode(buzz, OUTPUT); // Declare the LED as an output
pinMode(res, INPUT);
pinMode(trig, OUTPUT); // Sets the trigPin as an Output
pinMode(echo, INPUT); // Sets the echoPin as an Input
for (int i = 0; i < 7; i++) { // Sets the segment pins as an output
pinMode(segPins[i], OUTPUT);
}
}
void loop() {
// Switch States
s1state = digitalRead(switch1); // Read 1st switch
s2state = digitalRead(switch2); // Read 2nd switch
s3state = digitalRead(switch3); // Read 3rd switch
// processing data display
if (s1state == 1) {
if (Serial.available() > 0){
incomingByte = Serial.read();
if (incomingByte == 2) {
Serial.println(distance);
delay(1000);
} else if (incomingByte == 3) {
Serial.println(pRes);
delay(1000);
} else if (incomingByte == 4) {
for (int n = 0; n < 10; n++) // display digits 9 - 0 inclusive
{
segDisplay(n);
delay(1000);
}
}
}
}
if (s2state == 1) {
// Photoresistor and LED
pRes = analogRead(res);
if (pRes <= 20) { // if it's dark
digitalWrite(led, HIGH); // Turn the LED on
} else {
digitalWrite(led, LOW); // Turn the LED on
}
// Ultrasonic Sensor
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(5);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * 0.034 / 2;
// Ultrasonic buzzer if statement
if (distance <= 15) { // if object is within 15 centimeters
tone(buzz, 50); // buzzer
delay(50);
} else {
noTone(buzz);
}
} else {
digitalWrite(led, LOW);
noTone(buzz);
}
}
В этом коде у меня есть три экрана, на которых я могу нажать: Обработка изображения: (Пока не могу встраивать изображения, извиняюсь за неудобства.)
Проблема заключается здесь, когда я нажимаю на один из экранов , информация отображается правильно, и она обновляется. Однако, когда я выхожу и выхожу на другой экран (фоторезистор - ultransoni c), для переключения информации требуется некоторое время, например 15 секунд. Есть ли способ предотвратить это, чтобы информация стала точной, как только я нажму на другой экран?
Я зашел на форум arduino и получил ответ:
// Processing output for Arduino Ultrasonic and Photoresistor
color backButton = color(252, 108, 133); // Used to change colors for back button
color colorChangeUltrasonic = color(252, 108, 133); // Used to change colors for Ultrasonic Option
color colorChangePhotoresistor = color(252, 108, 133); // Used to change colors for Photoresistor Option
int screenStatus; // used to define screen state
import processing.serial.*;
Serial port;
String val;
void setup() {
size(1100, 800); // Sets the size to 1100-by-800 pixels.
screenStatus = 1;
String portName = "COM6"; // Matches with my Arduino
port = new Serial(this, portName, 9600); // baud rate and port
}
void draw() {
if (screenStatus == 1) {
controlPanel();
} else if (screenStatus == 2) {
doorSensor();
} else if (screenStatus == 3) {
nightLight();
} else {
}
// check();
}
int m;
void check() {
if (port.available() > 0) {
val = port.readStringUntil('\n');
println(val);
m++;
println(m);
}
}
void controlPanel() {
port.clear();
background(3, 190, 111);
fill(colorChangeUltrasonic);
rect(150, 50, 500, 300);
fill(colorChangePhotoresistor);
rect(150, 400, 500, 300);
fill(0);
textSize(50);
text("Door Sensor", 250, 225);
text("Night Light", 250, 565);
if (screenStatus == 1 && mouseX >=150 && mouseX<=650 && mouseY >=50 && mouseY <= 350) {
colorChangeUltrasonic = color(255, 0, 0);
if (mousePressed) {
screenStatus = 2;
doorSensor();
} else {
colorChangeUltrasonic = color(252, 108, 133);
}
}
if (screenStatus == 1 && mouseX >=150 && mouseX<=650 && mouseY >=400 && mouseY <= 700) {
colorChangePhotoresistor = color(255, 0, 0);
if (mousePressed) {
screenStatus = 3;
nightLight();
} else {
colorChangePhotoresistor = color(252, 108, 133);
}
}
}
int kee;
void sending(int mm) {
if ( kee != mm ) {
kee = mm;
port.write(mm);
}
}
void doorSensor() {
background(173, 216, 230);
if (screenStatus == 2) {
sending(2);
delay(500);
check();
if (val !=null) {
fill(0);
textSize(80);
text("Door Sensor and Buzzer", 90, 100);
textSize(50);
text("Distance in cm from object: "+ val, 125, 300);
text("Buzzer's Status: "+ val, 125, 400);
}
fill(backButton);
rect(0, 700, 200, 100);
fill(255, 255, 0);
text("<<Back", 0, 767);
if (mousePressed && mouseX >= 0 && mouseX <= 200 && mouseY >= 700 && mouseY <= 800) {
screenStatus = 1;
}
} else {
port.write(3);
}
}
void nightLight() {
background(173, 216, 230);
if (screenStatus == 3) {
sending(3);
delay(500);
check();
if (val !=null) {
fill(0);
textSize(80);
text("Photoresistor and LED", 110, 100);
textSize(50);
text("Photoresistor's reading: "+ val, 205, 300);
text("LED's Status: "+ val, 205, 400);
}
fill(backButton);
rect(0, 700, 200, 100);
fill(255, 255, 0);
text("<<Back", 0, 767);
if (mousePressed && mouseX >= 0 && mouseX <= 200 && mouseY >= 700 && mouseY <= 800) {
screenStatus = 1;
}
} else {
port.write(2);
}
}
однако, если я использую этот код, он зависает из-за задержки. Если я удаляю задержку, она работает, но не обновляется. Если какой-либо код может быть исправлен, я буду чрезвычайно благодарен.