查看: 4656|回复: 6

blinker物联网教程——10、日照时间分析

[复制链接]

该用户从未签到

发表于 2021-3-11 21:09 | 显示全部楼层 |阅读模式
本帖最后由 海神 于 2022-5-17 15:48 编辑

简介

物联网的一个主要应用方向是在农业,在农业应用种,有些农业瓜果蔬菜等植物对环境要求高,且有季节性。所以我们也经常会看到大棚种植。而在大棚种植种。检测植物生长环境的光照、温湿度等参数是必不可少的。
光照对于农作物的生长来说是非常重要的。如果没有阳光,植物将无法通过光合作用生成营养物质,会严重影响到植物的生长发育。光照是植物制造有机养料的关键条件之一,通过其光照情况,科研人员就能够大概了解植物生长情况的好坏。
本节,我们将一个模拟光敏传感器接入网络,实时记录光照时长,并生成对应时间轴的光照曲线,用于分析是否适合植物生长,或者是否采取措施给植物进行补光。
Wifiduino接入云服务器后,就可以接收来自传感器的数据,并且可以对其进行分析、显示和存储。使用一个光敏传感器用来检测环境的光照强度。然后将该时间上传至云端存储起来,方便进行数据分析。当一天的数据记录完毕上传云端后,统计时间的变量将会清零。

光敏传感器
光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器,又称为光电导探测器。当入射光强,电阻减小,入射光弱,电阻增大。可用来对周围环境光的强度进行检测,结合wifiduino控制器可实现光的测量,可通过3P传感器连接线与wifiduino专用传感器扩展板结合使用,可以制作光感相关的互动作品.
光敏传感器是一个模拟输入传感器,所以我们要采集其模拟数据,需要通过wifiduino的模拟输入接口。而wifiduino模拟输入接口只有A0一个(主芯片esp8266所决定),所以,我们暂时只能将其接在A0接口上。
(如果我们需要接入多个模拟输入传感器,该怎么办? 可以将主板更换成模拟输入接口更多的wifiduino32主板。)

硬件

光敏传感器*1

软件

blinker app

代码

示例代码中,我们通过模拟光敏传感器采集光照强度的参考值,显示在blinker app中,实现远程采集数据。程序中,我们只需添加一个数据控件,用来收集光线强度的数据。
  1. #define BLINKER_WIFI
  2. #include <Blinker.h>

  3. volatile int light;

  4. char auth[] = "dae8exxxx038";
  5. char ssid[] = "moxxxun";
  6. char pswd[] = "cxxxxxxx51";
  7. BlinkerNumber Number1("num-abc");
  8. void dataStorage(){
  9.    Blinker.dataStorage("num-abc", light);
  10. }

  11. void setup(){
  12.   Blinker.begin(auth,ssid,pswd);
  13.   light = 0;
  14.   Blinker.attachDataStorage(dataStorage);
  15. }

  16. void loop(){
  17.   light = analogRead(A0);
  18.   delay(100);
  19.   Number1.print(light);
  20.   Blinker.run();

  21. }
复制代码
blinker app界面定制

在blinker中添加一个数据控件,修改对应的键名和显示文本,设置最大值是1023,因为读取模拟传感器的数值范围是0-1023.
然后添加“图表”控件,修改和数据控件一样的键名和显示文本。

硬件连接

将传感器的S信号引脚连接在A0端口中,+ 和-分别接在VCC和GND上。

rzsj3.png


观察现象

打开blinker,等待设备显示在线,然后观察反馈的光照强度与光照曲线

rzsj2.png
进阶

采集并打印出数据后,我们可以将数据进行分析,通过程序来分析具体日照的时间有多长

代码

代码实现的主要功能是,采集光线强度数据,当光线强度高于一定值时,就认为是天亮了,此时光照时间开始计时;而当光线强度小于一定值时,认为是天黑了,此时光照时间停止计时。
  1. #define BLINKER_WIFI
  2. #include <Blinker.h>
  3. volatile int LEDP;
  4. unsigned long runTime;
  5. unsigned long LEDPtime;
  6. unsigned long nightTime;
  7. unsigned int  LEDPtime_H;
  8. unsigned int  LEDPtime_M;

  9. #define Thre 30//最小光照强度
  10. #define night 5
  11. #define CheckNightTime 24
  12. #define CheckDayTime 24

  13. char auth[] = "defxxxxxxx1894";  //手机端的设备密钥
  14. char ssid[] = "openjumper2016";       //无线wifi名称
  15. char pswd[] = "i3wasxxx05";    //wifi密码


  16. BlinkerNumber Number1("num-h");
  17. BlinkerNumber Number2("num-m");
  18. BlinkerNumber Number3("light");

  19. void dataStorage() {
  20.     //Blinker.dataStorage("light", LEDP);
  21. }

  22. void heartbeat(){
  23.   Number1.print(LEDPtime_H);
  24.   Number2.print(LEDPtime_M);
  25.   Number3.print(LEDP);
  26. }
  27. void setup(){
  28.   Serial.begin(115200);
  29.   Blinker.attachHeartbeat(heartbeat);
  30.   Blinker.begin(auth,ssid,pswd);

  31.   Blinker.attachDataStorage(dataStorage);

  32.   LEDP = 0;
  33.   runTime = 0;
  34.   LEDPtime = 0;
  35.   nightTime = 0;
  36. }

  37. void loop(){
  38.   runTime = millis()/1000;
  39.   
  40.   Blinker.run();
  41.   LEDP = analogRead(A0);//环境光照强度
  42.   Serial.print("light:");
  43.   Serial.print(LEDP);
  44.   Serial.print("  >>>>>>>>  ");
  45.   //Serial.println(runTime/1000);
  46.   
  47.   if (LEDP >= Thre) {
  48.     Serial.print("run timing:");
  49.     LEDPtime = (LEDPtime + (millis()/1000 - runTime));//时间单位秒
  50.     LEDPtime_M = (LEDPtime/60)%60;
  51.     LEDPtime_H = LEDPtime_M/360;
  52.     //LEDPtime = LEDPtime/1000;
  53.     if(LEDPtime_M%3 == 0){
  54.       Blinker.dataStorage("light", LEDP);
  55.       }
  56.     Serial.print(LEDPtime_H);
  57.     Serial.print(":");
  58.     Serial.print(LEDPtime_M);
  59.     Serial.print(":");
  60.     Serial.println(LEDPtime%60);
  61.     //Serial.println(" s");
  62.     if (LEDPtime_H > CheckDayTime) {
  63.       nightTime = 0;
  64.     }
  65.   } else if (LEDP < Thre) {
  66.     Serial.println("sleep");
  67.     if (LEDP <= Thre) {
  68.       nightTime = nightTime + (millis()/1000 - nightTime);
  69.       if (LEDPtime_H > CheckNightTime) {
  70.         LEDPtime = 0;
  71.       }
  72.     }
  73.   }
  74. }
复制代码

blinker软件界面定制

添加三个数据组件用来显示光照时间和光照强度,修改数据组件的参数特征,键名与程序中定义的一致。再添加一个图表控件,修改和光照强度一样的键名和显示文本。
light002.png light003.png light004.png light005.png
light001.png
观察现象


根据一定时间的检测,我们可以观察手机app中日照时间及其曲线
light006.png

视频展示



blinker物联网教程目录

blinker物联网教程——1、物联网及blinker介绍
blinker物联网教程——2、搭建编程环境
blinker物联网教程——3、主控硬件wifiduino
blinker物联网教程——4、控制开关灯
blinker物联网教程——5、认识传感器
blinker物联网教程——6、wifi智能插座
blinker物联网教程——7、室内温湿度计
blinker物联网教程——8、定时任务-定时震动器
blinker物联网教程——9、blinker语音识别-芝麻开门
blinker物联网教程——10、日照时间分析
blinker物联网教程——11、自动灌溉
blinker物联网教程——12、调色盘
blinker物联网教程——13、公园噪音监测
blinker物联网教程——14、智能停车场
blinker物联网教程——15、智能家居
blinker物联网教程——16、遥控机械臂
blinker物联网教程——17、防疫隔离门磁
blinker物联网教程——18、手机控制空调
blinker物联网教程——19、接入小度智能音箱
blinker物联网教程——20、语音氛围灯
blinker物联网教程——23、wifi智能小车
blinker物联网教程——24、智能宠物喂食器

该用户从未签到

发表于 2021-5-20 10:59 | 显示全部楼层
在大神的基础上,可以把光敏电阻和湿度传感器分别接到A0与D1、D2上面,使用查理复用(Charlieplex)方法把D1、D2分时置于输入状态(高阻抗)和数码1、0来分时检测水干和光照,以前用查理复用方法用8266读取过XY的模拟操纵杆,效果还行,缺点是时间上不能太快,比较适合于植物的全托物联网控制电路。

该用户从未签到

发表于 2021-5-19 17:11 | 显示全部楼层
datastorage存的数据,超过一周会被清掉是吗?

该用户从未签到

发表于 2022-1-3 21:06 | 显示全部楼层
只有一个A0模拟输入引脚,只能换开发板嘛,还有其他办法嘛

点评

wifiduino32  详情 回复 发表于 2022-1-4 09:47

该用户从未签到

 楼主| 发表于 2022-1-4 09:47 | 显示全部楼层
不良人cz 发表于 2022-1-3 21:06
只有一个A0模拟输入引脚,只能换开发板嘛,还有其他办法嘛

wifiduino32

该用户从未签到

发表于 2022-1-4 20:38 | 显示全部楼层

那就是只能换开发板喽

该用户从未签到

发表于 2022-1-16 18:50 | 显示全部楼层
第二段代码的第50行:
nightTime = nightTime + (millis() - nightTime);
这不就是nightTime=mills();吗?吧mills()赋值给nightTime?
这里是不是错了?应该是:
nightTime = nightTime + (millis() - runTime); 才对吧?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

ESP TOUCH V2测试
ESP TOUCH V2测试
[md]# 简介 看到blinker增加esp touch v2支持,但arduino中没有相关示例,分享测试记
【Arduino】168种传感器模块系列实验(90)--- ULN2003步进电机
【Arduino】168种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕彩色时钟
合宙ESP32C3使用TFT_eSPI
合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕彩色时钟,效果图: 程序如下: #inclu
RFID门禁系统
RFID门禁系统
RFID门禁系统准备材料:一块arduino开发板(uno,nano,mega2560均可),RC522 RFID门禁
esp32使用实时数据不定时重启
esp32使用实时数据不定时
我在代码中添加了10个实时数据点,然后esp32便会出现不定时重启,求大佬指导 代码:
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表