Как разбить переменную на 2 символа?

teslaboy47
Offline
Зарегистрирован: 19.11.2015

Друзья я новичок и мне нужна ваша помощь есть код:

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 Это мне нужно чтобы вывести значение на жк дисплей, дисплей глюкнутый и выводит только один символ в любом значении :( Но зато работает :)

vk007
Offline
Зарегистрирован: 16.06.2015

Использовать деление на 10 пробовали? Такое "/" и такое "%".

teslaboy47
Offline
Зарегистрирован: 19.11.2015

Спасибо за ответ, но немоглибы вы пояснить это в коде) Просто я новичок и обсалютно туп в этом)

vk007
Offline
Зарегистрирован: 16.06.2015
byte SEK1 = SEK / 10;   // тут десятки
byte SEK2 = SEK % 10;   // тут единицы

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

 

teslaboy47
Offline
Зарегистрирован: 19.11.2015

Большое спасибо! Получился код:

#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 и прибовляется но когла проходит ещё секунда он отнимается и минута уходит в предыдущее значение почиму?

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Понимание систем исчисления - это то, с чего должен начинать программист.

Пока сами в сути не разберетесь, чужие подсказки сильно не помогут.

vk007
Offline
Зарегистрирован: 16.06.2015

teslaboy47 пишет:

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

Не надо заводить отдельные переменные, пишите сразу:

lcd.print(HOUR / 10);
lcd.print(HOUR % 10);

 

teslaboy47
Offline
Зарегистрирован: 19.11.2015

Спасибо вам большое сам догнал чё к чему, но без вас бы точно не справился ;)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вобще-то Вам нужно было перевести число в строку (десятичную запись числа).

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
step962
Offline
Зарегистрирован: 23.05.2011

teslaboy47 пишет:

Но есть одна проблема когда проходит минута к минуте должен прибавиться 1 и прибовляется но когла проходит ещё секунда он отнимается и минута уходит в предыдущее значение почиму?

А это потому, что вы ининциализируете значения переменных MIN и HOUR при каждом вызове функции loop(). Перенесите соответствующие строки (23,24) в setup() и будет вам счастье.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я вообще бы не рекомендовал заводить отдельные переменные - код бы выглядел примерно так:

#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 сек