12064| 17
|
[教程] 要想面团发的好,此款神器少不了——基于行空板的面团... |
项目起源 哈喽,大家好,我是旺仔爸爸,一名喜欢造物的创客奶爸 作为一名典型的北方人,对于包子、馒头等面食的喜爱那是刻在骨子里的。不过,会吃不会做是现在大部分90后、00后典型特征,当然我也不例外。自从有了家庭后也会尝试自己发酵面团做面食,在面团发酵过程中对于温、湿度环境的要求还是比较高的,究竟什么样的环境下最有利于面团发酵呢?面团发酵过程中会产生什么样的物质,本期视频我们就来一探究竟。 下面我们先通过视频来看一下是行空板是如何完成实验的。 视频展示 知识背景介绍 首先我们需要了解一下面团发酵的过程 小麦作为人类最早种植的农作物,已有上万年的历史,小麦磨成粉做面食的传统也有千年,作为面食文化的传承者,几乎家家户户都会吃面食,面食的品类多种多样。包子、馒头等食物松软可口,里面有很多气孔;而水饺、面条比较劲道,没有气孔。为什么会有这样的区别呢?其实跟面团有关,包子、馒头需要发面,水饺、面条不需要发面。 发不发面这里关键在于和面时是否放入“引酵”,也叫老面(上一次蒸馒头剩下的面团),现在大多用干酵母替代。关于引酵的使用要追溯到人类对面食探索历史上的某一天,自然界中的酵母菌和其他菌种兄弟们像往常一样飘落在某户人家的面团中,它们将面团中的水解单糖转化为二氧化碳和水(有氧呼吸),从中获得生存繁衍的能量。 然而事情还没结束,粗心的制作者将面团遗忘在某处,因为酵母菌本身是兼性厌氧生物,即使面团中氧气有限,也可以直接将葡糖糖转化为二氧化碳和酒精来获取能量(无氧呼吸)。无论是有氧还是无氧呼吸,酵母菌的生长繁殖都产生了大量的二氧化碳,这使得面团变得疏松多孔。偶然间,粗心的制作者又发现了被遗忘的面团,为了节省原料,增加了一些面粉后进行蒸制,蒸制过程中,二氧化碳溢出、膨胀,产生更多更大的气孔使食物变得蓬松柔软。虽然会有些许酸味,但瑕不掩瑜,胜在口感味道新奇,这种做法被广为认可,流传至今。 既然面团发酵会产生酒精和二氧化碳,那么我们不妨就来测试一下面团发酵过程中的温、湿度环境对面团发酵的程度有什么影响 这就需要用到本次我们所使用到的器材: 其中比较至关重要的就是行空板了,它拥有堪比树莓派的性能,内置了各种Python第三方库,关键是自带SIoT服务器,可以非常轻松的胜任本次实验数据的采集、发送工作。 如果再为行空板外接一个USB免驱摄像头,每隔一段时间完成一次图像采集,那样就可以以延时摄影的方式完整的记录整个面团发酵的过程了。行空板作为本次实验的主要控制器简直是不二之选。 方案确定后,下面开始设计 设计制作 首先为本次的实验装置设计一个外观结构 图纸设计 要想面团发的好,不仅要和好面,还要密封起来,尽可能构造一个无氧环境(酵母菌前期做有氧呼吸,后期做无氧呼吸)为此我们选择一个较大的碗,使用亚克力板设计一个盖子,将检测环境的传感器、主控板以及摄像头安装在盖子上。这样既能保证气密性,又能完成数据采集和延时拍照,摄像头采用倾斜安装的方式,为了尽可能增大摄像头的拍摄幅面,将检测传感器安装在行空板的背部,立体叠加安装,不遮挡画面。 使用LaserMaker激光建模软件设计的图纸如下:图中设计了两种不同高度的摄像头支架 加工零件 图纸设计完成后,我们使用激光切割机把图纸零件加工出来,加工完成后的零件如下图所示 器材清单 除了以上外观结构,本次实验还需要用到如下器材
下图中的酒精浓度传感器由于量程问题,在实际使用过程中替换为了电路接线中的那款 器材准备完毕,接下来我们看一下各个电子部件之间如何接线的 电路接线 本次实验的传感器接线非常简单,传感器都为防呆接口,环境检测传感器和空气质量传感器使用IIC通讯协议,连接行空板的IIC引脚即可。酒精传感器为模拟信号连接行空板的P22引脚。摄像头连接USB接口。 一切准备就绪,下面进入组装环节 组装 安装摄像头 安装摄像头的零件如下,使用M2的螺丝和铜柱将摄像头固定在亚克力中,安装完成如下图 安装行空板 为了方便用户观察,行空板需要安装在亚克力盖子的正面,所需零件如下图。 使用M3螺丝将行空板固定,安装完成如下图 安装传感器 随后,需要将传感器安装在亚克力盖子的背面,零件如下图 使用M3螺丝和尼龙柱将传感器固定在亚克力盖子的背面,由于酒精传感器量程的原因,这里将早期测试使用的传感器做了替换,安装完成如下图所示 最后,将前面组装好的摄像头模块安装在圆形盖子上,本次实验装置就组装完成了 组装完成,按照前面接线图将电子部件连接即可使用 程序设计 装置组装完成,下面为实验装置设计程序 编程思路 从前文中可以知道,本次实验装置,我们需要测量的数据有:温度、湿度、二氧化碳以及酒精浓度。为了让数据更加直观可视化,我们还可以借助行空板自带的服务器将数据实时发送至SIoT物联网平台。甚至还可以结合延时摄影的程序,通过挂载的摄像头记录面团发酵的全过程。 下面我们根据思维导图开始程序设计 本次程序设计的编程环境为Mind+。现在,可以在官网https://mindplus.cc/中下载到最新的支持行空板的版本。 加载库 软件下载安装完成后需要加载本次程序设计用到的库。软件打开后点击左下角“扩展”按钮,加载官方库中的“行空板”、“代码生成器”和“MQTT”三种库。“行空板”库用来控制板载硬件;“代码生成器”可以以图形化积木块的形式调用Python第三方库的指令;“MQTT”库用来向服务器发送数据。 接下来,继续加载“pinpong”库,该库用来为控制板调用各种传感器 最后在用户库里输入关键字“BME280环境传感器”和“CCS811空气质量传感器”加载这两个库,也可以复制如下连接至搜索框中进行加载
所有库加载完毕,下面开始逐一测试每个模块,最后再将其整合成完成程序。 温、湿度环境监测 可以编写如下程序进行测试,注意在使用前需要先对传感器进行初始化 CO2测量 本次我们测量二氧化碳的传感器为CCS811空气质量传感器,该传感器可以用来测量CO2和TVOC。不过在使用之前需要获取传感器所处环境的基线,这样做的目的是让传感器在预热后能够立即显示空气质量,你也可以理解为通过获取基线的方式让传感器很快熟悉当前所处的环境 获取基线的程序如下 基线获取完成就可以开始测量CO2的浓度了,这里CO2浓度的单位是ppm。 根据测得的PPM数值也可以换算成mg/m³ 由以上公式可以知道,如果要测量面团发酵过程中二氧化碳变化情况,我们应该以碗中的二氧化碳浓度为基线。并且要保证在测量过程中不能打开盖子。 酒精浓度测量 本次实验所使用的酒精浓度传感器为典型的模拟信号,其原理是不同电压对应不同的模拟量,通过模拟量反应酒精浓度的变化。这样,我们就可以使用最简单的模拟量检测方法测量酒精浓度。 当然这里的浓度不能称之为真正意义上的酒精浓度,还需要使用公式进行计算才能得出。关于计算的过程这里不再赘述。本次实验能检测到浓度的线性变化即可满足需求,下图为计算浓度是可以参考的例子。 发送数据 通过上述测试,我们已经完成了温度、湿度、CO2以及酒精浓度的测量,下面我们需要将这些数据发送至SIoT物联网平台。首先我们在浏览器中打开行空板的服务器10.1.2.3,在应用开关选项中是默认开启SIoT服务的 随后,需要为行空板配置连接网络,点击网络设置连接范围内容WiFi 接着,点击SIoT应用中的“打开页面”输入账号密码就可以登录SIoT平台 下面进入SIoT页面后“Fm”项目中的数据,分别是湿度、温度、二氧化碳和酒精 以上内容配置完成,我们就可以使用MQTT模块向SIoT服务器发送数据,这里MQTT初始化的参数如下(这里SIoT服务器的地址也填写行空板的热点,前提是需要提前打开热点) 界面设计 关于面团发酵环境的各项数据测试基本实现后,下面还需要将这些数据显示在星空板的屏幕中,设置细节如下 将上述程序进行整合,设置将测量到数据显示在屏幕中的同时发送至SIoT服务器 界面显示效果如下图所示 由于本次实验的测试时间较长,可能会横跨7~8个小时,所以实验装置可以不用时时刻刻发送数据,间隔几分钟测量一次数据并发送就可以满足需求。这里我们就需要用到time库,使用代码生成器的方式调用该库,并由用户设置测量间隔时间,如当前时间与上一次测量记录的时间的差值大于用户设置的时间间隔则进行一次测量和发送数据,这样可以在不增加延时等待的前提下保证程序运行的效率。使用图形化模块编写的完整测量程序如下图 延时摄影 如果能够在测量数据的同时记录此刻面团的状态,那就需要加入摄像头来采集图像,正好行空有着树莓派的性能,能够挂载摄像头,调用OpenCV库在图形化程序的基础上稍微修改即可增加此功能。这里只展示代码,详细教程可以参考之前的文章 iimport cv2,time,os,siot from pinpong.libs.dfrobot_ccs811 import CCS811, CCS811_Ecycle, CCS811_Emode from pinpong.libs.dfrobot_bme280 import BME280 from pinpong.board import * from pinpong.extension.unihiker import * from pinpong.board import Board from pinpong.board import Board,Pin from unihiker import GUI siot.init(client_id="",server="10.1.2.3",port=1883,user="siot",password="dfrobot") Board().begin() u_gui=GUI() siot.connect() siot.loop() p_p22_analog=Pin(Pin.P22, Pin.ANALOG) siot.getsubscribe(topic="topic") ccs811 = CCS811() bme280 = BME280() ccs811.write_base_line(6337) logo=u_gui.draw_text(text="面团发酵环境监测",x=10,y=0,font_size=20, color="#33CCFF") Temp=u_gui.draw_text(text="温度:",x=0,y=40,font_size=12, color="#FF9900") Hum=u_gui.draw_text(text="湿度:",x=0,y=65,font_size=12, color="#FF0000") CO2=u_gui.draw_text(text="CO2:",x=0,y=90,font_size=12, color="#0000FF") Alcohol=u_gui.draw_text(text="酒精:",x=0,y=115,font_size=12, color="#CC33CC") cap = cv2.VideoCapture(0) def mqtt(path): if (ccs811.check_data_ready()): co2 = (ccs811.CO2_PPM()) CO2.config(text=(str("CO2:") + str((str(co2) + str("ppm"))))) wendu = (bme280.temp_c()) shidu = (bme280.humidity()) jiu = p_p22_analog.read_analog() Temp.config(text=(str("温度:") + str((str(wendu) + str("℃"))))) Hum.config(text=(str("湿度:") + str((str(shidu) + str("%rh"))))) Alcohol.config(text=(str("酒精:") + str(jiu))) img_image = u_gui.draw_image(x=10, y=140, w=220, h=165, image=path) siot.publish(topic="Fm/Temp", data=wendu) siot.publish(topic="Fm/Hum", data=shidu) siot.publish(topic="Fm/CO2", data=co2) siot.publish(topic="Fm/Alcohol", data=jiu) def delete(src_path): all_files = os.listdir(src_path) index = len(all_files) for i in range(index): os.remove(src_path+"{}.jpg".format(i)) def take_photo(img_time,video_time): src_path = '/root/faM/img/' delete(src_path) last_start_time = time.time() i=0 num = video_time*60//img_time #cap.isOpened() and ((cv2.waitKey(1) & 0xFF )!= ord('q')) while(i<num): ret,frame = cap.read() if time.time() - last_start_time >= img_time: path = src_path+"{}.jpg".format(i) cv2.imwrite(path, frame) mqtt(path) i+=1 last_start_time = time.time() if i>num: break cap.release() cv2.destroyAllWindows() makevideo(src_path) def makevideo(src_path): # 1.每张图像大小 size = (320,240) print("每张图片的大小为({},{})".format(size[0],size[1])) # 2.设置源路径与保存路径 sav_path = '/root/faM/video.mp4' # 3.获取图片总的个数 all_files = os.listdir(src_path) index = len(all_files) print("图片总数为:" + str(index) + "张") # 4.设置视频写入器 fourcc = cv2.VideoWriter_fourcc(*'mp4v')#MP4格式 #完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息 videowrite = cv2.VideoWriter(sav_path,fourcc,2,size)#2是每秒的帧数,size是图片尺寸 # 5.临时存放图片的数组 img_array=[] # 6.读取所有jpg格式的图片 (这里图片命名是0-index.jpg example: 0.jpg 1.jpg ...) for filename in [src_path +'/'+ r'{}.jpg'.format(i) for i in range(0,index)]: img = cv2.imread(filename) if img is None: print(filename + " is error!") continue img_array.append(img) print("sz"+str(len(img_array))) # 7.合成视频 for i in range(0,index): img_array = cv2.resize(img_array,(320,240)) videowrite.write(img_array) print('第{}张图片合成成功'.format(i)) if __name__ == '__main__': while True: while not ((button_a.is_pressed()==True)): pass siot.publish(topic="Fm/Alcohol", data="ok") siot.getsubscribe(topic="Fm/Alcohol") img_time = int(input("请输入拍摄间隔(单位秒)")) video_time = int(input("请输入拍摄时长(单位分钟)")) take_photo(img_time,video_time) siot.publish(topic="Fm/Alcohol", data="end") 实验探究 实验装置的软件硬件通通具备后,在开始实验之前,我们还需要准备面团。这里提供一个常用的(包子、馒头、花卷)和面比例:100克面粉加60克水、1克酵母、4克糖(加糖有助于酵母发酵),此比例可根据实际情况等比例缩放。面团准备好,封上盖子就可以开始测量了,用户可以通过设置测量间隔时间和测量时长来调节样本采集的数量 下面是8月9日傍晚18点05分至19点35分的数据变化情况,随着面团的不断发酵,CO2浓度和酒精浓度变得越来越大。 而温、湿度环境变化的数值则相对比较平缓 随后,我们在8月9日23点32分至8月10日凌晨5点13分进行第二次测量。此次测量时长将近6小时,温湿度变化继续较为平缓,二氧化碳和酒精浓度由起初的急剧拉升趋为平缓 实验小结
思考 新学期新课标即将进入我们学生课堂,劳动教育的新课标要求学生要贴近生活,掌握各项生活技能,我们在掌握技能的同时还需要留心观察生活,借助信息科技的软硬件支持,探索生活中的各种现象,实践是检验真理的唯一标准,融入生活的跨学科的科学探究更有生命力,更有说服力,更具真实性。我想在新课标的指引下,采用这样的新形式,学生的自主探索能力将大幅提升,信息科技或科学老师上课拥有了跨学科的新硬件工具也将得心应手、如鱼得水 以上就是本次科学探究实验的全部内容了,后面我还会分享更多关于行空板的案例,造物让生活更美好,我们下期再见。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed