簡體   English   中英

測試多條DS18B20傳感器電纜

[英]Testing multiple DS18B20 sensor cables

我真的是python和編碼的新手,所以我在這里尋求幫助。 在工作中,我們需要測試最多連接五個DS18B20傳感器的電纜。 我們得到了這個程序,並且已經使用了一段時間了,以通過樹莓派測試電纜。 但是,它幾乎沒有問題。

該程序需要檢測連接的傳感器的數量,並查看它們是否正常工作,然后按序列號從最低到最高的順序列出它們(以便我們對其進行預熱,看看其中哪一個被突出顯示,並逐一進行編號)重復。

通常感覺很慢,並且經常崩潰。 使用連接了5個傳感器的電纜,它可以在最多2條電纜上找到傳感器(如果幸運的話,可以找到更多),而當您連接第3條電纜時,它將不再找到它們,或者會一直說連接了10個傳感器。 重新啟動Pi可以解決此問題,但需要花費一些時間。 熱插拔電纜可能是此處的罪魁禍首,但這是最快的方法。

使用3條傳感器電纜,您可以檢查4-5條電纜,直到其掛起。

任何暗示問題可能出在哪里或我如何使事情更高效,更快地表示歡迎。

碼:

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))

問題 :當您插入第三根電纜(帶有2-3個溫度傳感器)時,它不再能找到任何新的傳感器。

如果我沒記錯的話,電纜的極限為2 您是否已驗證硬件支持更多電纜?

我建議重寫代碼和代碼分成 UI,傳感器和導線部分。

例如:

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')
        ...

用法

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

    oWire.search()
    print(oWire)

    oWire.refresh()
    print(oWire)

    oWire.read()
    print(oWire)

    history = oWire.history()
    print(history)

輸出

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]}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM