GUI для часов на ардуино(помогите решить проблему пожалуйста)

Тема в разделе "Arduino & Shields", создана пользователем Voronik, 25 апр 2019.

  1. Voronik

    Voronik Нуб

    В общем, сделан код на ардуино для часов с будильником, вот скетч:
    Код (C++):
    #include "SevenSegmentTM1637.h"
    #include "SevenSegmentExtended.h"
    #include <DS1302.h>

    DS1302 rtc(10, 9, 8);
    Time t;
    const int PIN_CLK = 3;
    const int PIN_DIO = 2;
    const int piezoPin = 13;

    SevenSegmentExtended      display(PIN_CLK, PIN_DIO);

    int h=-1;
    int m=-1;
    int alarmHour=-1, alarmMinute=-1;

    void setup()
    {
     
      Serial.begin(9600);
      display.begin();            // initializes the display
      display.setBacklight(100);  // set the brightness to 100 %
     
      rtc.halt(false);
      rtc.writeProtect(false);
      pinMode (piezoPin,OUTPUT);
    }



    void loop()
    {
      if (h == -1 || m == -1){
       while (Serial.available()>0){
        Serial.setTimeout (60000);
        h = Serial.parseInt();
        Serial.println (h);
        break;
      }

      while (Serial.available()>0){
        Serial.setTimeout (60000);
        m = Serial.parseInt();
        Serial.println (m);
        break;
      }
      rtc.setTime(h, m, 0);
    }
        else {
          if (alarmHour == -1 || alarmMinute == -1){
            Serial.println ("Enter alarm");
            Serial.setTimeout (10000);
            while (Serial.available()>0){
              Serial.setTimeout (60000);
              alarmHour = Serial.parseInt();
              Serial.println (alarmHour);
              break;
              }
       
            while (Serial.available()>0){
              Serial.setTimeout (60000);
              alarmMinute = Serial.parseInt();
              Serial.println (alarmMinute);
              break;
              }
              }
             
      t = rtc.getTime();

      if(millis()%1000==0){
      display.printTime(t.hour, t.min, false);
      }

      if (t.hour == alarmHour && t.min == alarmMinute){
         display.printTime(t.hour, t.min, false);
         tone(piezoPin, 2000); // Запустили звучание
         delay(500);
         noTone(piezoPin);
         alarmHour = -1;
         alarmMinute = -1;
      }
        }
    }
    Мне необходимо написать для него пользовательский интерфейс, соответственно решила выбрать Processing. Методом проб ошибок и примеров библиотек я написала сам интерфейс, но возникает следующая проблема, значения которые я передаю через processing в arduino по ком порту, передаются неверно, для этого я специально после отправки значения проверяю считывая из ком порта то, что передалось. Но значение которое считывается равно -1, даже если я просто передаю числа, символы, значение которое передалось, судя по чтению из ком порта всегда равно -1. Вот код:
    Код (Java):
    import controlP5.*;
    import processing.serial.*;

    Serial port;
    ControlP5 cp5;

    String textValue = "";
    int val=0;
    void setup() {
      size(700,400);
     
      PFont font = createFont("arial",20);
      port = new Serial(this, "COM3", 9600);
      cp5 = new ControlP5(this);
     
      cp5.addTextfield("Hour")
      .setPosition(20,100)
         .setSize(200,40)
         .setFont(createFont("arial",20))
         .setAutoClear(false)
         ;
                   
      cp5.addTextfield("Minute")
         .setPosition(20,170)
         .setSize(200,40)
         .setFont(createFont("arial",20))
         .setAutoClear(false)
         ;
      cp5.addTextfield("Alarm Hour")
         .setPosition(270,100)
         .setSize(200,40)
         .setFont(createFont("arial",20))
         .setAutoClear(false)
         ;
      cp5.addTextfield("Alarm Minute")
         .setPosition(270,170)
         .setSize(200,40)
         .setFont(createFont("arial",20))
         .setAutoClear(false)
         ;
      textFont(font);
    }

    void draw() {
      background(10);
      fill(255);
    }


    void controlEvent(ControlEvent theEvent) {
      if(theEvent.isAssignableFrom(Textfield.class)) {
        println( int(theEvent.getStringValue()) );
             port.write (int(theEvent.getStringValue()));
             val = port.read();
             println( val );
      }
    }
    Вот что выводит мне процессинг (приложенный принтскрин):
    Снимок.PNG
    первое значение то которое я передавала, второе- то которое передалось. Вопрос: что же мне делать? как решить эту проблему? чтобы передавались значения именно целочисленные по ком порту в ардуино, чтобы соответственно устанавливать время и будильник. ПРОШУ ПОМОГИТЕ!!)))
     
  2. b707

    b707 Гуру

    метод port.write() пишет в порт не строчку "12", а число 12 одним байтом.
    А на стороне ардуины вы ждете строчку - естесственно, что она читает неверно

    Я плохо знаю процессинг, если в нем кроме функции port.write() есть что-то типа port.print() - это поможет