2017-08-23 9 views
0

Ich bin wirklich neu in Python und Codierung im Allgemeinen, so dass ich hier um Hilfe wende. Bei der Arbeit müssen wir viele Kabel mit bis zu fünf angeschlossenen DS18B20-Sensoren testen. Wir haben dieses Programm und wir verwenden es schon seit einer Weile, um Kabel mit Raspberry Pi zu testen. Aber es gibt wenige Probleme damit.Testen mehrerer DS18B20 Sensorkabel

Das Programm muss die Anzahl der angeschlossenen Sensoren erkennen und sehen, ob sie funktionieren, und sie dann nach Seriennummer> niedrigste auflisten (damit wir sie aufwärmen können, sehen, welche einzeln und physisch hervorgehoben werden) Nummeriere sie) und wiederhole es.

Es fühlt sich im Allgemeinen langsam an und stürzt ziemlich oft ab. Mit den Kabeln, an denen 5 Sensoren angebracht sind, kann es die Sensoren an maximal 2 Kabeln finden (mehr wenn Glück), und wenn du das 3. Kabel anbringst, wird es sie nicht mehr finden oder es werden immer 10 Sensoren angeschlossen . Neustart das Pi behebt es aber es braucht Zeit. Das Tauschen der Kabel ist hier wahrscheinlich der Hauptschuldige, aber es ist der schnellste Weg.

Mit 3 Sensorkabeln können Sie 4-5 von ihnen überprüfen, bis es hängt.

Alle Hinweise, wo das Problem sein könnte oder wie ich die Dinge effizienter und schneller machen könnte, sind willkommen.

Code:

import os,sys,time 
import curses 
stdscr = curses.initscr() 

begin_x = 5; begin_y = 5 
height = 40; width = 40 

def temp_raw(sensor_str): 
    f = open(sensor_str, 'r') 
    lines = f.readlines() 
    f.close() 
    return lines 

def read_temp(sensor_str): 
    lines = temp_raw(sensor_str) 
    while lines[0].strip()[-3:] != 'YES': 
     lines = temp_raw(sensor_str) 
    temp_output = lines[1].find('t') 
    if temp_output != -1: 
     temp_string = lines[1].strip()[temp_output+2:] 
     temp_c = float(temp_string)/1000.0 
     return temp_c 
init = 1 
timer = 0 
search = 1 
curses.noecho() 
curses.curs_set(0) 
subdirectories = [] 
old_nbr_of_subdirs = 1 
nbr_of_subdirs = 1 
old_subdirectories = [] 
os.system('modprobe w1-gpio') 
os.system('modprobe w1-therm') 

while (1): 
    timer = timer + 1 

    while search == 1: 
     stdscr.addstr(10,30, "Searching for sensors"); 
     subdirectories = os.listdir("/sys/bus/w1/devices/"); 
     nbr_of_subdirs = len(subdirectories); 
     time.sleep(3) 
     if nbr_of_subdirs > old_nbr_of_subdirs: 
      stdscr.addstr(10,30, "Found %d new sensors   " % (nbr_of_subdirs-old_nbr_of_subdirs)); 
      stdscr.addstr(11,30, "Is this all sensors? (y/n)?"); 
      stdscr.refresh() 
      c = -1; 
      while(c == -1): 
       c = stdscr.getch(); 
       if c == ord('y'): 
        stdscr.addstr(10,30, "         "); 
        stdscr.addstr(11,30, "       "); 
        stdscr.refresh() 
        old_nbr_of_subdirs = nbr_of_subdirs; 
        init = 1; 
        search = 0; 
        timer = 0; 
     else: 
      stdscr.addstr(10,51 + timer, ". "); 
      timer = timer + 1; 
      timer = timer % 4; 
      stdscr.refresh() 



    if init == 1: 
     init = 0 
     alive_ticker = 0; 
     temp_list = []; 
     sensor_oldtemp = [0,0,0,0,0,0]; 
     sensor_temp = [0,0,0,0,0,0]; 
     active_sensor = [0,0,0,0,0,0]; 
     sensors = 0; 
     alive_ticker = 0; 
     active = 2; 
     confirm = 0; 

     stdscr.addstr(17,0, "Number of subdirectories %d" % (len(subdirectories))); 
     removed = 0; 
     index = 0; 
     length_old_subdirs = len(old_subdirectories); 
     while (index < length_old_subdirs): 
      length_old_subdirs = len(old_subdirectories); 

      if old_subdirectories[index] in subdirectories: 
       subdirectories.remove(old_subdirectories[index]); 
       removed += 1; 
       index += 1;  

      else: 
       old_subdirectories.remove(old_subdirectories[index]); 
       index = 0; 


     stdscr.addstr(30,20, "Removed %d" % (removed)) 


     stdscr.addstr(18,0, "Number of CUT subdirectories %d" % (len(subdirectories))); 


     stdscr.addstr(19,0, "Number of old_subdirectories %d" % (len(old_subdirectories))); 

     stdscr.addstr(13,20, "Press space to confirm active sensor!"); 
     stdscr.addstr(14,20, "Press r to reset!"); 

     for index in range(len(subdirectories)): 
      if subdirectories[index].find("28") != -1: 
       temp_list.append("/sys/bus/w1/devices/"+subdirectories[index]+"/w1_slave"); 
       sensor_temp[sensors] = 0; 
       sensors = sensors + 1; 
       old_subdirectories = old_subdirectories + subdirectories; 
       temp_list.sort(); 

    if confirm == 1: 
     stdscr.addstr(13,20, "Press space to confirm active sensor!"); 
     stdscr.addstr(14,20, "Press r to restart!"); 


    curses.halfdelay(1); 
    c = stdscr.getch(); 

    if c == 32: 
     confirm = 0; 
     timer = 10 
     for z in range(sensors): 
      if active_sensor[z] > active: 
       stdscr.addstr(z+5,20, "                  " , curses.A_DIM) 
       active_sensor[z] = 100 
       stdscr.refresh() 
    elif c == ord('n'): 
     init = 1 
     continue 

    elif c == ord('r'): 
     for z in range(sensors): 
      active_sensor[z] = 1; 

    if (timer > 9): 
     timer = 0 
     nbr_active_sensors = 0 
     for y in range(sensors): 
      if 99 > active_sensor[y]: 
       nbr_active_sensors = nbr_active_sensors + 1; 
       sensor_temp[y] = read_temp(temp_list[y]); 
       if ((sensor_oldtemp[y] + 0.1) < sensor_temp[y]): 
        active_sensor[y] = active_sensor[y] + 1; 
        sensor_oldtemp[y] = sensor_temp[y] 

     stdscr.addstr(3,5, "nbr_active_sensors=%d" % (nbr_active_sensors)) 
     stdscr.addstr(4,5, "sensors=%d" % (sensors)) 

     if nbr_active_sensors == 0: 
      search = 1 
      timer = 0; 
      continue 

     for x in range(sensors): 
      if (99 > active_sensor[x] and active_sensor[x] > active): 
       confirm = 1   
       stdscr.addstr(x+5,20, "Sensor %d value %4.2f ID:%s : %d " % (x+1, sensor_temp[x], temp_list[x][20:-9], active_sensor[x]), curses.A_STANDOUT) 
      elif active_sensor[x] <= active: 
       stdscr.addstr(x+5,20, "Sensor %d value %4.2f ID:%s : %d " % (x+1, sensor_temp[x], temp_list[x][20:-9], active_sensor[x])) 
     stdscr.refresh() 
     alive_ticker = alive_ticker + 1 
     stdscr.addstr(2, 55, "Alive ticker: %6d" % (alive_ticker)) 
+0

Zu viel Code. Können Sie Ihren Code auf ein minimales vollständiges, verifiziertes Beispiel reduzieren, das das Problem prägnanter zeigt? UND, wo stürzt der Code ab - welche Zeile, was ist der komplette Traceback? Bitte bearbeiten Sie dies in Ihrer Frage – barny

+0

Erklären Sie, warum Sie _... die Anzahl der angeschlossenen Sensoren erkennen müssen, anstatt die Anzahl der Sensoren und die ID in Ihrem Programm vorzugeben. – stovfl

+0

Entschuldigung für späte Antwort. @barny Ich weiß nicht wirklich, was das Programm zum Absturz bringt, wenn man das 3. Kabel (mit 2-3 Temperatursensor) einlegt, findet es einfach keine neuen Sensoren mehr. stovfl das ist eine gute Frage, da ich diesen Code nicht gemacht habe und keine wirkliche Idee habe, wie ich es ändern kann, schulde ich dir eine Antwort. –

Antwort

1

Frage: wenn Sie das dritte Kabel ein (mit 2-3 Temperatursensor auf sie) es wird nur keine neuen Sensoren mehr finden.

Wenn ich mich erinnere richtig ein Limit von Kabel besteht. Haben Sie verifiziert, dass Ihre Hardware mehr Kabel unterstützt?

Ich schlage vor, den Code und separate den Code in UI, Sensor und Wire Parts neu zu schreiben.

Zum Beispiel:

class DS18B20(object): 
    ... 
    def read(self): 
     ... 

class One_Wire(object): 
    def search(self): 
     print("Searching sensors") 
     ... 

    def read(self): 
     print('Reading sensors') 
     for key in self.sensors: 
      self.sensors[key].read() 

    def refresh(self): 
     print("Refreshing sensors") 
     ... 

    def history(self, alive=True): 
     print('Reading History') 
     ... 

Nutzungs:

if __name__ == '__main__': 
    oWire = One_Wire() 

    oWire.search() 
    print(oWire) 

    oWire.refresh() 
    print(oWire) 

    oWire.read() 
    print(oWire) 

    history = oWire.history() 
    print(history) 

Ausgang:

Searching sensors 
Sensors:5, active:5 
id:i2c-0 CONNECT temp:None, id:i2c-3 CONNECT temp:None, id:i2c-1 CONNECT temp:None, id:i2c-5 CONNECT temp:None, id:i2c-6 CONNECT temp:None 
Refreshing sensors 
NEW Sensor:i2c-2 
NEW Sensor:i2c-4 
Sensors:7, active:6 
id:i2c-0 CONNECT temp:None, id:i2c-2 CONNECT temp:None, id:i2c-3 CONNECT temp:None, id:i2c-1 disconnect temp:None, id:i2c-5 CONNECT temp:None, id:i2c-6 CONNECT temp:None, id:i2c-4 CONNECT temp:None 
Reading sensors 
Reading sensors 
Reading sensors 
Sensors:7, active:6 
id:i2c-0 CONNECT temp:19, id:i2c-2 CONNECT temp:25, id:i2c-3 CONNECT temp:26, id:i2c-1 disconnect temp:None, id:i2c-5 CONNECT temp:25, id:i2c-6 CONNECT temp:18, id:i2c-4 CONNECT temp:30 
Reading History 
[{'i2c-0': [20, 27, 19]}, {'i2c-2': [30, 21, 25]}, {'i2c-3': [23, 29, 26]}, {'i2c-5': [30, 18, 25]}, {'i2c-6': [30, 21, 18]}, {'i2c-4': [24, 18, 30]}] 
Verwandte Themen