Stap 4: De Code & hoe het werkt
Zoals u kunt zien in de beelden en de code die ik heb toegevoegd dat twee meer draden van de arduino aan de LCD dit eigenlijk controle het LCD-contrast in plaats van met behulp van een potentiometer (potmeter) en de helderheid van het scherm met PWM.
De arduino code luistert naar tekenreeksen komen via de seriële poort, verwijdert de eerste twee tekens die ik ervoor gekozen om dat de positie waar de tekenreeks op het LCD-scherm en de rest te schrijven zou de tekenreeks moet worden uitgevoerd.
String Format: ##String (want dit een 16 x 2 LCD is het eerste getal kan variëren van 0-15 X-positie en het tweede getal van 0 naar 1 Y-positie)
De python script is zo geschreven dat het voegt altijd de coördinaten voor de tekenreeks die ik schreef een functie waarin twee argumenten het eerste argument is de tekenreeks die wordt weergegeven om 00 (eerste regel van de lcd) en op 01 (tweede regel van de lcd)
De opdrachten om de Raspberry Pi Systeeminfo in de python script vond ik ze online bij Klik hier
Dit is de python-functie die de snaren aan de arduino stuurt:
def serialClear(): ser.write("00clr")
def serialWrite(Line1, Line2): serialClear(); //clear LCD time.sleep(betWait) //wait a bit for stringRead timeout ser.write("00"+Line1) //send first line time.sleep(betWait) //wait a bit for stringRead timeout ser.write("01"+Line2) //send second line
De Arduino Code (bestand ook als bijlage verzonden)
#include <LiquidCrystal595.h> // include the libraryLiquidCrystal595 lcd(7,8,9); // datapin, latchpin, clockpin int contrastPin = 6; int brightnessPin = 10; int contrast = 135; int brightness = 255; String input = ""; String stringRec = ""; String pos = ""; int posX = 0; int posY = 0;void setup() { pinMode(contrastPin,OUTPUT); pinMode(brightnessPin,OUTPUT); lcd.begin(16,2); // 16 characters, 2 rows lcd.clear(); analogWrite(contrastPin, contrast); analogWrite(brightnessPin, brightness); Serial.begin(9600); Serial.setTimeout(500); }void loop() { if(Serial.available() > 0){ input = Serial.readString(); pos = input.substring(0,2); posX = pos.substring(0,1).toInt(); posY = pos.substring(1,2).toInt(); stringRec = input.substring(2); /*Serial.println("String: "); Serial.println(stringRec); Serial.println(); Serial.println("Pos: "); Serial.print(posX); Serial.print(" "); Serial.print(posY); Serial.println();*/ } if(stringRec.equals("clr")){ lcd.clear(); stringRec = ""; } lcd.setCursor(posX,posY); lcd.print(stringRec); }
De volledige Python Code (bestand ook als bijlage verzonden)
importeren van os, urllib, json, serial, tijd #start seriële aansluiting met arduino ser = seriële. Seriële ('/ dev/ttyACM0', 9600) betWait = 1 #wait voordat de tweede tekenreeks niet lager dan 1 gaan vanwege arduino StringRead timeout sleepTime = 3 #wait voordat u volgende batch van info # terug CPU temperatuur als een karakter string def getCPUtemperature(): res = os.popen ("vcgencmd measure_temp').readline() return(res.replace("temp=","").replace("'C\n","")) # terug RAM informatie (eenheid = kb) in een lijst # Index 0 : total RAM # Index 1: RAM gebruikt # Index 2: gratis RAM def getRAMinfo(): p = os.popen('free') ik = 0 terwijl 1: ik = i + 1 lijn = p.readline() als ik == 2: return(line.split()[1:4]) # Return % van CPU gebruikt door gebruiker als een karakter string def getCPUuse(): retourneren (str (os.popen ("top - n1 | awk ' / Cpu\(s\): / {afdrukken $2}'") .readline () .strip (\))) # retourinformatie over schijfruimte als een lijst (eenheid opgenomen) # Index 0: total schijfruimte # Index 1: gebruikte schijfruimte # Index 2: resterende schijfruimte # Index 3: percentage van de schijf gebruikt def getDiskSpace(): p = os.popen (" df -h / ") ik = 0 terwijl 1: ik = i + 1 lijn = p.readline() als ik == 2: return(line.split()[1:5]) #Get externe IP-def getIP() : gegevens = urllib.urlopen("http://echoip.com/").read() gegevens retourneren import os, urllib, json, serial, time#start serial conection with arduino ser = serial.Serial('/dev/ttyACM0', 9600)betWait = 1 #wait before sending second string cant go lower than 1 because of arduino StringRead timeout sleepTime = 3 #wait before sending next batch of info# Return CPU temperature as a character string def getCPUtemperature(): res = os.popen('vcgencmd measure_temp').readline() return(res.replace("temp=","").replace("'C\n",""))# Return RAM information (unit=kb) in a list # Index 0: total RAM # Index 1: used RAM # Index 2: free RAM def getRAMinfo(): p = os.popen('free') i = 0 while 1: i = i + 1 line = p.readline() if i==2: return(line.split()[1:4])# Return % of CPU used by user as a character string def getCPUuse(): return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\ )))# Return information about disk space as a list (unit included) # Index 0: total disk space # Index 1: used disk space # Index 2: remaining disk space # Index 3: percentage of disk used def getDiskSpace(): p = os.popen("df -h /") i = 0 while 1: i = i +1 line = p.readline() if i==2: return(line.split()[1:5]) #Get external IP def getIP(): data = urllib.urlopen("http://echoip.com/").read() return data def serialClear(): ser.write("00clr") def serialWrite(Line1, Line2): serialClear(); time.sleep(betWait) ser.write("00"+Line1) time.sleep(betWait) ser.write("01"+Line2)def getPID(): pid = os.getpid() return pid time.sleep(3) #wait for arduino to resetwhile True: # CPU informatiom CPU_temp = getCPUtemperature() CPU_usage = getCPUuse() # RAM information # Output is in kb, here I convert it in Mb for readability RAM_stats = getRAMinfo() RAM_total = round(int(RAM_stats[0]) / 1000,1) RAM_used = round(int(RAM_stats[1]) / 1000,1) RAM_free = round(int(RAM_stats[2]) / 1000,1) # Disk information DISK_stats = getDiskSpace() DISK_total = DISK_stats[0] DISK_free = DISK_stats[1] DISK_perc = DISK_stats[3] #external IP IP = getIP() #Python script pid PID = getPID() #OUTPUT TO ARDUINO serialWrite("Process ID", str(PID)) time.sleep(sleepTime) serialWrite("Temperature:", CPU_temp + " C") time.sleep(sleepTime) serialWrite("CPU Usage:", CPU_usage + "%") time.sleep(sleepTime) serialWrite("Total RAM:", str(RAM_total) + " MB") time.sleep(sleepTime) serialWrite("Used RAM:", str(RAM_used) + " MB") time.sleep(sleepTime) serialWrite("Free RAM:", str(RAM_free) + " MB") time.sleep(sleepTime) serialWrite("Total Disk Space:", str(DISK_total)+"B") time.sleep(sleepTime) serialWrite("Free Disk Space:", str(DISK_free) + "B") time.sleep(sleepTime) serialWrite("Disk Used:", str(DISK_perc)) time.sleep(sleepTime) serialWrite("Public IP:", str(IP)) time.sleep(sleepTime) #DEBUG OUTPUTS # print(CPU_temp) # print(CPU_usage) # print(RAM_total) # print(RAM_used) # print(RAM_free) # print(DISK_total) # print(DISK_free) # print(DISK_perc) # print(IP) # print("\n") # time.sleep(3)