Как я могу объединить эти два кода в одной программе? И используйте его в приложении javafx

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

В моем java netbeans есть два графических интерфейса. Для мониторинга (первый код) и управления (второй). Я хочу, чтобы они оба работали только с одним комбинированным кодом в arduino.

Я попытался использовать оператор if else, чтобы Arduino знала, что делать. Тоже не работает. Кажется, я что-то пропустил

const int model = 0;  

void setup() {
Serial.begin(9600);

}

float sensitivity[] ={
      0.185,// для ACS712ELCTR-05B-T
      0.100,// для ACS712ELCTR-20A-T
      0.066// для ACS712ELCTR-30A-T

     } ;

void loop() {
static unsigned long count=0;
static float Vsum=0;
float Vave=0;
int volt = analogRead(A1);

float voltage= map(volt,0,1023, 0, 2500)/100.0;
Vsum=Vsum+voltage;

static float Csum=0;
float Cave=0;
 float milli = pow(10, -3);
 float current = (voltage / sensitivity[model]);
 float current1 = current*milli;

Csum=Csum+current1;
count++;
Vave=Vsum/count;
Cave=Csum/count;
float watts = Vave*Cave;

long milisec = millis();
long time=milisec/1000; 

 float energy = (watts*time)/3600;
Serial.print(energy,6);
Serial.println("Wh");
delay(1000);

}

А это второй код. Это получает байт от java для управления светодиодами

int incomingByte;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(0, OUTPUT);


}

void loop() {
 // if (Serial.available()>0) {
    incomingByte = Serial.read();

    if(incomingByte == 0x01){
      digitalWrite(13, HIGH);
     Serial.println("ON");

    }else if(incomingByte == 0x00){
      digitalWrite(13, LOW);
       Serial.println("OFF");
    }

    if(incomingByte == 0x02){
      digitalWrite(12, HIGH);
    }else if(incomingByte == 0x03){
      digitalWrite(12, LOW);
    }

    if(incomingByte == 0x04){
      digitalWrite(11, HIGH);
    }else if(incomingByte == 0x05){
      digitalWrite(11, LOW);
    }

    if(incomingByte == 0x06){
      digitalWrite(10, HIGH);
    }else if(incomingByte == 0x07){
      digitalWrite(10, LOW);
    }

    if(incomingByte == 0x08){
      digitalWrite(9, HIGH);
    }else if(incomingByte == 0x09){
      digitalWrite(9, LOW);
    }

    if(incomingByte == 0x10){
      digitalWrite(8, HIGH);
    }else if(incomingByte == 0x11){
      digitalWrite(8, LOW);
    }

    if(incomingByte == 0x12){
      digitalWrite(7, HIGH);
    }else if(incomingByte == 0x13){
      digitalWrite(7, LOW);
    }

    if(incomingByte == 0x14){
      digitalWrite(6, HIGH);
    }else if(incomingByte == 0x15){
      digitalWrite(6, LOW);
    }

    if(incomingByte == 0x16){
      digitalWrite(5, HIGH);
   }else if(incomingByte == 0x17){
      digitalWrite(5, LOW);
    }

    if(incomingByte == 0x18){
      digitalWrite(4, HIGH);
    }else if(incomingByte == 0x19){
      digitalWrite(4, LOW);
    }

    if(incomingByte == 0x20){
      digitalWrite(3, HIGH);
    }else if(incomingByte == 0x21){
      digitalWrite(3, LOW);
    }

    if(incomingByte == 0x22){
      digitalWrite(2, HIGH);
    }else if(incomingByte == 0x23){
      digitalWrite(2, LOW);
    }

    if(incomingByte == 0x24){
      digitalWrite(1, HIGH);
    }else if(incomingByte == 0x25){
      digitalWrite(1, LOW);
    }

    if(incomingByte == 0x026){
      digitalWrite(0, HIGH);
    }else if(incomingByte == 0x027){
      digitalWrite(0, LOW);
    }

  delay(100);
}

Это мой пример кода из приложения javafx

    try {
        if (tbLED12.isSelected()) {
            if (arduinoPort != null) {
                arduinoPort.writeByte((byte) 0x02);
                System.out.println("LED 12 ON");
            } else {
                System.out.println("arduinoPort not connected!");
            }
        } else {
            if (arduinoPort != null) {
                arduinoPort.writeByte((byte) 0x03);
                System.out.println("LED 12 OFF");
            } else {
                System.out.println("arduinoPort not connected!");
            }
        }
    } catch (SerialPortException ex) {
        Logger.getLogger(JavaFXApplication11.class.getName())
                .log(Level.SEVERE, null, ex);
    }

, 👍0

Обсуждение

Вы не показали нам свой комбинированный код, поэтому мы не можем сказать, что с ним не так. На этом сайте много вопросов типа «Нужно объединить эти два кода». Вы смотрели в них?, @chrisl

извините, но я не могу добавить свой комбинированный код, потому что он слишком длинный, но я просто добавляю свой первый код ко второму, и он становится неисправным, но если я запускаю их по отдельности, они работают хорошо., @Rica Jacutina

не устанавливайте pinmode для 0 и 1. это Serial RX и TX., @Juraj

Даже если вы просто поместите оба кода в один файл, это не должно быть слишком длинным для редактора вопросов. В противном случае вы должны создать минимальный полный пример. Вопрос о том, как объединить 2 кода без проблемного комбинированного кода, является очень широким и общим вопросом, который задавался и на который здесь много раз отвечали. Без вашего комбинированного кода и описаний того, как он неисправен, каждый ответ будет склонен к долгому обсуждению комментариев, чтобы добраться до сути проблемы (как мы видим с ответом Питера ниже). Этот сайт не подходит для этого; это не форум., @chrisl


2 ответа


1

Комбинация этого кода предназначена для синхронизации показаний датчиков с управляющими последовательностями, которые отправляются из программы Java.

Вторая программа непрерывно считывает последовательный порт в циклическом методе. Для этого лучше использовать последовательное прерывание. Позволь мне привести пример.

Мой код написан без IDE, поэтому это просто непроверенный пример. Но, надеюсь, я не включил ошибки ;-).

В качестве основы я использую первую программу:

const int model = 0;  
float sensitivity[] = {
  0.185,// для ACS712ELCTR-05B-T
  0.100,// для ACS712ELCTR-20A-T
  0.066// для ACS712ELCTR-30A-T
} ;

unsigned long count = 0;
float         Vsum  = 0;
float         Csum  = 0;

long startTime = 0;

void setup() 
{
  Serial.begin(9600);
  // установка контактов светодиода для вывода
  // я использую цикл
  for ( int i = 2; i < 14; i++ )
  {
    pinMode( i, OUTPUT );
  }
}


void loop() 
{
  float Vave = 0;
  float Cave = 0;
  // pow слишком дорого для цикла
  // я использую константу
  float milli = 0.001;

  if ( startTime = 0 ) startTime = millis();

  float voltage = map( analogRead( A1 ), 0, 1023, 0, 2500 ) / 100.0;
  Vsum = Vsum + voltage;

  float current  = ( voltage / sensitivity[ model ] );
  float current1 = current * milli;

  Csum = Csum + current1;

  count++;

  Vave = Vsum / count;
  Cave = Csum / count;
  float watts = Vave * Cave;

  // здесь вы не использовали временную дельту,
  // но энергия работает в течение определенного периода времени
  long timeDelta = ( millis() - startTime ) / 1000; 

  float energy = ( watts * timeDelta ) / 3600;
  Serial.print( energy, 6 );
  Serial.println( "Wh" );

  serialHandler();

  delay( 1000 );
}

void serialHandler() 
{
   delay( 200 );
   while ( Serial.available() ) 
   {
     // получаем новый байт:
     int inByte = Serial.read();

     if(inByte == 0x01) 
     {
       digitalWrite(13, HIGH);
       //Serial.println("ВКЛ");
     }
     else if(inByte == 0x00)
     {
       digitalWrite(13, LOW);
       //Serial.println("ВЫКЛ");
     }
     else if(inByte == 0x02) digitalWrite(12, HIGH);
     else if(inByte == 0x03) digitalWrite(12, LOW);
     else if(inByte == 0x04) digitalWrite(11, HIGH);
     else if(inByte == 0x05) digitalWrite(11, LOW);
     else if(inByte == 0x06) digitalWrite(10, HIGH);
     else if(inByte == 0x07) digitalWrite(10, LOW);
     else if(inByte == 0x08) digitalWrite(9,  HIGH);
     else if(inByte == 0x09) digitalWrite(9,  LOW);
     else if(inByte == 0x10) digitalWrite(8,  HIGH);
     else if(inByte == 0x11) digitalWrite(8,  LOW);
     else if(inByte == 0x12) digitalWrite(7,  HIGH);
     else if(inByte == 0x13) digitalWrite(7,  LOW);
     else if(inByte == 0x14) digitalWrite(6,  HIGH);
     else if(inByte == 0x15) digitalWrite(6,  LOW);
     else if(inByte == 0x16) digitalWrite(5,  HIGH);
     else if(inByte == 0x17) digitalWrite(5,  LOW);
     else if(inByte == 0x18) digitalWrite(4,  HIGH);
     else if(inByte == 0x19) digitalWrite(4,  LOW);
     else if(inByte == 0x20) digitalWrite(3,  HIGH);
     else if(inByte == 0x21) digitalWrite(3,  LOW);
     else if(inByte == 0x22) digitalWrite(2,  HIGH);
     else if(inByte == 0x23) digitalWrite(2,  LOW);
     //иначе if(inByte == 0x24) digitalWrite(1, HIGH);
     //иначе if(inByte == 0x25) digitalWrite(1, LOW);
     //иначе if(inByte == 0x26) digitalWrite(0, HIGH);
     //иначе if(inByte == 0x27) digitalWrite(0, LOW);
   }
}

ИЗМЕНИТЬ:

Я немного изменил код в соответствии с комментариями Юрая. Я также прокомментировал файлы `Serial.println', которые сообщали о состоянии светодиода 13.

,

serialEvent не является прерыванием. вне цикла() ядро тестирует Serial.available() и, если не 0, вызывает serialEvent() ., @Juraj

Я не могу управлять светодиодами. Когда я запускаю программу, загорается только один светодиод, хотя я включил их все. Но мониторинг работает, @Rica Jacutina

@Juraj И снова я кое-чему научился. Тем временем я был дома и мог опробовать свою программу, но она не сработала так, как я ожидал. И вы дали объяснение. А теперь мне грустно и я думаю о мороженом в холодильнике и о том, стоит ли его есть. Хм, да, я сделаю это. Но прежде чем я найду лучшее решение проблемы. Возможно, я переделаю функцию, немного подожду после отправки значений в java, а затем вызову прежний обратный вызов события. Затем я жду одну секунду и еще раз., @Peter Paul Kiefer

@RicaJacutina Какой светодиод работает, возможно, 13? Это встроенный светодиод. Правильно ли вы подключили остальные? Вы отправляете правильные значения? Знаете ли вы, что для светодиода 13 вы должны отправить нечетное значение (1), чтобы включить его. Остальные включаются четными значениями ( 2,4,6,8,10,12,). Эта функциональность должна работать. Я попробовал ее несколько минут назад со своей собственной настройкой., @Peter Paul Kiefer

@PeterPaulKiefer Я попробовал ваш код, мониторинг работает, но когда я управляю светодиодом, он не работает должным образом в моем графическом интерфейсе Java. Да 13 включается, но не выключается. Когда я попытался снова запустить программу, светодиод не заработал. :( Я знаю, что 13 загораются до нечетного значения, а другие - до четного. И я уверен, что все правильно подключил., @Rica Jacutina

@RicaJacutina Есть одна вещь, в которой я не уверен, а именно: может ли графический интерфейс Java обрабатывать строки «ON» и «OFF», которые вы отправляете с помощью Serial.println («OFF»); или Serial.println («ON» ");? (в случаях со светодиодом 13) Возможно, ваш графический интерфейс дает сбой, потому что он не получает значения, а затем не будет отправлять другие значения управления? Имеют ли возвраты какое-то значение или вы можете их безопасно удалить? Затем попробуйте удалить их. Или не управляйте светодиодом 13, а только остальными, чтобы проверить, работает ли это. Кстати: является ли графический интерфейс Java приложением обработки?, @Peter Paul Kiefer

Я использую приложение javafx. Я добавил свой код Java выше. Третий, @Rica Jacutina

Самая интересная часть - принимающая часть. Не отправляющая часть. Что произойдет, если ваша программа получит строку "ON" при включенном светодиоде 13? Может ли это привести к исключению, которое, например, закрывает последовательный порт. Вы видели комментарий @Juraj к вашему вопросу. Это то, что я полностью пропустил. Поскольку контакты 0 и 1 используются для последовательного соединения, вы не можете использовать их для управления светодиодами. Я немного изменю свой код. Возможно, тогда это работает для вашей установки., @Peter Paul Kiefer

@RicaJacutina Итак; Я изменил код. Но светодиоды 0 и 1 не будут работать с этой версией., @Peter Paul Kiefer


0
void serialEvent();
const int model = 0;  
float sensitivity[] = {
  0.185,// для ACS712ELCTR-05B-T
  0.100,// для ACS712ELCTR-20A-T
  0.066// для ACS712ELCTR-30A-T
} ;

unsigned long count = 0;
float         Vsum  = 0;
float         Csum  = 0;
float         DecPowerRate = 9.8623 ;//кВтч
long          startTime = 0;
float         no_voltage = 0.00;
//плавающий адрес = 0;
float         no_CURRENT = 0.000;
float energy;
long timeDelta;float consumption;float Kwatts;
void setup() 
{
  Serial.begin(9600);
  // установка контактов светодиода для вывода
  // я использую цикл
  for ( int i = 2; i < 14; i++ )
  {
    pinMode( i, OUTPUT );
  }
}


void loop() 
{
  float Vave = 0;
  float Cave = 0;
  float milli = 0.001;// pow слишком дорого для цикла

  if ( startTime = 0 ) startTime = millis();


  float voltage = map( analogRead( A1 ), 0, 1023, 0, 2500 ) / 100.0;

  if( voltage >no_voltage){
  Vsum = Vsum + voltage;

  float current  = ( voltage / sensitivity[ model ] );
  float current1 = current * milli;

  Csum = Csum + current1;

  count++;

  Vave = Vsum / count;
  Cave = Csum / count;
  Kwatts = (Vave * Cave)/1000;
  }
    if (Cave >no_CURRENT){
  // здесь вы не использовали временную дельту,
  // но энергия работает в течение определенного периода времени
  timeDelta = ( millis() - startTime ) / 1000; 
  energy = ( Kwatts * timeDelta ) / 3600;
  consumption = energy * DecPowerRate;
}


  //Serial.print(энергия, 6);
 // Serial.println("кВтч");

  Serial.print( "P " );
  Serial.print( consumption, 6 );
  Serial.println( "/kWh" );
  delay( 1000 );



}
// соглашение об именах для последовательного прерывания
void serialEvent() 
{
   while (Serial.available()) 
   {
 // получаем новый байт:
 int inByte = Serial.read();

 if(inByte == 0x01) 
 {
   digitalWrite(13, HIGH);
   //Serial.println("ВКЛ");
 }
 else if(inByte == 0x00)
 {
   digitalWrite(13, LOW);
   //Serial.println("ВЫКЛ");
 }
 else if(inByte == 0x02) digitalWrite(12, HIGH);
 else if(inByte == 0x03) digitalWrite(12, LOW);
 else if(inByte == 0x04) digitalWrite(11, HIGH);
 else if(inByte == 0x05) digitalWrite(11, LOW);
 else if(inByte == 0x06) digitalWrite(10, HIGH);
 else if(inByte == 0x07) digitalWrite(10, LOW);
 else if(inByte == 0x08) digitalWrite(9,  HIGH);
 else if(inByte == 0x09) digitalWrite(9,  LOW);
 else if(inByte == 0x10) digitalWrite(8,  HIGH);
 else if(inByte == 0x11) digitalWrite(8,  LOW);
 else if(inByte == 0x12) digitalWrite(7,  HIGH);
 else if(inByte == 0x13) digitalWrite(7,  LOW);
 else if(inByte == 0x14) digitalWrite(6,  HIGH);
 else if(inByte == 0x15) digitalWrite(6,  LOW);
 else if(inByte == 0x16) digitalWrite(5,  HIGH);
 else if(inByte == 0x17) digitalWrite(5,  LOW);
 else if(inByte == 0x18) digitalWrite(4,  HIGH);
 else if(inByte == 0x19) digitalWrite(4,  LOW);
 else if(inByte == 0x20) digitalWrite(3,  HIGH);
 else if(inByte == 0x21) digitalWrite(3,  LOW);
 else if(inByte == 0x22) digitalWrite(2,  HIGH);
 else if(inByte == 0x23) digitalWrite(2,  LOW);

   }
}

Это сработало! Спасибо за помощь! <3

,