From b231ada9dc1feb06b70da265a2125686f140e755 Mon Sep 17 00:00:00 2001 From: Eric Teunis de Boone Date: Sun, 26 Feb 2017 04:13:16 +0100 Subject: [PATCH] Added DHT22 sensor --- README.MD | 47 +++++++ get_tty.py | 25 ++++ mpduino.geany | 33 +++++ layout.ino => mpduino/layout.ino | 39 ++++-- mpcArduino.ino => mpduino/mpduino.ino | 63 +++++++-- mpduino/rot_encoder.ino | 29 ++++ mpduino/sensors.ino | 14 ++ mpduino/serial.ino | 88 ++++++++++++ serial.ino | 70 --------- serialmpcduino.py | 195 +++++++++++++++++--------- serialmpcduino.pyc | Bin 0 -> 9986 bytes ttycontrol.py | 49 +++++-- 12 files changed, 482 insertions(+), 170 deletions(-) create mode 100644 README.MD create mode 100644 get_tty.py create mode 100644 mpduino.geany rename layout.ino => mpduino/layout.ino (65%) rename mpcArduino.ino => mpduino/mpduino.ino (64%) create mode 100644 mpduino/rot_encoder.ino create mode 100644 mpduino/sensors.ino create mode 100644 mpduino/serial.ino delete mode 100644 serial.ino create mode 100644 serialmpcduino.pyc diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..9b900f6 --- /dev/null +++ b/README.MD @@ -0,0 +1,47 @@ +MpDuino +===================== + +A small project to interface an Arduino Uno with an OLED display, +rotary encoder to a MPD server. + + +Idea is to have one script `mpduino.py` creating multiple processes to +which one can attach + +From PySerial to Arduino +------------------------- + +A command looks like `[ES][VTAarzxcusP].*`. +Where `S` stands for set and `E` is to echo a value. The `[VTAarzxcusP]` +part selects what to set or echo. You can use `S!.*` to echo a message +back. + +| Character | Property | `.*` | +|---------------|---------------|---------------------------| +| V | Volume | number | +| T | Title | text | +| A | Artist | text | +| a | album | text | +| P | Playing | empty(false)/text(true) | +| r | repeat | empty(false)/text(true) | +| z | shuffle | empty(false)/text(true) | +| x | random | empty(false)/text(true) | +| c | consume | empty(false)/text(true) | +| u | updating | empty(false)/text(true) | +| s | single | empty(false)/text(true) | + +From Arduino to PySerial instance +--------------------------------- +Since the Arduino has a rotary encoder for the volume and play/pause, we +need to pass these through. Next tot this, we might reset the arduino, +without resetting the pySerial script, so we need to set all values +again. + + +| Character | Property | +|---------------|---------------| +| R | Reset | +| V | Volume | +| P | Pause/Play | +| t | Temperature | +| h | Humidity | diff --git a/get_tty.py b/get_tty.py new file mode 100644 index 0000000..55b4870 --- /dev/null +++ b/get_tty.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# A daemon which should be able to run a script, as said by the +# connecting arduino +def get_tty(noinput = True): + # Get TTY + arduino_ports = [] + while not arduino_ports: + arduino_ports = [ + p.device + for p in serial.tools.list_ports.comports() + if 'Arduino' in p.description + ] + if not arduino_ports: + raise IOError("No Arduino found") + + if len(arduino_ports) > 1: + if noinput is True: + raise IOError("Too many Arduinos found") + else: + while tty not in arduino_ports: + tty = raw_input("Enter a tty: "+" ,".join(arduino_ports)+ ";") + + else: + tty = arduino_ports[0] diff --git a/mpduino.geany b/mpduino.geany new file mode 100644 index 0000000..8452e3e --- /dev/null +++ b/mpduino.geany @@ -0,0 +1,33 @@ +[editor] +line_wrapping=false +line_break_column=72 +auto_continue_multiline=true + +[file_prefs] +final_new_line=true +ensure_convert_new_lines=false +strip_trailing_spaces=false +replace_tabs=false + +[indentation] +indent_width=4 +indent_type=1 +indent_hard_tab_width=8 +detect_indent=false +detect_indent_width=false +indent_mode=2 + +[project] +name=mpduino +base_path=/home/ericteunis/Arduino/mpduino +description= + +[long line marker] +long_line_behaviour=1 +long_line_column=72 + +[files] +current_page=0 + +[VTE] +last_dir=/home/ericteunis/Arduino/mpduino diff --git a/layout.ino b/mpduino/layout.ino similarity index 65% rename from layout.ino rename to mpduino/layout.ino index 9647392..81de539 100644 --- a/layout.ino +++ b/mpduino/layout.ino @@ -4,20 +4,37 @@ This one gives a way of scrolling through text. */ +#define FLASH_LINE_TICKS 3 -void layout(unsigned int tick) { +void initial_layout() { + display.clearDisplay(); + display.setTextSize(2); + display.setTextColor(WHITE); + display.setCursor(0, 8); + display.println("Waiting.."); + display.display(); + +} + +void layout( unsigned int tick ) { display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setTextWrap(false); - if ( playing || tick % 3 ) { + if ( playing || tick % FLASH_LINE_TICKS ) { display.setCursor(0, 0); // First line (20) - display.print(F(" ")); - if (volume < 100 ) display.print(' '); - display.print(volume); - display.print(F("% |||| ")); + if (volume == 100 || volume == 0){ + if (volume == 100) display.print('00'); + else display.print('--'); + } + else display.print(volume); + display.print(F("% ")); + display.print(round(temperature)); + display.print(F("C ")); + display.print(round(humidity)); + display.print(F("% |")); if (repeat_bool) display.print('r'); else display.print(' '); if (random_bool) display.print('x'); @@ -30,7 +47,6 @@ void layout(unsigned int tick) { else display.print(' '); if (updating_bool) display.print('u'); else display.print(' '); - display.print(" "); } //line 2 @@ -55,7 +71,14 @@ String textscroll(String text, unsigned int tick) { int len = text.length(); String newstring = ""; - if ( len < chars) return text; + if ( len < chars) { + for ( int i = len; i < chars -1; i+=2){ + text = " "+text+" "; + } + if ( text.length() == chars - 1) text = text+" "; + + return text; + } text = text + " - "; for ( int i = 0; i < chars; i++ ) diff --git a/mpcArduino.ino b/mpduino/mpduino.ino similarity index 64% rename from mpcArduino.ino rename to mpduino/mpduino.ino index 374350b..aca5f9b 100644 --- a/mpcArduino.ino +++ b/mpduino/mpduino.ino @@ -2,13 +2,46 @@ Project to interface a screen connected to an arduino with data from a vash script. Used as start up for a HTPC. */ + +#define BAUD 9600 +#define MAIN_DELAY 500 +#define DHT_DELAY 10000 + +// STRING Commands +#define KEY_RESET 'R' +#define KEY_READ 'E' +#define KEY_ECHO '!' +#define KEY_SET 'S' +//MPD +#define KEY_VOLUME 'V' +#define KEY_TITLE 'T' +#define KEY_ARTIST 'A' +#define KEY_ALBUM 'a' +#define KEY_REPEAT 'r' +#define KEY_SHUFFLE 'z' +#define KEY_RANDOM 'x' +#define KEY_CONSUME 'c' +#define KEY_UPDATE 'u' +#define KEY_SINGLE 's' +#define KEY_PLAYING 'P' +//Sensors +#define KEY_DHT_HUMIDITY 'h' +#define KEY_DHT_TEMPERATURE 't' + + +// DHT +#include +#define DHTPIN 7 // what pin we're connected to +#define DHTTYPE DHT22 // DHT 22 (AM2302) +DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino + // OLED thingies #include #include #include #include -//Functionality +//Functionality #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); @@ -42,16 +75,17 @@ static const unsigned char PROGMEM logo16_glcd_bmp[] = #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif + // Vars String inputString = ""; // a string to hold incoming data boolean stringComplete = false; // whether the string is complete -boolean repeat_bool = true; -boolean shuffle_bool = true; -boolean consume_bool = true; -boolean random_bool = true; -boolean updating_bool = true; -boolean single_bool = true; +boolean repeat_bool = false; +boolean shuffle_bool = false; +boolean consume_bool = false; +boolean random_bool = false; +boolean updating_bool = false; +boolean single_bool = false; boolean playing = false; int volume = 100; @@ -59,23 +93,29 @@ String title = " << << Title >> >> "; String artist = " << << Artist >> >> "; String album = " << << Album >> >> "; +float humidity = 0; +float temperature = 0; + unsigned int tick = 0; unsigned int maxticks = 0; void setup() { // initialise serial - Serial.begin(9600); + Serial.begin(BAUD); // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) // init done display.clearDisplay(); display.display(); - delay(500); + delay(MAIN_DELAY); + + initial_layout(); + while(!Serial); + establishContact(); layout(tick); calcMaxTicks(); - while(!Serial); } void loop() { @@ -88,6 +128,7 @@ void loop() { stringComplete = false; } layout(tick++); + update_sensor_readings(tick); if ( tick > maxticks ) tick = 0; - delay(500); + delay(MAIN_DELAY); } diff --git a/mpduino/rot_encoder.ino b/mpduino/rot_encoder.ino new file mode 100644 index 0000000..a35c423 --- /dev/null +++ b/mpduino/rot_encoder.ino @@ -0,0 +1,29 @@ +/* Functions to control playback */ + +void nextSong() { + +} + +void forward() { + +} + +void prevSong() { + +} + +void backward() { + +} + +void pause() { + +} + +void voldown() { + +} + +void volup() { + +} diff --git a/mpduino/sensors.ino b/mpduino/sensors.ino new file mode 100644 index 0000000..aa72e18 --- /dev/null +++ b/mpduino/sensors.ino @@ -0,0 +1,14 @@ +/* + Main function for sensors +*/ + +void update_sensor_readings( unsigned int tick ){ + + + if ( tick % (DHT_DELAY / MAIN_DELAY) == 0) + { + humidity = dht.readHumidity(); + temperature = dht.readTemperature(); + writeDHT(humidity, temperature); + } +} diff --git a/mpduino/serial.ino b/mpduino/serial.ino new file mode 100644 index 0000000..2b1d263 --- /dev/null +++ b/mpduino/serial.ino @@ -0,0 +1,88 @@ + +/* + SerialEvent occurs whenever a new data comes in the + hardware serial RX. This routine is run between each + time loop() runs, so using delay inside loop can delay + response. Multiple bytes of data may be available. + */ +void serialEvent() { + while (Serial.available()) { + // get the new byte: + char inChar = (char)Serial.read(); + // add it to the inputString: + inputString += inChar; + // if the incoming character is a newline, set a flag + // so the main loop can do something about it: + if (inChar == '\n') { + stringComplete = true; + } + } +} + +void establishContact(){ + while (Serial.available() <= 0) { + Serial.println(KEY_RESET); // send an initial string + delay(300); + } + Serial.println(KEY_RESET+KEY_RESET+KEY_RESET+KEY_RESET); +} + +void setFromSerial (String inputString) { + //remove newline + inputString = inputString.substring(0, inputString.length() -1); + char operation1 = inputString.charAt(0); + String string = ""; + + if ( operation1 == KEY_READ ){ + //Echo string like: EV means echo volume + switch ( inputString.charAt(1) ) { + case KEY_VOLUME: string = volume; break; + case KEY_TITLE: string = title; break; + case KEY_ARTIST: string = artist; break; + case KEY_ALBUM: string = album; break; + case KEY_REPEAT: string = repeat_bool; break; + case KEY_SHUFFLE: string = shuffle_bool; break; + case KEY_RANDOM: string = random_bool; break; +// case KEY_CONSUME: string = consume_bool; break; +// case KEY_UPDATE: string = updating_bool; break; +// case KEY_SINGLE: string = single_bool; break; + case KEY_PLAYING: string = playing; break; + case KEY_DHT_HUMIDITY: string = humidity; break; + case KEY_DHT_TEMPERATURE: string = temperature; break; + + default: string = KEY_ECHO; break; + } + Serial.println(string); + } + else if ( operation1 == KEY_SET ){ + bool success = true; + string = inputString.substring(2); + + switch ( inputString.charAt(1) ) { + case KEY_VOLUME: volume = string.toInt(); break; + case KEY_TITLE: title = string; break; + case KEY_ARTIST: artist = string; break; + case KEY_ALBUM: album = string; break; + case KEY_REPEAT: repeat_bool = (string != '0'); break; + case KEY_SHUFFLE: shuffle_bool = (string != '0'); break; + case KEY_RANDOM: random_bool = (string != '0'); break; +// case KEY_CONSUME: consume_bool = (string != '0'); break; +// case KEY_UPDATE: updating_bool = (string != '0'); break; +// case KEY_SINGLE: single_bool = (string != '0'); break; + case KEY_PLAYING: playing = (string != '0'); break; + //Echo + case KEY_ECHO: Serial.println(string); break; + default: success = false; break; + } + calcMaxTicks(); + Serial.println(int(success), DEC); + } + else Serial.println(-1, DEC); +} + +// write to serial from arduino +void writeDHT(float humidity, float temperature){ + Serial.println(KEY_DHT_HUMIDITY+String(humidity)); + delay(100); + Serial.println(KEY_DHT_TEMPERATURE+String(temperature)); +} diff --git a/serial.ino b/serial.ino deleted file mode 100644 index f504cb9..0000000 --- a/serial.ino +++ /dev/null @@ -1,70 +0,0 @@ - -/* - SerialEvent occurs whenever a new data comes in the - hardware serial RX. This routine is run between each - time loop() runs, so using delay inside loop can delay - response. Multiple bytes of data may be available. - */ -void serialEvent() { - while (Serial.available()) { - // get the new byte: - char inChar = (char)Serial.read(); - // add it to the inputString: - inputString += inChar; - // if the incoming character is a newline, set a flag - // so the main loop can do something about it: - if (inChar == '\n') { - stringComplete = true; - } - } -} - -void setFromSerial (String inputString) { - //remove newline - inputString = inputString.substring(0, inputString.length() -1); - char operation1 = inputString.charAt(0); - String string = ""; - - if ( operation1 == 'E' ){ - //Echo string like: EV means echo volume - switch ( inputString.charAt(1) ) { - case 'V': string = volume; break; - case 'T': string = title; break; - case 'A': string = artist; break; - case 'a': string = album; break; - case 'r': string = repeat_bool; break; - case 'z': string = shuffle_bool; break; - case 'x': string = random_bool; break; - case 'c': string = consume_bool; break; - case 'u': string = updating_bool; break; - case 's': string = single_bool; break; - case 'P': string = playing; break; - default: string = "!"; break; - } - Serial.println(string); - } - else if ( operation1 == 'S' ){ - bool success = true; - string = inputString.substring(2); - - switch ( inputString.charAt(1) ) { - case 'V': volume = string.toInt(); break; - case 'T': title = string; break; - case 'A': artist = string; break; - case 'a': album = string; break; - case 'P': playing = (string != 0); break; - case 'r': repeat_bool = (string != 0); break; - case 'z': shuffle_bool = (string != 0); break; - case 'x': random_bool = (string != 0); break; - case 'c': consume_bool = (string != 0); break; - case 'u': updating_bool = (string != 0); break; - case 's': single_bool = (string != 0); break; - //Echo - case '!': Serial.println(string); break; - default: success = false; break; - } - calcMaxTicks(); - Serial.println(int(success), DEC); - } - else Serial.println(-1, DEC); -} diff --git a/serialmpcduino.py b/serialmpcduino.py index db4948c..6ae7b8a 100644 --- a/serialmpcduino.py +++ b/serialmpcduino.py @@ -2,27 +2,57 @@ import serial import time class SerialMPCduino(object): - __volume = None - __progress = None - - __title = None - __artist = None - __album = None - - __playing = None - __repeat = None - __shuffle = None - __random = None - __single = None - __consume = None + stats = { + 'volume' :None, + 'title' :None, + 'artist' :None, + 'album' :None, + 'playing' :None, + 'repeat' :None, + 'shuffle' :None, + 'random' :None, + 'consume' :None, + 'updating' :None, + 'single' :None + } + + keys = { + 'read' :'E', + 'write' :'S', + 'reset' :'R', + 'volume' :'V', + 'title' :'T', + 'artist' :'A', + 'album' :'a', + 'playing' :'P', + 'repeat' :'r', + 'shuffle' :'z', + 'random' :'x', + 'consume' :'c', + 'updating' :'u', + 'single' :'s', + 'humidity' :'h', + 'temperature' :'t', + } + def __init__(self, tty, baud, verbose): self.tty = tty self.baud = baud self.verbose = verbose self.serial = serial.Serial(tty, baud) - + time.sleep(0.2) + if (self.serial.readline().decode('ascii').strip() == self.keys['write']*4): + print("All okay") + time.sleep(0.5) + + def __del__(self): + self.close() + + def close(self): + self.serial = None + def setup(self): print("Setup") print(self.serial) @@ -37,12 +67,14 @@ class SerialMPCduino(object): #if incoming bytes are waiting to be read from the serial input buffer #read the bytes and convert from binary array to ASCII string = self.serial.readline().decode('ascii') + if string != 1 and string != "\n": + print(string) return string def write_serial(self, string): - self.vprint("S"+string) - wait_time = 0.3 + 10 * len(string) / float(self.baud) - self.serial.write("S"+string+"\n") + self.vprint(self.keys['write']+string) + wait_time = 0.3 + 20 * (len(string)+2) / float(self.baud) + self.serial.write(self.keys['write']+string+"\n") time.sleep(wait_time) string = self.serial.readline().decode('ascii') @@ -50,126 +82,153 @@ class SerialMPCduino(object): self.vprint(string) self.vprint(self.check_serial()) self.vprint("Ready") - + def read_serial(self, string): - self.serial.write("E"+string+"\n") + self.serial.write(self.keys['read']+string+"\n") return self.serial.readline() + + def read_prop(self, prop): + return self.read_serial(prop) + + def write_prop(self, prop, new=None, force=False): + if force or new is not None and self.stats[prop] != new: + #write to serial + if force : + new = self.stats[prop] + + self.write_serial(prop+new) + def Checker(self, varfrom, varto, string): if varfrom == varto: return 0 self.write_serial(string) return 1 + + def write_all(self): + for prop in stats: + write_prop(prop, force=True) + return - - # Percentages - #@property - #def progress(self): - # return self.read_serial("p") - #@progress.setter - #def progress(self, new): - # if self.Checker(self.__progress, new, "p"+str(new)): - # print("Progress: {}".format(new)) - # self.__progress = new - + ### Properties + + # Ints @property def volume(self): - return self.read_serial("V") + return read_prop('volume') @volume.setter def volume(self, new): - if self.Checker(self.__volume, new, "V"+str(new)): + if self.Checker(self.stats['volume'], new, self.keys['volume']+str(new)): print("Volume: {}".format(new)) - self.__volume = new + self.stats['volume'] = new # Strings @property def title(self): - return self.write_serial("T") + return read_prop('title') @title.setter def title(self, new): - if self.Checker(self.__title, new, "T"+str(new)): + if self.Checker(self.stats['title'], new, self.keys['title']+str(new)): print("Title: {}".format(new)) - self.__title = new + self.stats['title'] = new @property def artist(self): - return self.write_serial("A") + return read_prop('artist') @artist.setter def artist(self, new): - if self.Checker(self.__artist, new, "A"+str(new)): + if self.Checker(self.stats['artist'], new, self.keys['artist']+str(new)): print("Artist: {}".format(new)) - self.__artist = new + self.stats['artist'] = new @property def album(self): - return self.write_serial("a") + return read_prop('album') @album.setter def album(self, new): - if self.Checker(self.__album, new, "a"+str(new)): + if self.Checker(self.stats['album'], new, self.keys['album']+str(new)): print("Album: {}".format(new)) - self.__album = new + self.stats['album'] = new # Booleans @property def repeat(self): - return self.write_serial("r") + return read_prop('repeat') @repeat.setter def repeat(self, new): - if self.Checker(self.__repeat, new, "r"+str(new*1)): + if self.Checker(self.stats['repeat'], new, self.keys['repeat']+str(new*1)): print("Repeat: {}".format(new)) - self.__repeat = new + self.stats['repeat'] = new @property def shuffle(self): - return self.write_serial("z") + return read_prop('shuffle') @shuffle.setter def shuffle(self, new): - if self.Checker(self.__shuffle, new, "z"+str(new*1)): + if self.Checker(self.stats['shuffle'], new, self.keys['shuffle']+str(new*1)): print("Shuffle: {}".format(new)) - self.__shuffle = new + self.stats['shuffle'] = new + # Booleans + @property + def repeat(self): + return read_prop('repeat') + @repeat.setter + def repeat(self, new): + if self.Checker(self.stats['repeat'], new, self.keys['repeat']+str(new*1)): + print("Repeat: {}".format(new)) + self.stats['repeat'] = new + + @property + def shuffle(self): + return read_prop('shuffle') + @shuffle.setter + def shuffle(self, new): + if self.Checker(self.stats['shuffle'], new, self.keys['shuffle']+str(new*1)): + print("Shuffle: {}".format(new)) + self.stats['shuffle'] = new @property def single(self): - return self.read_serial("s") + return read_prop('single') @single.setter def single(self, single): - if self.Checker(self.__single, new, "s"+str(new*1)): + if self.Checker(self.stats['single'], new, self.keys['single']+str(new*1)): print("Single: {}".format(new)) - self.__single = new + self.stats['single'] = new @property def random(self): - return self.read_serial("x") + return read_prop('random') @random.setter def random(self, new): - if self.Checker(self.__random, new, "x"+str(new*1)): + if self.Checker(self.stats['random'], new, self.keys['random']+str(new*1)): print("Random: {}".format(new)) - self.__random = new + self.stats['random'] = new @property def consume(self): - return self.read_serial("x") + return read_prop('random') @consume.setter def consume(self, new): - if self.Checker(self.__consume, new, "c"+str(new*1)): + if self.Checker(self.stats['consume'], new, self.keys['consume']+str(new*1)): print("Consume: {}".format(new)) - self.__consume = new + self.stats['consume'] = new - #@property - #def update(self): - # return self.read_serial("u") - #@update.setter - #def update(self, new): - # if self.Checker(self.__update, new, "u"+str(new*1)): - # print("Update: {}".format(new)) - # self.__update = new + @property + def update(self): + return read_prop('updating') + @update.setter + def update(self, new): + if self.Checker(self.stats['updating'], new, self.keys['updating']+str(new*1)): + print("Update: {}".format(new)) + self.stats['updating'] = new @property def playing(self): - return self.read_serial("P") + return read_prop('playing') @playing.setter def playing(self, new): - if self.Checker(self.__playing, new, "P"+str(new*1)): + if self.Checker(self.stats['playing'], new, self.keys['playing']+str(new*1)): print("Playing: {}".format(new)) - self.__playing = new + self.stats['playing'] = new diff --git a/serialmpcduino.pyc b/serialmpcduino.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae158e1f5ad00933dc59bc312fb16773dd15927c GIT binary patch literal 9986 zcmeHN-ESOM6+g4H{#eIOjAO@kQrfhQ>9#a+)3j-6(>RXPCQ!NwcheMtU^UsfPR8CZ zW@eKZ8X+}7LgERD7eL|(i6NH~q##~hy-$LApD zb2^;mY)*%B5|Ym$3CU+(Lh@OVkbD*;B%i|)lFtzd!6$r7!jI$jxP(uDYhJ>m)XDV` z37^!;sDw{xWlX}SwK6W@F|8CNT++&fgrCp~#C=99lM)uS0?D7%%6_pB|2fw01BGd^ z)3Sk?e6p_x1kY#98L=};aJ;Vv1ShiQL9qvwV7adc1TSRGS+TQ9aI&ul1TSXIIk9s} zaH_8d1TSUHLt+mp!OML;AUK^hyCb~P*8_rAvu1aMPxbYH;I*tdFLqv8yx!LXf-_lj zLF|GOywTSKg0oq3QS71;tn~GO;9S-`EcUPxtoHSQ;C$9RBKC+9to3?Kx%eh5JRL=G zyIE`3Z92ksl-8_v25}lCsdfgn8|`{JhR3a1uoX3KDnV>pHb}KQxz%1@@4OcWjj-vc ztIbBjfyeP?yA=j$_G*F($UXGGnbIX=8-&^{E5kc+l)A@8+p$e-s?V=!c~#3*EdwpD zXc=qyRW0voS=F+wWuoOR73WsF9)(f5rCn*d4>F{--m-C!wqskROuQIw)^H`?K=HmO z?~7DW$!P^mUn@CDec8w>K~Cn7^>{bi-7bL50lOq+B!f_A9z-L~L*&Fw&w6pA5BNanGwXV6r zQ?>GWsmM}QTCG7L+BC<}w|hwmTcr}(TBX9&l_0S|sIF*is%TTFKp+|#@)rSjl9535 zSZX$`Swd?Mr8CPI?`2#Mi$&fl)*)12$rmp>as4?7 z_gGft1Y>QtUIioNCf*2Pri!vlg+77~Coe?b%u75^7gfJf$w^#_I7cVxG1l0rm^*iX zH8*bV9)1n8EsT}Ef$@_(3h@p&{I|*cE*?0UHxM{f>6H9)StsI#MiLi5?jZ*0GH275 z_#Lh1rCZmT;(1wT%kW-`$k;rILg$@u@)PQ$YEx-}Pa5w95o5J^mc-AY=xN2g#3ruY zIqoC|sNS;G&5CpCRkV`{4(rYN3*JJ8Cyk5BQapc&iqj2C%-fSiOmCj?75YE~O%Z!F z-XfCD&mt<5FwfvQH-As#@`eV~?e8Pl>KF)y2+fG@9FQcS)dPA>MN>h)1IQ~3^LvA>X7CQSp8?Bc2896E zCGQD@2(U$PgeHLdgPh#+ zrKsj^7*3s5w}po?yZOwG(Pbs^}YvC3|0|NkC-LsRE6lnDA|Omd~*_o zi>+ypCgu#9E-oa--gKuE@Blk;z#! z?cN!4SKPOP8ZvdB4^&ddC$qwW_Oxq|4CD1RTphV!y?(*(B1FK*Ct*l+3g!Y1J3EBk zj&Z?IU4ZK3$_S(`{JONWUDa+y7R2i@R?#%#+gOP=_bBXg6|%;#YvXlPJ9C=!^0}#A zE+SK%6C=sp$0ZfH@TEh-*yqv>DvXhy_mweuPwj|mD4FvpU2Hjrn(AM@7Q{L<&mQ}Pf%mb(Zi?Rw+GIVqY0qw=rXhXXePDgHIBbe$N-E*J2ayHwcu`*7*ExnXcS49JgF7=Xy$JCixHk1^e(G?QM_ zUEOO(zjjY!p}C01<{XP|_P|y(KV`ACr=$AmHeDmU5x4j999Y2HS$=Xg+n4{+@q51Q6s@ZiYbq)Z<@9%QYavZ_ZN zLjZ&le2Y>rF33(Cg!yhTfNEJq-pKj{HN)G#q5e-XX)2y|O!k9Rf6z<405jF_PR4py3OHfrcah7}t=XA^ZOk zr}+uBuw!J1>0prI$Umn{|96^S{8!M>*#`p+N9GaRj-cU*8O<6w?X*i?x_U&G{H_i0C&Q1ixyt)_;O?#-kXi8Bt^vs^vs K7vf28GWSm?4Iza9 literal 0 HcmV?d00001 diff --git a/ttycontrol.py b/ttycontrol.py index 3956b9e..189f82b 100755 --- a/ttycontrol.py +++ b/ttycontrol.py @@ -2,8 +2,10 @@ from serialmpcduino import SerialMPCduino import subprocess import time +import warnings +import serial.tools.list_ports -tty = '/dev/ttyACM0' +tty = None baud = 9600 verbose = 1 mpdhost = 'fatserf.thuis' @@ -15,18 +17,37 @@ album = None volume = 0 #progress = 0 -repeat = True -shuffle = True -random = True -single = True -consume = True -playing = True +repeat = 0 +shuffle = 0 +random = 0 +single = 0 +consume = 0 +playing = 0 - -if True: +# Get TTY +arduino_ports = [] +while not arduino_ports: + arduino_ports = [ + p.device + for p in serial.tools.list_ports.comports() + if 'Arduino' in p.description + ] + if not arduino_ports: + raise IOError("No Arduino found") + + if len(arduino_ports) > 1: + if noinput is True: + raise IOError("Too many Arduinos found") + else: + while tty not in arduino_ports: + tty = raw_input("Enter a tty: "+" ,".join(arduino_ports)+ ";") + + else: + tty = arduino_ports[0] + +try: ser = SerialMPCduino(tty, baud, verbose) - time.sleep(0.5) while True: mpctext = subprocess.check_output(['mpc', '-h', mpdhost, '-f', mpcformat]) # Parse output @@ -77,7 +98,6 @@ if True: #print("Playing: {}".format(playing)) #raw_input("") - ser.playing = playing ser.volume = volume #ser.progress = progress ser.title = title @@ -85,6 +105,9 @@ if True: ser.album = album ser.repeat =repeat ser.shuffle = shuffle + ser.playing = playing - time.sleep(0.4) - subprocess.call(['mpc', '-h', mpdhost, 'idle'])# Waits for changes + time.sleep(0.5) + +finally: + ser.close()