sur le serveur « master » :
1 |
root@master:~# apt-get install nmap python-smbus |
activer la prise en charge du port i2c0 avec le kernel mainline 4.10 :
1 2 3 4 5 6 7 8 9 |
root@master:~# cat /boot/armbianEnv.txt verbosity=1 logo=disabled console=both disp_mode=1920x1080p60 overlay_prefix=sun8i-h3 overlays=i2c0 rootdev=UUID=ad705968-27e2-4b95-b597-bb5cfa710dbe rootfstype=ext4 |
lancer automatiquement les scripts d’affichage sur l’ecran lcd
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 |
root@master:~# nano /etc/rc.local #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. #kernel 3 #echo none >/sys/class/leds/red_led/trigger #echo mmc0 >/sys/class/leds/red_led/trigger #echo 1 >/sys/class/leds/green_led/brightness #kernel 4 echo mmc0 >/sys/class/leds/orangepi\:red\:status/trigger echo default-on >/sys/class/leds/orangepi\:green\:pwr/trigger /root/lcd_i2c/lcd_clusterpi.py & ncat -4 -lk --send-only -p 4444 -c '/bin/lcdoutput.sh' exit 0 |
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 |
root@master:~# nano /bin/lcdoutput.sh #!/bin/sh CMD="unknown" LINE="unknown" while read line; do #temp=`cat /sys/class/thermal/thermal_zone1/temp` read raw_temp </etc/armbianmonitor/datasources/soctemp # kernel 4 #board_temp=$(awk "BEGIN {printf \"%d\", $raw_temp/1000}") board_temp=$raw_temp sd_usage=$(df -h / | awk '/\// {print $(NF-1)}' | sed 's/%//g') # kernel 4 #mem_info=$(LANG=en_US.UTF-8 free -w 2>/dev/null | grep "^Mem" || LANG=en_US.UTF-8 free | grep "^Mem") #mem_usg_pct=$(echo $mem_info | awk '{printf("%.0f",(($2-($4+$6+$7))/$2) * 100)}') mem_usg_pct=$(free | awk '/Mem/ {printf("%.0f",(($2-($4+$6+$7))/$2) * 100)}') #seti_load=`top -n1 -b | grep setiathome | cut -c49-50 | paste -sd+ | bc` #sd_total=$(df -h / | awk '/\// {print $(NF-3)}') load=$(cat /proc/loadavg | awk '{print $1}') CMD=`echo ${line}` case $CMD in sys) LINE="sd:$sd_usage% mem:$mem_usg_pct%" ;; temp) LINE="$board_temp.C $load" ;; *) LINE="unknown" ;; esac echo $LINE break done |
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
root@master:~# nano /sbin/lcd_clusterpi.py #!/usr/bin/python #-------------------------------------- # ___ ___ _ ____ # / _ \/ _ \(_) __/__ __ __ # / , _/ ___/ /\ \/ _ \/ // / # /_/|_/_/ /_/___/ .__/\_, / # /_/ /___/ # # lcd_i2c.py # LCD test script using I2C backpack. # Supports 16x2 and 20x4 screens. # # Author : Matt Hawkins # Date : 20/09/2015 # # http://www.raspberrypi-spy.co.uk/ # # Copyright 2015 Matt Hawkins # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # #-------------------------------------- import smbus import time import os # Define some device parameters I2C_ADDR = 0x27 # I2C device address LCD_WIDTH = 16 # Maximum characters per line # Define some device constants LCD_CHR = 1 # Mode - Sending data LCD_CMD = 0 # Mode - Sending command LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line LCD_BACKLIGHT = 0x08 # On #LCD_BACKLIGHT = 0x00 # Off ENABLE = 0b00000100 # Enable bit # Timing constants E_PULSE = 0.0005 E_DELAY = 0.0005 #Open I2C interface bus = smbus.SMBus(0) # Rev 1 Pi uses 0 #bus = smbus.SMBus(1) # Rev 2 Pi uses 1 def lcd_init(): # Initialise display lcd_byte(0x33,LCD_CMD) # 110011 Initialise lcd_byte(0x32,LCD_CMD) # 110010 Initialise lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size lcd_byte(0x01,LCD_CMD) # 000001 Clear display time.sleep(E_DELAY) def lcd_byte(bits, mode): # Send byte to data pins # bits = the data # mode = 1 for data # 0 for command bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT # High bits bus.write_byte(I2C_ADDR, bits_high) lcd_toggle_enable(bits_high) # Low bits bus.write_byte(I2C_ADDR, bits_low) lcd_toggle_enable(bits_low) def lcd_toggle_enable(bits): # Toggle enable time.sleep(E_DELAY) bus.write_byte(I2C_ADDR, (bits | ENABLE)) time.sleep(E_PULSE) bus.write_byte(I2C_ADDR,(bits & ~ENABLE)) time.sleep(E_DELAY) def lcd_string(message,line): # Send string to display message = message.ljust(LCD_WIDTH," ") lcd_byte(line, LCD_CMD) for i in range(LCD_WIDTH): lcd_byte(ord(message[i]),LCD_CHR) def main(): # Main program block # Initialise display lcd_init() while True: #Get CPU and temperature #temp = os.popen('cat /sys/class/thermal/thermal_zone1/temp').readline() ip = os.popen(' '+"ip addr show wlan0 | grep 'inet ' | cut -d'/' -f1 | cut -d 't' -f 2").readline()[:-1] #ip = os.popen('ip addr show wlan0').read().split("inet ")[1].split("/")[0] # Send some test lcd_string("OPI'One Cluster ",LCD_LINE_1) lcd_string(ip,LCD_LINE_2) time.sleep(2) s0l1 = os.popen("echo temp | nc -q -1 localhost 4444").readline() s0l2 = os.popen("echo sys | nc -q -1 localhost 4444").readline() lcd_string("Pi0: "+s0l1[:-1],LCD_LINE_1) lcd_string(""+s0l2[:-1],LCD_LINE_2) time.sleep(2) s1l1 = os.popen("echo temp | nc -q -1 slave1 4444").readline() s1l2 = os.popen("echo sys | nc -q -1 slave1 4444").readline() lcd_string("Pi1: "+s1l1[:-1],LCD_LINE_1) lcd_string(""+s1l2[:-1],LCD_LINE_2) time.sleep(2) s2l1 = os.popen("echo temp | nc -q -1 slave2 4444").readline() s2l2 = os.popen("echo sys | nc -q -1 slave2 4444").readline() lcd_string("Pi2: "+s2l1[:-1],LCD_LINE_1) lcd_string(""+s2l2[:-1],LCD_LINE_2) time.sleep(2) if __name__ == '__main__': try: main() except KeyboardInterrupt: pass finally: lcd_byte(0x01, LCD_CMD) |
Un écran lcd sur l’Orange Pi
Thanks, great article.