简单的喷淋实验(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能_机器学习073_SVM支持向量机_人脸识别模型建模_预测可视化_网格搜索交叉验证最优化参数对比---人工智能工作笔记0113

接着上一节来说,可以看到我们已经找到了合适的参数,然后 我们可以看一下这里 gc.best_params_ 就可以打印出最合适的参数 然后我们把最合适串按说填入到代码中,然后进行计算,看看得分 可以看到得分,训练数据是1.0 然后测试数据得分是0.7857...对吧

nodejs+vue+微信小程序+python+PHP的热带野生动物园景点预约订票系统的设计与实现-计算机毕业设计推荐

管理员是系统的管理者&#xff0c;拥有系统的所有权限&#xff0c;通过系统设定的账号和密码登录后对系统进行管理&#xff0c;包括密码修改、用户管理。新闻公告的管理、景点管理、订单管理。管理员登录中&#xff0c;通过用户的登录名和密码到热带野生动物园景点预约订票系统…

three.js后处理(发光描边OutlinePass描边样式

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"></div>&…

WPS复选框里打对号,显示小太阳或粗黑圆圈的问题解决方法

问题描述 WPS是时下最流行的字处理软件之一&#xff0c;是目前唯一可以和微软office办公套件相抗衡的国产软件。然而&#xff0c;在使用WPS的过程中也会出现一些莫名其妙的错误&#xff0c;如利用WPS打开docx文件时&#xff0c;如果文件包含复选框&#xff0c;经常会出…

vue3+ts 代理的使用

简单封装request.ts import axios from "axios";// 1.创建axios对象 const serviceaxios.create();// 2.请求拦截器 service.interceptors.request.use(config>{return config; },error>{Promise.reject(error); })// 3.响应拦截器 service.interceptors…

助力打造清洁环境,基于YOLOv7开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题&#xff0c;公共环境下垃圾投放点都会有固定的值班时间&#xff0c;但是考虑到实际扔垃圾的无规律性&#xff0c;往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题&#xff0c;有些容易扩散的垃圾比…

HarmonyOS应用程序包-(上)

应用程序包-(上) 1.应用程序包概述 用户应用程序泛指运行在设备的操作系统之上&#xff0c;为用户提供特定服务的程序&#xff0c;简称“应用”。一个应用所对应的软件包文件&#xff0c;称为“应用程序包”。 HarmonyOS提供了应用程序包开发、安装、查询、更新、卸载的管理…

王道考研计算机网络——数据链路层

码元和信号变化是一一对应的 低通&#xff1a;低于最高频率的可以通过 奈氏准则无噪声&#xff0c;香农定理有噪声 给出db&#xff0c;利用公式求出S/N 放到数字信道上传输就是基带信号&#xff0c;放到模拟信道上传输就是宽带信号 把基带信号调制成宽带信号之后&#xff0c;…

微信使用证书退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道

解决方法&#xff1a;IIS-》应用程序池-》高级设置-》进程模块-》加载用户配置文件&#xff0c;设置为True就可以了。

冒泡排序(C语言)

void BubbleSort(int arr[], int len) {int i, j, temp;for (i 0; i < len; i){for (j len - 1; j > i; j--){if (arr[j] > arr[j 1]){temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}} } 优化&#xff1a; 设置标志位flag&#xff0c;如果发生了交换flag设置…

VD6283TX环境光传感器(1)----获取光强和色温

VD6283TX环境光传感器.1--获取光强和色温 概述视频教学样品申请完整代码下载主要特点硬件准备技术规格系统框图生成STM32CUBEMX串口配置IIC配置X-CUBE-ALS演示结果光强测试表 概述 为了充分利用VD6283TX传感器的特性和功能&#xff0c;本章节重点介绍了如何捕获光强度和相关色…

SQL server 数据库面试题及答案(实操2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

Stable Diffusion模型原理

AI 图像生成引人注目&#xff0c;它能够根据文字描述生成精美图像&#xff0c;这极大地改变了人们的图像创作方式。Stable Diffusion 作为一款高性能模型&#xff0c;它生成的图像质量更高、运行速度更快、消耗的资源以及内存占用更小&#xff0c;是 AI 图像生成领域的里程碑。…

泛微OA xmlrpcServlet接口任意文件读取漏洞(CNVD-2022-43245)

CNVD-2022-43245 泛微e-cology XmlRpcServlet接口处存在任意文件读取漏洞&#xff0c;攻击者可利用漏洞获取敏感信息。 1.漏洞级别 中危 2.影响范围 e-office < 9.5 202201133.漏洞搜索 fofa 搜索 app"泛微-OA&#xff08;e-cology&#xff09;"4.漏洞复现 …

Android 手机对于Arduino蓝牙控制解决方案

1、Android系统概述 ​ Android 系统是 Google 公司基于 Linux 内核开发的移动端操作系统,适用于智能手机智能手表平板电脑等设备&#xff0c;最新的版本为 7.1。Android系统具有免费开源的优势,任何企业与个人都可以查阅公开的 API 文档&#xff0c;并在自己开发的应用中通过调…

【Element】el-select下拉框实现选中图标并回显图标

一、背景 需求&#xff1a;在下拉框中选择图标&#xff0c;并同时显示图标和文字&#xff0c;以便用户可以直观地选择所需的图标。 二、功能实现 <template><div><el-table ref"table" :data"featureCustom2List" height"200"…

实验室安全教育考试管理系统v3.0功能介绍

瑞熙贝通实验室安全练习和在线考试系统&#xff0c;采取线上培训学习与安全考试相结合的教学形式&#xff0c;在学生进入开放实验室之前通过系统对实验的安全与规范有一个系统的认识与学习。通过线上考试系统&#xff0c;为评价学生的实验室安全学习效果提供了快速有效的实验平…

树莓派安装mediapipe方法

MediaPipe 解决方案可跨多个平台使用。 每个解决方案都包含一个或多个模型&#xff0c;您也可以为某些解决方案自定义模型。 以下列表显示了每个受支持平台可用的解决方案以及您是否可以使用 Model Maker 来自定义模型&#xff1a; 在树莓派上安装mediapipe后, python可以支持…

【http】缓存协议

✨ 专栏介绍 在当今互联网时代&#xff0c;计算机网络已经成为了人们生活和工作中不可或缺的一部分。而要实现计算机之间的通信和数据传输&#xff0c;就需要依靠各种网络协议来进行规范和约束。无论是浏览网页、发送电子邮件还是进行在线交流&#xff0c;都离不开各种各样的网…

工具系列:TensorFlow决策森林_(9)自动超参数调整

文章目录 介绍超参数调整算法使用TF Decision Forests进行超参数调整设置在没有自动超参数调整的情况下训练模型使用自动化超参数调整和手动定义超参数训练模型使用自动化超参数调整和自动定义超参数的模型训练&#xff08;推荐方法&#xff09;使用Keras Tuner训练模型 *(替代…