Как заставить Arduino обновлять правильную информацию для обработки? - PullRequest
0 голосов
/ 12 января 2020

Джеймс здесь. У меня были проблемы при попытке заставить мою программу работать, которая включает в себя 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);
  }
}

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

  • Спасибо, Джеймс
...