热度 6
2023-12-31 00:37
1314 次阅读|
2 个评论
项目背景:甲醛在生活也比较常见:新装修的公寓,不知名的家居,新装修的房子以及吸烟的密闭环境,你没有听错,吸烟过程有大量甲醛,甲醛严重超标。故需要DIY甲醛数显检测,检测时间短,反应快:进口甲醛传感器一致性很好,精度高,sensirion甲醛传感器SFA30,Arduino程序代码:Arduino UNO 驱动OLED实时显示甲醛传感器相关参数:甲醛浓度、温度、湿度,ws2812试试通过颜色确定当前环境中甲醛浓度等级 甲醛相关资料可参考抖音老爸评测中吸烟仓中甲醛浓度,或参考中国知网:吸烟烟雾中的甲醛、室内香烟、电子烟释放甲醛和VOCs的散发特征及健康风险分析等文章 sensirion甲醛传感器SFA30,甲醛传感器一般采用电化学原理,利用甲醛与催化剂作用产生微弱电压信号,经过运放处理后将微弱信号放大然后根据建立模型(湿度、温度补偿)得到甲醛浓度,本教程使用的是sensirion的SFA30甲醛传感器 甲醛传感器原理: 传感器模型框架图: 项目实现:基于Arduino平台搭建甲醛传感器实时显示、指示、读取数据的检测仪,真实检查环境中的甲醛浓度,专业甲醛检测仪动辄上万元,对于普通家庭很难承担,sensirion甲醛传感器SFA30基于电化学原理,通过半透膜筛选甲醛分子,真真切切检测环境中甲醛浓度。 项目原理图: PCB图: 3D渲染图: 实物图: 视频介绍: 代码附件: #include #include #define SENSOR_SERIAL_INTERFACE Serial SensirionUartSfa3x sfa3x; #include #ifdef __AVR__ #include #endif #define PIN 11 Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); #include "font.h" int16_t hcho; int16_t relativeHumidity; int16_t temperature; int SFA30_date=0; uint16_t error; int scl=A5;//定义OLEDSCL为A1引脚 int sda=A4;//定义OLEDSCL为A0引脚 int res=10;//定义OLE DRES为10引脚(IIC通信可不用设置) #define OLED_SCLK_Clr() digitalWrite(scl,LOW)//SCL #define OLED_SCLK_Set() digitalWrite(scl,HIGH) #define OLED_SDIN_Clr() digitalWrite(sda,LOW)//SDA #define OLED_SDIN_Set() digitalWrite(sda,HIGH) #define OLED_RST_Clr() digitalWrite(res,LOW)//RES 注:此引脚是为了配合SPI驱动模块改成I2C驱动模块使用的(改装的话必须接),如果买的是I2C模块,请忽略此引脚。 #define OLED_RST_Set() digitalWrite(res,HIGH) #define OLED_CMD 0 //写命令 #define OLED_DATA 1 //写数据 uint8_t OLED_GRAM ;//将要显示的缓存内容 void setup() { pinMode(2, OUTPUT);pinMode(3, OUTPUT);//SFA30传感器供电引脚使能 digitalWrite(3, HIGH);digitalWrite(2, LOW);//SFA30传感器供电输出 pinMode(A3, OUTPUT);pinMode(A2, OUTPUT); //OLED供电引脚使能 digitalWrite(A3,LOW); digitalWrite(A2,HIGH);//OLED供电输出 OLED_Init();//OLED初始化 OLED_ColorTurn(0);//0正常显示 1反色显示 OLED_DisplayTurn(0);//0正常显示 1翻转180度显示 SENSOR_SERIAL_INTERFACE.begin(115200); while (!SENSOR_SERIAL_INTERFACE) {delay(100);} sfa3x.begin(SENSOR_SERIAL_INTERFACE); sfa3x.deviceReset();//SFA30传感器复位 sfa3x.startContinuousMeasurement();//SFA30传感器开始测试 //WS2812驱动 #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif // End of trinket special code strip.begin(); strip.setBrightness(50); strip.show(); // Initialize all pixels to 'off' //WS2812驱动 } void loop() { while(1) { sfa3x.readMeasuredValuesOutputFormat2(hcho, relativeHumidity,temperature);//获取SFA30传感器数据 //OLED_Clear(); OLED_ShowString(0,0,"T:",16);OLED_ShowNum(40,0,temperature/200,2,16); OLED_ShowString(56,0,".",16);OLED_ShowNum(64,0,temperature%200,2,16);OLED_DrawCircle(82,4,1);OLED_ShowString(86,0,"C",16); OLED_ShowString(0,16,"H:",16);OLED_ShowNum(40,16,relativeHumidity/100,2,16); OLED_ShowString(56,16,".",16);OLED_ShowNum(64,16,relativeHumidity%100,2,16); OLED_ShowString(82,16,"%",16); OLED_ShowString(0,32,"HCHO:",16);OLED_ShowNum(40,32,hcho/5,3,16);OLED_ShowString(66,32,"ppb",16); OLED_ShowString(0,48,"date:",16);OLED_ShowNum(40,48,SFA30_date,3,16); OLED_Refresh(); delay(50);SFA30_date++; if(hcho<307) {colorWipe(strip.Color(0, 255, 0), 50); }// Green else if(hcho<615) {colorWipe(strip.Color(0, 0, 255), 50); }// Green else if(hcho<615) {colorWipe(strip.Color(255, 0, 0), 50); }// Red } } //反显函数 void OLED_ColorTurn(uint8_t i) { if(!i) OLED_WR_Byte(0xA6,OLED_CMD);//正常显示 else OLED_WR_Byte(0xA7,OLED_CMD);//反色显示 } //屏幕旋转180度 void OLED_DisplayTurn(uint8_t i) { if(i==0) { OLED_WR_Byte(0xC8,OLED_CMD);//正常显示 OLED_WR_Byte(0xA1,OLED_CMD); } else { OLED_WR_Byte(0xC0,OLED_CMD);//反转显示 OLED_WR_Byte(0xA0,OLED_CMD); } } //起始信号 void I2C_Start(void) { OLED_SDIN_Set(); OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SCLK_Clr(); } //结束信号 void I2C_Stop(void) { OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SDIN_Set(); } //等待信号响应 void I2C_WaitAck(void) //测数据信号的电平 { OLED_SCLK_Set(); OLED_SCLK_Clr(); } //写入一个字节 void Send_Byte(uint8_t dat) { uint8_t i; for(i=0;i<8;i++) { OLED_SCLK_Clr();//将时钟信号设置为低电平 if(dat&0x80)//将dat的8位从最高位依次写入 { OLED_SDIN_Set(); } else { OLED_SDIN_Clr(); } OLED_SCLK_Set();//将时钟信号设置为高电平 OLED_SCLK_Clr();//将时钟信号设置为低电平 dat<<=1; } } //发送一个字节 //向SSD1306写入一个字节。 //mode:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(uint8_t dat,uint8_t mode) { I2C_Start(); Send_Byte(0x78); I2C_WaitAck(); if(mode){Send_Byte(0x40);} else{Send_Byte(0x00);} I2C_WaitAck(); Send_Byte(dat); I2C_WaitAck(); I2C_Stop(); } //更新显存到OLED void OLED_Refresh(void) { uint8_t i,n; for(i=0;i<8;i++) { OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址 OLED_WR_Byte(0x00,OLED_CMD); //设置低列起始地址 OLED_WR_Byte(0x10,OLED_CMD); //设置高列起始地址 for(n=0;n<128;n++) OLED_WR_Byte(OLED_GRAM ,OLED_DATA); } } //清屏函数 void OLED_Clear(void) { uint8_t i,n; for(i=0;i<8;i++) { for(n=0;n<128;n++) { OLED_GRAM =0;//清除所有数据 } } OLED_Refresh();//更新显示 } //画点 //x:0~127 //y:0~63 void OLED_DrawPoint(uint8_t x,uint8_t y) { uint8_t i,m,n; i=y/8; m=y%8; n=1<
热度 7
2023-8-1 14:48
1434 次阅读|
0 个评论
甲醛是一种常见的有机化合物,广泛应用于建筑材料、家具、木制品、纺织品等各行业。然而,长期暴露于甲醛可能会对人体健康造成危害,例如引起呼吸道刺激、过敏反应和潜在的致癌作用。为了减少人们对甲醛的接触以及环境中的甲醛排放,欧盟 REACH 法规新增了附录 XVII ,对甲醛和甲醛释放物质施加了限制。 欧盟 REACH 法规( Registration, Evaluation, Authorization, and Restriction of Chemicals )是一项旨在保护人类健康和环境的重要法规。本文将重点介绍欧盟 REACH 法规附录 XVII 中新增的甲醛和甲醛释放物质的限制。 欧盟官方通告 图片源于欧盟委员会官网 2023 年 7 月 17 日,欧盟在其官方公报发布 REACH 法规限制篇修订法规 (EU) 2023/1464 ,对 REACH 法规( EC ) No 1907/2006 附录 XVII 进行了修订,旨在 REACH 法规附录 XVII 中增加第 77 条关于甲醛和甲醛释放物质的限制条款。 此次修订将在欧盟官方公报公布后的第 20 天 2023 年 8 月 6 日开始生效。 根据管控要求销往欧盟的产品包括电子电气产品未来均需要满足该法规要求,而电子产品使用的涂料、油墨、胶粘剂等材料均可能带来甲醛风险。 此次修订新增限制内容 管控物质 77. 甲醛 CAS 号: 50-00-0 EC 号: 200-001-8 英文名 :Formaldehyde-releasing Substances 及甲醛释放物质 附录 XVII对甲醛的限制: 根据欧盟 REACH法规附录XVII,甲醛的限制主要包括以下几个方面: a. 儿童玩具和产品:附录XVII要求在儿童玩具和产品中甲醛的释放量应低于规定的限值。这些限值的设立基于科学评估和风险控制的原则,旨在保护儿童不受甲醛的危害。 b. 建筑和家具材料:附录XVII对于建筑和家具材料中甲醛的释放也设立了限制。特定的产品和材料要求符合欧洲标准,以确保室内空气质量符合健康和安全要求。 c. 面板材料和地板产品:附录XVII进一步详细规定了面板材料和地板产品中甲醛的限制。这些规定包括释放量的最大限值、测试方法和必要的技术文件。 d. 标签和说明:根据附录XVII,包含甲醛的产品必须进行合适的标记和说明,以警示消费者关于甲醛的存在和潜在风险。 限制条件 1 、 2026 年 8 月 6 日后,按照附录 14 规定的测试条件进行测试的过程中,物品中释放的甲醛浓度超过如下浓度将不得投放市场: (a) 家具和木质物品: 0.062 mg/m³ ; (b) 除家具和木质物品以外的其他物品: 0.080 mg/m³ 。 上述限制不适用于 : (a) 当甲醛或甲醛释放物质仅天然存在于生产该物品的材料中的物品; (b) 专供在可预见条件下户外使用的物品; (c) 建筑物中的物品,仅在建筑物外壳和蒸汽屏障外使用,并且不会将甲醛排放到室内空气中; (d) 专用于工业或专业用途的物品,除非其释放的甲醛在可预见的使用条件下导致公众暴露; (e) REACH 法规 (EC) No 1907/2006 附录 XVII 第 72 项规定的限制物品; (f) 属于欧洲议会和理事会条例 (EU) No 528/2012 范围内的杀菌产品; (g) 法规 (EU) 2017/745 范围内的设备 ; (h) 法规 (EU) 2016/425 范围内的个人防护设备 ; (i) 法规 (EC) No 1935/2004 范围内直接或间接接触食品的物品; (j) 二手物品。 2 、 2027 年 8 月 6 日后,如果在附录 14 中规定的试验条件,这些车辆内的甲醛浓度超过 0.062 mg/m³ ,则不得投放市场。 上述限制不适用于 : (a) 仅用于工业或专业用途的道路车辆,除非这些车辆内部的甲醛在可预见的使用条件下暴露给公众; (b) 二手车辆。 增加附录 14 (测试条件) 甲醛释放物质的限制 : 除了对甲醛本身的限制,欧盟 REACH法规附录XVII还对某些甲醛释放物质施加了限制。这些甲醛释放物质是在特定条件下会释放甲醛的化学物质,它们也被认为对人体健康可能造成危害。 a. 室内产品:附录XVII对室内产品中甲醛释放物质的限制要求符合特定的标准,以确保室内空气的质量达到健康要求。 b. 化妆品和个人护理产品: REACH法规还对化妆品和个人护理产品中甲醛释放物质施加了限制。 1 、甲醛释放到室内空气的测量,参照第 77 条第 1 条第 1 项 第 77 条第 1 条第 1 项所述物品释放的甲醛应在以下累积参考条件下在试验箱的空气中进行测量: (a) 试验箱内的温度应为 (23±0.5)℃ ; (b) 试验箱内的相对湿度应为 (45±3)% ; (c) 负载系数,表示为试验件总面积与试验箱容积之比,应为 (1±0.02) ㎡ /m³ 。此载荷系数对应于木质面板的测试;对于其他材料或产品,如果载荷系数在可预见的使用条件下显然不现实,则可使用符合 EN 16516 第 4.2.2 节的载荷系数; (d) 试验箱内的空气交换率应为 (1±0,05)h-1 ; (e) 应使用适当的分析程序测量试验箱内的甲醛浓度; (f) 应使用适当的试样取样方法; (g) 在整个试验期间,应每天至少测量两次试验箱空气中的甲醛浓度,两次连续取样之间的时间间隔至少为 3 小时;应重复测量,直到有足够的数据可用于确定稳态浓度; (h) 试验时间应足够长,以便确定稳态浓度,但不得超过 28 天; (i) 在试验室中测得的甲醛的稳态浓度应用于验证是否符合第 77 条第 1 条第 1 项中提及的物品释放的甲醛限值。 如果使用上述参考条件的测试方法的数据不可用或不适合测量特定物品释放的甲醛,则可以使用使用非参考条件的试验方法获得的数据,其中所使用的试验方法的结果与参考条件之间存在科学上有效的相关性。 2 、车辆内部甲醛浓度的测量,参见第 77 条第 2 条第 1 项 对于道路车辆,包括卡车和公共汽车,应根据 ISO 12219-1 ( *3 )或 ISO 12219-10 ( *4 )中规定的条件,在环境模式下测量甲醛浓度,测量的浓度应用于验证是否符合条目 77 第 2 条第 1 项中提及的限值。 知识拓展 关于甲醛 甲醛是在环境温度和大气压条件下的高活性气体,是具有广泛用途的高产量化学品,常被用作生产甲醛基树脂,热塑性塑料和其他化学品的化学中间体。在制造木材板时,这些树脂可作为木材颗粒的粘合剂;还可用于生产其他木质产品如家具、地板、壁纸、泡沫、道路车辆、飞机部件、纺织品和皮革制品。这些物品在使用的过程中,会释放出甲醛,从而对人体造成危害。