Sponsored Content
Top Forums Programming Arduino UNIX Time - Syncing Computer UNIX Time to Arduino Time with Python Post 303042409 by Neo on Monday 23rd of December 2019 11:53:59 PM
Old 12-24-2019
Here is a quick sketch I put together for the Arduino UNO to get the unix time from the usb serial port and sync the Arduino time to the computer (in my case macos).

This sketch works but needs more refinement (trap errors, disconnects, add options, etc) but since I will not be doing much with this for the next few weeks, I post the first working draft below and will also post the python script I use on macos soon:

Code:
/*
  Sync UNIX Time with Computer and
  LCD Display with I2C on Arduino UN0
  Rough Draft 0.1  (needs improvements)
  Neo December 2019
  https://www.unix.com
*/

// Include Wire Library for I2C
#include <Wire.h>
// Include NewLiquidCrystal Library for I2C
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <TimeLib.h>

#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by Unix time_t as ten ASCII digits
#define TIME_HEADER 'T' // Header tag for serial time sync message
#define TIME_REQUEST 7  // ASCII bell character requests a time sync message
#define DEBUG_SKETCH false
// Define LCD pinout
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
// can be any integer greater than zero and less than recent unix time
const int time_int = 1000;
// Define I2C Address - change if reqiuired
const int i2c_addr = 0x27;
String s;
bool flag = true;
time_t t = now();
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
void setup()
{
    Serial.begin(9600);
    Wire.begin();
    time_t t = now();
    lcd.begin(16, 2);
    lcd.clear();
}

void loop()
{
    lcd.clear();
    int count = 0;
    if (Serial.available() and flag)
    {
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print("Serial OK");
        count = processSyncMessage();
        if (DEBUG_SKETCH)
        {
               Serial.println("Serial Available: " + count);
        }
        if (count > time_int)
            flag = false;
    }

    lcd.setCursor(0, 0);
    if (timeStatus() == timeNotSet)
    {
        if (flag)
        {
            Serial.println("waiting for sync message");
            lcd.print("Arduino Time:");
        }
    }
    else
    {

        lcd.print("Unix Time:");
        if (DEBUG_SKETCH)
        {
            Serial.println("Time Synced");
        }
    }
    t = now();
    s = String(t);
    if (s != '0')
    {
        lcd.setCursor(0, 1);
        lcd.print(t);
        lcd.print(" secs");
    }
    Serial.println(s);
    delay(1000);
    lcd.clear();
}

int processSyncMessage()
{
    while (Serial.available() >= TIME_MSG_LEN)
    { // time message consists of header & 10 ASCII digits
        char c = Serial.read();
        int count = 0;
        Serial.print(c);
        time_t pctime = 0;
        if (c == TIME_HEADER)
        {
            for (int i = 0; i < TIME_MSG_LEN - 1; i++)
            {
                c = Serial.read();
                if (c >= '0' && c <= '9')
                {
                    Serial.print(c);
                    count++;
                    pctime = (10 * pctime) + (c - '0'); // convert digits to a number
                }
            }
            Serial.print("\n");
            if (DEBUG_SKETCH)
            {
                Serial.write(pctime + "\n");
                Serial.println(pctime);
            }
            setTime(pctime); // Sync Arduino clock to the time received on the serial port
        }
        return count;
    }
}

 

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Help me!First time use UNIX.

I am assigned a programming work.It is my first time to use unix. The task is writing a shell script to interrogate the university Unix operating system to determine the number of "Runnable" processes at any given time.Then append the result,along with a time-stamp,on a log file. Also there are... (1 Reply)
Discussion started by: zhshqzyc
1 Replies

2. UNIX for Advanced & Expert Users

How To Provide Time Sync Using Nts-150 Time Server On Unix Network?

can anybody tel lme,how to instal NTS -150 on a unix network,it needs some patch to fetch time frm serve,,?? (2 Replies)
Discussion started by: pesty
2 Replies

3. Shell Programming and Scripting

Convert Unix Time to Standard Time

I have a list of interfaces and time the interface was last active. I can't figure out how to convert the time in the second column, Fa1/14 0 Se0/0/0 0 Fa1/11 0 Fa1/9 0 Fa1/0 0 Se0/0/1 1240401408 Gi1/0 0 Fa0/0 1240401408 Fa1/3 0 Fa1/8 0 Fa1/15 0 Fa1/13 0 Fa1/10 0 Fa1/1 0 Fa1/12... (7 Replies)
Discussion started by: mrlayance
7 Replies

4. Shell Programming and Scripting

Unix time

how do i convert unix time to show normal eg i have unix time 1297702242 and i want it converted to normal time. how do i do that (2 Replies)
Discussion started by: blackzinga80
2 Replies

5. Shell Programming and Scripting

How to get time duration between two human readable time stamp in Unix?

Here is two time I have: Jul 12 16:02:01 Jul 13 01:02:01 and how can I do a simple match to get difference between two time which is 09:00:00 Thanks in advance. (3 Replies)
Discussion started by: ford99
3 Replies

6. UNIX for Dummies Questions & Answers

Converting string date time to unix time in AWK

I'd like to convert a date string in the form of sun aug 19 09:03:10 EDT 2012, to unixtime timestamp using awk. I tried This is how each line of the file looks like, different date and time in this format Sun Aug 19 08:33:45 EDT 2012, user1(108.6.217.236) all: test on the 17th ... (2 Replies)
Discussion started by: bkkid
2 Replies

7. Shell Programming and Scripting

Adding time to date time in UNIX shell scipting

I needed some help in adding a duration (in seconds) to a start time (in hhmmss format) and a start date (in mmddyy format) in order to get an end date and end time. The concept of a leap year is also to be considered while incrementing the day. The code/ function that I have formed so far is as... (3 Replies)
Discussion started by: codehelp04
3 Replies

8. Shell Programming and Scripting

Convert UTC time into current UNIX sever time zone

Hi guys thanks for the help for my previous posts.Now i have a requirement that i download a XMl file which has UTC time stamp.I need to convert UTC time into Unix server timezone. For ex if the time zone of unix server is CDT then i need to convert into CDT.whatever may be the system time... (5 Replies)
Discussion started by: mohanalakshmi
5 Replies

9. Programming

Arduino-cli - Uploading to Unknown Chinese Arduino Boards using the Arduino Command Line Interface

In my further exploration of Arduino, today I decided to install the arduino-cli on my mac today. https://github.com/arduino/arduino-cli I followed the instructions for macOS but when I got to this part: arduino-cli board list I got the dreaded "Unknown" Fully Qualified Board Name... (1 Reply)
Discussion started by: Neo
1 Replies
PROCMETERRC(5)							File Formats Manual						    PROCMETERRC(5)

NAME
procmetetrc - The procmeterrc configuration file for procmeter3, procmeter3-xaw, gprocmeter3, procmeter3-gtk1, procmeter3-gtk2, procme- ter3-log and procmeter3-lcd programs. SYNOPSIS
This file contains the run-time options for the procmeter3, procmeter3-xaw, gprocmeter3, procmeter3-gtk1, procmeter3-gtk2, procmeter3-log and procmeter3-lcd programs. These include the outputs that are displayed, the colours and fonts that are used (for X window outputs), the LCDproc server (for the procmeter-lcd version) and other program options. DESCRIPTION
The resources for ProcMeter version 3.x are stored in the .procmeterrc file instead of using X resources. This gives more flexibility and allows for much simpler customisation. When the procmeter3, procmeter3-xaw, gprocmeter3, procmeter3-gtk1, procmeter3-gtk2, procmeter3-log or procmeter3-lcd programs start the .procmeterrc file is searched for in the current directory, the current users home directory or the system default installation directory (named procmeterrc). The file is used from the first one of these locations that matches. The format of the .procmeterrc file is a number of sections with the section names marked in '[]'. As well as the fixed sections (described below) there is a section for each module that is named using the name that the module reports itself to be. There are then further sections for each of the possible outputs of each module. The names of the sections and parameters are not case sensitive although the values that they are given may be. Lines beginning with the characters ';' or '#' are comments and continuation using the '' charac- ter at the end of a line is allowed. Below is listed the resource values and the sections of the .procmeterrc file that they can exist in. library SECTION This section contains the information about the ProcMeter modules that are available. This applies to all versions of the program. path=... The pathname of the library that contains the compiled ProcMeter modules. (defaults to the program's compiled-in installation loca- tion). others=... A list of other modules to be loaded (full pathnames separated by spaces). startup SECTION This section controls how the ProcMeter window should look when the program is started. order=... A list of the outputs that are to be started up in the order that they are to be displayed (separated by spaces). If command line options are also specified then they appear after those specified here. resources SECTION This section contains the general program display resources. Not all of the options apply to all of the versions of the program. Specific versions that the options apply to are specified below. horizontal=... A Boolean to indicate that the outputs are stacked horizontally instead of the default which is vertically. (For X versions of procmeter3 only.) background=... The colour to use as the default background for all outputs. (An X11 colour name or an RGB value in hex as #RRGGBB.) (For X ver- sions of procmeter3 only.) foreground=... The colour to use as the default foreground for all outputs. (An X11 colour name or an RGB value in hex as #RRGGBB.) (For X ver- sions of procmeter3 only.) label-font=... The font to use for the label that describes the output. (An X11 font name.) (For X versions of procmeter3 only.) label-foreground=... The colour to use as the foreground for the label. (An X11 colour name or an RGB value in hex as #RRGGBB.) (For X versions of procmeter3 only.) label-position=... The position of the label relative to the body of the output. (Either top, bottom or none.) (For X versions of procmeter3 only.) grid-foreground=... The colour to use for the grid lines. (An X11 colour name or an RGB value in hex as #RRGGBB.) (For X versions of procmeter3 only.) graph-solid=... A boolean to indicate if the graph should be solid (the default) or a single line. (yes or no, true or false, 0 or 1.) (For X ver- sions of procmeter3 only.) grid-min=... The minimum number of grid lines to display on a graph or bar chart. (An integer.) (For X and LCD versions of procmeter3 only.) This is particularly important with the bar chart because with this set too low the bar will always be the same length on screen and the number of grid lines will change with the data. grid-max=... The maximum number of grid lines to display on a graph or bar chart. (An integer.) (For X and LCD versions of procmeter3 only.) text-font=... The font to use for the textual outputs. (An X11 font name.) (For X versions of procmeter3 only.) menu-foreground=... The colour to use as the foreground for the menus. (An X11 colour name or an RGB value in hex as #RRGGBB.) (For procmeter3 and procmeter3-xaw only.) menu-background=... The colour to use as the background for the menus. (An X11 colour name or an RGB value in hex as #RRGGBB.) (For procmeter3 and procmeter3-xaw only.) (The background of all items on the same menu must be the same due to the Xaw Widget set used.) menu-font=... The font to use for the menus. (An X11 font name.) (For procmeter3 and procmeter3-xaw only.) update=... The update interval for the output in seconds (an integer). LCD SECTION
This section contains parameters that are only used by the procmeter3-lcd version of the program. host=... The name of the host that the LCDd daemon is running on. port=... The port number that the LCDd daemon is running on. duration=... The length of time that all of the ProcMeter outputs are displayed on the LCD display for before cycling to the next. priority=... The priority of all of the ProcMeter outputs when they are displayed on the LCD display. This values should be a numeric value for LCDd verions before 0.5 or priority names for later versions. Using numeric values will likely fail for LCDd versions after 0.5 due to a bug in LCDd. The safest solution is not to use this option unless you are sure what value to use. MODULE SECTION
The name of the section is the name of the ProcMeter module (see the help, procmeter3 -h), for example: ProcMeter These can contain any of the resource values which will then apply to all outputs of this module. There are also extra options that can be applied to the module and as defaults for the all of the outputs of that module. options=... A string containing options that are passed to the module at startup, different modules have different options, see the procme- ter3_modules(1) manual page. graph-scale=... The scaling of the graph or bar chart, the number of units between each of the grid lines (an integer). run=... A string that specifies a program that can be run by selecting it from the menu for the left mouse button. (For X versions of procmeter3 only.) The way that the command is run can be specified using one of the following abbreviations; XTerm( command ) to run command in an xterm then exit. XTermWait( command ) to run command in an xterm and wait for user input before exiting. Shell( command ) to run command in an shell and exit. This last one is equivalent to using none of these abbreviations. OUTPUT SECTION
The name of the section is the name of the ProcMeter output (see the help, procmeter3 -h), for example: ProcMeter.Version The output sections can contain any of the resource or module options (except 'options') which will then apply only to the specified out- put. There are also options that can only be applied to individual outputs. label=... Changes the default label for the output to the specified string. EXAMPLE
Below is an example .procmeterrc file, it is a much reduced version of the system default procmeterrc file. [startup] # ProcMeter version, clock, CPU graph, load text order=ProcMeter.Version Date_Time.Time_HM Statistics.CPU-g Processes.Load-t [resources] # The outputs, black on white foreground = black background = white # A large-medium size text font. text-font = 8x13 # Solid graphs with at least 5 grid lines in grey. graph-solid = yes grid-min = 5 grid-foreground = grey50 # Black on white output labels, small font, below the data. label-font = 5x7 label-foreground = black label-position = bottom # Black on white menu items in a small-medium size font. menu-foreground = black menu-background = white menu-font = 7x13 [ProcMeter.Version] # A smaller font than normal with no label. text-font = 6x10 label-position = none [Statistics] [Statistics.CPU] # The minimum number of grid lines, they are 20% each. grid-min = 5 [Processes] run = XTerm(top) [Network] # To pick up extra devices not automatically recognised. #options=ppp0 slip0 FILES
./.procmeterrc ~/.procmeterrc /usr/local/lib/X11/ProcMeter3/procmeterrc or /usr/lib/X11/ProcMeter3/procmeterrc SEE ALSO
procmeter3(1), procmeter3-xaw(1), gprocmeter3(1), procmeter3-gtk1(1), procmeter3-gtk2(1), procmeter3-log(1), procmeter3-lcd(1), procme- ter3_modules(1). AUTHOR
Andrew M. Bishop 1998-2007 July 3, 2010 PROCMETERRC(5)
All times are GMT -4. The time now is 11:55 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy