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