GUI для часов на ардуино

voronik
Offline
Зарегистрирован: 25.04.2019

В общем, сделан код на ардуино для часов с будильником, вот скетч:

#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. Вот код:

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 );
  }
}

Вот что выводит мне процессинг (приложенный принтскрин)

решить эту проблему? чтобы передавались значения именно целочисленные по ком порту в ардуино, чтобы соответственно устанавливать время и будильник. ПРОШУ ПОМОГИТЕ!!)))

ata3d
Offline
Зарегистрирован: 24.05.2017

Первым делом надо открыть монитор порта в Ардуино и посмотреть, что передается с Ардуино. А оттуда ничего не передается, цикл while бесконечный, и его надо заменить. Задержки в 60 секунд тоже не подарок.

Эти вопросы уже обсуждались в предыдущих темах, почитайте.

b707
Offline
Зарегистрирован: 26.05.2017

ata3d пишет:

А оттуда ничего не передается

с чего вы это взяли? - код смотрите

ata3d
Offline
Зарегистрирован: 24.05.2017

разместите код Ардуино в песочнице, там народу много больше бывает.

SLKH
Offline
Зарегистрирован: 17.08.2015

voronik пишет:

решить эту проблему? чтобы передавались значения именно целочисленные по ком порту в ардуино, чтобы соответственно устанавливать время и будильник. ПРОШУ ПОМОГИТЕ!!)))

Для начала написать 2 коротких программки без RTC, 1637 и прочих красот:

1:

- ардуино и процессинг устанавливают связь

- ардуино что-то простое передает, процессинг пишет это на экране

 

2:

- ардуино и процессинг устанавливают связь

- процессинг что-то простое передает, ардуино выводит это в монитор (или 13 диодом мигает)

 

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Думаю, что чтение порта надо переместить из void controlEvent в void draw

Проверяя перед чтением что port.available() > 0

ata3d
Offline
Зарегистрирован: 24.05.2017

прочитайте посты 1 и 2 там почти все написано. Вот пример работающей программы.

создаете массив из 2 чисел - часы и минуты. По таймеру (библиотек полно) передаете их в Serial, символ А начало передачи. У меня реализована передача байтов, поэтому необходимо привести числа в байты.