【嵌入式系统与入门】Day02 Arduino 按键、蜂鸣器与湿温度传感器

news2024/9/21 1:50:20

文章目录

  • 1. 按键控制
    • 1.1 认识按键
    • 1.2 工作原理
    • 1.3 Arduino代码展示
    • 1.4 原理图
    • 1.5 实现去抖【消抖动延时】
  • 2. 蜂鸣器控制
    • 2.1 认识蜂鸣器
    • 2.2 分类
    • 2.3 工作原理
    • 2.4 连线
    • 2.5 Arduino代码展示
  • 3. PWM模拟量输出
    • 3.2 Arduino代码展示
  • 4. 湿温度测量
    • 4.1 认识器件
    • 4.2 传感器接口
    • 4.3 Arduino代码展示【封装库】

1. 按键控制

1.1 认识按键

  • 目的:控制电动机或其他电气设备运行,常用来连通或断开,控制电路
    在这里插入图片描述

1.2 工作原理

  • 原理:K1、K2、K3、K4【开关量】与数字引脚相连,通过对按键操作,展现为电平的高低
    • 不按的情况,K1连接R1,与VCC相连,表现为高电平
    • 按下键时,K1直接与GND相连,表现为低电平
      在这里插入图片描述

1.3 Arduino代码展示

//定义按键
int k1 = 8;
int k2 = 9;
int k3 = 10;
int k4 = 11;

void setup(){
	Serial.begin(9600);
	pinMode(k1, INPUT);
	pinMode(k2, INPUT);
	pinMode(k3, INPUT);
	pinMode(k4, INPUT);
}

void loop(){
	if(!digitalRead(k1))	//按下k1,digitalRead返回值为低电平【即返回为0】,取反为1,打印出“k1被按下”
		Serial.println("K1 is pressed");
	if(!digitalRead(k2))
		Serial.println("K2 is pressed");
	if(!digitalRead(k3))
		Serial.println("K3 is pressed");
	if(!digitalRead(k4))
		Serial.println("K4 is pressed");
	delay(100);
}

1.4 原理图

在这里插入图片描述

  • k1被按下时,看窗口监视器输出什么
    在这里插入图片描述
  • 一下输出3个的“K1 is pressed”的原因是程序的抖动

1.5 实现去抖【消抖动延时】

int k1 = 8, k2 = 9, k3 = 10, k4 = 11; //定义按键
int key = 0; //定义键值
int key1 = 0void setup(){
	Serial.begin(9600);
	pinMode(k1, INPUT_PULLUP);
	pinMode(k2, INPUT_PULLUP);
	pinMode(k3, INPUT_PULLUP);
	pinMode(k4, INPUT_PULLUP);
}

void read_key(){
	if(!digitalRead(k1) || !digitalRead(k2) || !digitalRead(k3) || !digitalRead(k4)){ //同时读取4个按键值,只要有一个按键被按下,则显示为低电平,取反之后为1,条件为真,执行程序
		delay(25); //消抖动延时
		if(!digitalRead(k1) || !digitalRead(k2) || !digitalRead(k3) || !digitalRead(k4)){ //再次读取键值,确认是否有按键
			if(!digitalRead(k1)) key = 1; //记录按下的键值
			if(!digitalRead(k2)) key = 2;
			if(!digitalRead(k3)) key = 3;
			if(!digitalRead(k4)) key = 4;
		}
		else key = 0;
	}
	if(key1 != key) //只要这个键一直按着不松开,则认为按一个键。屏蔽标准键盘输入的联机问题,不会认为按许多键
		key1 = key;
	else 
		key = 0;
}

void loop(){ //主函数,先查询有无按键,有按键的话在屏幕显示结果
	read_key(); //调用读取按键的函数
	if(!key){
		Serial.print("K");
		Serial.print(key);
		Serial.println(" is pressed");
		key = 0; //再初始化为0,方面下次循环
	}
}

2. 蜂鸣器控制

2.1 认识蜂鸣器

  • 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,主要用于电子产品中作发生器件。
    在这里插入图片描述

2.2 分类

  • 按结构
    • 压电蜂鸣器
    • 电磁蜂鸣器
  • 按有无振荡源
    • 有源蜂鸣器
    • 无源蜂鸣器

    a为有源蜂鸣器,b为无源蜂鸣器在这里插入图片描述

2.3 工作原理

  1. 有源蜂鸣器
  • 有源蜂鸣器内部含有振荡电路,主要是通过供应直流电,将恒定直流电转化为一定频率的脉冲信号,从而实现磁场交变,带动钼片振动发声。
  1. 无源蜂鸣器
  • 内部不带震荡源,所以加直流电,磁路恒定,钼片不能振动发声。只有加方波的理想信号,频率不同,震荡出来声音也不同。

2.4 连线

  • 蜂鸣器共连两条线,正极连接到数字8口,负极连接到GND插口中。
    在这里插入图片描述
    在这里插入图片描述

2.5 Arduino代码展示

int buzzer = 8; //定义控制蜂鸣器的数字IO脚,另一脚连接到GND上

void setup(){
	pinMode(buzzer, OUTPUT); //设置数字IO模式,OUTPUT为输出
	//Arduino输送信号控制蜂鸣器响不响,所以定义为OUTPUT
}

void loop(){
	unsigned char i, j; //定义变量
	while(1){
		for(i = 0; i < 80; i ++){ //输出一个频率的声音
			digitalWrite(buzzer, HIGH); //发声音
			delay(1); //延迟1ms
			digitalWrite(buzzer, LOW); //不发声音
			delay(1); //延迟1ms
		}
		for(i = 0; i < 100; i ++){ //输出另一个频率的声音
			digitalWrite(buzzer, HIGH);
			delay(2); //延迟2ms
			digitalWrite(buzzer, LOW);
			delay(2);
		}
	}
}

3. PWM模拟量输出

亮度发生渐变的三色灯——“呼吸灯”,实现灯的变化
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.2 Arduino代码展示

const int red = 3;
const int green = 4;
const int blue = 5;
//3、4、5属于PWM引脚

void setup(){
	set pins 2 through 13 as outputs:
	{
		pinMode(red, OUTPUT);
		pinMode(green, OUTPUT);
		pinMode(blue, OUTPUT);
	}
}

void loop(){
	//低--->高变化【白色形成】
	for(int brightness = 0; brightness < 255; brightness ++){ //0 ~ 255,红绿蓝同步逐渐发生变化
		analogWrite(red, brightness); 
		analogWrite(green, brightness);
		analogWrite(blue, brightness);
		delay(3);
	}
	
	//高--->低变化【白色褪色】
	for(int brightness = 255; brightness >= 0; brightness --){
		analogWrite(red, brightness); 
		analogWrite(green, brightness);
		analogWrite(blue, brightness);
		delay(3);
	}
	
	//显示红色
	for(int brightness = 255; brightness >= 0; brightness --){
		analogWrite(red, brightness); 
		//analogWrite(green, brightness);
		//analogWrite(blue, brightness);
		delay(3);
	}

	//显示绿色
	for(int brightness = 255; brightness >= 0; brightness --){
		//analogWrite(red, brightness); 
		analogWrite(green, brightness);
		//analogWrite(blue, brightness);
		delay(3);
	}

	//显示蓝色
	for(int brightness = 255; brightness >= 0; brightness --){
		//analogWrite(red, brightness); 
		//analogWrite(green, brightness);
		analogWrite(blue, brightness);
		delay(3);
	}

	//显示红绿的混色
	for(int brightness = 255; brightness >= 0; brightness --){
		analogWrite(red, brightness); 
		analogWrite(green, brightness);
		//analogWrite(blue, brightness);
		delay(3);
	}
	
	//显示红蓝混色
	for(int brightness = 255; brightness >= 0; brightness --){
		analogWrite(red, brightness); 
		//analogWrite(green, brightness);
		analogWrite(blue, brightness);
		delay(3);
	}
	
	//显示绿蓝混色
	for(int brightness = 255; brightness >= 0; brightness --){
		//analogWrite(red, brightness); 
		analogWrite(green, brightness);
		analogWrite(blue, brightness);
		delay(3);
	}
}

4. 湿温度测量

4.1 认识器件

  • 用来粗略测试现场环境的湿温度,多为DHT11湿温度传感器。温湿度是模拟信号,但模块经过处理转换成数字信号通过单总线输出。
    在这里插入图片描述

4.2 传感器接口

  • VCC — 电源引脚5V
  • GND — 电源引脚GND
  • DAT — 数字引脚 2
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.3 Arduino代码展示【封装库】

#include "dht11.h" //封装库的头文件

dht11 DHT11; //构造函数封装实例化

#define DHT11PIN 2 //定义引脚

void setup(){
	Serial.begin(9600); //串口通信
	Serial.println("DHT11 TEST PROGRAM");
	Serial.print("LIBRARY VERSION");
	Serial.println(DHT11LIB_VERSION);
	Serial.println();
}

void loop(){
	Serial.println("\n");

	int chk = DHT11.read(DHT11PIN); //返回值为chk

	Serial.print("Read sensor: ");
	switch(chk){
		case DHTLIB_OK
			Serial.println("OK");
			break;
		case DHTLIB_ERROR_CHECKSUM
			Serial.println("Checksum error");
			break;
		case DHTBIL_ERROR_TIMEOUT
			Serial.println("Time out error");
			break;
		default:
			Serial.println("Unknown error");
			break;
	}

	Serial.print("Humidity(%): "); //打印湿度
	Serial.print((float)DHT11.humidity, 2); //显示两位小数

	Serial.print("Temperature(oC): "); //打印温度
	Serial.print((float)DHT11.temperature, 2);

	Serial.print("Temperature(oF): "); //打印温度
	Serial.print(Fahrenheit(DHT11.temperature), 2);

	Serial.print("Temperature(K): "); //打印温度
	Serial.print(Kelvin(DHT11.temperature), 2);

	Serial.print("Dew Point(oC): "); //打印
	Serial.print(dewPoint(DHT11.temperature, DHT11.humidity));

	Serial.print("Dew PointFast(oC): "); //打印
	Serial.print(dewPoint(DHT11.temperature, DHT11.humidity));

	delay(2000);

	





	}
}


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

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

相关文章

CMU-自主探索导航系统(TARE FAR Planner)学习-All in one

参考引用 Autonomous Exploration Development EnvironmentTARE机器人自主导航系统社区-CSDN社区云TARE机器人自主导航系统公开课1TARE机器人自主导航系统公开课2CMU团队开发的全套开源自主导航算法FAR Planner —— IROS2022 最佳学生论文&#xff1c;论文阅读&#xff1e;TAR…

【源码分析】XXL-JOB的执行器的注册流程

目的&#xff1a;分析xxl-job执行器的注册过程 流程&#xff1a; 获取执行器中所有被注解(xxlJjob)修饰的handler执行器注册过程执行器中任务执行过程 版本&#xff1a;xxl-job 2.3.1 建议&#xff1a;下载xxl-job源码&#xff0c;按流程图debug调试&#xff0c;看堆栈信息…

【ONE·C++ || stack queue (一)】

总言 主要介绍栈和队列的基本函数使用&#xff1a;栈和队列、优先级队列、适配器、反向迭代器。 文章目录 总言1、栈和队列接口基本介绍1.1、基本介绍1.2、相关例题1.2.1、最小栈1.2.2、栈的压入、弹出序列1.2.3、逆波兰表达式求值 2、适配器介绍2.1、引入&#xff1a;如何实现…

儿童用灯哪个品牌好?分享五款儿童护眼台灯品牌

家中有小朋友上了幼儿园就已经戴上了眼镜&#xff0c;太让人心疼了 近视已经成为世界难题&#xff0c;而我国儿童近视形式尤为严峻 据官方数据显示&#xff0c;我国儿童青少年总体近视率竟高达52.7% 如何保护孩子眼睛&#xff0c;儿童用灯哪个品牌好&#xff1f; 那今天&am…

Open vSwitch 入门实践(8) VXLAN实验

目录 什么是VXLAN&#xff1f; VXLAN解决了什么问题&#xff1f; VXLAN网络如何工作&#xff1f; 简单VXLAN实验 主机A 主机B 测试 什么是VXLAN&#xff1f; VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0…

Spring依赖注入 - Resource注解详解及与Autowired注解区别

上篇博客我们讲了Spring中的自动注入(byName,byType)和Autowired注解的工作原理以及源码分析&#xff0c;那么这次&#xff0c;我们来分析还没讲完的&#xff0c;剩下的核心的方法&#xff1a; Nullable Object resolveDependency(DependencyDescriptor descriptor, Nullable …

0.96寸OLED液晶显示器

在日常的小项目制作中我们经常会接触到OLED液晶显示器&#xff0c;本文介绍0.96寸液晶显示器的基本原理&#xff0c;辅助我们后续的小项目开发 OLED被称为有机激光二极管&#xff0c;也被称为有机激光显示&#xff0c;OLED采用有机材料涂层和玻璃基板&#xff0c;当有电流通过…

#Chrome扩展程序开发教程--02:Hello Extensions

#Chrome扩展程序开发教程--02&#xff1a;Hello Extensions 引言1、Hello Extensions2、固定扩展程序3、重新加载扩展程序4、查看扩展程序的输出 引言 本系列博客旨在带来最新的Chrome扩展程序开发入门教程。 1、Hello Extensions 本节博客中&#xff0c;笔者将带领读者创建一个…

C++附加篇: 空间适配器

"我有时难过&#xff0c;却还有些抚慰和感动。" 一、我们来谈谈空间适配器 (1) 什么是空间配置器? STL的六大组件&#xff0c;容器、算法、迭代器、适配器、仿函数&#xff0c;最后一个也就是"空间适配器"。 所谓"空间适配器"&#x…

轻松掌握K8S使用kubectl操作配置文件挂载ConfigMap和密钥Secret知识点05

1、挂载应用配置文件配置集ConfigMap 当有许多应用如redis、mysql&#xff0c;希望将它的配置文件挂载出去&#xff0c;以便随时修改&#xff0c;可以用ConfigMap配置集 具体用法查看使用命令行操作里的 3、ConfigMap配置集实战 2、挂载应用配置文件的敏感信息Secret Secre…

JAVA开发运维(云基础设备监控)

在大型的商用系统中&#xff0c;经常需要监控云设备的健康状态&#xff0c;性能情况&#xff0c;流量数据等。及时发现系统问题&#xff0c;及时修复&#xff0c;以确保系统的高可用。检查云资源的工作内容主要包括基础监控、主动拨测、用户体验、APM监控、指标体系、业务分析、…

Java运行时内存管理

一、前言 希望能在我们平时开发写代码的时候&#xff0c;能够知道当前写的这段代码&#xff0c;内存方面是如何分配的。 我们深知&#xff0c;一个Java程序员在很多时候根本不用操心内存的释放&#xff0c;而是依靠JVM去管理&#xff0c;以前写C代码的时候&#xff0c;却要时刻…

SAP 自定义生产订单状态

1、生产订单通常系统有一整套订单状态&#xff0c;做PP的各位同学都应该知道。 CRTD状态 REL已下达 CNF已报工 DLV已入库 TECO技术性完成 等等状态这里就不在罗列了&#xff0c;可以自行在生产订单中看到 2、这篇文章主要是在生产订单系统外&#xff0c;在自定义一套状态。这个…

Spring更简单的读取和存储Bean(基于注解)

目录 ①从Maven中央仓库获取spring-context和spring-beans的依赖&#xff0c;将依赖引入到pom.xml中 ②配置扫描路径 ③添加注解存储Bean对象&#xff08;可以使用5大类注解和方法注解&#xff09; 类注解&#xff08;写在类上&#xff0c;作用于类上&#xff09; Contro…

【致敬未来的攻城狮计划】— 连续打卡第十一天:FSP固件库开发点亮第一个灯。

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

leetcode刷题--辅助工具

idea插件 插件商店搜索leetcode&#xff0c;可以让你利用idea调试leetcode的题目 插件首先需要填写用户名密码登录&#xff0c;登录上就可以在idea搜题、做题、提交等 注意&#xff1a; 一些版本登录可能登录失败&#xff0c;解决方法是换leetcode地址为leetcode.cn。 有些可…

通过用户名密码认证保障 MQTT 接入安全

认证是一种安全措施&#xff0c;用于识别用户并验证他们是否有权访问系统或服务器。它能够保护系统免受未经授权的访问&#xff0c;确保只有经过验证的用户才能使用系统。 物联网连接万物&#xff0c;对试图访问基础设施的用户进行认证至关重要。未经授权的访问存在重大的安全…

数据保管库的数据质量错误

数据保管库的数据质量错误 在过去的几年里&#xff0c;数据仓库发生了巨大的变化&#xff0c;但这并不意味着支撑健全数据架构的基本原理需要被抛在窗外。事实上&#xff0c;随着GDPR等数据法规的日益严格以及对优化技术成本的重新重视&#xff0c;我们现在看到了“Data Vault…

设计模式之备忘录模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、备忘录模式是什么&#xff1f; 备忘录模式是一种行为型的软件设计模式&#xff0c;在不破坏封装的前提下&#xff0c;获取一个…

OpenCV实例(八)行人跟踪

OpenCV实例&#xff08;八&#xff09;行人跟踪 1.目标跟踪概述2.基于背景差分检测运动物体2.1 实现基本背景差分器2.2 使用MOG背景差分器2.3 使用卡尔曼滤波器寻找运动趋势 3.跟踪行人 作者&#xff1a;Xiou 1.目标跟踪概述 目标跟踪是对摄像头视频中的移动目标进行定位的过…