简单的喷淋实验(2):(1)根据土壤湿度自动控制喷淋开关;(2)根据光照强度控制风扇以及灯的开关---嵌入式实训

目录

简单的喷淋实验(2):

        (1)根据土壤湿度自动控制喷淋开关;

        (2)根据光照强度控制风扇以及灯的开关---嵌入式实训

任务2:

具体过程:

所用的头文件:

data_global.h

mqtt.h

主程序:mian.c

运行结果:

运行过程视频:

上述程序存在问题:

初步破局:

继续探讨:


简单的喷淋实验(2):

        (1)根据土壤湿度自动控制喷淋开关;

        (2)根据光照强度控制风扇以及灯的开关---嵌入式实训

任务2

在所给的 irrigate-1 文件夹中创建一个main.c 完成以下内容:

(1)根据土壤湿度自动控制喷淋开关

(2)根据光照强度控制风扇以及灯的开关

参考:

#include <stdio.h>
#include <unistd.h>
#include "mqtt.h"
#include "parse_config.h"#define SUB_TOPIC  "1703161172612/AIOTSIM2APP"   //定阅的主题
#define PUB_TOPIC  "1703161172612/APP2AIOTSIM"  //发布主题#define IRRIGATED_ON "{\"irrigated\":true}"
#define IRRIGATED_OFF "{\"irrigated\":false}"#define FAN_ON		"{\"fan\":true}"
#define FAN_OFF		"{\"fan\":false}"#define LAMP_ON		"{\"lamp\":true}"
#define LAMP_OFF		"{\"lamp\":false}"#define ALARM_ON		"{\"alarm\":true}"
#define ALARM_OFF		"{\"alarm\":false}"int main(int argc, const char *argv[])
{ENV msg_env={};//1.初始化mqtt协议if(mqtt_init()!=0){printf("mqtt init err.\n");return -1;}//订阅别人发布的消息if(mqtt_subscribe(SUB_TOPIC) < 0){printf("sub err.\n");return -1;}//循环获取温湿度//当大于阈值关闭灌溉,小于就打开while(1){sleep(1);//获取值msg_env=get_virtual_env();if(msg_env.ill < 20000){mqtt_publish(PUB_TOPIC,FAN_OFF);mqtt_publish(PUB_TOPIC,LAMP_ON);}else if(msg_env.ill > 50000){mqtt_publish(PUB_TOPIC,FAN_ON);mqtt_publish(PUB_TOPIC,LAMP_OFF);}printf("ill:%f\n",msg_env.ill);if(msg_env.soil < 30){mqtt_publish(PUB_TOPIC,IRRIGATED_ON);}else if(msg_env.soil > 50){mqtt_publish(PUB_TOPIC,IRRIGATED_OFF);}printf("soilhum:%f\n",msg_env.soil);// if(msg_env.infrared == 1)// {// 	mqtt_publish(PUB_TOPIC,ALARM_ON);// }else {// 	mqtt_publish(PUB_TOPIC,ALARM_OFF);// }// printf("infrared:%d\n",msg_env.infrared);}exit_mqtt();return 0;
}

具体过程:

所用的头文件:
data_global.h
#ifndef __DATA_GLOBAL__H__
#define __DATA_GLOBAL__H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <time.h>
#include <termios.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdbool.h>
struct env_info
{float soil;  //土壤湿度float light; //光照强度float temp;   //空气温度uint8_t gas;    //有害气体
};extern struct env_info env_msg;//设备编号
#define FAN  0x00
#define BEEP 0x10
#define LED  0x20
#define PUMP 0X30#define DATA_ARRIVE SIGUSR1 //数据到达信号//订阅、发布主题
#define ENV_PUB_TOPIC "FS_VRJJ/control"//虚拟仿真硬件协议
#define LAMP_ON    "{\"lamp\":true}"
#define LAMP_OFF   "{\"lamp\":false}"#define ALARM_ON   "{\"alarm\":true}"
#define ALARM_OFF  "{\"alarm\":false}"#define SUNSHADE_FOR "{\"sunshade\":\"forward\"}"
#define SUNSHADE_REV	"{\"sunshade\":\"reverse\"}"
#define SUNSHADE_STOP	"{\"sunshade\":\"stop\"}"#define VIR_FAN_ON	"{\"fan\":true}"
#define VIR_FAN_OFF "{\"fan\":false}"#define IRRIGATED_OFF "{\"irrigated\":false}"
#define IRRIGATED_ON "{\"irrigated\":true}"
#endif
mqtt.h
#ifndef __MQTT_SMART_H_
#define __MQTT_SMART_H_typedef struct env
{float soil;//土壤湿度float ill;//光照int smog;//烟雾int infrared;//人体红外
}ENV;
int mqtt_init();
void exit_mqtt();
int mqtt_subscribe(const char*topic);
int mqtt_publish(const char *topic, char *msg);
ENV get_virtual_env();#endif
主程序:mian.c
#include<stdio.h>
#include"mqtt.h"
#include<unistd.h>
#include"data_global.h"#define subscribe "1703503856299/AIOTSIM2APP"
#define publish "1703503856299/APP2AIOTSIM"
int main(int argc, char *argv[]){//1-连接服务器mqtt_init();//2-订阅元宇宙平台主题,获得数据串//通过目标节点的发布主题,才能的得到发布的内容mqtt_subscribe(subscribe);//4.循环获取数据,下发控制指令while (1){sleep(1);ENV env= get_virtual_env();if (env.soil>60){mqtt_publish(publish, IRRIGATED_OFF);printf("关闭喷淋。。。。\n");}else if (env.soil<30){mqtt_publish(publish, IRRIGATED_ON);printf("打开喷淋\n");}printf("当前土壤湿度:%.2f\n", env.soil);if (env.ill>27000){mqtt_publish(publish, VIR_FAN_ON);mqtt_publish(publish,  LAMP_OFF);printf("打开风扇,关闭灯。。。。\n");}else if (env.ill<25000){mqtt_publish(publish,  VIR_FAN_OFF);mqtt_publish(publish,  LAMP_ON);printf("关闭风扇,打开灯。。。。。。\n");}sleep(1);printf("当前光照强度:%.2f\n", env.ill);printf("++++++++++++++++++++++++++++\n");}exit_mqtt();return 0;
}
运行结果:

元宇宙未运行时:

元宇宙运行后:

运行过程视频:

嵌入式实训2023-12-25 20-19-53


上述程序存在问题:

初步破局:

在元宇宙实验平台还没开始运行时,各种数据都是0,就会导致程序通过if、else if判断语句来控制各种机器运作,这是不正确的。为了避免这种情况,可以添加一些额外的判断来解决这个问题。

首先,我们可以在while循环之前添加一个延时等待,让实验平台有足够的时间来获取和发送数据。例如,我们可以使用sleep函数来等待5秒钟:

sleep(5); // 等待5秒钟,让实验平台有足够的时间来获取和发送数据

然后,我们可以在if、else if判断语句之前添加一个判断,检查所需的数据是否已经被正确地获取。例如,我们可以检查土壤湿度是否为0来确定是否成功获取了土壤湿度数据:

ENV env= get_virtual_env();
if (env.soil == 0) {printf("未成功获取到土壤湿度数据,等待下一次获取...\n");sleep(1);continue; // 跳过本次循环,等待下一次循环
}// 在此之后添加if、else if判断语句进行控制

 同样,我们可以添加类似的判断来检查光照强度等数据是否已经被正确获取。这样做可以避免在数据未准备好时误操作机器,保证程序的正确性。

完整代码:

#include<stdio.h>
#include"mqtt.h"
#include<unistd.h>
#include"data_global.h"#define subscribe "1703503856299/AIOTSIM2APP"
#define publish "1703503856299/APP2AIOTSIM"
int main(int argc, char *argv[]){//1-连接服务器mqtt_init();//2-订阅元宇宙平台主题,获得数据串//通过目标节点的发布主题,才能的得到发布的内容mqtt_subscribe(subscribe);//3.等待数据准备就绪printf("等待数据准备就绪...\n");sleep(5); // 等待5秒钟,让实验平台有足够的时间来获取和发送数据//4.循环获取数据,下发控制指令while (1){ENV env= get_virtual_env();if (env.soil == 0) {printf("未成功获取到土壤湿度数据,等待下一次获取...\n");sleep(1);continue; // 跳过本次循环,等待下一次循环}if (env.soil>60){mqtt_publish(publish, IRRIGATED_OFF);printf("关闭喷淋。。。。\n");}else if (env.soil<30){mqtt_publish(publish, IRRIGATED_ON);printf("打开喷淋\n");}printf("当前土壤湿度:%.2f\n", env.soil);if (env.ill == 0) {printf("未成功获取到光照强度数据,等待下一次获取...\n");sleep(1);continue; // 跳过本次循环,等待下一次循环}if (env.ill>27000){mqtt_publish(publish, VIR_FAN_ON);mqtt_publish(publish,  LAMP_OFF);printf("打开风扇,关闭灯。。。。\n");}else if (env.ill<25000){mqtt_publish(publish,  VIR_FAN_OFF);mqtt_publish(publish,  LAMP_ON);printf("关闭风扇,打开灯。。。。。。\n");}printf("当前光照强度:%.2f\n", env.ill);printf("++++++++++++++++++++++++++++\n");sleep(1);}exit_mqtt();return 0;
}

继续探讨:

还是有点问题,如果等待5秒后,实验平台运行了,但是土壤湿度和光照强度又恰好是0呢?这样是没有错误的呀

上述提出了一个很好的问题。确实,在等待5秒后,如果土壤湿度和光照强度仍然是0,那么程序就会继续执行,而不会等待数据准备就绪。为了解决这个问题,可以使用一个循环来判断数据是否已经准备就绪,并设置一个最大等待时间。

下面是修改后的代码示例:

#include<stdio.h>
#include"mqtt.h"
#include<unistd.h>
#include"data_global.h"#define subscribe "1703503856299/AIOTSIM2APP"
#define publish "1703503856299/APP2AIOTSIM"
int main(int argc, char *argv[]){//1.连接服务器mqtt_init();//2.订阅元宇宙平台主题,获得数据串//通过目标节点的发布主题,才能的得到发布的内容mqtt_subscribe(subscribe);//3.等待数据准备就绪printf("等待数据准备就绪...\n");int max_wait_time = 10; // 最大等待时间为10秒int wait_time = 0; // 已等待的时间ENV env;while (1){env= get_virtual_env();if (env.soil != 0 && env.ill != 0) {break; // 数据已准备就绪,跳出循环}sleep(1);wait_time++;if(wait_time >= max_wait_time){printf("超过最大等待时间,未成功获取到数据!\n");exit_mqtt();return 0;}}//4.循环获取数据,下发控制指令while (1){if (env.soil>60){mqtt_publish(publish, IRRIGATED_OFF);printf("关闭喷淋。。。。\n");}else if (env.soil<30){mqtt_publish(publish, IRRIGATED_ON);printf("打开喷淋\n");}printf("当前土壤湿度:%.2f\n", env.soil);if (env.ill>27000){mqtt_publish(publish, VIR_FAN_ON);mqtt_publish(publish,  LAMP_OFF);printf("打开风扇,关闭灯。。。。\n");}else if (env.ill<25000){mqtt_publish(publish,  VIR_FAN_OFF);mqtt_publish(publish,  LAMP_ON);printf("关闭风扇,打开灯。。。。。。\n");}printf("当前光照强度:%.2f\n", env.ill);printf("++++++++++++++++++++++++++++\n");sleep(1);}exit_mqtt();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gin框架使用系列之三——获取表单数据

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》 一、获取get参数 get请求的参数是直接加在url后面的&#xff0c;在gin中获取get请求的参数主要用Query()和DefaultQuery()两个方法&#xff0c;示例代码如下…

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。 我们创建地形很简单&#xff0c;在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型&#xff01;这个模型是Unity内置的。 接下来的地形编辑功能全部集中在这个地形的组件上 主要功能如下&…

WPS中如何根据身份证号生成出生日期并排序

1. wps中如何根据身份证号导出出生日期并排序 1.1 wps中建一张表 1.2 使用转日期格式导出出生日期 DATE(VALUE(MID(C2,7,4)),VALUE(MID(C2,11,2)),VALUE(MID(C2,13,2)))MID(C2, 7, 4)&#xff1a;这部分从单元格 C2 中提取文本字符串&#xff0c;从第7个字符开始提取长度为4的…

[python]python使用M-LSD直线检测算法onnx部署模型实时检测

介绍 github地址&#xff1a;https://github.com/navervision/mlsd LSD (M-LSD)一种用于资源受限环境的实时轻量线段检测器。它利用了极其高效的 LSD 架构和新颖的训练方案&#xff0c;包括 SoL 增强和几何学习方案。模型可以在GPU、CPU甚至移动设备上实时运行。算法已开源&a…

【elk-day01】es和kibana搭建及验证---Mac-Docker

Mac系统使用Docker下载搭建和验证eskibana Docker下载安装es安装es验证kibana安装kibana验证 Docker下载安装 Docker Desktop官网安装下载地址 说明一下为什么要安装desktop版本的docker&#xff0c;因为docker作为工具使用&#xff0c;我们需要的是开箱即用&#xff0c;没有必…

windows搭建MySQL 8.25主从配置

1.本次搭建的版本 mysql-8.0.25-win-x64 2.在解压完成后的文件内并没有对应的my.ini的配置文件这个my.ini是需要的主配置文件需要自行创建。 注&#xff1a;安装路径及数据存放路径需根据实际安装情况进行修改&#xff08;其它配置信息可结合实际情况进行修改&#xff09; 3.在…

vue+element实现动态表格:根据后台返回的属性名和字段动态生成可变表格

现有一个胡萝卜厂生产不同品种的胡萝卜&#xff0c;为了便于客户了解产品&#xff0c;现需在官网展示胡萝卜信息。现有的萝卜信息&#xff1a;编号&#xff08;id&#xff09;、名称&#xff08;name&#xff09;、保质期&#xff08;age&#xff09;、特点&#xff08;remark&…

深度学习:计算机技术的革命性突破

深度学习&#xff1a;计算机技术的革命性突破 随着科技的飞速发展&#xff0c;深度学习已经成为计算机技术领域的一股强大力量。它改变了我们与机器的交互方式&#xff0c;为人工智能领域带来了革命性的突破。本篇博客将深入探讨深度学习的原理、应用和发展趋势。 一、深度学…

【python】爬取斗鱼直播照片保存到本地目录【附源码+文末免费送书】

一、导入必要的模块&#xff1a; 这篇博客将介绍如何使用Python编写一个爬虫程序&#xff0c;从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应&#xff0c;以及os模块处理文件和目录操作。 如果出现模块报错 进入控制台输入&#xff…

【基础篇】五、类的双亲委派机制

文章目录 1、双亲委派机制2、Java代码中去主动加载一个类3、“父”加载器4、Q & A5、打破双亲委派机制 1、双亲委派机制 JVM中有多个类加载器&#xff0c;某个类A&#xff0c;到底该由谁去加载 ⇒ 双亲委派机制 该机制的作用&#xff1a; 保证类加载的安全性&#xff1a;避…

Grafana 配置告警

配置告警 配置告警 1. Grafana 配置文件配置 #################################### SMTP / Emailing ########################## [smtp] enabled true host smtp.qq.com:587 user 9**qq.com # If the password contains # or ; you have to wrap it with triple quotes…

智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MA…

vue3+elementPlus+cascader动态加载封装自定义组件+v-model指令实现父子通信

文章目录 select普通操作 &#xff08;1&#xff09;cascader操作&#xff08;2&#xff09; select普通操作 &#xff08;1&#xff09; 搜索条件需求&#xff1a;接口入参需要houseId&#xff0c;但是要先选择完楼栋&#xff0c;再选择单元&#xff0c;最后选择房屋 如图&a…

【C#】.net core 6.0 依赖注入生命周期

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 对于.net core而言&#xff0c;依赖注入生命周期有三种瞬态&#xff08;Transient&#xff09;、作用域&#xff08;Scoped&#xff09;和单例&#xff08;Singleton&#xff09;&#xf…

数据结构-如何实现一个队列?逐步解析与代码示例(超详细)

文章目录 前言1.队列的基本概念2.链表与数组实现队列的区别2.1数据存储结构2.2性能2.3内存使用 3.为什么选择链表实现队列&#xff1f;4.结构定义函数声明 5.核心操作5.1初始化 (QInit)5.2销毁 (QDestroy)5.3入队 (QPush)5.4出队 (QPop) 6.队列的查询操作6.1队首元素 (QueueFro…

如何将语音版大模型AI接入自己的项目里(语音ChatGPT)

如何将语音版大模型AI接入自己的项目里语音ChatGPT 一、语音版大模型AI二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、语音版大模型AI 基于阿里通义千问、百…

分享5款实用的小工具,提升你的工作效率

​ 工作中&#xff0c;简单而实用的小工具能够为我们带来事半功倍的效果。这五款工具可能是你工作效率提升的关键。 1.云存储——Dropbox ​ Dropbox是一款流行的云存储服务&#xff0c;可以让你在不同的设备上同步和访问你的文件。你可以将你的文件上传到Dropbox的服务器上&…

绝缘电阻测试仪的测量范围有多少?它的测量方法是什么?

绝缘电阻测试仪广泛应用于设备检测和故障排除。它广泛应用于电力检测行业。甚至可以说&#xff0c;电力设备离不开绝缘电阻测试仪设备。对于许多经验丰富的电力测试工人来说&#xff0c;绝缘电阻测试仪的常规测量范围和方法应该非常清楚。在本文中&#xff0c;我们将向一些新的…

学之思开源考试系统是一款 java + vue 的前后端分离的考试系统

学生系统功能 模块介绍登录用户名、密码注册年级、用户名、密码任务中心管理员发布的年级任务&#xff0c;每个学生只能做一次考试题干支持文本、图片、数学公式、表格等&#xff0c;学生答题支持&#xff1a;文本固定试卷可重复练习、自行批改的试卷时段试卷在时间限制内&…

关于chatglm3 function calling的理解

ChatGLM3-6B开源了工具调用&#xff0c;好奇他是怎么实现的&#xff0c;所以写了这个文章记录。 一、测试官方的示例 官方给的示例很简单&#xff0c;只不过给的两个函数 track 和 text-to-speech 没有具体的实现&#xff0c;模型的输出也只是给出了需要调用的函数名和参数。剩…