GUI для часов на ардуино
- Войдите на сайт для отправки комментариев
В общем, сделан код на ардуино для часов с будильником, вот скетч:
#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 );
}
}
Вот что выводит мне процессинг (приложенный принтскрин)
:
решить эту проблему? чтобы передавались значения именно целочисленные по ком порту в ардуино, чтобы соответственно устанавливать время и будильник. ПРОШУ ПОМОГИТЕ!!)))
Первым делом надо открыть монитор порта в Ардуино и посмотреть, что передается с Ардуино. А оттуда ничего не передается, цикл while бесконечный, и его надо заменить. Задержки в 60 секунд тоже не подарок.
Эти вопросы уже обсуждались в предыдущих темах, почитайте.
А оттуда ничего не передается
с чего вы это взяли? - код смотрите
разместите код Ардуино в песочнице, там народу много больше бывает.
решить эту проблему? чтобы передавались значения именно целочисленные по ком порту в ардуино, чтобы соответственно устанавливать время и будильник. ПРОШУ ПОМОГИТЕ!!)))
1:
- ардуино и процессинг устанавливают связь
- ардуино что-то простое передает, процессинг пишет это на экране
2:
- ардуино и процессинг устанавливают связь
- процессинг что-то простое передает, ардуино выводит это в монитор (или 13 диодом мигает)
Думаю, что чтение порта надо переместить из void controlEvent в void draw
Проверяя перед чтением что port.available() > 0
прочитайте посты 1 и 2 там почти все написано. Вот пример работающей программы.
создаете массив из 2 чисел - часы и минуты. По таймеру (библиотек полно) передаете их в Serial, символ А начало передачи. У меня реализована передача байтов, поэтому необходимо привести числа в байты.