本帖最后由 海神 于 2022-5-17 15:48 编辑
简介
物联网的一个主要应用方向是在农业,在农业应用种,有些农业瓜果蔬菜等植物对环境要求高,且有季节性。所以我们也经常会看到大棚种植。而在大棚种植种。检测植物生长环境的光照、温湿度等参数是必不可少的。
光照对于农作物的生长来说是非常重要的。如果没有阳光,植物将无法通过光合作用生成营养物质,会严重影响到植物的生长发育。光照是植物制造有机养料的关键条件之一,通过其光照情况,科研人员就能够大概了解植物生长情况的好坏。 本节,我们将一个模拟光敏传感器接入网络,实时记录光照时长,并生成对应时间轴的光照曲线,用于分析是否适合植物生长,或者是否采取措施给植物进行补光。 Wifiduino接入云服务器后,就可以接收来自传感器的数据,并且可以对其进行分析、显示和存储。使用一个光敏传感器用来检测环境的光照强度。然后将该时间上传至云端存储起来,方便进行数据分析。当一天的数据记录完毕上传云端后,统计时间的变量将会清零。
光敏传感器 光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器,又称为光电导探测器。当入射光强,电阻减小,入射光弱,电阻增大。可用来对周围环境光的强度进行检测,结合wifiduino控制器可实现光的测量,可通过3P传感器连接线与wifiduino专用传感器扩展板结合使用,可以制作光感相关的互动作品. 光敏传感器是一个模拟输入传感器,所以我们要采集其模拟数据,需要通过wifiduino的模拟输入接口。而wifiduino模拟输入接口只有A0一个(主芯片esp8266所决定),所以,我们暂时只能将其接在A0接口上。 (如果我们需要接入多个模拟输入传感器,该怎么办? 可以将主板更换成模拟输入接口更多的wifiduino32主板。)
硬件
光敏传感器*1
软件
blinker app
代码
示例代码中,我们通过模拟光敏传感器采集光照强度的参考值,显示在blinker app中,实现远程采集数据。程序中,我们只需添加一个数据控件,用来收集光线强度的数据。 - #define BLINKER_WIFI
- #include <Blinker.h>
- volatile int light;
- char auth[] = "dae8exxxx038";
- char ssid[] = "moxxxun";
- char pswd[] = "cxxxxxxx51";
- BlinkerNumber Number1("num-abc");
- void dataStorage(){
- Blinker.dataStorage("num-abc", light);
- }
- void setup(){
- Blinker.begin(auth,ssid,pswd);
- light = 0;
- Blinker.attachDataStorage(dataStorage);
- }
- void loop(){
- light = analogRead(A0);
- delay(100);
- Number1.print(light);
- Blinker.run();
- }
复制代码 blinker app界面定制
在blinker中添加一个数据控件,修改对应的键名和显示文本,设置最大值是1023,因为读取模拟传感器的数值范围是0-1023. 然后添加“图表”控件,修改和数据控件一样的键名和显示文本。
硬件连接
将传感器的S信号引脚连接在A0端口中,+ 和-分别接在VCC和GND上。
观察现象
打开blinker,等待设备显示在线,然后观察反馈的光照强度与光照曲线
进阶
采集并打印出数据后,我们可以将数据进行分析,通过程序来分析具体日照的时间有多长
代码
代码实现的主要功能是,采集光线强度数据,当光线强度高于一定值时,就认为是天亮了,此时光照时间开始计时;而当光线强度小于一定值时,认为是天黑了,此时光照时间停止计时。 - #define BLINKER_WIFI
- #include <Blinker.h>
- volatile int LEDP;
- unsigned long runTime;
- unsigned long LEDPtime;
- unsigned long nightTime;
- unsigned int LEDPtime_H;
- unsigned int LEDPtime_M;
- #define Thre 30//最小光照强度
- #define night 5
- #define CheckNightTime 24
- #define CheckDayTime 24
- char auth[] = "defxxxxxxx1894"; //手机端的设备密钥
- char ssid[] = "openjumper2016"; //无线wifi名称
- char pswd[] = "i3wasxxx05"; //wifi密码
- BlinkerNumber Number1("num-h");
- BlinkerNumber Number2("num-m");
- BlinkerNumber Number3("light");
- void dataStorage() {
- //Blinker.dataStorage("light", LEDP);
- }
- void heartbeat(){
- Number1.print(LEDPtime_H);
- Number2.print(LEDPtime_M);
- Number3.print(LEDP);
- }
- void setup(){
- Serial.begin(115200);
- Blinker.attachHeartbeat(heartbeat);
- Blinker.begin(auth,ssid,pswd);
- Blinker.attachDataStorage(dataStorage);
- LEDP = 0;
- runTime = 0;
- LEDPtime = 0;
- nightTime = 0;
- }
- void loop(){
- runTime = millis()/1000;
-
- Blinker.run();
- LEDP = analogRead(A0);//环境光照强度
- Serial.print("light:");
- Serial.print(LEDP);
- Serial.print(" >>>>>>>> ");
- //Serial.println(runTime/1000);
-
- if (LEDP >= Thre) {
- Serial.print("run timing:");
- LEDPtime = (LEDPtime + (millis()/1000 - runTime));//时间单位秒
- LEDPtime_M = (LEDPtime/60)%60;
- LEDPtime_H = LEDPtime_M/360;
- //LEDPtime = LEDPtime/1000;
- if(LEDPtime_M%3 == 0){
- Blinker.dataStorage("light", LEDP);
- }
- Serial.print(LEDPtime_H);
- Serial.print(":");
- Serial.print(LEDPtime_M);
- Serial.print(":");
- Serial.println(LEDPtime%60);
- //Serial.println(" s");
- if (LEDPtime_H > CheckDayTime) {
- nightTime = 0;
- }
- } else if (LEDP < Thre) {
- Serial.println("sleep");
- if (LEDP <= Thre) {
- nightTime = nightTime + (millis()/1000 - nightTime);
- if (LEDPtime_H > CheckNightTime) {
- LEDPtime = 0;
- }
- }
- }
- }
复制代码
blinker软件界面定制
添加三个数据组件用来显示光照时间和光照强度,修改数据组件的参数特征,键名与程序中定义的一致。再添加一个图表控件,修改和光照强度一样的键名和显示文本。
观察现象
根据一定时间的检测,我们可以观察手机app中日照时间及其曲线。
视频展示
blinker物联网教程目录
|