Raspberry Pi + Arduino Serial med LCD-skärm (4 / 6 steg)
Steg 4: Koden & hur det fungerar
Som ni kan se i bilderna och koden jag lagt till två mer kablar från arduino till LCD dessa i princip styra LCD-kontrasten i stället för med en potentiometer och skärmens ljusstyrka med PWM.
Arduino koden lyssnar efter alla strängar som kommer in genom den seriella porten, tar bort de två första tecknen som jag valde att vara ståndpunkten om att skriva strängen på LCD-skärmen och resten skulle vara strängen till utgång.
Strängformat: ##String (eftersom detta är en 16 x 2 LCD den första siffran kan variera från 0-15 X-position och den andra siffran från 0 till 1 Y-position)
Python-skript är skriven så att det alltid ger koordinaterna innan strängen skrev jag en funktion som tar två argument det första argumentet är strängen som visas 00 (första raden i lcd) och vid 01 (andra raden i lcd)
Kommandon för att få Raspberry Pi system info i python skript jag hittade dem online på Klicka här
Detta är python-funktion som skickar strängarna till arduino:
def serialClear():
ser.write("00clr")
def serialWrite (Line1, rad2):
serialClear(); tydlig LCD
Time.Sleep(betWait) //wait lite för stringRead timeout
ser.write("00"+Line1) //send första raden
Time.Sleep(betWait) //wait lite för stringRead timeout
ser.write("01"+line2) //send andra raden
Arduino koden (också bifogad fil)
#include < LiquidCrystal595.h > / / include biblioteket
LiquidCrystal595 lcd(7,8,9); datapin, latchpin, clockpin
int contrastPin = 6;
int brightnessPin = 10;
int kontrast = 135;
int ljusstyrka = 255;
Sträng input = "";
String stringRec = "";
Sträng pos = "";
int posX = 0;
int posY = 0;
void setup() {
pinMode(contrastPin,OUTPUT);
pinMode(brightnessPin,OUTPUT);
LCD.BEGIN(16,2); 16 tecken, 2 rader
LCD.Clear();
analogWrite (contrastPin, kontrast);
analogWrite (brightnessPin, ljusstyrka);
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 ("sträng:");
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);
}
Den fullständiga Python koden (också bifogad fil)
importera os, urllib, json, seriell, tid
#start seriell conection med arduino
ser = följetong. Serial ('/ dev/ttyACM0', 9600)
betWait = 1 #wait innan du skickar andra strängen kan inte gå lägre än 1 på grund av arduino StringRead timeout
sleepTime = 3 #wait innan du skickar nästa omgång info
# Tillbaka CPU-temperaturen som en teckensträng
def getCPUtemperature():
Res = os.popen('vcgencmd measure_temp').readline()
Return(res.replace("Temp=","").replace("'C\n",""))
# Tillbaka RAM information (enhet = kb) i en lista
# Index 0: totala RAM
# Index 1: används RAM
# Index 2: gratis RAM
def getRAMinfo():
p = os.popen('free')
Jag = 0
medan 1:
jag = i + 1
linje = p.readline()
om jag == 2:
Return(Line.Split()[1:4])
# Avkastning % av CPU som en teckensträng som används av användare
def getCPUuse():
tillbaka (str (os.popen ("top - n1 | awk "/ Cpu\(s\): / {skriva ut $2} "") .readline () .strip (\
)))
# Returnera information om diskutrymme som en lista (enhet ingår)
# Index 0: totala diskutrymme
# Index 1: Använd bricka utrymme
# Index 2: återstående diskutrymme
# 3: indexvärde disk används
def getDiskSpace():
p = os.popen ("df -h /")
Jag = 0
medan 1:
jag = jag + 1
linje = p.readline()
om jag == 2:
Return(Line.Split()[1:5])
#Get externa IP
def getIP():
data = urllib.urlopen("http://echoip.com/").read()
returnera data
def serialClear():
ser.write("00clr")
def serialWrite (Line1, rad2):
serialClear();
Time.Sleep(betWait)
ser.write("00"+Line1)
Time.Sleep(betWait)
ser.write("01"+line2)
def getPID():
PID = os.getpid()
returnera pid
Time.Sleep(3) #wait för arduino att återställa
samtidigt sant:
# CPU informatiom
CPU_temp = getCPUtemperature()
CPU_usage = getCPUuse()
# RAM information
# Utgången är i kb, här jag konvertera den i Mb för läsbarhet
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)
# Diskinformation
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 TILL ARDUINO
serialWrite ("Process-ID", str(PID))
Time.Sleep(sleepTime)
serialWrite ("temperatur:", CPU_temp + "C")
Time.Sleep(sleepTime)
serialWrite ("CPU-användning:", CPU_usage + "%")
Time.Sleep(sleepTime)
serialWrite ("Total RAM:", str(RAM_total) + "MB")
Time.Sleep(sleepTime)
serialWrite ("används RAM:", str(RAM_used) + "MB")
Time.Sleep(sleepTime)
serialWrite ("fri slå ned:", str(RAM_free) + "MB")
Time.Sleep(sleepTime)
serialWrite ("totala diskutrymme:", str(DISK_total)+"B")
Time.Sleep(sleepTime)
serialWrite ("fri bricka utrymme:", str(DISK_free) + "B")
Time.Sleep(sleepTime)
serialWrite ("Disk används:", str(DISK_perc))
Time.Sleep(sleepTime)
serialWrite ("Public IP:", str(IP))
Time.Sleep(sleepTime)
#DEBUG UTGÅNGAR
# 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)