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, символ А начало передачи. У меня реализована передача байтов, поэтому необходимо привести числа в байты.