简单的喷淋实验(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.rhkb.cn/news/225692.html

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

相关文章

【接口测试】Postman(一)--接口测试知识准备 _

1.0 前言 ​ 应用程序编程接口&#xff08;Application Programming Interface, API&#xff09;是这些年来最流行的技术之一&#xff0c;强大的Web应用程序和领先的移动应用程序都离不开后端强大的API。API技术的应用给系统开发带来了便利&#xff0c;但也对测试人员提出了更高…

PYTHON基础:最小二乘法

最小二乘法的拟合 最小二乘法是一种常用的统计学方法&#xff0c;用于通过在数据点中找到一条直线或曲线&#xff0c;使得这条直线或曲线与所有数据点的距离平方和最小化。在线性回归中&#xff0c;最小二乘法被广泛应用于拟合一条直线与数据点之间的关系。 对于线性回归&…

k8s的二进制部署(一)

k8s的二进制部署&#xff1a;源码包部署 环境&#xff1a; k8smaster01: 20.0.0.71 kube-apiserver kube-controller-manager kube-schedule ETCD k8smaster02: 20.0.0.72 kube-apiserver kube-controller-manager kube-schedule Node节点01: 20.0.0.73 kubelet kube-pr…

Vue学习之第一、二章——Vue核心与组件化编程

第一章. Vue核心 1.1 Vue简介 1.1.1 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ 1.1.2 Vue特点 遵循 MVVM 模式编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发它本身只关注 UI, 也可以引入其它第三方库开发项目 1.2 初始Vue 这里可以参考&a…

如何在vscode当中预览html文件运行结果

如何在vscode当中预览html文件运行结果 下载拓展内容打开拓展界面下载拓展 运行html文件参考内容 上一篇文章当中讲了如何实现在网页上对html文件的预览,但是这样子其实在运行代码的过程当中效果比较差,那么还需要可以实时预览运行的结果 下载拓展内容 打开拓展界面 下载拓展 …

Springboot整合MVC进阶篇

一、概述 1.1SpringBoot整合SpringMVC配置 SpringBoot对SpringMVC的配置主要包括以下几个方面&#xff1a; 自动配置&#xff1a;SpringBoot会自动配置一个嵌入式的Servlet容器&#xff08;如Tomcat&#xff09;&#xff0c;并为我们提供默认的SpringMVC配置。这样我们无需手动…

华清远见嵌入式学习——ARM——作业3

作业要求&#xff1a; 代码效果图&#xff1a; 代码&#xff1a; led.h #ifndef __LED_H__ #define __LED_H__#define RCC_GPIO (*(unsigned int *)0x50000a28) #define GPIOE_MODER (*(unsigned int *)0x50006000) #define GPIOF_MODER (*(unsigned int *)0x50007000) #defi…

12.26代码复现

# 建立矩阵模型 m Model(specification) x m.addMVar((48,),vtypeGRB.BINARY,namex) y m.addMVar((240,),lb-GRB.INFINITY,namey) u m.addMVar((48,),vtypeGRB.BINARY,nameu)以下是一个简单的示例代码&#xff0c;演示了如何使用 Python 和 Gurobi 库来实现 KKT 方法求解列…

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称&#xff1a;Dark High Contrast &#xff08;意思就是&#xff0c;黑色的&#xff0c;高反差的&#xff09; 步骤&#xff1a;设置→Themes→Color Theme→Dark High Contrast 效果如下&#xff1a; 感觉这个颜色的看起来比较舒服。

【四】【C语言\动态规划】地下城游戏、按摩师、打家劫舍 II,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

汽车项目管理

项目节点&#xff1a; MR (Management Review)——管理层评审 KO (Kick Off)——项目正式启动 SI (Strategy Intent)——战略意图 SC (Strategy Confirmation)——战略确认 PA (Program Approval)——项目批准 PR (Product Readiness)——产品就绪 VP (Verification Prototype)…

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…

全正版商用视频素材网站,一个字:绝

大家心心念念的全正版商用视频素材网站终于来了&#xff0c;今天给小伙伴们推荐一个我的新宠&#xff0c;已经替大家体验了一番&#xff0c;不论是设计&#xff0c;还是搜索&#xff0c;都恰到好处的合适&#xff0c;完全就是为影视人、媒体人量身打造的&#xff01; 当当当&am…

亚马逊美国站ASTM F2613儿童折叠椅和凳子强制性安全标准

ASTM F2613折叠椅和凳子安全标准 美国消费品安全委员会&#xff08;CPSC&#xff09;发布的ASTM F2613儿童折叠椅和凳子的强制性安全标准&#xff0c;已于2020年7月6日生效&#xff0c;并被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》。 亚马逊要求在美国站上架的儿…

QT小技巧 - 使用QMovie进行gif切帧

简介 使用QMovie 将 gif 进行切帧&#xff0c; magick 进行合并代码 QString gifPath "E:\\workspace\\qt\\gif2imgs\\203526qre64haq3ccoobqi.gif"; // 你的图片QMovie movie(gifPath); movie.setCacheMode(QMovie::CacheNone);qDebug() << movie.frameCou…

Python——yolov8识别车牌2.0

目录 一、前言 二、关于项目UI 2.1、修改界面内容的文本 2.2、修改界面的图标和图片 三、项目修改地方 四、其他配置问题 一、前言 因为后续有许多兄弟说摄像头卡顿&#xff0c;我在之前那个MATS上面改一下就可以了&#xff0c;MAST项目&#xff1a;基于YOLOv8的多端车流检…

Matlab/Simulink的一些功能用法笔记(3)

01--引言 最近加入到一个项目组&#xff0c;有一些测试需要去支持&#xff0c;通过了解原先团队的测试方法后&#xff0c;自己作了如下改善&#xff0c;大大提高了工作效率。这也许就是软件开发的意义吧&#xff0c;能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …

ArcGIS渔网的多种用法

在ArcGIS中有一个渔网工具&#xff0c;顾名思义&#xff0c;可以用来创建包含由矩形像元所组成网络的要素类。不太起眼&#xff0c;但它的用途却有很多&#xff0c;今天跟大家分享一篇关于渔网的多种用途。 1.马赛克地图制作 2.基于网格的设施密度统计制作马赛克地图 准备材…

马萨诸塞州道路数据集预处理

今天我们将分享Massachusetts Roads遥感道路语义分割数据集,并会在下期使用FC-DenseNet进行遥感影像道路提取。 Massachusetts Roads遥感道路语义分割数据集覆盖了美国马萨诸塞州超过2600km2的面积,包含城市、城镇、农村和山区等多种地区的道路信息,图像大小均为1500像素1500像…

Duboo-入门到学废【上篇】

目录 1&#x1f95e;.什么是duboo 2&#x1f32d;.架构图 3.&#x1f37f;快速入门 4.&#x1f9c7;浅浅理解 1.什么是duboo&#x1f936;&#x1f936;&#x1f936; Dubbo是一个由阿里巴巴开发的基于Java的开源RPC框架。它提供了高性能、透明化的远程方法调用&#xff0…