Datetime 来自Arduino DS3231的Concat YYYYMMDDHMMSS

Datetime 来自Arduino DS3231的Concat YYYYMMDDHMMSS,datetime,arduino,concatenation,Datetime,Arduino,Concatenation,我想从DS3231实时时钟读取日期/时间信息,并用最少的代码行将结果连接成yyyymmddhhmmss格式。以下例程可以很好地检索和打印数据,但我不知道如何将其连接到单个变量/字符串中 byte BCD2DEC(byte val){ //Ex: 51 = 01010001 BCD. 01010001/16-->0101=5 then x10-->50. return(((val/16)*10)+(val%16));} // 0101

我想从DS3231实时时钟读取日期/时间信息,并用最少的代码行将结果连接成yyyymmddhhmmss格式。以下例程可以很好地检索和打印数据,但我不知道如何将其连接到单个变量/字符串中

byte BCD2DEC(byte val){             //Ex: 51 = 01010001 BCD.  01010001/16-->0101=5 then x10-->50.  
  return(((val/16)*10)+(val%16));}  //         01010001%16-->0001.  50+0001 = 51 DEC

void GetRTCTime(byte *second, byte *minute,byte *hour,byte *DoW,byte *Date,byte *month,byte *year){
  Wire.beginTransmission(DS3231_I2C_Addr);  //Open I2C to RTC
  Wire.write(0x00);                         //Set reg pointer to 0x00 Hex
  Wire.endTransmission();                   //End xmit to I2C.  Tell RTC to send data.
  Wire.requestFrom(DS3231_I2C_Addr, 7);     //Get 7 bytes from RTC buffer
  *second = BCD2DEC(Wire.read() & 0x7f);    //Seconds. remove hi order bit
  *minute = BCD2DEC(Wire.read());           //Minutes
  *hour = BCD2DEC(Wire.read() & 0x3f);      //Hour 0-24 remove 2 hi order bits
  *DoW = BCD2DEC(Wire.read());              //Day of week (1Sun-7Sat)
  *Date = BCD2DEC(Wire.read());             //Date (1-31)
  *month = BCD2DEC(Wire.read());            //Month (1-12)
  *year = BCD2DEC(Wire.read());             //Year (00-99)
}
void printTime(){                           //Read & print data from RTC
  GetRTCTime(&second, &minute, &hour, &DoW, &Date, &month, &year);  //Get RTC data
  Serial.print(x);             //Print year 20xx.  Year 00-99
  if(month<10){Serial.print("0");}          //Print leading 0 if needed
  Serial.print(month, DEC);                 //Month as decimal
  if(Date<10){Serial.print("0");}           //Print leading 0 if needed
  Serial.print(Date, DEC);                  //Date (1-30)
  Serial.print(DoWList[DoW]);               //1Sun-7Sat (0=null)
  if(hour<10){Serial.print("0");}           //Print leading 0 if needed
  Serial.print(hour,DEC);                   //HH
  if(minute<10){Serial.print("0");}         //Print leading 0 if needed
  Serial.print(minute, DEC);                //MM
  if(second<10){Serial.print("0");}         //Print leading 0 if needed
  Serial.println(second, DEC);              //SS
}
byte BCD2DEC(byte val){//Ex:51=01010001 BCD.01010001/16-->0101=5然后x10-->50。
返回((val/16)*10)+(val%16));}//01010001%16-->0001。50+0001=51十二月
void GetRTCTime(字节*秒,字节*分钟,字节*小时,字节*道,字节*日期,字节*月,字节*年){
Wire.beginTransmission(DS3231_I2C_Addr);//打开I2C到RTC
Wire.write(0x00);//将reg指针设置为0x00十六进制
Wire.endTransmission();//将xmit结束到I2C。告诉RTC发送数据。
requestFrom(DS3231_I2C_Addr,7);//从RTC缓冲区获取7个字节
*second=BCD2DEC(Wire.read()&0x7f);//秒。删除高位
*分钟=BCD2DEC(Wire.read());//分钟
*小时=BCD2DEC(Wire.read()&0x3f);//小时0-24删除2个高阶位
*DoW=bcdDec(Wire.read());//一周中的一天(1Sun-7Sat)
*Date=BCD2DEC(Wire.read());//日期(1-31)
*月份=BCD2DEC(Wire.read());//月份(1-12)
*year=BCD2DEC(Wire.read());//year(00-99)
}
void printTime(){//从RTC读取和打印数据
GetRTCTime(&second,&minute,&hour,&DoW,&Date,&month,&year);//获取RTC数据
Serial.print(x);//打印年份20xx.00-99

如果(月yyyymmddhhmmss为14个字符

为15个字符创建缓冲区(文本+终止空字符)

用文本填充缓冲区:

sprintf(buffer, "%d%02d%02d%02d%02d%02d\0", year, month, day, hour, minute, second);
%d是一个数字,%02d用前导零填充该数字,使其至少有两位数字

印刷品

Serial.println(buffer);

请参见

以明确OP,虽然这是较少的代码行,但实际上可能是较大的代码比问题中的代码占用更多的程序空间。较少的代码行并不总是等于较小的代码。sprintf是一个昂贵的函数。谢谢。我尝试了sprintf,但无法正确使用它,因此选择了其他路径。这是给我一个字符数组。“unsigned int datetimeresult=buffer.toInt();”将从这些字符创建一个整数,是吗?“无法正确获取”没有有用的信息。不确定你不能得到正确的,我给了你解决方案。Delta_G提到的唯一问题。它是昂贵的。没有,我在留下评论之前尝试过,但无法使其工作。你的代码工作正常,谢谢。
Serial.println(buffer);