2023年8月知识复习

物联网总括

物联网即通过网络将客观事物进行智能化互联网络系统。互联网主要是人与人、人与计算机之间的通信,而物联网主要是物联网设备之间的通信。

注意:数据上传到云端不是物联网的必要条件。物联网可以仅在本地网络和局域网中进行通信和数据处理。

比如在工业控制系统中,设备之间需要实时通信和数据处理,但出于隐私、安全性或数据管控的考虑,避免将数据上传到云端。

物联网应用于人们生活的方方面面,给人们带来了巨大的便利,如智能家居、智慧城市、工业自动化、农业、医疗保健、交通运输等。

物联网的优势:1、实时监测和远程控制;2、数据采集和分析;3、自动化和智能化;4、跨界互联

物联网的劣势:1、安全和隐私问题;2、标准和互操作性问题;3、复杂性和成本;4、巨量的数据处理

C语言语法

关键字

1、数据类型关键字

A基本数据类型(5个)

void: 是用来修饰函数的参数或返回值的,代表函数没有参数或没有返回值

char:用 char 定义的变量是字符型变量,占1个字节。char的长度不会随着计算机系统的升级而改变。

int :使用 int 定义的变量是整型变量,在32位系统和64位系统下占4个字节,在16位系统下占2个字节。

float :用 float 定义的变量是单浮点型的实数,占4个字节。如果是单浮点数,要记得在数字后面加 f ;否则默认数字为 double 型

double :用 double 定义的变量是双浮点型的实数,占8个字节。

B 类型修饰关键字(4个)

short :修饰int,短整型数据,可省略被修饰的int。使用 short 定义的变量是短整型变量,在16位系统、32位系统和64位系统中都占2个字节。

long :修饰int,长整形数据,可省略被修饰的int。使用 long 定义的变量是长整型变量,在16位系统、32位系统和64位系统下占4个字节。

signed :修饰整型数据,有符号数据类型。代表定义的数据是有符号的,可以保存正数,也可以保存负数。默认情况下 signed 可以省略。

unsigned :修饰整型数据,无符号数据类型。  代表定义的数据是无符号的数据,只能保存正数和 0 。

C 复杂类型关键字(5个)

struct :在C语言中,可以使用结构体( Struct )来存放一组不同类型的数据。结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。

union :union(共同体或联合)就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。
共用体的初始化与赋值方式与结构体相同。但任何时刻,共用体只有一个成员变量能够存在

enum :枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。枚举名不能重复,它从第一个成员开始进行编号,从0开始。

typedef :重命名相关的关键字。作用是给一个已有的类型,重新起个类型名,并没有创造一个新的类型。

sizeof :用来测变量、数组的占用存储空间的大小(字节数)。

D 存储级别关键字(6个)

auto :在函数内声明的所有变量默认情况下都被视为具有auto存储类别。当函数退出时,使用auto存储类别的变量也将自动销毁。

static :修饰变量时为静态变量,分配在静态变量区;修饰函数时,为静态函数。全局变量,所有代码都可以访问到;而静态全局变量只有当前文件可以访问。二者生存周期都是程序运行到程序结束。静态局部变量的生存周期也是程序运行到程序结束,但是局部变量的生存周期是函数调用到函数返回。静态局部变量的生存周期比局部变量的长。

register :register修饰变量的作用:尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的。

extern :用关键字 extern 对变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

const :关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。

volatile :用 volatile 定义的变量,是易改变的,即告诉 cpu 每次用 volatile 变量的时候,重新去内存中取,保证用的是最新的值,而不是寄存器中的备份。volatile 关键字现较少使用。

2、流程控制关键字

A 跳转结构(4个)

return :用在函数体中,返回特定值(或者是void值,即不返回值)

continue :结束当前循环,开始下一轮循环

break :跳出当前循环或switch结构

goto :无条件跳转语句

B 分支结构(5个)

if :条件语句

else :条件语句否定分支(与if连用)

switch :开关语句(多重分支语句)

case :开关语句中的分支标记

default :开关语句中的“其他”分治,可选。

C 循环结构(3个)

for :for循环结构

do :do循环结构,do 1 while(2); 的执行顺序是 1->2->1...循环,2为循环条件

while :while循环结构

条件语句

 if 语句

 if 语句能否执行,由它的判断表达式决定。若表达式为真,则执行语句,反之不执行。

 if 语句有三种形式,分别是:

1、if(布尔表达式){执行语句};

2、if(布尔表达式){执行代码}else{执行代码};

3、if(布尔表达式){执行代码}else if(布尔表达式){执行代码}else{执行代码};

 switch 语句

switch语句中,当变量表达式中的值对应case中的值时,执行case后面的语句;如果都不符合,则执行default后面的语句。

if语句比较灵活,常用于范围判断;而switch语句进行条件判断后直接执行到条件语句,更加高效。当分支比较多时,switch语句的执行效率比较高,而且结构更清晰

循环语句

for循环

for(表达式1; 表达式2; 表达式3)循环语句;

表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环时候终止。表达式3为调整部分,用于循环条件的调整。

while循环

在while语句中,只要条件判断语句成立,就会不断执行循环。

do-while循环

do-while循环与while循环大体相同,区别在于该循环会先执行一次语句,再开始判断是否继续执行循环。它无论如何都会执行一次语句。

跳转语句

return :返回特定值

continue :结束当前循环,开始下一轮循环

break :跳出当前循环或switch结构

goto :无条件跳转语句

函数的封装和调用

函数封装可以理解为为一个功能写一个子函数。格式返回值类型  函数名(参数列表){函数体;
}

封装的好处:


1、实现代码的复用,避免编写重复的代码

2、提高代码的可读性和可维护性

函数调用指一个函数暂时中断本函数的运行,去执行另一个函数的过程。
主函数可以调用子函数,子函数之间也可以相互调用。但是,子函数不能调用主函数。

函数的原型声明

一般函数的声明写在程序的开头或者放在头文件中。
如果被调用函数定义在调用函数之后,在函数使用之前,需要进行原型声明。
当被调用函数与调用函数不在同一个文件时,必须使用函数声明。

开发板

MCU

微控制单元(Micro-controller Unit;MCU) 是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机。

MCU常用到的技能:嵌入式系统开发、C/C++编程、汇编语言编程、低功耗设计、实时操作系统(RTOS)、通信协议(UART、SPI、I2C、CAN等)、传感器接口和数据处理。

MCU应用方向:消费类电子产品、工业自动化、汽车电子、医疗设备、物联网(IoT)、安全系统、军事和航空航天。

MCU与SOC的区别

 SOC(System on a Chip)和MCU(Microcontroller Unit)有一定的联系,同时也有一些区别。SOC是一种集成电路芯片,它将多个功能和模块集成在一个芯片上,包括处理器核心、存储器、外设接口、通信接口、图形处理器等。

比如说,Arduino和STM32是MCU,而树莓派是SOC。

在技术层面上,MCU可以被视为SOC的一个子集。因为SOC可以集成与MCU相同或相似的处理器核心和与之对应的外设接口,同时还拥有更丰富的功能和性能。

SOC通常用于较复杂的计算和多媒体处理任务,如智能手机、平板电脑、嵌入式系统等。与SOC相比,MCU的功能相对简单,主要用于低功耗、实时性要求较高的嵌入式应用。MCU常用于控制和处理传感器、执行简单任务和实时操作。

在二者的选择上,通常由性价比来决定。

Arduino

Arduino使用的编程语言是C/C++。

Arduino通常采用裸机编程方式。

Arduino开发难度和学习难度较低,开发者只需要通过简单学习,了解各个引脚和函数的作用,便可利用它开发出各种出色的项目。

Arduino通常采用低功耗微控制器,处理能力较弱,适合处理简单的控制任务和传感器数据。

STM32

STM32使用的编程语言是C/C++,其中最常使用C语言。

STM32支持实时操作系统(RTOS)

STM32系列微控制器具有较高的处理能力和更大的存储容量,适用于较复杂的计算和控制任务。它的时钟频率高,可以快速处理数据,支持实时控制和高速通信。

树莓派

树莓派上面可以使用很多种编程语言,python,C,java等都可以,但最常使用python。

树莓派支持多种操作系统,其中最受欢迎的是基于Linux的Raspbian操作系统,也可以安装其他Linux发行版如Ubuntu、Debian等。

树莓派具有较强的处理性能和较大的内存。它可以运行复杂的应用程序和多任务,并具备网络连接图形处理能力。

协议

UART

简介

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种异步、串行、全双工的通信协议。

使用3根线完成,分别是:发送线(TX)接收线(RX)地线(GND),通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信。


发送和接收设备之间的时钟频率可以不同,但是它们需要约定相同的波特率(传输速率)来确保数据的正确传输。

UART数据包格式

起始位:当不传输数据时,UART数据传输线通常保持高电平。若要开始数据传输,发送UART会将传输线从高电平拉到低电平并保持1个时钟周期。

停止位:为了表示数据包结束,发送UART将数据传输线从低电压驱动到高电压并保持1到2位时间。

UART的优点

1、简单易用

2、传输速率快:UART接口支持高速的数据传输,适合需要快速传输大量数据的应用

3、独立性强:UART是异步传输,发送方和接收方不需要同步时钟信号。因此,UART可以在不同硬件平台使用,且不受时钟偏差的影响。

UART的缺点

无法多点通信:UART是一对一通信

两根传输线的限制: UART 要求有传输线和接受线,每条线都只能单向传输。因此,每次传输都需要两根线

IIC

简介

IIC(Inter-Integrated Circuit)是一种同步串行半双工的通信协议,也被称为I2C(Inter-Integrated Circuit)。它是由飞利浦公司(现在的恩智浦半导体公司)在1982年开发的一种简单、高效的通信协议,用于在集成电路(IC)之间进行通信。

IIC使用两根线(时钟线SCL数据线SDA)进行通信,同时支持多个设备共享这两根线,因此适用于多主设备多从设备的应用场景。主设备通过产生时钟信号(SCL)来控制数据的传输,从设备则根据时钟信号进行相应的数据处理。

数据格式

传输状态

数据为有效:

时钟信号为高电平(High)期间,数据线上的数据必须保持稳定

时钟信号为低电平(Low)期间,数据线上方才允许变化

即:数据在时钟线SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须保持稳定

空闲状态:

当IIC总线的数据线SDA和时钟线SCL同时处于高电平(High)时,规定总线为空闲状态。

起始信号:

时钟线SCL为高电平期间(High),数据线SDA由高电平向低电平变化(下降沿)表示起始信号。

终止信号:

时钟线SCL为高电平期间(High),数据线SDA由低电平向高电平变化(上升沿) 表示终止信号。

IIC的优点

多设备共享总线:IIC协议支持多个设备共享同一总线,通过地址区分不同的设备,这使得系统中的设备连接更简洁。

两根线的传输:IIC协议只需要两根线(时钟线和数据线)进行通信,节省了引脚资源。

速度可调节:IIC协议支持不同的通信速率,例如标准模式(100 kHz)和快速模式(400 kHz)。

IIC的缺点

仲裁问题:当多个主设备同时发起通信时,可能会发生冲突,需要通过仲裁机制解决冲突。

系统复杂性:由于多个设备共享总线,需要管理和控制设备的地址分配、冲突解决、时钟同步等问题,增加了系统设计的复杂性。

距离限制:IIC接口的传输距离相对较短,一般在几米范围内,超过一定距离后信号质量可能会下降。

模拟信号和数字信号

模拟信号

保密性差:只要收到模拟信号,就容易得到通信内容。

抗干扰能力弱:电信号在沿线路的传输过程中会受到外界的和通信系统内部的各种噪声干扰,噪声和信号混合后难以分开,从而使得通信质量下降。线路越长,噪声的积累也就越多。

数字信号

保密性强:加强了通信的保密性。

抗干扰能力强:数字信号可以通过差分信号传输、误码校验等技术来减小噪音对信号的影响,提高信号的抗干扰性能。

PWM

简介

脉冲宽度调制(Pulse Width Modulation,PWM),简称脉宽调制。在PWM中,输出信号被表示为一系列固定周期的脉冲。每个脉冲的宽度可以根据输入信号的需求进行调节。脉冲的高电平时间决定了输出信号的功率大小,而周期决定了调制的精度。

PWM的工作原理

PWM的工作原理基于将模拟信号转换为数字信号,并通过调节脉冲的宽度和周期来实现对输出信号的控制。也就是说,通过调整占空比,可以控制输出信号的平均电压或功率。占空比越高,输出信号的平均电压或功率就越高,而占空比越低,输出信号的平均电压或功率就越低。

PWM的优点

精确性:PWM技术提供了非常高的信号精确性。通过调整脉冲的宽度和频率,可以实现对输出信号的准确控制。这对于需要精确控制或调节的应用非常重要,如电机驱动、照明调光等。

数字化:PWM信号是由数字脉冲组成的,这使得它可以很容易地在数字系统中生成和处理。

PWM的缺点

产生噪音:PWM技术的一个缺点是在一些应用中可能产生较高的噪音。

电磁干扰:由于PWM信号的高频切换特性,它们可能对附近的电路和设备产生电磁干扰。

差分信号

概述

差分传输在这两根线上都传输信号,这两个信号的振幅相同相位相反。在这两根线上的传输的信号就是差分信号。差分信号具有强大的抗干扰能力

232/485协议

概述

232/485协议是一种用于串行通信的通信协议,常用于工业自动化领域和数据采集应用中。
232/485协议是由RS-232协议和RS-485协议两种协议组成的。
在使用232/485协议时,可以通过转换器或集成电路将RS-232信号转换为RS-485信号,实现两种不同协议之间的通信。

RS232

RS-232是一种传统的点对点通信的串行通信标准,用于在计算机和外部设备之间进行通信。RS232协议使用单个发送线接收线进行全双工通信。RS-232使用不平衡的电压信号传输数据,适合短距离通信。在RS232中,3~15V是高电平,-3~-15V是低电平。RS232只是改变了电平大小,传输的还是原来串口的0或1的数据。

RS-485

RS-485是针对远程通信多点通信设计的协议。它支持半双工通信,即数据可以在两个方向上传输。RS-485使用平衡的差分信号传输数据,对于长距离通信和抗干扰能力要求较高。

差分信号只需要两根线,不需要地线。差分信号用两根信号线的差值来表示逻辑0和1.且两根线采用双绞线形式缠绕在一起。这样,即使收到干扰,也是两根线同时受到干扰。

Modbus

Modbus是一种串行通信协议,施耐德电气(Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

Modbus协议有多种变体,包括Modbus RTU、Modbus ASCII和Modbus TCP,它们可以在不同的物理层上运行,包括RS-485和以太网。通常Modbus RTU和Modbus ASCII用于串行通信,而Modbus TCP/IP用于宽带网络。

Modbus采用主从结构进行操作,其中主设备(如PLC或计算机)发起与一个或多个从设备之间的通信。主设备向从设备发送读取或写入数据的请求,从设备因此请求的或数据读取操作的确认进行响应。

我们常用的IIC通信协议,需要在物理上连接iic总线,然后加上拉电阻,规定好物理层的高低电平。而 Modbus协议是一种应用层报文传输协议,协议本身并没有定义物理层,定义了控制器能够认识和使用的消息结构

注意Modbus是一主多从的通信协议。从机不会自己发送消息给主站,只能回复从主机发送的消息请求。modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。

 Modbus可以通过不同的物理层协议来实现,其中一种常见的选择是使用RS-485作为物理层。

报文格式

SPI

概括

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,同步,全双工的通信总线。常用于短距离通讯,主要是在嵌入式系统中。它使用主从架构进行通信。通常情况下,一个主设备控制一个或多个从设备。

信号线:

1、 SCLK(Serial Clock):SCLK是SPI通信的时钟信号线,由主设备提供。时钟可以是低电平有效(CPOL=0)或高电平有效(CPOL=1)。
2、MOSI(Master Out Slave In):MOSI是主设备发送数据到从设备的数据线。主设备在时钟的上升缘或下降沿将数据写入此线路。
3、MISO(Master In Slave Out):MISO是从设备将数据发送回主设备的数据线。从设备在时钟的上升沿或下降沿将数据写入此线路。
4、CS(Chip Select):每个从设备都有一个独立的片选线,用于选择与主设备进行通信的特定从设备。

连接方式

常规SPI模式

在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

菊花链模式

在某些情况下,多个从设备可以通过串联相连形成菊花链连接方式。主设备通过MOSI将数据连续发送到一个从设备,然后该从设备再将数据传递给下一个从设备,依此类推。

优点

简单且广泛支持:SPI接口易于实现

高速数据传输:SPI通信速度快,可以达到几Mbps甚至更高的速率,适用于对实时性要求较高的应用。

低延迟:SPI的通信过程在硬件层面实现,不依赖于操作系统或相关驱动程序的支持,因此具有更低的通信延迟。

灵活的连接方式:SPI支持多种连接方式

缺点

传输距离短

没有应答机制

仅支持一个主设备

对于资源有限的嵌入式系统来说,占用引脚多

CAN

概述

控制器局域网CAN 是一种异步、半双工的通信协议总线。

物理层

CAN总线通常采用双线制,即CAN-High(CAN-H)和CAN-Low(CAN-L)两根差分信号线。差分信号线的实现可以提供良好的抗干扰性能,减少电磁干扰对信号的影响。

通常情况下,CAN使用双绞线作为物理层的传输介质。双绞线可以提供良好的抗干扰能力和适当的传输距离,同时在成本和可靠性方面具有优势。

CAN物理层的实现通常需要一些支持组件,如收发器(Transceiver)和终端电阻(Termination Resistor)。
收发器负责将CAN控制器产生的电信号转换为差分信号,并实现信号的驱动和接收功能。
终端电阻用于抑制信号的反射和提供信号匹配,确保信号的质量和稳定性。

TCP/IP协议

TCP协议

提供可靠的面向连接面向字节流的数据传输。它将数据分割成报文段,提供流量控制、拥塞控制和错误恢复等功能,确保数据按照顺序到达。

TCP协议是传输层协议。

TCP协议的特点:

面向连接、可靠性、面向字节流、流量控制、拥塞控制和全双工通信。

注意:流量控制,针对的是单个连接数据处理能力的控制。拥塞控制,针对的是整个网络环境,数据处理能力的控制。

报文格式

三次握手

四次挥手

注意:三次握手由客户端发起;四次挥手可以由客户端发起,也可以由服务端发起。

IP协议

IP协议是网络层的核心,负责数据包的传输和路由。IP协议有两个版本:IPv4和IPv6。

IP协议的主要功能是在网络中传输数据包,负责数据包的路由和寻址

IP协议是网络层协议。

IPv4报文格式

IPv6报文格式

UDP协议

概述

UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的传输层协议,在网络中用于处理数据包,是一种无连接的协议。UDP不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

此外,UDP不提供数据包分组、组装,不能对数据包进行排序。

UDP的主要特点:无连接性、不可靠性、简单性、传输速度快。

UDP报文格式

TCP与UDP的区别

连接性:TCP是面向连接的协议,必须在发送数据之前先建立连接。而UDP是无连接的协议,不需要建立连接。

可靠性:TCP提供可靠的数据传输机制,通过序列号、确认应答、超时重传和流量控制等机制来确保数据的可靠传输。UDP不提供可靠性保证,数据报可能丢失、重排或重复。

有序性:TCP保证数据的有序性,即发送的数据会按照发送的顺序到达接收端。UDP不保证数据的有序性,数据报可能以任意顺序到达接收端。

拥塞控制:TCP具有拥塞控制机制,如果网络出现拥塞,TCP会降低发送速率以避免网络的过载。UDP没有拥塞控制机制,它会以恒定的速率发送数据,因此在拥塞的网络中可能会导致丢包情况。

TCP/IP协议

TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在不同网络之间传输信息的协议集合,TCP/IP协议不单单指的是TCP和IP两个协议,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。

TCP/IP协议是整个网络通讯中最基本的协议,无论是底层数据包发包还是数据链路通讯,TCP/IP协议都起到了很重要的作用,是网络技术中一个非常重要的理论基础。

网络接口层

也被称为数据链路层,是TCP/IP协议栈中的底层层次,位于协议栈的最底部。它提供直接连接到物理网络的接口

主要协议:Ethernet(以太网)、Wi-Fi、PPP(点对点协议)等。


网络层

主要负责处理网络间的数据包路由和转发。它通过路由选择算法来选择最佳路径将数据包从源主机发送到目标主机,同时提供 IP 地址和逻辑地址的转换。

主要协议:IP(Internet协议)、ICMP(网际控制报文协议)。


传输层

位于网络层之上,主要负责端到端的数据传输和可靠性保证。

主要协议:TCP(传输控制协议)、UDP(用户数据报协议)。


应用层

提供应用程序间的通信和数据交换。

主要协议:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名系统)等。

Arduino实验

编写代码步骤

1、定义引脚

2、初始化

3、业务逻辑

LED灯

LED灯的连接:将电源接到LED的正极,GND接到LED的负极,在两极之一接一个220欧电阻。

LED灯的控制:使用 digitalWrite() 函数为对应数字引脚输出高低电平可控制LED灯的亮灭;使用 analogWrite() 函数为对应模拟引脚输出PWM模拟值可控制LED灯的亮度。

LED灯的闪烁:通过延时函数 delay() 控制高低电平的时间来实现。

四脚开关

如图

在实物中,1和3非常近,2和4非常近。

1和2、3和4一直相通;开关合上后,四个脚都接通。

蜂鸣器

有源蜂鸣器

蜂鸣器的引脚郡朝上放置时,可以看出没有电路板而用黑胶封闭的一种是有源蜂鸣器。

用黑表笔接蜂鸣器 “+”引脚,红表笔在另一引脚上来回碰触,如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。

有源蜂鸣器内部带震荡源,所以只要一通电就会叫。

有源蜂鸣器的优点是:程序控制方便。

可使用 tone() 函数控制有源蜂鸣器。

无源蜂鸣器

蜂鸣器的引脚郡朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器

用黑表笔接蜂鸣器 “+”引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω的是无源蜂鸣器

无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。

无源蜂鸣器的优点是:便宜,声音频率可控

tone() 函数

tone(pin, frequency)
tone(pin, frequency, duration)

pin: 发声引脚(该引脚需要连接扬声器)

frequency: 发声频率(单位:赫兹) – 无符号整数型

duration: 发声时长(单位:微秒,此参数为可选参数) – 无符号长整型

tone()函数可以产生固定频率的PWM信号来驱动扬声器发声。发声时间长度和声调都可以通过参数控制。定义发声时间长度有两种方法,第一种是通过tone()函数的参数来定义发声时长,另一种是使用noTone()函数来停止发声。如果您在使用tone()函数时没有定义发声时间长度,那么除非您通过noTone()函数来停止声音,否则Arduino将会一直通过tone()函数产生声音信号。

旋钮开关

旋钮开关接通电源,再将中间的接口接到模拟信号接口,开发板便可接收到开关的模拟值。可以在代码中使用 analogRead() 函数读取模拟值。

光照传感器

光照传感器是通过光电效应来测量环境光强度的传感器。它们基于光敏元件的特性,例如光敏二极管(Photodiode)、光敏三极管(Phototransistor)和光敏电阻(LDR),来将环境光转换成电信号。这些光敏元件基于光电效应产生的光电流或电阻变化来确定光照强度。

在使用光电传感器时,要记得为其连接一个1K电阻。

将光照传感器与电阻相连的那端接到模拟信号接口,开发板便可以接收到光照传感器的模拟值。

RGB灯

RGB灯通过电流控制各个颜色灯珠的亮度,从而混合出所需的颜色。通过改变红、绿、蓝三个通道的亮度和比例,可以呈现出各种静态颜色和动态效果,如渐变、跳变、闪烁等。

共阳的RGB灯,四个引脚中最长的那个为阳极。其他三个分别为,红灯(R),蓝灯(B),绿灯(G)的阴极。我们通过控制三个灯两端的电压值可以控制灯的发光亮度,然后组合,让RGB灯发出不同颜色的光。

热敏电阻

热敏电阻是一种传感器电阻,其电阻值随着温度的变化而改变。按照温度系数不同分为正温度系数热敏电阻(PTC thermistor,即 Positive Temperature Coefficient thermistor)和负温度系数热敏电阻(NTC thermistor,即 Negative Temperature Coefficient thermistor)。正温度系数热敏电阻器的电阻值随温度的升高而增大,负温度系数热敏电阻器的电阻值随温度的升高而减小,它们同属于半导体器件。

在使用热敏电阻时,要记得为其连接一个1K电阻。

将热敏电阻与电阻相连的那端接到模拟信号接口,开发板便可以接收到热敏电阻的模拟值。

倾斜传感器

根据角度的不同,决定倾斜传感器为开路OFF状态还是闭路ON状态

在使用倾斜传感器时,要记得为其连接一个1K电阻。

将倾斜传感器与电阻相连的那端接到模拟信号接口,开发板便可以接收到倾斜传感器的模拟值。

火焰传感器

用于探测是否有火源

在使用火焰传感器时,要记得为其连接一个1K电阻。

将火焰传感器与电阻相连的那端接到模拟信号接口,开发板便可以接收到火焰传感器的模拟值。

4*4矩阵

行扫描法,又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。

判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

9G舵机

接线:

红线:电源正

棕线:电源负

橙线:信号输出

使用9G舵机,首先要使用头文件 Servo.h ,在实例化Servo,再使用 attach() 设置舵机控制信号引脚,最后使用write() 控制舵机角度。

超声波模块

引脚连接:

VCC:电源正
GND:电源地
Trig:触发信号输入
Echo:回响信号输出

通过让Trig引脚发出最少10微秒的高电平触发超声波模块,再使用 pulseIn(echo,HIGH) 函数采集反馈的高电平宽度,最后将其通过公式计算出距离。

人体传感器

检测人体活动的传感器,如果人体不活动,则无法检测。

可通过 digitalRead() 函数读取传感器的值。

数码管

当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。

LCD1602液晶显示屏

引脚:

首先,调用库文件 LiquidCrystal.h ,再创建 LiquidCrystal() 实例(括号内是用到的IO口),使用 该库的begin()函数初始化,用 setCursor(6) 设置显示位置,用 print() 打印。

DHT11温湿度传感器模块

首先调用库文件 DHT.h ,再创建 DHT 实例。之后用 该库的 readTemperature() 读取温度值,用readHumidity() 读取湿度值。

LM35温度传感器

只需要用 analogRead() 读取数值即可。

74HC595位移缓存器

在传输数据之前,要先将 STCP 引脚制高电平,传输完数据再制低电平。传输数据用shiftOut() 函数。

shiftOut(dataPin, clockPin, bitOrder, value);

dataPin – 数据引脚
clockPin – 时钟引脚
bitOrder – 移位顺序 ( 高位先出 或 低位先出)
val – 数据

DS1302时钟芯片

首先,调用 DS1302.h 库,将DS1302实例化。在初始化时,使用 writeProtect(false) 关闭写保护,用 halt(false) 清除时钟关闭标志,用 time() 向DS1302设置时间数据,最后用 snprintf() 打印时间。

云计算的三种服务模式

云计算有以下⼏个层次的服务:基础设施即服务(IaaS),平台即服务(PaaS)和软件即服务(SaaS)。

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

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

相关文章

机器学习练习-决策树

机器学习练习-决策树 代码更新地址:https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释:黄海广,haiguang2000wzu.edu.cn 1.分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if…

Docker的基本操作

Docker的基本操作 操作常见指令 # 推送镜像到服务 docker push # 从服务拉去镜像 docker pull # 构建镜像 docker build # 保存镜像为一个压缩包 docker save # 加载镜像 docker load镜像加载、删除等 拉取nginx docker pull nginx查看镜像 docker images # 只查看id doc…

SpringBoot2.0(mybatis-plus常见的增删改查和分页)

目录 一,mybatis-plus常见注解二,创建一个工具类和启动类三,创建实体类四,创建mapper接口五,创建service接口和impl类六,创建配置类七,创建controller八,使用测试工具测试增删改查和…

C数据结构二.练习题

一.求级数和 2.求最大子序列问题:设给定一个整数序列 ai.az..,a,(可能有负数).设计一个穷举算法,求a 的最大值。例如,对于序列 A {1,-1,1,-1,-1,1,1,1,1.1,-1,-1.1,-1,1,-1},子序列 A[5..9](1,1,1,1,1)具有最大值5 3.设有两个正整数 m 和n,编写一个算法 gcd(m,n),求它们的最大公…

在JavaScript中,什么是尾递归优化(tail call optimization)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 尾递归优化(Tail Call Optimization)⭐ 递归和调用栈⭐ 尾递归⭐ 尾递归优化的好处⭐ JavaScript的尾递归优化支持⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链…

Android只需要一分钟生产1到1000的dimens.xml中带命名尺寸

先上效果图&#xff1a;一分钟实现下面的效果&#xff01; 下面是教程&#xff1a; 1、使用下面的方法&#xff1a; private val listDpDimen arrayListOf<String>()private fun initDimen() {listDpDimen.clear()for (i in 1..1000) {val s "<dimen name\&qu…

微服务保护-授权规则/规则持久化

授权规则 基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用者允许访问 黑名单&#xff1a;来源&#xff08;origin&#xff09;在黑名单内的调用者不允许访问 点…

科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画

近日&#xff0c;美国专利商标局正式授予苹果一项与虚拟纸张相关的专利。这是与虚拟纸张这项发明相关的第二项专利&#xff0c;鉴于苹果 Vision Pro 将于明年上市&#xff0c;那么我们离苹果实现虚拟纸张的发明又近了一步。 虚拟纸张将能够包含 2D、3D 和动画等 MR内容&#…

python使用SMTP发送邮件

SMTP是发送邮件的协议&#xff0c;Python内置对SMTP的支持&#xff0c;可以发送纯文本邮件、HTML邮件以及带附件的邮件。 Python对SMTP支持有smtplib和email两个模块&#xff0c;email负责构造邮件&#xff0c;smtplib负责发送邮件。 首先&#xff0c;我们来构造一个最简单的…

2、ARM处理器概论

一、ARM处理器概述 1、ARM的含义 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义&#xff0c;一个公司的名称、一类处理器的通称、一种技术 ARM公司&#xff1a; 成立于1990年11月&#xff0c;前身为Acorn计算机公司主要设计ARM系列RISC处理器内核授权ARM内…

Linux安装kafka-manager

相关链接https://github.com/yahoo/kafka-manager/releases kafka-manager-2.0.0.2下载地址 百度云链接&#xff1a;https://pan.baidu.com/s/1XinGcwpXU9YBF46qkrKS_A 提取码&#xff1a;tzvg 一、安装部署 1.把kafka-manager-2.0.0.2.zip拷贝到目录 /opt/app/elk 2.解压…

上四休三,未来的期许

近日“少上一天班&#xff0c;究竟香不香”引发关注&#xff0c;英国媒体2月21日报道&#xff0c;一项全世界目前为止参加人数最多的“四天工作制”试验&#xff0c;不久前在英国取得了成功。很多人表示上过四天班之后&#xff0c;给多少钱也回不去五天班的时代了。 来百度APP畅…

three.js——GUI的使用

GUI的使用 效果图1、导入gui2、创建一个GUI对象3、通过gui调用方法 name:按钮的名称 效果图 1、导入gui // 导入ligui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js2、创建一个GUI对象 const gui new GUI()3、通过gui调用方法 name:按钮的名称 // 创…

【Java 基础篇】Java标准输入流详解:读取用户输入的完整指南

Java是一门流行的编程语言&#xff0c;常用于开发各种类型的应用程序&#xff0c;包括控制台应用、桌面应用、Web应用等。在这些应用中&#xff0c;与用户进行交互是一项重要的任务。本文将重点介绍Java标准输入流&#xff0c;它是Java程序中用于从用户获取输入的关键组成部分。…

Python变量

变量声明 变量的使用过程一般需要经过声明、初始化和赋值&#xff0c;而Python 是(动态类型语言)解释型脚本语言&#xff0c;不需要编译&#xff0c;即不需要预先声明变量的类型&#xff0c;拿过来就能用。 Python属于解释型脚本语言&#xff0c;不需要编译&#xff0c;变量也不…

利用Pycharm将python程序打包为exe文件(亲测可用)

最近做了一个关于py的小项目&#xff0c;对利用Pycharm将python文件打包为exe文件不是很熟悉&#xff0c;故学习记录之。 目录 一、下载pyinstaller库 二、打开Pycharm进行打包&#xff08;不更改图标&#xff09; 三、打开Pycharm进行打包&#xff08;更改图标&#xff09…

常见入门级进销存系统合集

进销存系统是企业管理中不可或缺的一环&#xff0c;它们可以帮助企业有效管理库存、销售和采购等关键业务。然而&#xff0c;对于初创企业和小型企业来说&#xff0c;选择一个合适的进销存系统可能是一项挑战。在这篇文章中&#xff0c;我们将探讨入门级和资深级进销存系统之间…

递归视角下

def listSum(numbers): if not numbers: return 0 else: (f, rest) numbers return f listSum(rest)myList (1, (2, (3, (4,None))))total listSum(myList)print(total) while循环何时退出&#xff1f; 恐怕是while循环技巧所在&#xff0c;即选择恰…

Linux学习之Redis集群部署

Redis集群部署 准备集群环境 创建集群 # 准备集群环境--配置192.168.88.51(host51) [rootlocalhost ~]# yum install -y redis [roothost51 ~]# vim /etc/redis.conf bind 192.168.88.51 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 5000…

malloc是如何实现内存分配的?

文章目录 前言一、malloc实现原理概括&#xff1f;二、brk() 函数与mmap()函数三、mmap实现原理普通读写与mmap对比mmap内存映射实现过程mmap 的适用场景 前言 在C和C中&#xff0c;malloc函数是用于动态分配内存的常用函数。本文将深入探究malloc函数的内存分配实现机制&…