Timestamp چیست و چه کاربردهایی دارد به همراه سورس و مثال
فرض کنید شما قراره زمان را توسط یک ماژول GPS و ارتباط سریال با پروتکل NMEA دریافت کنید. همچنین لازمه در فاز بعدی اون را ذخیره کنید و توسط مثلا ارتباط GPRS اون را ارسال کنید و حتی برخی محاسبات روی اون هم انجام بدید, مثلا اون را محلی کنید ( همانطور که میدونید زمان ارسال شده GPS بر اساس UTC هست ) و شایدم برخی محاسبات روی اون انجام بدید. زمان را میتوان یکی از مهمترین داده ها در ساز و کار نرم افزارها و سخت افزارها نامید, به همین سبب نحوه ذخیره سازی و اعمال برخی تغییرات و محاسبات نیز پراهمیت هست. وقتی مهندسین الکترونیک قراره با زمان کار کنند چون منابع سخت افزاری بسیار محدود میشه لازمه بهترین روش برای موارد بالا در نظر گرفته بشه. اکثر پروژه های الکترونیکی نیاز به محاسبات زمان دارند پروژه هایی که دغدغه های زیر را هم دارند:- ذخیره زمان
- تغییر در زمان, مثلا محلی کردن زمان در زمان
- مقایسه و یا برخی اعمال محاسبات ریاضی بر روی زمان
- انتقال زمان از بسترهای مختلف مانند GPRS
1 | $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A |
نحوه استفاده از توابع Timestamp در میکروکنترلر
به نظر هویت Timestampe مشخص شده ما برای این سیستم الان به دو تا تابع نیاز داریم: تبدیل ساعت , دقیقه , ثانیه , ماه , روز , سال به TimeStamp و بالعکس: در زیر سورس این دو تابع را میتونید ببنید که برای اینکه مشخص بشه توابع چطور کار میکنن ما یک پروژه کوچک با کدویژن Codevision انجام دادیم و با شبیه ساز پروتئوس نیز اون را شبیه سازی کردیم که در زیر میتونید هم سورس کدویژن و هم Proteus را دانلود کنید و در پروژه های خودتون استفاده کنید.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | typedef struct _tm_struct { unsigned char tm_sec; /* seconds after the minute - [0,59] */ unsigned char tm_min; /* minutes after the hour - [0,59] */ unsigned char tm_hour; /* hours since midnight - [0,23] */ unsigned char tm_mday; /* day of the month - [1,31] */ unsigned char tm_mon; /* months since January - [0,11] */ unsigned int tm_year; /* years since 1900 */ unsigned char tm_wday; /* days since Sunday - [0,6] */ unsigned char tm_yday; /* days since January 1 - [0,365] */ unsigned char tm_isdst; /* daylight savings time flag */ // NOT USED }tm_struct; // this array represents the number of days in one non-leap year at // the beginning of each month unsigned long DaysToMonth[13] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 }; unsigned long DateToUnixTimestamp(tm_struct *datetime) { unsigned long iday; unsigned long val; iday = (unsigned long)365 * (datetime->tm_year - 70) + DaysToMonth[datetime->tm_mon-1] + (datetime->tm_mday - 1); iday = iday + (datetime->tm_year - 69) / 4; if ((datetime->tm_mon > 2) && ((datetime->tm_year % 4) == 0)) { iday++; } val = (unsigned long) datetime->tm_sec + 60 *(unsigned long) datetime->tm_min + 3600 * (datetime->tm_hour + 24 * iday); return val; } void UnixTimestampToDate(unsigned long binary,tm_struct *datetime) { unsigned long hour; unsigned long day; unsigned long minute; unsigned long second; unsigned long month; unsigned long year; unsigned long whole_minutes; unsigned long whole_hours; unsigned long whole_days; unsigned long whole_days_since_1968; unsigned long leap_year_periods; unsigned long days_since_current_lyear; unsigned long whole_years; unsigned long days_since_first_of_year; unsigned long days_to_month; unsigned long day_of_week; whole_minutes = binary / 60; second = binary - (60 * whole_minutes); // leftover seconds whole_hours = whole_minutes / 60; minute = whole_minutes - (60 * whole_hours); // leftover minutes whole_days = whole_hours / 24; hour = whole_hours - (24 * whole_days); // leftover hours whole_days_since_1968 = whole_days + 365 + 366; leap_year_periods = whole_days_since_1968 / ((4 * 365) + 1); days_since_current_lyear = whole_days_since_1968 % ((4 * 365) + 1); // if days are after a current leap year then add a leap year period if ((days_since_current_lyear >= (31 + 29))) { leap_year_periods++; } whole_years = (whole_days_since_1968 - leap_year_periods) / 365; days_since_first_of_year = whole_days_since_1968 - (whole_years * 365) - leap_year_periods; if ((days_since_current_lyear <= 365) && (days_since_current_lyear >= 60)) { days_since_first_of_year++; } year = whole_years + 68; month = 13; days_to_month = 366; while (days_since_first_of_year < days_to_month) { month--; days_to_month = DaysToMonth[month-1]; if ((month > 2) && ((year % 4) == 0)) { days_to_month++; } } day = days_since_first_of_year - days_to_month + 1; day_of_week = (whole_days + 4) % 7; datetime->tm_yday = days_since_first_of_year; /* days since January 1 - [0,365] */ datetime->tm_sec = second; /* seconds after the minute - [0,59] */ datetime->tm_min = minute; /* minutes after the hour - [0,59] */ datetime->tm_hour = hour; /* hours since midnight - [0,23] */ datetime->tm_mday = day; /* day of the month - [1,31] */ datetime->tm_wday = day_of_week; /* days since Sunday - [0,6] */ datetime->tm_mon = month; /* months since January - [0,11] */ datetime->tm_year = year; /* years since 1900 */ } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | tm_struct timeStruct; unsigned long UnixTimestamp; char Buf[50]; Port_Init(); putsf("Sisoog.com \n\r"); printf("------------\n\r"); putsf("Time =21:32:53 21/6/2018 \n\r"); timeStruct.tm_hour = 21; timeStruct.tm_min = 32; timeStruct.tm_sec = 53; timeStruct.tm_year = 118; timeStruct.tm_mon = 6; timeStruct.tm_mday = 21; UnixTimestamp = DateToUnixTimestamp(&timeStruct); ltoa(UnixTimestamp,Buf); printf("TimeStamp=");puts(Buf); printf("\n\r"); UnixTimestampToDate(UnixTimestamp,&timeStruct); sprintf(Buf,"TimeStruct -> %d:%d:%d, %d/%d/%d \n\r",timeStruct.tm_hour,timeStruct.tm_min,timeStruct.tm_sec, timeStruct.tm_mday,timeStruct.tm_mon,timeStruct.tm_year+1900); puts(Buf); printf("------------\n\r"); printf("Local Time +4.5 \n\r"); UnixTimestamp+=(4*60+30)*60; //Local Time +4.5 UnixTimestampToDate(UnixTimestamp,&timeStruct); sprintf(Buf,"TimeStruct -> %d:%d:%d, %d/%d/%d +4.5 \n\r",timeStruct.tm_hour,timeStruct.tm_min,timeStruct.tm_sec, timeStruct.tm_mday,timeStruct.tm_mon,timeStruct.tm_year+1900); puts(Buf); |