免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9365 | 回复: 6
打印 上一主题 下一主题

求助:python树莓派多线程编程 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2016-03-28 15:18 |显示全部楼层
本帖最后由 amduroncn 于 2016-03-28 16:14 编辑

你应该建立一个线程同步事件,一个资源为1临界资源的访问的信号量


主线程 申请能临界区的使用-》测温》释放临界区访问-》发通知-》-----loop
显示线程 收通知-》重置事件-->申请临界区使用权-》快速复制一个副本-》释放临界区资源使用-》显示---loop


祝你小朋友成功孵出小鸡!


以下是代码
  1. # -*- coding: utf-8 -*-
  2. import threading
  3. import time
  4. import random
  5. # 建立一个继承threading的线程实现类

  6. temp_lists = []


  7. class DisplayClass(threading.Thread):
  8.     def __init__(self):
  9.         threading.Thread.__init__(self)
  10.         #  初始化各种变量

  11.     def run(self):
  12.         while 1:
  13.             ready.wait()  # 等待测温事件完成通知
  14.             ready.clear()  # 重置事件
  15.             sep.acquire()  # 对临界区访问,速度复制一个副本,
  16.             tmplists = temp_lists
  17.             tmpavg = temp_avg
  18.             sep.release()  # 释放临界区访问
  19.             print(u"显示温度"+str(tmplists)+ u",平均温度:"+str(tmpavg))
  20.             time.sleep(6)


  21. def temp_get():
  22.     # random.random()
  23.     temp_lists.append(random.random()*65)
  24.     if len(temp_lists) > 6:
  25.         temp_lists.pop(0)
  26.     return temp_lists


  27. def get_avg(l):
  28.     return sum(l)/len(l)


  29. def dis_hot():
  30.     pass


  31. def keep_warming():
  32.     pass


  33. def hot():
  34.     pass

  35. def main():
  36.     global temp_lists
  37.     global temp_avg
  38.     global ready
  39.     global sep;
  40.     temp_max = 40
  41.     temp_min = 35
  42.     ready = threading.Event()
  43.     sep = threading.Semaphore(1)
  44.     ready.clear()
  45.     threaddisdis = DisplayClass()
  46.     threaddisdis.start()
  47.     while 1:
  48.         sep.acquire()
  49.         temp_lists = temp_get()  # 读取传感器的值到一个list
  50.         temp_avg = get_avg(temp_lists)  # 计算温度平均值
  51.         sep.release()
  52. # 发出通知显示线程可以执行
  53.         ready.set()

  54.         if temp_avg > temp_max:
  55.             dis_hot()  # 若平均值大于设定上限,则持续降温
  56.             print(u'降温')
  57.         elif temp_avg < temp_min:
  58.             hot()  # 若平均值小于下限,则持续加热
  59.             print(u'加热')
  60.         else:
  61.             keep_warming()   # 否则保温(不加热也不降温)
  62.             print(u'保温')
  63.         time.sleep(1)
  64. if __name__ == "__main__":
  65.     main()
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
Windows19 + 10 这个思路我给满分10分

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2016-03-29 00:21 |显示全部楼层
本帖最后由 amduroncn 于 2016-03-29 00:30 编辑

不用客气,我也是初学。从你的描叙来看,6秒就会使温度超出范围,可见你的发热丝,功率貎似得大啊。何不使用PWM控制发热丝,发热丝可以用低压的发热丝(安全),结合PID控制,可把温度做得很恒定哟。你现在的方案,继电器会经常动作吗?

论坛徽章:
0
3 [报告]
发表于 2016-03-29 19:53 |显示全部楼层
bskay 发表于 2016-03-29 15:06
import multiprocessing

def main():
说下这个思路的几个问题
1数码管与液晶不同,它是一个需要不停扫描才能显示显示的器件,如果几个温度相同,就不进行显示,数码管会没有输出。当然1602是可以正常显示的。  

所以
if old == (temp_lists,temp_avg):
            continue
old = (temp_lists,temp_avg) #控制一下不要做可有可无的调用
对数码管来说是错误的,它会导致数码管无显示。

2.bskay使用了进程池,这可以充分利用多核cpu的各个核心,但bskay开了5个进程,这是没必要的且是错误的。主线程的一个loop是很快的(不加sleep,测5个18b20,最多ms级吧),而显示进程是很慢的,主线程一个loop下来,就会有一个进程被产生出来(<=5)基本上瞬间就会使进程池满掉,造成主线程阻塞。

而且依楼主意思楼主只有一个数码管,是依次做的扫描。btw,你得把数据传进去,否则进程显示什么呢?

论坛徽章:
0
4 [报告]
发表于 2016-03-30 13:33 |显示全部楼层
回复 9# bskay


    以前看到apply_async说是池满了,会阻塞主线程。实验了一下不会。我说错了。这个方法可行,只要将POOL(1)即可。

论坛徽章:
0
5 [报告]
发表于 2016-04-03 02:38 |显示全部楼层
本帖最后由 amduroncn 于 2016-04-03 02:47 编辑

找到合适的电源

QQ图片20160403022539.png (13.01 KB, 下载次数: 34)

QQ图片20160403022539.png

论坛徽章:
0
6 [报告]
发表于 2016-04-03 02:39 |显示全部楼层
本帖最后由 amduroncn 于 2016-04-03 03:01 编辑

找到合适的电源(最好将电源定为12V,谁家没有几个旧电脑电源呢,一般12V它可以提供10A的电流输出能力,千万不要用小功率12V电源,接上要烧的),确定电压电流,然后上TB买低压的发热丝,根据使用的功率,找到合适的场效应管(要求导通电阻小,从废电脑主板cpu供电部分拆一般都能满足要求,比如ntd4806,(30V,6mohm@Vgs 10V)。

然后控制pwm占空比,调节发热丝功率,温度然后就恒定了,如果控制得好,超调量小,连风扇都可以省略~~~

论坛徽章:
0
7 [报告]
发表于 2016-04-23 22:09 |显示全部楼层
回复 16# jiaxv


    不是直流就能精确控制,交流也是一样。我只是认为大电压的交流搞起来有危险。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP