Advertisement
ripred

Calibrate.ino

Dec 5th, 2023 (edited)
648
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | Source Code | 0 0
  1. /*
  2.  * Calibrate.ino
  3.  *
  4.  * Arduino sketch for the CompileTime library
  5.  * to calibrate the exact timing to compensate
  6.  * for Arduino crystal speed differences/
  7.  *
  8.  * version 1.0 written June 2023 - Trent M. Wyatt
  9.  *
  10.  */
  11. #include <CompileTime.h>
  12.  
  13. using namespace CompileTime;
  14.  
  15. static uint32_t sys_start_secs;
  16. static uint32_t arduino_start_micros;
  17. static uint32_t arduino_stop_micros;
  18. static uint32_t duration_micros;
  19.  
  20. //name of months
  21. const char* months[12] {
  22.     "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  23. };
  24.  
  25. #define  CALIBRATE_MINUTES_TIME   5
  26.  
  27. void setup() {
  28.     // pass:
  29.     //   - the number of seconds it takes to upload
  30.     CompileTime::setCompileTime(8);
  31.     arduino_start_micros = micros();
  32.     CompileTime::uSecAdjust = 1000000UL;
  33.     duration_micros = CALIBRATE_MINUTES_TIME * 60UL * 1000000UL;
  34.     arduino_stop_micros = arduino_start_micros + duration_micros;
  35.     sys_start_secs = (CompileTime::hour * 60UL * 60UL) + (CompileTime::minute * 60UL) + CompileTime::second;
  36.  
  37.     char buff[32] = "";
  38.     sprintf(buff, "%d:%02d:%02d", CompileTime::hour, CompileTime::minute, CompileTime::second);
  39.  
  40.     Serial.begin(115200);
  41.     Serial.println(buff);
  42.     Serial.print(F("Running calibration for "));
  43.     Serial.print(CALIBRATE_MINUTES_TIME, DEC);
  44.     Serial.println(F(" minutes"));
  45.     Serial.println(F("Minute total secs: ............................................................"));
  46.     Serial.print(F("Minute 1 progress: "));
  47. }
  48.  
  49. void loop() {
  50.     static int16_t lasts = CompileTime::second;
  51.     static int16_t secs_passed = 0;
  52.     static int16_t min_num = 1;
  53.  
  54.     uint32_t const now_us = micros();
  55.     updateTime(now_us);
  56.  
  57.     if (now_us < arduino_stop_micros) {
  58.         if (CompileTime::second != lasts) {
  59.             lasts  = CompileTime::second;
  60.             secs_passed++;
  61.             Serial.print('.');
  62.         }
  63.  
  64.         if (secs_passed >= 60) {
  65.             secs_passed -= 60;
  66.             min_num++;
  67.             Serial.print(F("\nMinute "));
  68.             Serial.print(min_num);
  69.             Serial.print(F(" progress: "));
  70.         }
  71.     }
  72.     else {
  73.         Serial.println("\nEnter the system time string in the monitor window as hours:minutes:seconds");
  74.         while (Serial.available() < 8) { }
  75.         String timestr = Serial.readString();
  76.         timestr.trim();
  77.         char const * ptr = timestr.c_str();
  78.         uint16_t sysh = atoi(ptr);
  79.         uint16_t sysm = atoi(ptr+3);
  80.         uint16_t syss = atoi(ptr+6);
  81.  
  82.         uint32_t const sys_end_secs = (sysh * 60UL * 60UL) + (sysm * 60UL) + syss;
  83.         uint32_t const sys_delta_secs = sys_end_secs - sys_start_secs;
  84.         Serial.print(F("System seconds passed = "));
  85.         Serial.println(sys_delta_secs);
  86.  
  87.         float sys_us = float(sys_delta_secs) * 1000000.0;
  88.         uint32_t cal_us = (uint32_t)(((float)duration_micros / sys_us) * 1000000.0);
  89.  
  90.         Serial.print(F("New microseconds per second = "));
  91.         Serial.println(cal_us);
  92.  
  93.         cal_us -= 8; // internal adjust
  94.  
  95.         CompileTime::writeEepromCalibrate(cal_us);
  96.         Serial.println(F("New microseconds has been written to EEPROM!"));
  97.         CompileTime::uSecAdjust = cal_us;
  98.  
  99.         char buff[32] = "";
  100.         int16_t lasts = CompileTime::second;
  101.         while (true) {
  102.             CompileTime::updateTime(micros());
  103.             if (lasts != CompileTime::second) {
  104.                 lasts = CompileTime::second;
  105.                 sprintf(buff, "%s, %d, %d - %2d:%02d:%02d", months[month], day, year, hour, minute, second);
  106.                 Serial.println(buff);
  107.             }
  108.         }
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement