Код (C++): #include <math.h> #include <LiquidCrystal.h> LiquidCrystal lcd(13,12,11,10,9,8); int t1,t2,t3; void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); lcd.begin(16, 2); lcd.print("Time:"); lcd.setCursor(0, 1); lcd.print("Temperature:"); } void loop() { if (Serial.available() > 0) { Serial.println ("Hours"); t1 = Serial.read(); delay (6000); Serial.println ("Minutes"); t2 = Serial.read(); delay (6000); Serial.println ("Seconds"); t3 = Serial.read(); delay (6000); } else { float v = analogRead(A5) * 5 / 1024.0; float r1 = v / (5 - v); float ttre = 1./( 1./4300*log(r1)+1./(25. + 273.) ) - 273; lcd.setCursor(12, 1); lcd.print (ttre,1); lcd.setCursor(6, 0); if (ttre > 18 && ttre < 27) { analogWrite (5, 10); digitalWrite (6, LOW); digitalWrite (3, LOW); } else if (ttre < 18) { analogWrite (6, 10); digitalWrite (5, LOW); digitalWrite (3, LOW); } else { digitalWrite (3, HIGH); digitalWrite (5, LOW); digitalWrite (6, LOW); } lcd.setCursor(6,0); lcd.print(t1); lcd.print(":"); lcd.print(t2); lcd.print(":"); lcd.print (t3); Serial.print (t1); Serial.print (":"); Serial.print (t2); Serial.print (":"); Serial.println (t3); t3 = t3 + 1; if (t3 >= 59) { t2 = t2 + 1; t3 = 0; } if (t2 >= 59) { t1 = t1 + 1; t2 = 0; } if (t1 >= 24) { t1 = 0; t2 = 0; t3 = 0; } delay(990); } } Вот мой код. Он рабочий, но с одним но: время после запуска скидывается на 0, что нормально. Но у меня не получается задать время через USB, он выдаёт немыслимые значения и потом снова скидывается на ноль. Прошу помощи. P.s. Я сделал часы с термометром: на дисплей выводится текущая температура и время (к сожалению с последней загрузки). А температура ещё и светодиодами дополняется.
Не, ну вы же не рассказываете какие данные посылаются для установки времени. О parseInt почитайте в гугле, но можно и read использовать. Все зависит от того, что идет на вход ардуинке. И еще необходимо в начале слать какой-то признак начала пакета, иначе ардуина не разберет где минуты, а где часы. Короче, пока проблема в протоколе обмена (любые устройства, которые хотят общаться, должны придерживаться протокола). Описывайте протокол, потом подскажем.
Собственно говоря уже не надо. Я воспользовался вашим советом, советом rkit а, и в итоге всё получилось. Мне просто надо было заменить delay на однажды вызванный Serial.setTimeout и всё заработало. Но остался один вопросик. Сейчас, когда количество секунд меньше 10 (t3) у меня показывается нужное число, а после него цифра, которая осталась от когда-то показывавшегося двухзначного числа. Тоесть вместо записи на дисплее "12:35:01" я вижу "12:35:51". Есть ли тут что-то вроде Паскалевского case, чтоб назначить t3 значение "01" вместо "1"?
Извиняюсь, я забыл сказать, что уже пытался это поправить, перенося курсор дальше когда t3 < 10 и тогда получалось "12:35:51". А если смотреть по коду, который я показал в первом сообщении, то там получается как-то так "12:35:18" вместо "12:35:1"
Вот код, который работает на данный момент: Код (C++): #include <math.h> #include <LiquidCrystal.h> LiquidCrystal lcd(13,12,11,10,9,8); int t1,t2,t3; void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); lcd.begin(16, 2); lcd.print("Time:"); lcd.setCursor(0, 1); lcd.print("Temperature:"); } void loop() { if (Serial.available() > 0) { Serial.println ("Hours"); Serial.setTimeout(5000); t1 = Serial.parseInt(); Serial.println ("Minutes"); t2 = Serial.parseInt(); Serial.println ("Seconds"); t3 = Serial.parseInt(); } float v = analogRead(A5) * 5 / 1024.0; float r1 = v / (5 - v); float ttre = 1./( 1./4300*log(r1)+1./(25. + 273.) ) - 273; lcd.setCursor(12, 1); lcd.print (ttre,1); if (ttre > 18 && ttre < 27) { analogWrite (5, 10); digitalWrite (6, LOW); digitalWrite (3, LOW); } else if (ttre < 18) { analogWrite (6, 10); digitalWrite (5, LOW); digitalWrite (3, LOW); } else { digitalWrite (3, HIGH); digitalWrite (5, LOW); digitalWrite (6, LOW); } lcd.setCursor(6,0); lcd.print(t1); lcd.print(":"); lcd.print(t2); lcd.print(":"); if (t3 <10) { lcd.setCursor (13, 0); } lcd.print (t3); Serial.print (t1); Serial.print (":"); Serial.print (t2); Serial.print (":"); Serial.println (t3); t3 = t3 + 1; if (t3 >= 59) { t2 = t2 + 1; t3 = 0; } if (t2 >= 59) { t1 = t1 + 1; t2 = 0; } if (t1 >= 24) { t1 = 0; t2 = 0; t3 = 0; } delay(998); }
Кстати, глупое добавление такой вот строчки, после вывода времени не помогло. Код (C++): Serial.println (" ");
Я дурак. Естественно куча пробелов после времени, которое отправляется по USB не изменит что-то на дисплее. Я имел ввиду вот эту строчку, которая даже помогла: Код (C++): lcd.print(" ");