【物联网原理与应用】实验二:红外传感实验

目录

一、实验目的

二、实验原理 

三、实验内容及步骤

四、实验结果

五、核心代码


一、实验目的

  1. 学习试验模块上线路的连接操作
  2. 理解掌握红外传感器的工作原理
  3. 实现对红外传感器数据的接收和处理

二、实验原理 

1、将红外辐射能转换成电能的光敏元件称为红外传感器,也常称为红外探测器。红外辐射是由于物体(固体、液体和气体)内部分子的转动及振动而产生的。这类振动过程是物体受热而引起的,只有在绝对零度(-273.16℃)时,一切物体的分子才会停止运动。换言之,在一般的常温下,所有的物体都是红外辐射的发射源。例如火焰、轴承、汽车、飞机、动植物甚至人体等都是红外辐射源。

    红外线和所有的电磁波一样,具有反射、折射、散射、等性质。红外传感器测量时不与被测物体直接接触,因而不存在摩擦,并且有灵敏度高,响应快等优点。红外传感器常用于无接触温度测量、气体成分分析和无损探伤,在医学、军事、空间技术和环境工程等领域得到广泛应用。例如采用红外线传感器远距离测量人体表面温度的热像图,可以发现温度异常的部位,及时对疾病进行诊断治疗(见热像仪);利用人造卫星上的红外线传感器对地球云层进行监视,可实现大范围的天气预报;采用红外线传感器可检测飞机上正在运行的发动机 的过热情况等。

三、实验内容及步骤

1、我们先在UI页面上利用Storyboard元素进行动画定义。需要定义:车辆进出停车场和A、B车位的进库动画,一共4个动画。

2、每个动画分别通过设置时间线的显示时间,同时在页面上添加一个Border元素,利用其背景作为显示屏幕,通过功能代码中调用Storyboard元素. Begin()方法和Stop()方法来控制动画的播放和停止。

3、在功能代码中我们开启和检测串口,通过串口帮助类获取红外传感器的感应数据,根据返回的数据启动或停止对应的动画。

4、在结束时关闭串口,回收资源。

四、实验结果

         

入口动画演示

       

出口动画演示

                        

                ​​​​​​​       

A点停车动画图片演示


                                                                B点停车动画图片演示                                                        

五、核心代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Timers;

using InfraredElecLibrary;


namespace InfraredElec
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 串口辅助类
        /// </summary>
        static ComHelper com = null;
        /// <summary>
        /// 是否第一次
        /// </summary>
        bool _isfirst = true ;
        /// <summary>
        /// 计时器
        /// </summary>
        static Timer timer;
        /// <summary>
        /// 动画容器A点,B点,驶出动画,驶入动画
        /// </summary>
        Storyboard sbA, sbB, sbOut, sbIn;

        /// <summary>
        /// 是否停止 :A点,B点,驶出动画,驶入动画
        /// </summary>
        bool isstopA = true, isstopB = true, isstopOut = true, isstopIn = true;
        /// <summary>
        /// 是否暂停
        /// </summary>
        static bool isprush = false;
        
        public MainWindow()
        {
            InitializeComponent();

        }
        /// <summary>
        /// 窗体加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Loaded(object sender, RoutedEventArgs e) {
            if (com != null)
                return;
            //注意串口要与具体环境对应
            string strCom = System.Configuration.ConfigurationManager.AppSettings["SName"];
            int intBaud = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SBaud"]);
            com = new ComHelper("COM4",9600);
            if (com != null)
            {
                com.Open();
                com.Init(0x33);
            }
            sbA = (Storyboard)FindResource("sb_A");
            sbB = (Storyboard)FindResource("sb_B");
            sbOut = (Storyboard)FindResource("sb_Out");
            sbIn = (Storyboard)FindResource("sb_In");
            sbA.Completed += sb_Completed;
            sbB.Completed += sb_Completed;
            sbOut.Completed += sb_Completed;
            sbIn.Completed += sb_Completed;
            timer = new Timer(200);
            timer.Elapsed += timer_Elapsed;
            timer.Start();

            
        }
        /// <summary>
        /// 窗体卸载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Unloaded(object sender, RoutedEventArgs e)
        {
            if (com != null)
                com.Close();
            timer.Stop();
        }
        /// <summary>
        /// 动画完成时执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void sb_Completed(object sender, EventArgs e)
        {
            var sbname = ((sender as ClockGroup).Timeline as Storyboard).Name;
           
            switch (sbname)
            {
                case "sb_A":
                    isstopA = true;
                    break;
                case "sb_B":
                    isstopB = true;
                    break;
                case "sb_Out":
                    isstopOut = true;
                    break;
                case "sb_In":
                    isstopIn = true;
                    break;
            }
        }
        /// <summary>
        /// 计时事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            //防止未执行以下代码重新计时
            var tt = sender as Timer;
            tt.Stop();
            if (_isfirst)
            {
                _isfirst = false ;
                com.Init(0x33);
            }

            var bts14 = com.GetD14Data(0x33);
            if (bts14 != null)
                StardControl(bts14[0]);
            //0x40 读取ADC数据
            var ad0 = com.GetRetData(0x33, 0x40, 0x00);
            if (ad0 != null)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    var i0 = (int)ad0[0];
                    pro_ad1.Value = i0 / 2.55;
                    lbad1.Content = i0.ToString();
                }));
            }
            //0x40 读取ADC数据
            var ad1 = com.GetRetData(0x33, 0x40, 0x01);
            if (ad1 != null)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    var i1 = (int)ad1[0];
                    pro_ad2.Value = i1 / 2.55;
                    lbad2.Content = (i1).ToString();
                }));
            }

            if (!isprush)
                tt.Start();//启动监听

        }

        /// <summary>
        /// 根据数值执行UI动画效果
        /// </summary>
        /// <param name="bt">数值</param>
        void StardControl(byte bt)
        {
            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                img_B.Source = new BitmapImage(new Uri("Images/switch_0.png", UriKind.Relative));
                img_A.Source = new BitmapImage(new Uri("Images/switch_0.png", UriKind.Relative));
                img_Out.Source = new BitmapImage(new Uri("Images/switch_0.png", UriKind.Relative));
                img_In.Source = new BitmapImage(new Uri("Images/switch_0.png", UriKind.Relative));
            }));
            if ((bt & 0x01) == 0)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    Storyboard sb = (Storyboard)FindResource("sb_B");

                    StardSb(sb);
                }));
            }
            else if ((bt & 0x02) == 0x00)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    Storyboard sb = (Storyboard)FindResource("sb_A");
                    StardSb(sb);
                }));
            }
            else if ((bt & 0x04) == 0x04)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    Storyboard sb = (Storyboard)FindResource("sb_Out");
                    StardSb(sb);
                }));
            }
            else if ((bt & 0x08) == 0x08)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    Storyboard sb = (Storyboard)FindResource("sb_In");
                    StardSb(sb);
                }));
            }
        }
        /// <summary>
        /// 动画执行方法
        /// </summary>
        /// <param name="sb"></param>
        void StardSb(Storyboard sb)
        {

            switch (sb.Name)
            {
                case "sb_B":
                    sbB.Stop();
                    sbOut.Stop();
                    sbIn.Stop();
                    if (isstopB)
                    {
                        sb.Begin(brd);
                        
                    }

                    img_B.Source = new BitmapImage(new Uri("Images/switch_1.png", UriKind.Relative));
                    break;

                case "sb_A":
                     
                     sbA.Stop();
                    sbOut.Stop();
                    sbIn.Stop();
                    if (isstopA)
                    {
                        sb.Begin(brd);
                        
                    }
                    img_A.Source = new BitmapImage(new Uri("Images/switch_1.png", UriKind.Relative));
   
                    break;
                case "sb_In":
                     sbA.Stop();
                    sbB.Stop();
                    sbOut.Stop();
                    if (isstopIn)
                    {
                        sb.Begin(brd);
                        
                    }
                    img_In.Source = new BitmapImage(new Uri("Images/switch_1.png", UriKind.Relative));
                    break;
                case "sb_Out":
                    sbA.Stop();
                    sbB.Stop();
                    sbIn.Stop();
                    if (isstopOut)
                    {
                        sb.Begin(brd);
                        
                    }
                    img_Out.Source = new BitmapImage(new Uri("Images/switch_1.png", UriKind.Relative));
                    break;
            }
        }
    }
}

                

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

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

相关文章

PAL(Program-Aided Language Model)

PAL&#xff08;Program-Aided Language Model&#xff09;是一种结合生成式语言模型&#xff08;如 GPT&#xff09;和程序执行能力的技术框架。它的核心思想是通过让语言模型生成代码或程序来解决复杂任务&#xff0c;程序执行的结果反过来增强语言模型的输出准确性和逻辑性。…

java基础概念36:正则表达式1

一、正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则&#xff1b;作用二&#xff1a;在一段文本中查找满足要求的内容。——爬虫 二、正则表达式 2-1、字符类 示例&#xff1a; public static void main(String[] args) {System.out.println("a".matc…

VsCode 插件推荐(个人常用)

VsCode 插件推荐&#xff08;个人常用&#xff09;

工业储能柜的大小该如何选择,工商储能系统设备哪家好?

在能源转型和可持续发展的大潮中&#xff0c;工商业储能系统因其提升清洁能源利用率、降低电能损耗、实现“双碳”目标等优势而备受青睐。它们不仅增强了电力系统的可靠性和灵活性&#xff0c;还帮助企业降低成本、提高经济效益。储能系统通过负荷管理适应电价波动&#xff0c;…

人工智能之数学基础:线性代数在人工智能中的地位

本文重点 从本文开始&#xff0c;我们将开启线性代数的学习&#xff0c;在线性代数中有向量、矩阵&#xff0c;以及各种性质&#xff0c;那么这些数学知识究竟和人工智能有什么关系呢&#xff1f; 重要性 机器学习和深度学习的本质就是训练模型&#xff0c;要想训练模型需要使…

数字IC后端实现时钟树综合系列教程 | Clock Tree,Clock Skew Group之间的区别和联系

Q: Clock&#xff0c;Clock Tree和Skew Group有何区别&#xff1f;Innovus CCOPT引擎是如何使用这些的&#xff1f; Clock是时序约束SDC中的时钟定义点。 create_clock -name clk_osc -period $period_24m [get_ports xin_osc0_func] 时钟树综合(Clock Tree Synthesis)之前应…

飞桨大模型PaddleOCR

一、新建项目PaddleOCRProject 二、查看开源 pip install paddlepaddle pip install paddleocr指定镜像源下载才快&#xff1a; pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple 三…

31、js中日期操作

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>日期</title> </head> <body></body> <script>// js中日期操作 var datenew Date();document.write("日期时间&am…

【大数据学习 | Spark】Spark中的join原理

join是两个结果集之间的链接&#xff0c;需要进行数据的匹配。 演示一下join是否存在shuffle。 1. 如果两个rdd没有分区器&#xff0c;分区个数一致 &#xff0c;会发生shuffle。但分区数量不变。 scala> val arr Array(("zhangsan",300),("lisi",…

NLP论文速读(CVPR 2024)|使用DPO进行diffusion模型对齐

论文速读|Diffusion Model Alignment Using Direct Preference Optimization 论文信息&#xff1a; 简介&#xff1a; 本文探讨的背景是大型语言模型&#xff08;LLMs&#xff09;通过人类比较数据和从人类反馈中学习&#xff08;RLHF&#xff09;的方法进行微调&#xff0c;以…

小车AI视觉识别--9.目标检测

一、目标检测概述 本节主要解决的问题是如何使用OpenCV中的dnn模块&#xff0c;用来导入一个实现训练好的目标检测网络。但是对opencv的版本是有要求的。目前用深度学习进行目标检测&#xff0c;主要有三种方法&#xff1a; Faster R-CNNsYou Only Look Once(YOLO)Single Shot…

2023年9月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题号 123456789101112131415 答案 CDBCDBACACBBDDA 1. 我们通常说的 “ 内存 ” 属于计算机中的&#xff08;&#xff09;。 A. 输出设备 B. 输 ⼊ 设备 C. 存储设备 D. 打印设备 【答案】 C 【考纲知识点】…

VS2022进行Libigl库编译

目录 一 编译OK 二 编译难点 2.1 cmake问题 2.2 文件编码问题 三 调用链接 一 编译OK 二 编译难点 2.1 cmake问题 vs2022直接多次cmake生成即可。 2.2 文件编码问题 格式保存为GB2312. 三 调用链接 https://github.com/libigl/libigl-example-project

Vue3 el-table 默认选中 传入的数组

一、效果&#xff1a; 二、官网是VUE2 现更改为Vue3写法 <template><el-table:data"tableData"border striperow-key"id"ref"tableRef":cell-style"{ text-align: center }":header-cell-style"{background: #b7babd…

晶圆测试中自动化上下料的重要性与应用

随着科技的飞速发展&#xff0c;硅光技术在通信、数据处理等领域展现出巨大的应用潜力。硅光晶圆作为硅光技术的核心源头组件&#xff0c;其性能的稳定性和可靠性对于整个系统的运行至关重要。因此&#xff0c;对硅光晶圆的测试成为生产过程中不可或缺的一环。近年来&#xff0…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen关于inet_ntoa UDP服务器封装 系…

Perfetto学习大全

Perfetto 是一个功能强大的性能分析和追踪工具&#xff0c;主要用于捕获和分析复杂系统中的事件和性能数据&#xff0c;特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态&#xff0c;以便优化性能和诊断问题。 Perfetto的主要作用…

IDEA2023 SpringBoot整合MyBatis(三)

一、数据库表 CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,gender ENUM(Male, Female, Other),email VARCHAR(100) UNIQUE,phone_number VARCHAR(20),address VARCHAR(255),date_of_birth DATE,enrollment_date DATE,cours…

教学内容全覆盖:航拍杂草检测与分类

1.背景意义 研究背景与意义 随着全球农业生产的不断发展&#xff0c;杂草的管理与控制成为了提升作物产量和质量的重要环节。杂草不仅会与作物争夺水分、养分和光照&#xff0c;还可能成为病虫害的滋生地&#xff0c;从而对农业生产造成严重影响。因此&#xff0c;准确、快速…

【倍数问题——同余系】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10, M 1e3 10; int maxx[M][4]; void consider(int r, int x) {if(x > maxx[r][1]){maxx[r][3] maxx[r][2];maxx[r][2] maxx[r][1];maxx[r][1] x;}else if(x > maxx[r][2]){maxx[…