风筝
发表于: 2020-10-15 16:41:37 | 显示全部楼层

紫外线(Ultraviolet rays),简称UV,是太阳发出的光线。由于臭氧层的消耗,这些射线趋于达到极高的限值,可能导致皮肤晒伤等。这就是为什么始终需要每天和每小时对紫外线指数进行预测,以帮助人们保持追踪和保持安全的原因。为了进行监控,为什么不拥有个人紫外线强度计?

s-l300.jpg

在本篇文章中,我们将使用Arduino开发板和诺基亚5110 LCD显示屏以及紫外线传感器(UVM30A)来制作一款紫外线强度计。诺基亚5110用于显示紫外线强度指数,这个是国际标准单位,用于表示在特定位置和特定时间遇到的来自太阳的紫外线强度。

first-picture.jpg

测量特定位置和特定时间的紫外线指数的目的是为了防止人们受到高紫外线指数射线所引起的危险,因为高紫外线射线可能会导致诸如晒伤等现象。它还可以用来指导人们,以便他们能够采取足够的保护措施,例如每天使用防晒霜、太阳镜、帽子等。试图将紫外线指数与适当的防护设备匹配的紫外线防护图如下所示:

Sunscreen-chart.jpg

从该图表可以看出,当紫外线水平极高时,建议留在室内,原因是紫外线指数室内大部分为零。这意味着在测试我们将要制造的设备时,应将其拿到外面,如下图所示,因为在室内测试时该值不会改变。

Outdoor-tesst.jpg


本文中将使用的UVM30A紫外线传感器是一个具有几乎线性输出的低成本模拟传感器。这意味着传感器的输出分别随紫外线辐射的成比例增加而增加。从传感器数据表中摘录出的传感器输出(以mV为单位)相对于紫外线指数的图表如下所示。

UV-linear.jpg

UV指数与传感器输出电压之间的线性关系

它是一个由VCC、GND和模拟信号输出组成的简单的三引脚传感器,这样就可以开始工作了。


所需的组件

●    紫外线传感器

●    Arduino Uno开发板

●    诺基亚5110 LCD显示屏

●    面包板

●    连接导线


原理图

准备好所有组件之后,请按照以下示意图进行原理图连接:

uv-and-nokia-5110.png


我们在之前的文章中介绍了将N0kia 5110 LCD连接到Arduino开发板的方法,但在本文中,我们仍列出了引脚图的连接方式。同时本文给出了UV传感器与Arduino开发板的连接方式。


UV传感器与Arduino开发板的引脚连接表

GND
GND
VCC
VCC
output
A0

诺基亚5110 LCD与Arduino开发板之间的引脚连接表:

Pin 1(RST)
D12
Pin 2(CE)
D11
Pin 3(DC)
D10
Pin 4(DIN)
D9
Pin 5(CLK)
D8
Pin 6(VCC)
VCC
Pin 7(LIGHT)
GND
Pin 8(GND)
GND

在编写代码之前,请仔细检查连接以确认一切正常。


代码

此项目的代码非常简单,我们仅使用一个库(诺基亚5110 LCD库)与LCD进行通信。可以从此链接下载该库。该代码的基本操作是读取传感器输出连接到的模拟引脚0(A0),并将其转换为mV,以便我们可以与UV指数表中的值进行比较,并计算该特定位置和时间的UV指数。在计算并确定了紫外线指数之后,该指数通过诺基亚5110 LCD显示给用户。下图显示了用于比较的紫外线指数表。



UV-index-mv-table.jpg


与往常一样,我们将代码分成小块,并在给出完整代码之前进行解释。首先,我们在代码中要做的第一件事是导入诺基亚5110 LCD库,该库是显示屏所必需的。

  1. //////////////////////////////////////////////
  2.   //            Arduino UV Meter              //
  3. //            with NOKIA 5110 LCD           //
  4. //           http://www.educ8s.tv           //
  5. /////////////////////////////////////////////
  6. #include <LCD5110_Graph.h>
复制代码

导入库后,我们开始声明将在代码中使用的其他变量和常量。

  1. LCD5110 lcd(8,9,10,12,11);
  2. extern unsigned char BigNumbers[];
  3. extern uint8_t splash[];
  4. extern uint8_t ui[];
  5. String UV = "0";
复制代码

完成后,我们转到setup函数。我们要做的第一件事是初始化LCD,然后设置显示器的字体,使用lcd.clrScr()清除屏幕,然后绘制初始位图。

  1. void setup() {

  2. lcd.InitLCD();
  3. lcd.setFont(BigNumbers);
  4. lcd.clrScr();
  5. lcd.drawBitmap(0, 0, splash, 84, 48);
复制代码

在执行drawBitmap命令之后,我们更新LCD以反映更改,并延迟3000毫秒以确保启动画面在屏幕上停留的时间足够长。

  1. lcd.update();  
  2. delay(3000);

  3. }
复制代码

setup函数结束后,我们进入loop()函数,这里调用readSensor函数,该函数从UV传感器读取值,将其转换为mV并将其与Index表进行比较以获得mV的UV索引匹配读入的值。

  1. void loop() {

  2. int stringLength = 0;
  3.   
  4. UV = readSensor();
复制代码

接下来,我们清除屏幕并绘制将要插入索引的UI。

  1. lcd.clrScr();
  2. lcd.drawBitmap(0, 0, ui, 84, 48);
复制代码

绘制UI后,我们将计算索引的长度,并使用printUV函数将其显示,然后调用LCD更新命令。

  1. stringLength = UV.length();
  2. printUV(stringLength);
  3. lcd.update();
  4. delay(150);
  5. }
复制代码

该项目的完整代码如下。

  1.   //////////////////////////////////////////////
  2.   //            Arduino UV Meter              //
  3. //            with NOKIA 5110 LCD           //
  4. //           http://www.educ8s.tv           //
  5. /////////////////////////////////////////////

  6. #include <LCD5110_Graph.h>

  7. LCD5110 lcd(8,9,10,12,11);
  8. extern unsigned char BigNumbers[];
  9. extern uint8_t splash[];
  10. extern uint8_t ui[];

  11. String UV = "0";

  12. void setup() {

  13. lcd.InitLCD();
  14. lcd.setFont(BigNumbers);
  15. lcd.clrScr();
  16. lcd.drawBitmap(0, 0, splash, 84, 48);
  17. lcd.update();  
  18. delay(3000);

  19. }

  20. void loop() {

  21. int stringLength = 0;
  22.   
  23. UV = readSensor();
  24. lcd.clrScr();
  25. lcd.drawBitmap(0, 0, ui, 84, 48);

  26. stringLength = UV.length();
  27. printUV(stringLength);
  28. lcd.update();
  29. delay(150);
  30. }

  31. void printUV(int length)
  32. {
  33.   switch(length)
  34.   {
  35.     case 1:  lcd.print(UV,38,19); break;
  36.     case 2:  lcd.print(UV,24,19); break;
  37.     default:  lcd.print(UV,0,19); break;
  38.   }
  39. }

  40. String readSensor()
  41. {
  42.   String UVIndex = "0";
  43.   int sensorValue = 0;
  44.   
  45.   sensorValue = analogRead(0);                        //connect UV sensor to Analog 0   
  46.   int voltage = (sensorValue * (5.0 / 1023.0))*1000;  //Voltage in miliVolts
  47.   
  48.   if(voltage<50)
  49.   {
  50.     UVIndex = "0";
  51.   }else if (voltage>50 && voltage<=227)
  52.   {
  53.     UVIndex = "0";
  54.   }else if (voltage>227 && voltage<=318)
  55.   {
  56.     UVIndex = "1";
  57.   }
  58.   else if (voltage>318 && voltage<=408)
  59.   {
  60.     UVIndex = "2";
  61.   }else if (voltage>408 && voltage<=503)
  62.   {
  63.     UVIndex = "3";
  64.   }
  65.   else if (voltage>503 && voltage<=606)
  66.   {
  67.     UVIndex = "4";
  68.   }else if (voltage>606 && voltage<=696)
  69.   {
  70.     UVIndex = "5";
  71.   }else if (voltage>696 && voltage<=795)
  72.   {
  73.     UVIndex = "6";
  74.   }else if (voltage>795 && voltage<=881)
  75.   {
  76.     UVIndex = "7";
  77.   }
  78.   else if (voltage>881 && voltage<=976)
  79.   {
  80.     UVIndex = "8";
  81.   }
  82.   else if (voltage>976 && voltage<=1079)
  83.   {
  84.     UVIndex = "9";
  85.   }
  86.   else if (voltage>1079 && voltage<=1170)
  87.   {
  88.     UVIndex = "10";
  89.   }else if (voltage>1170)
  90.   {
  91.     UVIndex = "11";
  92.   }
  93.   return UVIndex;
  94. }
复制代码

演示

将Arduino开发板连接到计算机,启动IDE并将代码粘贴到其中。 在上传之前,请不要忘记将UI和Splash文件添加到代码的Arduino sketch文件夹中,因为这可能会引发错误。

demo-2-1.jpg


将代码上传到您的开发板上,然后带到外面以测量您所在区域的紫外线强度。

跳转到指定楼层
lzz
发表于: 2024-2-29 22:27:24 | 显示全部楼层

UI和Splash文件能不能给一下谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-21 18:21 , Processed in 0.069255 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表