first commit

This commit is contained in:
Lucca Pirovano
2025-11-15 18:01:18 -05:00
commit d9fc362e34
5 changed files with 223 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
#!/usr/bin/env python3
"""
Ultra-responsive fan control every key press is sent instantly.
Uses raw stdin + select() with zero timeout.
"""
import serial
import sys
import select
import termios
import tty
import serial.tools.list_ports
# -------------------------------------------------
# Auto-detect Arduino port
# -------------------------------------------------
def find_arduino():
for p in serial.tools.list_ports.comports():
if 'Arduino' in p.description or 'ACM' in p.device or 'USB' in p.device:
return p.device
return None
PORT = find_arduino() or '/dev/ttyACM0'
BAUD = 115200
# -------------------------------------------------
def raw_stdin():
"""Put stdin into raw mode and return old settings."""
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
tty.setraw(fd)
return old
# -------------------------------------------------
def main():
# --- open serial -------------------------------------------------
try:
ser = serial.Serial(PORT, BAUD, timeout=0) # non-blocking
except Exception as e:
sys.exit(f"Cannot open {PORT}: {e}")
print(f"Connected to {PORT}")
print("Keys: 0-9, f=full, s=stop, q=quit (every press is sent immediately)")
old_term = raw_stdin()
try:
while True:
# ---- non-blocking read from keyboard (0-second timeout) ----
rlist, _, _ = select.select([sys.stdin], [], [], 0)
if rlist:
key = sys.stdin.read(1) # exactly one char
if key.lower() == 'q':
print("\nBye!")
break
ser.write(key.encode()) # send raw byte
print(f"{key}", end='', flush=True)
# ---- echo any reply from Arduino (non-blocking) ----
if ser.in_waiting:
reply = ser.read(ser.in_waiting).decode(errors='ignore')
print(reply, end='', flush=True)
finally:
termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, old_term)
ser.close()
if __name__ == '__main__':
main()