Hej
Jeg er igang med et Raspberry Pi projekt hvor jeg har følgende;
En Raspberry pi med i2c gpio expander hvor jeg på 8 bit har led's og 8 andre har push swithces
Jeg ønsker at styre led over IP fra en PC og bruger Socket + et TCP program på PC der kan sende cmd til Pi'en
Jeg har lavet et test program i python og det fungerer i de basale dele
Det venter på en connection og når jeg har connected så kan jeg sende simple cmd's som så tænder led's eller slukker
jeg kan også læse switches.... MEN kun når jeg spørger efter status med "sw" cmd
Problemet er at jeg ønsker at software læser switch status hele tiden så man kan detektere om nogen trykker på en knap, men hvis jeg læser switch status ved den linie der hedder
data = c.recv(1024)
så læser den kun hver gang det kommer noget data fra PC
med andre ord så "hænger" koden her indtil der kommer data
Jeg kunne godt tænke mig at hvis ikke der er data så kan jeg læse switche alligevel og sende data til PC hvis nogen har trykket på en knap
Håber det giver mening og at der er en der har rodet mere med python end jeg har :-)
from socket import *
## Import GPIO library
import RPi.GPIO as GPIO
import time ## Import 'time' library. Allows us to use 'sleep'
import serial
import smbus
bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
DEVICE = 0x20 #7 bit address (will be left shifted to add the read$
IODIRA = 0x00 # Pin direction register
OLATA = 0x14 # Register for outputs
GPIOA = 0x12 # Register for inputs
# Set all GPA pins as outputs by setting
# all bits of IODIRA register to 0
bus.write_byte_data(DEVICE,IODIRA,0x00)
# Set output all 7 output bits to 0
bus.write_byte_data(DEVICE,OLATA,0)
#port1 = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=3.0)
port1 = serial.Serial("/dev/ttyAMA0", baudrate=250000, timeout=3.0)
# Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
#GPIO.setmode(GPIO.BCM)
# Set up header pin 7 (GPIO7) as an output
GPIO.setup(12,GPIO.OUT)
host = "192.168.1.93"
print host
port = 7777
s = socket(AF_INET, SOCK_STREAM)
#s.setblocking(0)
print "Socket Made"
s.bind((host,port))
print "Socket Bound"
s.listen(5)
print "Listening for connections..."
port1.write("\r\nHello Wold:")
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
while True:
data = c.recv(1024)
if(data == "sw" ):
# Read state of GPIOA register
MySwitch = bus.read_byte_data(DEVICE,GPIOA)
if MySwitch & 0b10000000 == 0b10000000:
print "Switch 1 was pressed!"
if MySwitch & 0b01000000 == 0b01000000:
print "Switch 2 was pressed!"
else:
print "NOT pressed"
if(data[0:3] == "led" ):
print 'led'
bus.write_byte_data(DEVICE,OLATA,ord(data[3]))
print data
if(data == "on" ):
print 'pin 12 on'
GPIO.output(12,True)
elif(data == 'off' ):
print 'pin 12 off'
GPIO.output(12,False) ## Turn off GPIO pin 7
elif(data == 'close' ):
print 'closing connection'
c.close()
break
elif(data == 'exit' ):
print 'closing program'
c.close()
s.close()
break
else:
print 'none'
print 'break'
GPIO.cleanup()
c.close()
s.close()