Как разбить переменную на 2 символа?
- Войдите на сайт для отправки комментариев
Пт, 20/11/2015 - 11:37
Друзья я новичок и мне нужна ваша помощь есть код:
byte SEK = 0;
byte MIN = 0;
byte HOUR = 0;
unsigned long prMillis = 0;
void setup()
{
}
void loop()
{
if (millis() - prMillis > 1000){
prMillis = millis();
HOUR = 19;
MIN = 06;
SEK++;
if (SEK > 59){
SEK = 0;
MIN++;
}
if (MIN > 59){
MIN = 0;
HOUR++;
}
if (HOUR > 23) HOUR = 0;
}
lcd.print(HOUR);
}
Вопрос такой как разбить переменную [ byte SEK ] на два символа тоесть если SEK = 24; как разбить его на 2 и 4? ps Это мне нужно чтобы вывести значение на жк дисплей, дисплей глюкнутый и выводит только один символ в любом значении :( Но зато работает :)
Использовать деление на 10 пробовали? Такое "/" и такое "%".
Спасибо за ответ, но немоглибы вы пояснить это в коде) Просто я новичок и обсалютно туп в этом)
teslaboy47, вы можете сразу завести по две переменные, и считать их до 10 и до 6 соответственно. Что бы потом ничего не разбивать.
byte SEK1,SEK2; unsigned long prMillis = 0; void setup(){ Serial.begin(9600); } void loop() { if (millis() - prMillis >= 1000){ prMillis = millis(); SEK1++; if (SEK1==10){ SEK1=0; SEK2++; if (SEK2==6) { SEK2=0; MIN++; } } // для минут аналогично Serial.print(SEK2); Serial.println(SEK1); } }Большое спасибо! Получился код:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); byte SEK = 0; byte MIN = 0; byte HOUR = 0; unsigned long prMillis = 0; void setup() { lcd.init(); lcd.backlight(); } void loop() { if (millis() - prMillis > 1000){ prMillis = millis(); HOUR = 13; MIN = 5; SEK++; if (SEK > 59){ SEK = 0; MIN++; } if (MIN > 59){ MIN = 0; HOUR++; } if (HOUR > 23) HOUR = 0; } byte SEK1 = SEK / 10; byte SEK2 = SEK % 10; byte MIN1 = MIN / 10; byte MIN2 = MIN % 10; byte HOUR1 = HOUR / 10; byte HOUR2 = HOUR % 10; lcd.setCursor(1, 0); lcd.print(HOUR1); lcd.print(HOUR2); lcd.print(":"); lcd.print(MIN1); lcd.print(MIN2); lcd.print(":"); lcd.print(SEK1); lcd.print(SEK2); delay(1000); }Но есть одна проблема когда проходит минута к минуте должен прибавиться 1 и прибовляется но когла проходит ещё секунда он отнимается и минута уходит в предыдущее значение почиму?
Понимание систем исчисления - это то, с чего должен начинать программист.
Пока сами в сути не разберетесь, чужие подсказки сильно не помогут.
byte SEK1 = SEK / 10; byte SEK2 = SEK % 10; byte MIN1 = MIN / 10; byte MIN2 = MIN % 10; byte HOUR1 = HOUR / 10; byte HOUR2 = HOUR % 10; lcd.print(HOUR1); lcd.print(HOUR2); lcd.print(":"); lcd.print(MIN1); lcd.print(MIN2); lcd.print(":"); lcd.print(SEK1); lcd.print(SEK2);Не надо заводить отдельные переменные, пишите сразу:
Спасибо вам большое сам догнал чё к чему, но без вас бы точно не справился ;)
Вобще-то Вам нужно было перевести число в строку (десятичную запись числа).
http://www.cplusplus.com/reference/cstdio/sprintf/?kw=sprintf
Но есть одна проблема когда проходит минута к минуте должен прибавиться 1 и прибовляется но когла проходит ещё секунда он отнимается и минута уходит в предыдущее значение почиму?
А это потому, что вы ининциализируете значения переменных MIN и HOUR при каждом вызове функции loop(). Перенесите соответствующие строки (23,24) в setup() и будет вам счастье.
Я вообще бы не рекомендовал заводить отдельные переменные - код бы выглядел примерно так:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); unsigned long prMillis = 0; unsigned long secs = 0; void setup() { lcd.init(); lcd.backlight(); } void loop() { if (millis() - prMillis > 1000){ prMillis = millis(); secs++; char time[8]; byte hour = (secs/3600)%24; byte min = (secs/60)%60; byte second = secs%60; sprintf_P(time,PSTR("%02d:%02d:%02d"),hour,min,second); lcd.setCursor(1, 0); lcd.print(time); } }Хранить время в секундах гораздо проще - переводить тоже не сложно - добавть минуту=добавляем 60 сек
добавить час=добавляем 3600 сек