毕业设计 单片机手势检测识别系统 - arduino 物联网 嵌入式

news2024/11/24 5:06:02

文章目录

  • 0 前言
  • 1 简介
  • 2 主要器件
  • 3 实现效果
  • 4 设计原理
  • 5 部分核心代码
  • 6 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于单片机的手势检测识别系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

1 简介

2 主要器件

  • Arduino Nano R3
  • PIR传感器
  • OLED显示模块(128X64)
  • 热阵列传感器

3 实现效果

成品展示
在这里插入图片描述

在这里插入图片描述

4 设计原理

PIR传感器:

PIR传感器:一种电子传感器,测量从其视野内的物体辐射的红外(IR)光。最常用于基于PIR的运动检测器。所有温度高于绝对零度的物体都会以辐射的形式放出热能,通常这种辐射对人眼来说是不可见的,因为它是以红外波长辐射,但它可以被为此目的设计的电子设备检测到。

在这种情况下,术语“无源”指的是这样一个事实,即PIR设备不产生或辐射用于检测目的的能量。它们完全通过探测物体发射或反射的红外辐射来工作,它们不能探测或测量热量。
在这里插入图片描述
TPA81:

热电堆阵列,检测2微米~22微米内的红外线(辐射热的波长)
同时测量8个相邻点的温度
控制伺服系统来平移模块并建立热成像
检测2米(6英尺)范围内的蜡烛火焰,不受环境光影响
Arduino IDE

在这里插入图片描述
电路图:
在这里插入图片描述
如果想使用8个PIR传感器,应将8个单个PIR传感器连接到Arduino板上,并逐个读取它们
在这里插入图片描述
软件部分

运行Arduino板步骤:

  • 在www.arduino.cc/en/Main/Software下载操作系统软件,并按照说明安装集成开发环境软件
  • 运行Arduino IDE,清除文本编辑器,在文本编辑器中复制下面的代码
  • 导航至草图并包含库(从以下链接下载库),点击添加压缩库并添加库
  • 在工具和电路板中选择电路板,选择Arduino Nano
  • 将Arduino连接到电脑,并在工具和端口中设置通讯端口
  • 按上传(箭头符号)按钮

在这里插入图片描述
在这里插入图片描述
运行此代码后,在 Arduino IDE 中打开串行终端并查看 TPA81 感应到的 8 阵列温度。每行的第一个数字属于总温度。

要手动定义手势,需知道手部温度,并将其设置为偏移量。

将偏移量设置为 29 度,上传以下一代码查看在 TPA81 前的手部动作。
在这里插入图片描述

5 部分核心代码

#include <Wire.h>
#include <TPA81.h>

// Create new TPA81 instance
TPA81 tpa;

void setup() {
  Serial.begin(9600);

  // You need to begin the Wire library to use TPA81 library
  Wire.begin();
}

void loop() {
  // Print temperature light
  Serial.print(tpa.getAmbient());
  Serial.print(" ");

  // Print all temperature point
  for (int i = 1; i <= 8; i++)
  {
    Serial.print(tpa.getPoint(i));
    Serial.print(" ");
  }
  Serial.println("\n");
  
  delay(500);
}

const uint8_t Signal816[16] PROGMEM = //mobie signal
{
    0xFE,0x02,0x92,0x0A,0x54,0x2A,0x38,0xAA,0x12,0xAA,0x12,0xAA,0x12,0xAA,0x12,0xAA
};

const uint8_t Msg816[16] PROGMEM =  //message
{
    0x1F,0xF8,0x10,0x08,0x18,0x18,0x14,0x28,0x13,0xC8,0x10,0x08,0x10,0x08,0x1F,0xF8
};

const uint8_t Bat816[16] PROGMEM = //batery
{
    0x0F,0xFE,0x30,0x02,0x26,0xDA,0x26,0xDA,0x26,0xDA,0x26,0xDA,0x30,0x02,0x0F,0xFE
};

const uint8_t Bluetooth88[8] PROGMEM = // bluetooth
{
    0x18,0x54,0x32,0x1C,0x1C,0x32,0x54,0x18
};

const uint8_t GPRS88[8] PROGMEM = //GPRS
{
    0xC3,0x99,0x24,0x20,0x2C,0x24,0x99,0xC3
};

const uint8_t Alarm88[8] PROGMEM = //alram
{
    0xC3,0xBD,0x42,0x52,0x4E,0x42,0x3C,0xC3
};

void command(uint8_t cmd){
    digitalWrite(OLED_DC, LOW);
    SPIWrite(&cmd, 1);
}

void SPIWrite(uint8_t *buffer, int bufferLength) {
    int i;
    for (i = 0; i < bufferLength; i++) {
        SPI.transfer(buffer[i]);
    }
}

void SSD1306_begin()
{

    pinMode(OLED_RST, OUTPUT);
    pinMode(OLED_DC, OUTPUT);
    pinMode(OLED_CS, OUTPUT);
    SPI.begin();
    
    SPI.setClockDivider(SPI_CLOCK_DIV128);
    
    digitalWrite(OLED_CS, LOW);
    digitalWrite(OLED_RST, HIGH);
    delay(10);
    digitalWrite(OLED_RST, LOW);
    delay(10);
    digitalWrite(OLED_RST, HIGH);
    
    command(SSD1306_DISPLAYOFF);
    command(SSD1306_SETDISPLAYCLOCKDIV);
    command(0x80);                              // the suggested ratio 0x80
    
    command(SSD1306_SETMULTIPLEX);
    command(0x3F);
    command(SSD1306_SETDISPLAYOFFSET);
    command(0x0);                               // no offset
    command(SSD1306_SETSTARTLINE | 0x0);        // line #0
    command(SSD1306_CHARGEPUMP);
    command((VCCSTATE == SSD1306_EXTERNALVCC) ? 0x10 : 0x14);
    
    command(SSD1306_MEMORYMODE);
    command(0x00);                              // 0x0 act like ks0108
    
    command(SSD1306_SEGREMAP | 0x1);
    command(SSD1306_COMSCANDEC);
    command(SSD1306_SETCOMPINS);
    command(0x12);           // TODO - calculate based on _rawHieght ?
    command(SSD1306_SETCONTRAST);
    command((VCCSTATE == SSD1306_EXTERNALVCC) ? 0x9F : 0xCF);
    command(SSD1306_SETPRECHARGE);
    command((VCCSTATE == SSD1306_EXTERNALVCC) ? 0x22 : 0xF1);
    command(SSD1306_SETVCOMDETECT);
    command(0x40);
    command(SSD1306_DISPLAYALLON_RESUME);
    command(SSD1306_NORMALDISPLAY);
    command(SSD1306_DISPLAYON);
}

void SSD1306_clear(uint8_t* buffer)
{
	int i;
	for(i = 0;i < WIDTH * HEIGHT / 8;i++)
	{
		buffer[i] = 0;
	}
}

void SSD1306_pixel(int x, int y, char color, uint8_t* buffer)
{
    if(x > WIDTH || y > HEIGHT)return ;
    if(color)
        buffer[x+(y/8)*WIDTH] |= 1<<(y%8);
    else
        buffer[x+(y/8)*WIDTH] &= ~(1<<(y%8));
}

void SSD1306_char1616(uint8_t x, uint8_t y, uint8_t chChar, uint8_t* buffer)
{
	uint8_t i, j;
	uint8_t chTemp = 0, y0 = y, chMode = 0;

	for (i = 0; i < 32; i++) {
		chTemp = pgm_read_byte(&Font1612[chChar - 0x30][i]);
		for (j = 0; j < 8; j++) {
			chMode = chTemp & 0x80? 1 : 0; 
			SSD1306_pixel(x, y, chMode, buffer);
			chTemp <<= 1;
			y++;
			if ((y - y0) == 16) {
				y = y0;
				x++;
				break;
			}
		}
	}
}

void SSD1306_char(unsigned char x, unsigned char y, char acsii, char size, char mode, uint8_t* buffer)
{
    unsigned char i, j, y0=y;
    char temp;
    unsigned char ch = acsii - ' ';
    for(i = 0;i<size;i++) {
        if(size == 12)
        {
            if(mode)temp = pgm_read_byte(&Font1206[ch][i]);
            else temp = ~pgm_read_byte(&Font1206[ch][i]);
        }
        else 
        {            
            if(mode)temp = pgm_read_byte(&Font1608[ch][i]);
            else temp = ~pgm_read_byte(&Font1608[ch][i]);
        }
        for(j =0;j<8;j++)
        {
            if(temp & 0x80) SSD1306_pixel(x, y, 1, buffer);
            else SSD1306_pixel(x, y, 0, buffer);
            temp <<= 1;
            y++;
            if((y-y0) == size)
            {
                y = y0;
                x++;
                break;
            }
        }
    }
}

void SSD1306_string(uint8_t x, uint8_t y, const char *pString, uint8_t Size, uint8_t Mode, uint8_t* buffer)
{
    while (*pString != '\0') {       
        if (x > (WIDTH - Size / 2)) {
            x = 0;
            y += Size;
            if (y > (HEIGHT - Size)) {
                y = x = 0;
            }
        }
        
        SSD1306_char(x, y, *pString, Size, Mode, buffer);
        x += Size / 2;
        pString++;
    }
}

void SSD1306_char3216(uint8_t x, uint8_t y, uint8_t chChar, uint8_t* buffer)
{
    uint8_t i, j;
    uint8_t chTemp = 0, y0 = y, chMode = 0;

    for (i = 0; i < 64; i++) {
        chTemp = pgm_read_byte(&Font3216[chChar - 0x30][i]);
        for (j = 0; j < 8; j++) {
            chMode = chTemp & 0x80? 1 : 0; 
            SSD1306_pixel(x, y, chMode, buffer);
            chTemp <<= 1;
            y++;
            if ((y - y0) == 32) {
                y = y0;
                x++;
                break;
            }
        }
    }
}

void SSD1306_bitmap(uint8_t x,uint8_t y,const uint8_t *pBmp, uint8_t chWidth, uint8_t chHeight, uint8_t* buffer)
{
	uint8_t i, j, byteWidth = (chWidth + 7)/8;
	for(j = 0;j < chHeight;j++){
		for(i = 0;i <chWidth;i++){
			if(pgm_read_byte(pBmp + j * byteWidth + i / 8) & (128 >> (i & 7))){
				SSD1306_pixel(x + i,y + j, 1, buffer);
			}
		}
	}		
}

void SSD1306_display(uint8_t* buffer)
{
	command(SSD1306_COLUMNADDR);
	command(0);         //cloumn start address
	command(WIDTH -1); //cloumn end address
	command(SSD1306_PAGEADDR);
	command(0);         //page atart address
	command(PAGES -1); //page end address
    digitalWrite(OLED_DC, HIGH);
    SPIWrite(buffer, WIDTH * HEIGHT / 8);
}


6 最后

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

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

相关文章

uniapp中video层级太高(或者在页面中不跟随页面滚动)解决方案

我觉得这个问题有必要记录一下。最近项目中遇到的问题&#xff1a;项目是uniapp开发&#xff0c;有一个商品详情的页面和一个视频竖向轮播的页面。 问题描述 1、商品详情页上面是图片轮播(包含视频)&#xff0c;下面是商品详情&#xff0c;当页面上下滑动时&#xff0c;如果当…

微服务框架 SpringCloud微服务架构 服务异步通讯 52 惰性队列 52.2 惰性队列

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯52 惰性队列52.2 惰性队列52.2.1 惰性队列52.2.2 总结52 惰性队列 52.2 惰性队列 52.2.1 惰…

【BTC】Fork

区块链中fork的分类&#xff1a; state fork&#xff1a; 两个节点差不多同一个时候挖到了矿&#xff0c;就会出现一个临时性的分叉。 forking attack&#xff08;deliberate fork&#xff09;&#xff1a;也是属于对比特币这个区块链当前的状态产生的意见分歧&#xff0c;只不…

汇编语言笔记——汇编程序开发、汇编大作业

文章目录传送门汇编程序开发汇编代码初步实践dos虚拟机与挂载实模式Hello World代码解析汇编链接重新汇编与批处理反汇编与debug保护模式Hello WorldVS2017masm32环境配置汇编基础语言概述汇编环境汇编语言语句格式常用伪指令数据定义符号定义操作符\$OFFSET算术操作符逻辑操作…

【基础】RabbitMQ 基础

RabbitMQ 基础RabbitMQ 基本介绍RabbitMQ 基本概念ConnectionChannelVirtual HostQueueExchangedirectfanouttopicheadersRabbitMQ 基本介绍 RabbitMQ 是使用 Erlang 语言开发的基于 AMQP 协议来实现的开源消息队列系统。 RabbitMQ 的特点&#xff1a; 灵活路由&#xff1a;E…

社招前端二面react面试题整理

解释 React 中 render() 的目的。 每个React组件强制要求必须有一个 render()。它返回一个 React 元素&#xff0c;是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素&#xff0c;则必须将它们组合在一个封闭标记内&#xff0c;例如 <form>、<group>、<div&g…

什么是数据标注,它的用途是什么?

什么是数据标注&#xff1f; 从本质上讲&#xff0c;数据标注是对计算机视觉或自然语言处理 (NLP)可识别的材料内容进行标记的过程。当我们标记或标注这些类型的数据时&#xff0c;它们变得更容易输入算法或编程以通过 NLP 进行解释。 得益于数据标注&#xff0c;人工智能 (…

【Vue】Vue项目打包上线流程--20221219

Vue项目打包上线流程 我的链接https://blog.csdn.net/m0_46629123/article/details/128371149 1.打包 npm run build 2.准备服务器 1.准备demo文件夹&#xff0c;并CMD输入npm init 2.CMD输入npm i express 3.新建并编辑server.js server.js const express require(…

电动汽车对系统运行的影响(Matlab实现)

目录 0 写在前面 1 插式电动车介绍 2 全系统 PEV 充电需求估算 2.1 旅行模式模型 2.2 能源消耗模型 2.3 电力消耗模型 3 单个 PEV 充电设施需求估算 4 PEV充电站需求估算网络 5 电动汽车对电力系统影响的评估 6 系统模型 6.1 结果 6.2 Matlab代码 0 写在前面 在不久…

论文笔记High-Resolution Image Synthesis with Latent Diffusion Models

普通的扩散模型在像素空间操作&#xff0c;运算复杂度较高。为了保证在低资源下训练扩散模型&#xff0c;并保留扩散模型的质量和灵活性&#xff0c;该论文使用预训练的自编码器得到隐含空间&#xff0c;并在隐含空间中训练扩散模型。另一方面&#xff0c;该论文使用cross-atte…

设计模式原则 - 里氏替换原则

一 背景&#xff1a; 里氏替换原则是针对继承的。介绍前先聊聊继承性的特点 继承优势 提高代码的复用性&#xff08;每个子类有拥有父类的属性和方法&#xff09;提高代码的可扩展性 继承劣势 继承是侵入性的&#xff08;只要继承&#xff0c;就必须拥有父类的属性和方法&…

齐鲁转债上市价格预测

齐鲁转债基本信息转债名称&#xff1a;齐鲁转债&#xff0c;评级&#xff1a;AAA&#xff0c;发行规模&#xff1a;80.0亿元。正股名称&#xff1a;齐鲁银行&#xff0c;今日收盘价&#xff1a;4.28&#xff0c;转股价格&#xff1a;5.87。当前转股价值 转债面值 / 转股价格 *…

endo BCN-PEG4-COOH,endo BCN-四聚乙二醇-羧酸

中文名&#xff1a;endo BCN-四聚乙二醇-羧酸 英文名&#xff1a;endo BCN-PEG4-acid CAS号&#xff1a;1881221-47-1 分子式/分子量&#xff1a;C22H35NO8/441.5 结构式 溶解性&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等&#…

公务员备考(四十) 图推提升

第一章 平面专题总结 一、线总结 1、曲线直线 曲直图形判断原则:有曲则为曲,无曲才为直。阴影图形不讨论曲直性。 曲直规律图形特点:a.纯直线曲线图形;b.简笔画实物图形;c.单区域简单图形;d.内外结构图形 2、平行线(含回旋折线) a.轮廓自带平行线条;b.N字型、Z字…

Vs Code的使用

在上一章中有使用到Vs Code但是没有相关的介绍。 什么是Vs Code&#xff1f; 1、vscode是Microsoft公司在美国的一个项目&#xff1a;一个跨平台的源代码编辑器&#xff0c;用于在Mac OS X&#xff0c;Windows和Linux上运行的现代Web和云应用程序。通俗地说&#xff0c;是一款…

MapReduce案列-数据去重

文章目录一&#xff0c;案例分析&#xff08;一&#xff09;数据去重介绍&#xff08;二&#xff09;案例需求二&#xff0c;案例实施&#xff08;一&#xff09;准备数据文件&#xff08;1&#xff09;启动hadoop服务&#xff08;2&#xff09;在虚拟机上创建文本文件&#xf…

最新前端面试总结

介绍 plugin 插件系统是 Webpack 成功的一个关键性因素。在编译的整个生命周期中&#xff0c;Webpack 会触发许多事件钩子&#xff0c;Plugin 可以监听这些事件&#xff0c;根据需求在相应的时间点对打包内容进行定向的修改。 一个最简单的 plugin 是这样的: class Plugin{// …

自动驾驶CarSim和Simulink联合仿真的完美攻略!

作者 | 车路慢慢 仿真秀科普作者 导读&#xff1a;大家好&#xff0c;我叫李慢慢&#xff0c;仿真秀专栏作者&#xff0c;某汽车主机厂汽车仿真工程师&#xff0c;正在筹备转岗。自2020年起&#xff0c;我就在仿真秀App分享ANSA教程和攻略,并学习自动驾驶仿真。 中汽院智能网…

如何通过手机APP在线监控西门子PLC的运行状态

随着工业生产、制造环节的不断神话&#xff0c;工业设备越来越精细复杂&#xff0c;借助PLC实现的自动化控制技术被广泛的应用于工业领域中&#xff0c;具备丰富的应用场景。在物联网和无线通信技术的发展下&#xff0c;越来越多的工业企业系统通过手机APP监控现场PLC的运行状态…