你会在办公室里昏昏沉沉吗?你需要一个感叹号!

2020-04-221.9万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用DFRobot的氧气传感器和TinkerNode物联网主控器来监测办公室内的氧气含量。项目需求包括实时监测、物联网上传数据、低功耗等。通过设计一个有趣的感叹号外壳,使设备在办公室中不突兀。材料包括氧气传感器、TinkerNode主板、扩展板、12864LCD屏幕和锂电池。通过Gravity™接口,连接这些传感器和主板非常简单。

序言

各位小伙伴,不管是在办公室还是学校里,你们是不是有的时候总觉得头晕目眩,感觉非常的难受。你会在办公室里昏昏沉沉吗?你需要一个感叹号!图4
这种现象在人多的时候特别明显。
如果有这种问题的小朋友,可以在后面留言告诉我你的感受。
根据我的了解,我认为这种情况大部分的情况是缺氧造成的。
大家都知道在我们的大气中,有21%左右是氧气,一般来说这个数据是不会有大的变化的。
你会在办公室里昏昏沉沉吗?你需要一个感叹号!图5
但是在密闭的环境中,特别是人多的情况,例如人多的会议室,在聚集的大礼堂中。由于大量的人群聚集,大气不流通,二氧化碳聚集,相对的来说含氧量就相对的降低了。
但是降到什么时候人会觉得难受呢?
我也不知道。但是有什么办法可以让我们来研究一下这个情况呢?
在之前我们是没有办法来验证的,因为我们没有一种传感器来帮助我们检查氧气的含量。
我在淘宝曾经搜索过,氧气传感器确实是有买的,但是大家都知道他们用在哪里吗?
答案让我非常的震惊,一般的氧气传感器竟然是给汽车用的。
你会在办公室里昏昏沉沉吗?你需要一个感叹号!图6
传统的油车,通过吸入空气和燃料油混合后在气缸中爆燃,产生巨大的化学能并通过气缸的运动将化学能转换成动能,驱动汽车前进。
在化油器时代,汽车是不需要什么传感器的,直接通过油门来控制进气阀门来控制通入气缸的气量。
现在早已是电喷时代,出于对效率的追求和环保的要求,车厂利用强大的车载计算机和发达的传感器技术,精确的对进气进行控制。氧气传感器在这里主要是控制进气和出气的氧含量,通过氧气含量的变化来自动调节进气节流阀的开度,确保反应的完全、高效运转、排气最少。
因此在淘宝上,大家可以发现大量用于汽车的氧气传感器。这些传感器需要各种各样的条件,由于缺乏材料,一般人是没有办法用起来的。

好在我现在拿到了由DFRobot开发的氧气传感器。由于我拿到的这款传感器是还在开发的样板,因此还没有经典的DFRobot配色,但相信很快大家就能拿到这块有趣的氧气传感器了。

和传统的DFRobot Gravity™传感器一样,该传感器采用的是IIC的接口,因此通过提供的IIC传感器接线就可以直接接在支持IIC的主板上,通过提供的样例就可以直接读取相应数据。

回到一开始的问题,你会在办公室昏昏沉沉吗?当然会的,而且大概率我们是因为缺氧造成的。
所以我们需要一个传感器来进行了解,是不是有缺氧的情况。
但是这里有一个问题,如果在一个办公室里,你放一堆的主板和传感器会让整个环境变得异常的奇怪。
我们能让我们的氧气检测仪更无感的出现在我们的会议室、办公室、室内操场里吗?
我的回答是可以的。
我们可以给整个系统设计一个有趣的外壳。
在这里我给到的答案是一个感叹号。
你会在办公室里昏昏沉沉吗?你需要一个感叹号!图7
氧气是生命的重要元素,感叹号要表达的就是对这种司空见惯事物的感叹!
让我们对那些我们必须但却被忽视的元素给与更多的关注。

我们不仅需要了解当前的氧气含量,我们更希望能通过连续的数据来找到相应的规律,通过这些数据来建立模型,并提出有效的建议和意见。

好了说了那么多,让我们开始项目的制作吧。



项目分析

项目需求

根据以上的分析,我将我们项目的一些需求整理了一下,可以发现大致,我们需要一个具有以下功能的设备。

  • 监测实时的氧气含量
  • 氧气含量通过物联网上传
  • 低功耗
  • 氧气含量低提醒
  • 氧气含量现场读取
  • 外观在办公室不突兀
  • 可移动使用
    根据功能的要求,我们需要在众多的物联网平台单片机中进行选择。
    正好,最近在DFRobot的网站上一款tinkernode的物联网主控器正在推广。
    我看了下,深得我心。

让我觉得非常满意的点如下。

  • 有NB-IoT的模块,我可以直接联网。物联网功能完美符合要求。

  • 有电源管理模块,我不需要考虑供电的选择,随便找各种电池。满足可移动使用。

  • 低功耗集成,满足低功耗满足需求。

  • 和阿里云高度结合,可以直接调用相应模型,省的自己写代码。氧气含量低报警的功能可以通过钉钉来实现,而钉钉是阿里旗下产品,可以很方便的打通。

  • I2C接口支持,直接就可以读取氧气传感器数据
    电子部分的内容基本上都能直接满足。
    就选tinkernode他了。

    材料表

  • 氧气传感器 1个

  • TinkerNode主板 1个

  • TinkerNode扩展板 1个(如果不想焊接,我还是强烈建议用扩展板)

  • 12864LCD屏幕

  • 锂电池

原本我认为不需要现场显示检测的数据,因为氧气的变化可能没有想象中的那么,可能引起人不适的含量会在小数点后一位二位而已,但考虑到一个检测设备如果不能在现场反应器数据,还是让人觉得有点不可思议。于是还是到处找了下显示的设备,正好手头有一个12864的小型的LCD屏幕,就这样使用吧。好在这块LCD屏也是I2C的,所以点亮他也不是很麻烦。

材料准备好了,就可以开干了,总体来说,通过Gravity™的接口,其实连接这些传感器和主板是非常简单的。特别是由于采用了扩展板,我只要将I2C的接口接在扩展板上对应的I2C接口上,连接就完成了。你会在办公室里昏昏沉沉吗?你需要一个感叹号!图1
由于采用了标准的电池接口,所以标准的电池也只要一插到主板上就好了。好像连接这个问题竟然根本不需要多考虑。你会在办公室里昏昏沉沉吗?你需要一个感叹号!图2
这对完成一个项目显得一点挑战都没有……
如果不用显示器,甚至我觉得我都可以不用扩展板……
你会在办公室里昏昏沉沉吗?你需要一个感叹号!图3




好了,接下来就看看怎么设计外观了。
虽然我现在已经可以用了……
就是那么的简单……
但是好看的感叹号还等着我们去设计,不是吗?



外观设计



正如前面所叙述的,我希望这个装置能不那么突兀。所以需要对其进行下设计。
于是我画了一个草图:
你会在办公室里昏昏沉沉吗?你需要一个感叹号!图8

问了下大部分人,还是喜欢大图中的感叹号,而不需要将O2也加上。
于是开干!


三维设计
一直以来我用的三维设计软件是sketchup,但随着sketchup被谷歌卖掉,后面的厂家对他的管理让我很难用到免费的版本,我不得不换软件。
众所众知,我是Autodesk的粉丝,所以我换用了TinkerCAD,不过后来发现Fusion360在功能上更强大,于是我换成了Fusion360。
我注册的是教育版,教育版本非常适合新人,免费使用。我估计今后到期后,我可能会付费使用。
那就看下怎么进行设计吧。

Fusion360的工作流程和sketchup很像,所以需要先画好平面图,然后在用拉伸的方法来建立实体。但如何画好一个模型呢?
我的工作流程是这样的。

首先把所有的元器件都画好,或者找到。注意在这里我们需要注意几个关键尺寸。在这个案例里,氧气传感器的直径,和屏幕的长宽都非常重要。
然后把这些元件摆好位置,在软件里摆好位置,当然我在画草图的时候,已经大致有了相关的位置,在软件里只是更仔细的确定他们的位置而已。
这个感叹号有上盖和下盖,需要分别处理。

先把代码放上来,大家先慢慢的看一下。

  1. <font face="微软雅黑"><font face="微软雅黑">[mw_shl_code=cpp,false]
  2. #include "DFRobot_Iot.h"
  3. #include "DFRobot_BC20.h"
  4. #include "DFRobot_GasSensor.h"
  5. #include "DFRobot_OLED12864.h"
  6. DFRobot_OLED12864  display(0x3c);
  7. DFRobot_GasSensor Oxygen;
  8. DFRobot_Iot myDevice;
  9. DFRobot_BC20 myBC20;
  10. /*Configure device certificate information*/
  11. String ProductKey = "Your_Product_Key";
  12. String ClientId = "12345";/*Custom id*/
  13. String DeviceName = "Your_Device_Name";
  14. String DeviceSecret = "Your_Device_Secret";
  15. /*Configure the domain name and port number*/
  16. String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";
  17. uint16_t PORT = 1883;
  18. /*Product identifier that needs to be operated*/
  19. String Identifier = "Your_Identifier";
  20. /*TOPIC that need to be published and subscribed*/
  21. const char * subTopic = "Your_subTopic";//****set
  22. const char * pubTopic = "Your_pubTopic";//******post
  23. DFRobot_Iot myIot;
  24. void ConnectCloud() {
  25.   while (!myBC20.connected()) {
  26.     Serial.print("Attempting MQTT connection...");
  27.     if (myBC20.connect(myDevice._clientId, myDevice._username, myDevice._password)) {
  28.       Serial.println("Connect Server OK");
  29.     }
  30.     else {
  31.       myBC20.getQMTCONN();
  32.     }
  33.   }
  34. }
  35. void setup(){
  36.   Serial.begin(115200);
  37.   display.init();
  38.   display.setContrast(255);
  39.   display.flipScreenVertically();
  40.   display.clear();
  41.   delay(1000);
  42.   display.drawString(16,24,"Oxygen:");
  43.   display.drawString(96,24,"%");
  44.   display.display();
  45.   
  46.    while(!Oxygen.begin(ADDRESS_3)) {
  47.     Serial.println("I2c device number error !");
  48.     delay(1000);
  49.   }
  50.   Serial.println("I2c connect success !");
  51. /* Pass in the key value marked on the oxygen sensor */
  52.   Oxygen.SetKeys(20.9 / 90);
  53.   
  54.   Serial.print("Starting the BC20.Please wait. . . ");
  55.   while(!myBC20.powerOn()){
  56.       delay(1000);
  57.       Serial.print(".");
  58.   }
  59.   Serial.println("BC20 started successfully !");
  60.   Serial.println("check OK");
  61.   while (!myBC20.checkNBCard()) {
  62.     Serial.println("Please insert the NB card !");
  63.     delay(1000);
  64.   }
  65.   Serial.println("Waitting for access ...");
  66.   while (myBC20.getGATT() == 0) {
  67.     Serial.print(".");
  68.     delay(1000);
  69.   }
  70.   myDevice.init(ALIYUN_SERVER, ProductKey, ClientId, DeviceName, DeviceSecret);
  71.   myBC20.setServer(myDevice._mqttServer, PORT);
  72.   //myBC20.setCallback(callback);
  73.   ConnectCloud();
  74. }
  75. void loop(){
  76.   float oxygenData = Oxygen.ReadOxygenData();
  77.   
  78.   display.clear();
  79.   delay(1000);
  80.   display.drawString(16,24,"Oxygen:");
  81.   display.drawString(96,24,"%");
  82.   display.drawString(64,24,String(oxygenData));
  83.   display.display();
  84.   
  85.   Serial.print(" Oxygen concentration is ");  
  86.   Serial.print(oxygenData);  
  87.   Serial.println(" %vol(mv)");
  88.   myBC20.getCLK();  // Get CLK from BC20
  89.   myBC20.loop();
  90.   myBC20.publish(pubTopic, ("{"id":"+ClientId+","params":{""+Identifier+"":"+(String)oxygenData+"},"method":"thing.event.property.post"}"));
  91.   Serial.println("Data is published to cloud.");
  92.   delay(10000);
  93. }[/mw_shl_code]
  94. </font></font>
复制代码


代码框架

代码主要分为几个部分
  • 加载库(把需要的库加载进来,在前人的基础上干活,轻松又惬意)
  • 生成对象(面向对象的玩法,不知道照着做就对了)
  • 生成阿里云的连接的相关信息(找到相对应的token填进去就可以了)
  • setup中进行单次运行,进行阿里云的连接
  • loop中定期更新氧气数值并上传云端代码思路
    其实这个代码是拼装起来的。
    首先,先确定氧气传感器的使用。



  1. <font face="微软雅黑"><font face="微软雅黑">[mw_shl_code=cpp,false]
  2. while(!Oxygen.begin(ADDRESS_3)) {
  3.     Serial.println("I2c device number error !");
  4.     delay(1000);
  5.   }
  6.   Serial.println("I2c connect success !");
  7. /* Pass in the key value marked on the oxygen sensor */
  8.   Oxygen.SetKeys(20.9 / 90);
  9. [/mw_shl_code]</font></font>
复制代码

由于氧气传感器是I2C的,因此只需要在找到合适地址后就可以使用了。
注意,氧气传感器需要进行校准。因此在这里进行了手动的校准。
听产品经理@DFSH_Faith介绍,后续会通过一个按钮简化操作,因此大家也不用在代码中写Oxygen.SetKeys(20.9 / 90)这样的语句了。
然后接下来是屏幕,采用的12864的屏幕,因此直接加载#include "DFRobot_OLED12864.h" 这个库,如果找不到这个库的,可以到DFRobot的wiki里去找


  1. <font face="微软雅黑">[mw_shl_code=cpp,false]
  2.   display.init();
  3.   display.setContrast(255);
  4.   display.flipScreenVertically();
  5.   display.clear();
  6.   delay(1000);
  7.   display.drawString(16,24,"Oxygen:");
  8.   display.drawString(96,24,"%");
  9.   display.display();
  10. [/mw_shl_code]</font></font>
复制代码

通过这段代码就可以把想要显示的内容显示出来了。
这里需要注意的是,每次需要采用display.display();来显示上面的设置内容。否则可能会和你想象的不一样。
display.drawString(16,24,"Oxygen:");这里的16和24分别代表了行和列,可以根据实际需要进行调整。
display.setContrast(255);可以调整屏幕的对比度,使显示不那么亮或者刺眼。
display.flipScreenVertically();可以翻转屏幕,如果反过来了,那就用这行来翻转过来。
这两部分完成后,只需要把相关的信息给到NB-IoT部分即可,NB-IoT部分的代码也是现成的。
loop()函数中


[mw_shl_code=cpp,false]
float oxygenData = Oxygen.ReadOxygenData();
myBC20.getCLK();  // Get CLK from BC20
  myBC20.loop();
  myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
  Serial.println("Data is published to cloud.");
  delay(10000);[/mw_shl_code]
用Oxygen.ReadOxygenData()获取氧气的含量值。用oxygenData来存储。
用myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
将publish函数将相应的数据上传到阿里云。
在测试的时候,可以分别对这些代码进行处理。
然后分别看其效果,比如
myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
可以把其中oxygenData直接改为数字,来检查上传是否正常。
又比如
display.drawString(64,24,String(oxygenData));
可以将oxygenData改为数字来检查显示是否正常。
记得串口监视器是硬件调试的好帮手。
相关的串口打印数据是调试时的重要抓手。
有不确定的时候,放上几个串口打印命令一定会让你事半功倍。
好了,硬件上的这个代码就是非常的简单明了。
报警等功能可以在阿里云上进行设置。

致谢
@DFSH_Faith提供了巨大的支持。
感谢你提供的支持和帮助!



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(8)
gada888
gada888
一杯咖啡下肚,就不会昏昏沉沉了
gray6666
gray6666
期待。。。。。。。。。。。。
微笑的rockets
微笑的rockets
作者
回复gray6666
请多批评!
Mary
Mary
最近Rockets的产出很多嘛,继续继续
微笑的rockets
微笑的rockets
作者
回复Mary
还好吧,把之前的欠账还掉而已。
白吃白给
白吃白给
我感觉不是缺氧,而是老师讲的内容索然无味,无聊到困了
微笑的rockets
微笑的rockets
作者
回复txm派瑞深山锹🐛🐜🐞🦂
我觉得氧气不够注意力就容易涣散。
微笑的rockets
微笑的rockets
作者
回复白吃白给
那就想办法把那些内容变成有趣的事情吧,比如说做个感叹号?
共4条回复,已加载2条,点击查看更多共4条回复,已加载全部
NganTing
NganTing
占坑外观设计
微笑的rockets
微笑的rockets
作者
[md]
## 总结
本帖子希望通过完整的记录一个项目的思考过程和实现过程,能带给大家一点思考。
抛出我这块砖,也希望能让更多的小伙伴一起加入创造的过程。
在这里我也必须说,以上这些技能,我也并不是十分的熟练,但是通过和其他小伙伴的沟通和学习,这些技能是可以被掌握的。
我认为作为一个创客,更重要的是,把自己的想法实现出来。
作品可以不完美,但重要的是,现在你有一个实物供大家评价,是好是坏,让我们拉出来溜溜。
# 未完待续
[/md]
微笑的rockets
微笑的rockets
作者
先把代码放上来,大家先慢慢的看一下。
[mw_shl_code=cpp,false]
#include "DFRobot_Iot.h"
#include "DFRobot_BC20.h"
#include "DFRobot_GasSensor.h"
#include "DFRobot_OLED12864.h"
DFRobot_OLED12864 display(0x3c);
DFRobot_GasSensor Oxygen;
DFRobot_Iot myDevice;
DFRobot_BC20 myBC20;
/*Configure device certificate information*/
String ProductKey = "Your_Product_Key";
String ClientId = "12345";/*Custom id*/
String DeviceName = "Your_Device_Name";
String DeviceSecret = "Your_Device_Secret";
/*Configure the domain name and port number*/
String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";
uint16_t PORT = 1883;
/*Product identifier that needs to be operated*/
String Identifier = "Your_Identifier";
/*TOPIC that need to be published and subscribed*/
const char * subTopic = "Your_subTopic";//****set
const char * pubTopic = "Your_pubTopic";//******post
DFRobot_Iot myIot;
void ConnectCloud() {
while (!myBC20.connected()) {
Serial.print("Attempting MQTT connection...");
if (myBC20.connect(myDevice._clientId, myDevice._username, myDevice._password)) {
Serial.println("Connect Server OK");
}
else {
myBC20.getQMTCONN();
}
}
}
void setup(){
Serial.begin(115200);
display.init();
display.setContrast(255);
display.flipScreenVertically();
display.clear();
delay(1000);
display.drawString(16,24,"Oxygen:");
display.drawString(96,24,"%");
display.display();
while(!Oxygen.begin(ADDRESS_3)) {
Serial.println("I2c device number error !");
delay(1000);
}
Serial.println("I2c connect success !");
/* Pass in the key value marked on the oxygen sensor */
Oxygen.SetKeys(20.9 / 90);
Serial.print("Starting the BC20.Please wait. . . ");
while(!myBC20.powerOn()){
delay(1000);
Serial.print(".");
}
Serial.println("BC20 started successfully !");
Serial.println("check OK");
while (!myBC20.checkNBCard()) {
Serial.println("Please insert the NB card !");
delay(1000);
}
Serial.println("Waitting for access ...");
while (myBC20.getGATT() == 0) {
Serial.print(".");
delay(1000);
}
myDevice.init(ALIYUN_SERVER, ProductKey, ClientId, DeviceName, DeviceSecret);
myBC20.setServer(myDevice._mqttServer, PORT);
//myBC20.setCallback(callback);
ConnectCloud();
}
void loop(){
float oxygenData = Oxygen.ReadOxygenData();
display.clear();
delay(1000);
display.drawString(16,24,"Oxygen:");
display.drawString(96,24,"%");
display.drawString(64,24,String(oxygenData));
display.display();
Serial.print(" Oxygen concentration is ");
Serial.print(oxygenData);
Serial.println(" %vol(mv)");
myBC20.getCLK(); // Get CLK from BC20
myBC20.loop();
myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
Serial.println("Data is published to cloud.");
delay(10000);
}[/mw_shl_code]
[md]
## 代码框架
代码主要分为几个部分
* 加载库(把需要的库加载进来,在前人的基础上干活,轻松又惬意)
* 生成对象(面向对象的玩法,不知道照着做就对了)
* 生成阿里云的连接的相关信息(找到相对应的token填进去就可以了)
* setup中进行单次运行,进行阿里云的连接
* loop中定期更新氧气数值并上传云端
## 代码思路
其实这个代码是拼装起来的。
首先,先确定氧气传感器的使用。
[/md]
[mw_shl_code=cpp,false]
while(!Oxygen.begin(ADDRESS_3)) {
Serial.println("I2c device number error !");
delay(1000);
}
Serial.println("I2c connect success !");
/* Pass in the key value marked on the oxygen sensor */
Oxygen.SetKeys(20.9 / 90);
[/mw_shl_code]
[md]
由于氧气传感器是I2C的,因此只需要在找到合适地址后就可以使用了。
注意,氧气传感器需要进行校准。因此在这里进行了手动的校准。
听产品经理@DFSH_Faith介绍,后续会通过一个按钮简化操作,因此大家也不用在代码中写Oxygen.SetKeys(20.9 / 90)这样的语句了。
然后接下来是屏幕,采用的12864的屏幕,因此直接加载#include "DFRobot_OLED12864.h" 这个库,如果找不到这个库的,可以到DFRobot的wiki里去找。
[/md]
[mw_shl_code=cpp,false]
display.init();
display.setContrast(255);
display.flipScreenVertically();
display.clear();
delay(1000);
display.drawString(16,24,"Oxygen:");
display.drawString(96,24,"%");
display.display();
[/mw_shl_code]
[md]
通过这段代码就可以把想要显示的内容显示出来了。
这里需要注意的是,每次需要采用display.display();来显示上面的设置内容。否则可能会和你想象的不一样。
display.drawString(16,24,"Oxygen:");这里的16和24分别代表了行和列,可以根据实际需要进行调整。
display.setContrast(255);可以调整屏幕的对比度,使显示不那么亮或者刺眼。
display.flipScreenVertically();可以翻转屏幕,如果反过来了,那就用这行来翻转过来。
这两部分完成后,只需要把相关的信息给到NB-IoT部分即可,NB-IoT部分的代码也是现成的。
loop()函数中
[/md]
[mw_shl_code=cpp,false]
float oxygenData = Oxygen.ReadOxygenData();
myBC20.getCLK(); // Get CLK from BC20
myBC20.loop();
myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
Serial.println("Data is published to cloud.");
delay(10000);[/mw_shl_code]
[md]
用Oxygen.ReadOxygenData()获取氧气的含量值。用oxygenData来存储。
用myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
将publish函数将相应的数据上传到阿里云。
在测试的时候,可以分别对这些代码进行处理。
然后分别看其效果,比如
myBC20.publish(pubTopic, ("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)oxygenData+"},\"method\":\"thing.event.property.post\"}"));
可以把其中oxygenData直接改为数字,来检查上传是否正常。
又比如
display.drawString(64,24,String(oxygenData));
可以将oxygenData改为数字来检查显示是否正常。
记得串口监视器是硬件调试的好帮手。
相关的串口打印数据是调试时的重要抓手。
有不确定的时候,放上几个串口打印命令一定会让你事半功倍。
好了,硬件上的这个代码就是非常的简单明了。
报警等功能可以在阿里云上进行设置。
## 致谢
@DFSH_Faith提供了巨大的支持。
感谢你提供的支持和帮助!
[/md]
微笑的rockets
微笑的rockets
作者
[md]## 外观设计
正如前面所叙述的,我希望这个装置能不那么突兀。所以需要对其进行下设计。
于是我画了一个草图:

问了下大部分人,还是喜欢大图中的感叹号,而不需要将O2也加上。
于是开干!
## 三维设计
一直以来我用的三维设计软件是sketchup,但随着sketchup被谷歌卖掉,后面的厂家对他的管理让我很难用到免费的版本,我不得不换软件。
众所众知,我是Autodesk的粉丝,所以我换用了TinkerCAD,不过后来发现Fusion360在功能上更强大,于是我换成了Fusion360。
我注册的是教育版,教育版本非常适合新人,免费使用。我估计今后到期后,我可能会付费使用。
那就看下怎么进行设计吧。
Fusion360的工作流程和sketchup很像,所以需要先画好平面图,然后在用拉伸的方法来建立实体。但如何画好一个模型呢?
我的工作流程是这样的。
首先把所有的元器件都画好,或者找到。注意在这里我们需要注意几个关键尺寸。在这个案例里,氧气传感器的直径,和屏幕的长宽都非常重要。
然后把这些元件摆好位置,在软件里摆好位置,当然我在画草图的时候,已经大致有了相关的位置,在软件里只是更仔细的确定他们的位置而已。
这个感叹号有上盖和下盖,需要分别处理。
# 未完待续
[/md]
- 没有更多了 -