CM Panel technical documentation Buy
New directory app and file goshd.py.
$ mkdir /home/pi/app
$ cd /home/pi/app
$ nano goshd.py
Contens:
!/usr/bin/python
import RPi.GPIO as GPIO
import time
import datetime
import os
O_DISPLAY =22
I_SHD =25
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(I_SHD,GPIO.IN)
GPIO.setup(O_DISPLAY,GPIO.OUT)
while True:
if GPIO.input(I_SHD) == 1:
GPIO.output(O_DISPLAY,GPIO.HIGH) # Display Off
os.system("sudo shutdown -h -P now")
time.sleep(.5)
Set it as executable class='acmetable':
$ chmod +x goshd.py
$ sudo nano /etc/systemd/system/goshdn.service
Save on it these contents:
[Unit]
Description=Set Auto shutdown
After=systemd-user-sessions.service
[Service]
ExecStart=/home/pi/app/goshd.py
Restart=on-abort
User=root
WorkingDirectory=/home/pi/app
[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable goshdn.service
!/usr/bin/python
import RPi.GPIO as GPIO
import time
import os
SHDNDONE = 26
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(SHDNDONE,GPIO.OUT)
# On CM3 (Send message OK to Microcontroller )
GPIO.output(SHDNDONE,GPIO.LOW)
# Set register RTC
time.sleep(1)
os.system("sudo i2cset -y -f 1 0x68 0x00 0x58")
time.sleep(1)
os.system("sudo i2cset -y -f 1 0x68 0x0f 0xff")
time.sleep(1)
os.system("sudo hwclock -s")
Set it as executable class='acmetable':
$ chmod +x cm3start.py
$ sudo nano /etc/systemd/system/cm3start.service
with this content:
[Unit]
Description=CPU to microcontroller to start regular operating system
After=systemd-user-sessions.service
[Service]
ExecStart=/home/pi/app/cm3start.py
Restart=on-abort
User=root
WorkingDirectory=/home/pi/app
[Install]
WantedBy=multi-user.target
Then enable the service by typing:
$ sudo systemctl daemon-reload
$ sudo systemctl enable cm3start.service
$ sudo raspi-config
Examples:
Set Localisation Options, L2 Timezone, Europe and Rome.
This will be used for example to set the board to switch on at a set time through the Interrupt Real Time Clock chip.
$ mkdir /home/pi/app
$ cd /home/pi/app
$ nano set_alarm.py
Contents:
#!/usr/bin/python
'''
===============================================================================
Description : Set PCF8523 Alarm interrupt - Minute or Time
Board : CM3-Panel V.7 POE - Acme Systems
Autror : Mauro Tocci
Version : 1.1 - October 2019
-------------------------------------------------------------------------------
Use example :
-------------------------------------------------------------------------------
script.py 12:15 M N N
script.py 12:15 T N N
| | |_ Y = Debug enable (Y only screen, no transfer to the chip)
| |
| |___ Y = Sync NTP server
|
|_____ M = Switching on only when the minutes indicate value 15
|_____ T = Start-up time 12:15
-------------------------------------------------------------------------------
Logic sequence:
Time alarm example: 14:30
1. Split time value to array (variable dato[x])
2. Hour calculation (dato[0]) to time UTC
3. Calculation of hexadecimal values to be set on the RTC registers
Hour alarm register (address 0Bh)
Hour
__12__ <--- UTC value
| |
DEC UNIT
7654 3210 Bit registry
0001 0010 Binary
|______|
| <- Concatenate
00010010 BCD to hex convert
|
0x12 Hexadecimal value
|
sudo i2cset -f -y 0x68 0x0b 0x12 Set Hour Alarm registry
Minute alarm register (address 0Ah)
Minute
__30__
| |
DEC UNIT
7654 3210 Bit registry
0011 0000 Binary
|______|
| <- Concatenate
00110000 BCD to hex convert
|
0x30 Hexadecimal value
|
sudo i2cset -f -y 0x68 0x0a 0x30 Set Minute Alarm registry
4. Send final sequence data to RTC
sudo ntpdate ntp1.inrim.it # Example Sync Italian NTP Server (Y)
sudo hwclock -w # Set clock hardware (Y)
sudo i2cset -f -y 0x68 0x00 0x58 # Reset chip PC8523"
sudo i2cset -f -y 0x68 0x00 0x02 # AIE Enable alarm INT1
sudo i2cset -f -y 0x68 0x0f 0xff # INT1 Off - mosfet open drain
sudo i2cset -f -y 0x68 0x0a 0x30 # Set Minute Alarm registry
sudo i2cset -f -y 0x68 0x0b 0x12 # Set Hour Alarm registry
===============================================================================
'''
import os
import sys
import datetime
from datetime import timedelta
#----------------------------------------------------------------------
# Conversion from decimal to binary
#----------------------------------------------------------------------
def bcddigit(sn,dgt):
n = int(sn)
bin_nr = bin(n)[2:]
return (('0' * dgt ) + bin_nr)[-dgt:]
#----------------------------------------------------------------------
# Clear
#----------------------------------------------------------------------
def cls():
os.system('cls' if os.name=='nt' else 'clear')
try:
#----------------------------------------------------------------------
# Variables sets
#----------------------------------------------------------------------
dato = sys.argv[1].split(':') # Array hour
TYP = sys.argv[2] # Type of writing
Sync = sys.argv[3] # Sync to NTP server
Debug = sys.argv[4] # Debug screen print value
#----------------------------------------------------------------------
# Data preparation to be transferred to the chip
#----------------------------------------------------------------------
cls()
delta = 0
ACTH = dato[0] # Hour
ACTM = dato[1] # Minute
# UTC
utc_h = datetime.datetime.utcnow()
# Local time
dat_h = datetime.datetime.now()
# I find the difference between local time and UTC
if ( utc_h < dat_h ):
delta = (int(dat_h.strftime("%H")) - int(utc_h.strftime("%H"))) *-1
#----------------------------------------------------------------------
# UTC Calculate
#----------------------------------------------------------------------
utc_h = datetime.datetime.now().strftime("%Y-%m-%d " + dato[0] + ":" + dato[1])
utc_h = datetime.datetime.strptime(utc_h, '%Y-%m-%d %H:%M')
utc_h = utc_h + timedelta(hours=delta)
dato = utc_h.strftime("%H:%M").split(':') # Calculated time
D = 4
BIN_D = "" # Decimal
BIN_U = "" # Unit
reg_0a = "" # Minute Register
reg_0b = "" # Hour Register
if ( Debug == 'Y' ):
print "==================================================================="
print " List of data entered and register calculation"
print "==================================================================="
print "Time : " + sys.argv[1]
print "Type : " + TYP
print "Sync NTP : " + Sync
print "Calc UTC : " + repr(delta) + " hours compared to Local Time"
if ( TYP == 'T' ):
if ( Debug == 'Y' ):
print ""
print "-----------------"
print " HOURS"
print "-----------------"
print " Value : " + ACTH
print " UTC calculation : " + dato[0]
print ""
print " Ten's place : " + dato[0][:1]
BIN_D = bcddigit(dato[0][:1],D)
if ( Debug == 'Y' ):
print " Binary : " + BIN_D
print " HEX : " + hex(int(BIN_D,2)).replace("0x", "0x0")
print ""
print " Unit place : " + dato[0][1:]
BIN_U = bcddigit(dato[0][1:],D)
if ( Debug == 'Y' ):
print " Binary : " + BIN_U
print " HEX : " + hex(int(BIN_U,2)).replace("0x", "0x0")
print ""
print " Bit registry : 76543210 - AEN_H = 7 (0 = Enable, default 1)"
print " Binary : " + BIN_D + BIN_U
BIN = BIN_D + BIN_U
if ( int(BIN,2) < 16 ):
reg_0b = hex(int(BIN,2)).replace("0x", "0x0")
if ( Debug == 'Y' ):
print " HEX Reg. 0Bh : " + reg_0b
else:
reg_0b = hex(int(BIN,2))
if ( Debug == 'Y' ):
print " HEX Reg. 0Bh : " + reg_0b
if ( Debug == 'Y' ):
print ""
print "-----------------"
print " MINUTES"
print "-----------------"
print " Value : " + ACTM
print ""
print " Ten's place : " + dato[1][:1]
BIN_D = bcddigit(dato[1][:1],D)
if ( Debug == 'Y' ):
print " Binary : " + BIN_D
print " HEX : " + hex(int(BIN_D,2)).replace("0x", "0x0")
print ""
print " Unit place : " + dato[1][1:]
BIN_U = bcddigit(dato[1][1:],D)
if ( Debug == 'Y' ):
print " Binary : " + BIN_U
print " HEX : " + hex(int(BIN_U,2)).replace("0x", "0x0")
print ""
print " Bit registry : 76543210 - AEN_M = 7 (0 = Enable, default 1)"
print " Binary : " + BIN_D + BIN_U
BIN = BIN_D + BIN_U
if ( int(BIN,2) < 16 ):
reg_0a = hex(int(BIN,2)).replace("0x", "0x0")
if ( Debug == 'Y' ):
print " HEX Reg. 0Ah : " + reg_0a
else:
reg_0a = hex(int(BIN,2))
if ( Debug == 'Y' ):
print " HEX Reg. 0Ah : " + reg_0a
if ( Debug == 'Y' ):
print ""
print "-------------------------------------------------------------------"
print " Set registry PCF8523"
print "-------------------------------------------------------------------"
if ( Sync == 'Y' ):
print "sudo ntpdate ntp1.inrim.it" + " # Sync NTP Server Italiano"
print "sudo hwclock -w" + " # Set clock hardware"
print "sudo i2cset .y -f 1 0x68 0x00 0x58" + " # Reset chip PC8523"
print "sudo i2cset -y -f 1 0x68 0x00 0x02" + " # AIE Enable alarm INT1"
print "sudo i2cset -y -f 1 0x68 0x0f 0xff" + " # INT1 Off"
if ( TYP == 'T' ):
print "sudo i2cset -y -f 1 0x68 0x0b " + reg_0b + " # Set Hour register"
print "sudo i2cset -y -f 1 0x68 0x0a " + reg_0a + " # Set Minute register"
print ""
if ( Debug == 'N' ):
if ( Sync == 'Y' ):
x=os.system("sudo ntpdate ntp1.inrim.it")
x=os.system("sudo hwclock -w")
os.system("sudo i2cset -y -f 1 0x68 0x00 0x58")
os.system("sudo i2cset -y -f 1 0x68 0x00 0x02")
os.system("sudo i2cset -y -f 1 0x68 0x0f 0xff")
if ( TYP == 'T' ):
os.system("sudo i2cset -y -f 1 0x68 0x0b " + reg_0b + "")
os.system("sudo i2cset -y -f 1 0x68 0x0a " + reg_0a + "")
except IndexError as e:
cls()
print "---------------------------------------------------------------------------------------"
print " Error insert data"
print "---------------------------------------------------------------------------------------"
print " Example use :"
print ""
print " Name Time Functions"
print " script.py 12:15 M N N"
print " script.py 12:15 T N N"
print " | | |_ Y = Debug enable (Y only screen, no transfer to the chip)"
print " | |"
print " | |___ Y = Sync NTP server"
print " |"
print " |_____ M = Switching on only when the minutes indicate value 15"
print " |_____ T = Start-up time 12:15 (*)"
print ""
print " (*) Note : The time is recalculated by the script based on the UTC format."
print "---------------------------------------------------------------------------------------"
print ""
Run command:
$ chmod +x set_alarm.py
Example use:
./set_alarm.py 16:11 T N N
This script set interrupt to LOW status from hour 16:11.