粉丝230获赞3217

哈喽,小伙伴们大家好啊,从这节课开始,我们来学习使用 ardino 开发 e s p 三二单片机。本套课程呢,面向零基础的小伙伴大家可以放心使用。 ardono 是一个开发平台,可用于编写和运行各种倾诉项目。 esp 三二是一款功能强大的 wifi 和蓝牙无线模块,结合 ardono 和 esp 三二,可以帮助你轻松地开发物联网应用程序。 接着我们来了解一下 esp 三二的主要组成部分。首先是一个复位按键和 usb 接口,这个 usb 接口呢用于下载程序电源输入,还有稍路驱动等等。 再就是部特按键,它的作用是启动模式选择,按下表示下载模式,放开表示运行模式。四就是我们这个开发版的 核心 esp 三二 room 三二模组里面集成了蓝牙、 wifi 等模块。最后就是这两排针脚,他们是 gpio 接口,控制输入输出用的。 我们来看看 esp 三二开发版的银角图。 esp 三二芯片有四十八个银角,具有多种功能,但并不是所有的 esp 三二开发版的银角都暴露在外面,有些银角不能使用,也就没有暴露出来的必要。我们这个单片机就只有三十个银角。 e s p 三二芯片有三十四个可编程的 g p i o 银角,每个银角执行多个功能,也就是 i o 口的复用。设置 i o 口功能的时候,只有一个功能会被激活,可以在程序中将银角设置为 g p i o a d c u a r t 等等。 e s p 三二的开发方式 有以下几种,有 micropison、 ardono 和乐欣公司的物联网开发框架,还有几个比较小众的开发方式,撸啊 gs 等等,大家可以去自己了解一下。我们的教程主要是 micropison 与 ardono, 掌握了这两个开发方式,大部分基本的 diy 项目都能手到擒来了。 那什么是 ardino 呢?如果你是初学者,可以从以下几个方面了解 ardino。 首先 ardino 它是一款电子开源圆形平台,它由硬件和软件两部分组成, 硬件呢,就是包括一个开发版。软件部分呢,它是基于 c 加加编程语言改编过来的 ardino 语言。 ardino 硬件也就是各种型号的 ardino 开发版,比如 nano 啦, woono 的呢,可以通过 usb 接口与电脑进行通信 以及一些引脚,可以连接一些其他的电子元器件。而啊对头的编程语言呢,它是基于 c 加加的,但是简化了很多语法,让初学者容易上手。你可以通过啊对头 i d e 编写代码,并把代码呢上传到主板上运行。 阿迪诺最大的优势就是他简单易学,开发门槛低,所以成为了电子制作、互联网等领域的热门选择。在阿迪诺的官方网站上呢,你也可以找到各种各样的项目,视力从简单的 led 闪烁到复杂的机器人控制等等都有。 同时呢,阿迪诺社区他也非常的活跃,有很多志同道合的小伙伴分享自己的作品和经验,可以帮新手呢更好的入门。

这节课我们来学习如何使用 ardeno 对 s d 卡中的内容呢,进行读写操作。 那首先咱们得知道什么是 s d 卡啊? s d 卡呢,它是一种常见的可移动存储设备,用于存储和传输数据, 放在十年前还是非常抢手,非常热门的一个东西啊。比如你的相机里需要塞一个内存卡了,还有就是你的这个手机里面呢,之前也是需要塞内存卡成个增加内存,现在可能就不是很常用了。 那 sd 卡具有以下几个主要特点。首先就是尺寸小, sd 卡呢,采用了较小的尺寸,便于携带和使用。标准尺寸的 sd 卡是三十二毫米乘二十四乘二点一,而这个还有微 型的 sd 卡和迷你 sd 卡就更小了。第二个特点是高存储容量,现代的 sd 卡通常具有较大的这个存储容量,可以满足各种数据存储需求。 第三点呢就是可擦写性, sd 卡可以被多次擦写和这个重新写入,是他非常适合存储和传输数据,用户可以根据需要将这个数据呢写入 sd 卡,并随时进行修改或者删除。 第四点就是高速传输, sd 卡呢,它支持高速数据传输,可以满足对快速读写数据的一个速度的需求。不同类型的 sd 卡可能具有不同的传输速度标准,例如 s d, s a, s d h c 和 s d x c 等等。 最后一点就是兼容性, sd 卡呢,具有广泛的兼容性,可以在很多设备上使用,比如就是数字相机啦,移动电话啦和 m p 三, m p 四等等。通过试配器呢, s d 卡可以与其他类型的存储设备接口兼容, 我们之前呢就经常会用 sd 卡存储一些照片了,音乐、视频还有文档了等等。 在使用 sd 卡时就需要注意保护数据的安全性和完整性,避免数据丢失或者损坏。接着呢,我们通过读卡器把咱们这个 sd 卡连接到电脑上, 在我这里呢就是这个 i 盘,我右击选择这个格式化,这里我们可以看到啊,首先他告诉我这个容量是三点七 g, 基本上就是四 g, 然后文件系统他这里有一个 fat 三十二,这默认什么的,然后 fat 还有 exfat, 还有这个 ntfs, 这几个什么意思啊?这文件系统呢,它指的就是 sd 卡上组织和管理文件和文件夹的一个方法。 常见的 s d 卡系统有咱们看到的这 f a t 十六, f a t 三十二和 e x f a t, 它们分别代表的意思是 fat 十六呢,是 file allocation table 十六,支持最大容量的为二 gb 的存储设备,它使用了十六位的文件分配表来记录文件的存储位置和状态。 f a t 十六系统有一定的局限性,无法处理大容量存储设备和这个单个文件超过二 g b 的情况。接着是 f a t 三十二,它呢支持最大容量为二 t b 的存储 设备,采用三十二位的文件分配表,可以更有效的管理存储空间和文件锁引。而且 fat 三十二呢,它是最常用的。 第三个呢是 e x f a t, e x f a t 呢,它是一种针对大容量存储设备设计的文件系统,它支持最大的容量为一百二十八 pb 的存储设备和单个文件大小为十六 eb, 并且呢,这 e x f a t 具有较好的这个兼容性,可以在多个操作系统上使用。 我们刚才还需要看到一点啊,我们再看一下啊,这除了 f a t f a t 三十二,还有 e x f a t 之外,还有一个 n t f s。 需要注意的是,在 s d 卡的文件系统选项中存在这个 n t f s 选项, 这个并不是 s d 卡的文件系统,如果你使用这个选项格式化 s d 卡的话,会导致 s d 卡模块读取不到任何内容。 那 n t f s 到底是什么呢?它的全称呢,就是 new technology box system, 是一种现代的文件系统,最早由这个微软引入,并用于 windows n t 操作系统及其后续版本。 它具有许多这个先进的功能和优势,适用于处理大容量磁盘驱动器和大文件。然后这个 ntfs 系统啊,具有这个支持大容量存储、高性能、安全性、容错能力强、支持大文件、支持文件压缩和加密几个功能。 而且呢, n t f s 是在 windows 操作系统中广泛使用的文件系统,它在性能、安全性和功能方面 都具有一定的优势,可以满足现代计算机系统对文件系统的要求。最后呢,我们再来了解一下这个 sd 卡模块, sd 卡模块它是通过标准的 spi 协议与单片机进行连接的,如果我们采用双线式或者三线式 spi 协议的话,就无法实现全双功能数据读写功能。 唯一需要注意的是呢, sd 卡模块的 vcc 引角需要接五伏电源,如果你接的是这个三点三伏,就会导致这个内容无法读取。 了解完原理之后呢,我们就可以来搭建电路了,因为我们这个 sd 卡模块呢,它采用了这个 spi 协议,所以我们可以看到这个 sd 卡模块就占用了四根这个信号线,下面这两根呢就是一个 vcc, 一个是那个尖地, 这个 c s 引角呢,也就是片选信号,这偏选信号接的是第五引角。然后 i c k 时钟线呢,接的是第十八, m o s i 呢接的是第二,三 m i s o 接的是第十九。 在 rpno 中对 s d 卡进行操作,可以使用 e s p 三二自带的 s d 库。 s d 库呢,提供了一系列的函数,用于在 s d 卡上进行文件操作, 咱们呢就讲一些常用的 s d 库中的一些函数。首先第一个呢是这个 s d 点 begin, 它的作用呢是初始化 sd 卡,并且呢启动 spi 通信使用的是硬件, spi 参数咱们是可以不填的,使用默认的参数即可,默认参数呢使用的是咱们这个 vs spi, 比如我们就可以直接写成是 s d 点 begin。 第二个呢是 open, open 表示打开一个文件或者目录,并且返回给我们一个 file 对象,以便于我们进行后面的这个文件操作。 按呐接收两个参数,第一个呢是文件类型,第二个呢是文件打开模式。常见的打开模式呢,包括 file gan read, 比如指读模式 file gang right, 指写模式 file gang open 的追加写入模式,如果我们不填这个打开模式的话,他默认就是指读模式。 第三个呢是咱们这个额 vlog, 它是用于检查我们这个文件是否可用的,也就表示咱们这个文件是否已经打开,如果文件可用呢,就返回一个处,否则就返回 force。 接着是这个 red, 它是来读 我们文件的内容,但是呢,我们这个函数,他每次只能从文件中读取一个字节的数据,并且呢返回给我们读到的数据。所以如果我们想要读取这个文件内容,打印在创口屏上的话,就需要结合一下这个创口类中的 right 方法, 它呢是每次写入一个字节的数据。接着我们看第五个 s d 中的 ret, 它是写入文件,并且参数呢就是要写入的数据。 在下面这个 printline, 它与 red 差不多,只不过呢它是写入一行数据,在写完这一行数据之后呢,它会自动换行。 第七个,咱们进行完文件操作之后呢,是不是就需要关闭一下文件,释放掉 sd 卡的资源,结束对 sd 卡的操作。 这个 remove 也就是删除,我们可以删除指定的文件,他接收的参数呢就是我们要删除的文件。在下面这个 exist 来检查我们指定的路径,这个文件是否存在,存在就返回处,不存在呢就返回 pose maker, 创建指定路径的目录。到了最后这三个他们经常用来读取文件列表的, 比如我们这个 open next file, 他呢是打开咱们 sd 卡中的下一个文件,返回一个 file 对象,表示打开的文件如果没有更多的文件可以打开呢,就返回给我们一个空的 file 对象。 内幕则是返回给我们打开文件的文件名。最后这个 directory 判断一下咱们这个打开的文件是不是一个目录,如果是目录的话 就返回处,不是的话就返回 force, 那咱们这文件要么就是目录,要么就是文件,对不对?所以呢,如果是处的话就说明是个文件夹, force 的话就说明是个文件。 刚才我们把他们三个归为一类,因为咱们你想啊,如果你想读取文件列表的时候呢,是不是可以使用这个 open next file 函数来对 sd 卡通每个文件进行迭代, 然后使用内幕函数来获取我们打开文件的文件名,并且呢,你也可以使用这个意思 directory 函数来判断咱们这个文件是一个普通文件呢还是一个目录呢?这三个函数组合就可以帮助我们便利 sd 卡上的所有文件,并且执行相关的操作了。 以上这十三个函数呢,都是 s d 库中的常用函数,你可以根据自己的具体应用需求选择适合 的函数来进行 sd 卡上的文件操作。当然你也可以参考 sd 库的官方文档和视力代码来了解更多的函数和用法。 了解完第三方库之后呢,我们就可以来敲代码了。在敲代码之前呢,我们先在咱们的内存卡中创建几个文件和文件夹,方便一会我们来读取。 比如我创建两个文件夹,还有两个普通的文本文件名字呢,分别叫 file 一、 file 二。 需要注意的是,因为咱们使用的是 e s p 三二自带的 s d 库,所以我们在读取文件的时候呢,就无法读取到中文名。因此如果你想要读取到中文名字的话,可以下载第三方库,名字就叫 s d fight, 咱们看就这里搜到了,我这里已经安 通过了,它的使用方法呢和咱们的 e s p 三二自带的 s d 库差不多,只不过多了一些封装。 ok, 那接下来咱们就可以把内存卡插回到我们的 s d 卡模块上,然后开始敲代码了, 直接搜索 s d f a t, 咱们看也就是这个库我已经安装过了,但是我们今天讲的是 e s p 三二它自带的这个 s d 库,它们两个用法呢基本上差别不是很大,就是主要的函数呢是差不多一样的。 那我们现在就把我们的内存卡插回我们的这个 s d 卡模块中,就可以开始写代码了。那咱们 第一步是不是需要先引入咱们这个 sd 库的头文件,也就 sd 点 h, 接着呢我们就需要初始化,咱们的这个文件对象类型呢就是 file, 因为咱们连接的是这个 e s p 三二的 v s p i 的一组元音角,所以呢我们就不需要传递任何参数了。那在赛大模式中,咱们第一步呢是先这个设置串口通信波特率,那就是 serial 点 begin 九六零零。 接着呢咱们就判断一下我们这个初始化有没有成功,那就 if 咱们这个 s d 点 begin, 初始化成功的话,咱们就成功了啊。如果初始化没有成功的话,我们前面加个感叹号,表示 note 区反没有成功呢, 我们就先让他在咱们的创口屏中打印出来 s d 卡初始化失败, 并且呢写一个 return, 这个 return 什么意思呢?是指中断我们这个赛踏靶上数的一个执行,因为咱们这个 sd 卡出实话失败了对不对?所以我们后面的文件操作了就完全没有意义,那就没必要再执行下去了,直接在这里 return 终止程序就行了。 那如果没问题的话,咱们就在外面就打印一下 serial 点 print line, 咱们就 sd 卡初始化成功。 咱们第一步呢就先创建一个新的文件,并且呢写入数据,那就是 my file, 它就等于一个 s d 点 open。 参数呢,第 一个是我们这个文件路径,那就斜杠开头,斜杠开头呢表示根目路,名字呢我们就叫 text 点 t x t 文本操作类型呢就是 fell 杠 right。 创建完成之后,我们先判断一下 efmfl 存在,如果我们这个 mfl 创建成功的话,咱们就让他写入什么内容呢? 咱们就让它写入这个。你好 s d 卡,那写入一行数据,咱们可以用这个 right, 也可以用这个 print line, 那就叫你好 s d 卡。 那我们写完之后呢,咱们就关闭这个文件 my file 点 close。 那如果我没有打开成功的话,那咱们这里呢,就直接 serial 点 pretty light, 无法打开文件,那咱们这个创建写入数据的代码呢,就写完了,我们就是让它延时一个呃一秒, 然后咱们读取一下咱们这个文件中的内容,也就是 my file 等于一个 s d 点 open, 还是我们这个 test 点 p x t 类型呢,就默认就是指读模式。 那咱们这次读取内容的话需要注意一下了,这里呢,我们如果想要读取内容的话,就需要使用这个 my file 点 available 检查我们这个文件是否可用,如果可用的话呢,咱们就用 serial 点 right, 注意啊,这里是 serial 的 right 方法来,在咱们这个屏幕上呢,显示咱们这个 myfiel 文件中的其中一个字节,但是这里注意啊,是一个字节对不对?所以呢我们需要用对应的 myfiel 中的 read 方法来读取这一个字节的内容。 执行完成之后呢,我们就关闭这个文件, my file 点 cloth, 那关闭之后我们就 serial 点 print line 啊印一下这个文件读取完成, 因为咱们前面没有加换行符,对不对?所以呢我们在这个文件读取完成前面自己加一个换行符,那就放斜杠 n, 再继续就是 delay, 再让它延迟一个一千毫秒。接着呢 我们就追加文件内容,那咱们是不是还是 mifi 啊?就等于一个咱们这个 s e 点 open, 那我就把这里复制过来, 根部落下的这个 text 点 t x t 文件。但是这次我们这个文件操作类型呢,应该是 file 杠 open 的追加写入操作。那我们写入什么内容呢?那就 my file 点 green 来 修改文件内容。那写完之后呢,咱们就 my file 点 close 关闭文件, 接着就在咱们这个创口监视器中打印一行咱们这个提示语,也就文件修改成功。文件修改成功之后呢,咱们再延时一个一千毫秒,那咱们是不是 还得知道我们到底有没有追加写入成功了,对不对?所以呢我们就再一次读取这个文件内容,就把上面这行代码呢给他复制过来,放到这里。读取完之后,那我们现在就是增山改查里面的增改查,我们就用过了,那最后就删除文件, 那用到的就是 remove 函数,也就是 s d 点 remove, 把咱们这个文件路径写在这里,人目录下的泰色点 txt 文件,但是呢我们需要判断一下你这个文件有没有删除成功, 那咱们就把这个代码呢给它剪切一下,放到一个 if 的条件中,如果我们删除成功了,那咱们就在窗口监视器中打印文件,删除文工, 那 als 就是文件删除失败了。 ok, 我们来运行一下看看。 哎,我们现在来看啊,他一开始就直接打印了一个,你好,这个 sd 卡就读取了我们这个文件内容,但这里我们并没有显示这个创建写的一个提示词,对不对? 还有就是我们看咱们第一行这个 sd 卡初始化成功,也没有打印出来,对不对?所以呢我们在这前面给他一个延时 delay, 延时一个一千毫秒, 咱们在这个写入完成之后呢,让他也打印一句提示词,就叫创建写入数据完成,红心再来运行一下,前面这些我先清空。 哎,咱们看啊,现在咱们就是先是 sd 卡初始化成功,创建写入数据成功,接着就是打印咱们这个文件读取的内容,就捏好 sd 卡,然后呢咱们就文件修改成功, 修改完成之后呢我们又读取内容,就你好, sd 卡还有咱们这个修改的文件内容,这句话是不是也打印出来了?接着我们就打印出来,咱们这个文件读取完成最后第二次读取完之后呢,我们就到了删除文件,文件删除成 功,最后我们就再实现一个功能,就是打印指定路径的一个文件列表,那我们就把这个程序呢放装到一个函数里面吧,名字嘛,我们就叫 void list files, 我们需要给他传入一个我们要指定的路径,对不对?所以呢我们就可以用 const 叉星 pass 来表示,这个呢就表示我们要传入的是一个字符串参数, 那咱们这个函数的第一步呢,就是先在咱们的串口屏中打印一句话,也就是文件列表码号。 接着呢我们就需要打开文件路径,也就是 file, 用 root 来表示吧,也就是咱们的根目路就等于一个 s d 点 open 咱们这个 pass 传进来。接着呢我们就便利一下当前目录下的有什么文件和文件夹, 我们呢就先获取一下咱们这个路径下的第一个文件,用 file 来接收一下 file, 就等于一个 route 登录下的 open next file, 获取咱们当前目录下的下一个文件。 然后呢我们就判断一下咱们的还有没有下个文件,如果下个文件存在的话,咱们就打印这个文件或者文件夹。那如果咱们这个文件不存在的话,咱们就跳出这个循环,并且呢关闭我们这根部路如何点 loves, 那你这个外层的关闭了,内层是不是也得关闭?那 file 点 closet 也得写在这里,所以咱们这个外偶循环 中他需要执行的内容呢,其实就很简单,我们就判断一下他是不是文件或者是目录就可以了。如果是目录的话,我们就打印一个目录加文件名,如果他不是目录的话,那不是目录就是文件了,对不对?那就打印文件加咱们这个文件名, 那就 if 这里我们就用到了我们这个 file 点 is directory, 如果你是目录的话,就打印 print 一下目录,我把这句话复制一下,接着就是 als, 不是目录呢,就是文件, 接着呢就是在后面就是 serial 点 rent line, 那么打印下这个文件名需要用到的函数呢?是这个 file 点 name 方法, ok, 那这就可以了, 故事给写完,判断文件类型,最后就是关闭文件操作, 咱们这个函数现在写完了,我们写完这个函数是不是还得在咱们这个程序中调用一下,对不对?所以呢,我们在一开始在咱们创建文件之前呢,先要用一下咱们这个 list bios 参数呢,就是答应我们跟不录就行了。 接着呢,我们在这个文件创建完成之后,并且咱们又追加写入内容,读取完文件之后,也就是在咱们删除之前呢,再打印一下文件列表,看看有什么变化。 现在咱们来看啊,就是我们现在代码出了 bug 对不对?咱们就一直在打印 目录这 cstm volume 这 information, 所以有 bug 我们就要解决,看一下我们这个 list file 文件哪里有问题, file 循环一直跳不出去,那肯定这里有问题吧,为什么有问题?因为咱们一直在判断这个 file 并没有给这个 file 一个变化的值,对不对? 所以呢,咱们呢,还需要在循环的结尾加一个循环变量的一个增量,也就是让咱们这个 file 呢,就等于一个 route, 再获取一下咱们下一个文件 next file, 也就是便利下一个文件, ok, 再来运行一下。 哎,现在我们来看啊,咱们 s d 卡初始化成功之后,读取文件列表,先是目录一 system volume information, 接着呢 folder 二,文件 file, 一点 t x t 文件 file, 二点 t x t 再是目录 folder, 一, 接着呢就是我们这个读取文件的内容。你好, sd 卡读取完成,然后咱们就到了修改文件内容,修改完成之后呢,我们又开始读取文件的内容了。也还是你好, sd 卡修改文件内容 读取完成之后呢,我们就再一次打印一下我们这个文件列表,现在就变成了前面五项是一样的,最后又多了一项这个 test t x t 这说明呢,我们创建写入这个文件就成功了,然后最后呢,咱们就把这个文件给删除了。那可 有小伙伴好奇了哈,这个 system volume information 这什么意思啊?他呢是 windows 操作系统在咱们这个存储设备上创建的隐藏文件夹,用于存储系统恢复信息和其他系统相关数据的。 当你在 windows 中使用 s d 卡的时候呢,它就会在咱们这个 s d 卡的根目录下放建这个文件夹, 所以呢,你就不需要关心这个文件夹是什么用的,你只需要知道,就算你是个空文件夹呢,它也会给你打印出来这个隐藏的文件夹。那咱们 s d 卡的实验呢,就结束了。

前面我们介绍使用 pwm 输出不同电压值,类似于模拟信号输出。那如果需要 e s p 三二检测外部输入的模拟信号该怎么办呢?这就是本节课要学习的 a、 d、 c 魔术转换器,通过 a、 d、 c 将模拟信号转换为数字信号,再给 e s p 三二, 在学习 a、 d、 c 之前呢,我们要首先学习一下什么是模拟信号,什么是数字信号。模拟信号呢,它是持续变化的量,生活中接触到的信号基本上都是模拟信号,比如温度变化了,天体运动了等等,这些都是连续的信息,都是模拟信号。 在电路中呢,简单的说就是用电信号模拟出其他的信号,比如用电信号模拟出图像,模拟出声音的声波。数字信号呢,是时间离散,数值离散的信号。数字 信号存在取样,还存在这个量化,只能取到一些不连续的固定值,所以总结就是模拟信号的时间连续扶直连续,而数字信号的时间离散扶直离散。 模拟电路呢,就是使用处理模拟信号的电路。数字电路呢,就是使用处理数字信号的电路。 我们举一个简单的例子,指针时钟和数字时钟。这指针时钟它显示的就是时间的模拟信号,因为时间是连续变化的,而数字时钟呢,它显示的就是时间的数字信号。 时间的显示是按照固定的增量变化的,他可以显示一、二、三,但是呢,他没办法显示一点一、二点二、三点三这样的数字。所以在数字电路中呢,使用的数字信号一般只能取零或者一把零对应为低电 屏,把一对应为高电屏,说白了就是有或者没有。数字信号是在模拟信号的基础上,依次经过采样量化编码而形成的。 具体的说,采样就是把输入的模拟信号按适当的时间间隔得到各个时刻的样本值。而量化呢,是把采样测得的每个时刻的值用二进制数值来表示。 编码则是把量化生成的二进制数排列在一起,形成顺序脉冲序列。 最后就是这个魔术转换器, adc 他可以将这个模拟信号转换为数字信号。由于单片机他只能识别二进制的数字,所以外界模拟信号常常会通过 adc 转换成这个单片机可以识别的数字信号。常见的应用就是把这个变化 把电压转换成数字信号。需要注意的是啊,咱们在使用这个 adc 默认配置的时候, adc 银角的输入电压必须是介于零到一之间,任何高于一伏的电压呢,都会视为一个最高值。如果需要增加测量范围呢,你就需要配置一下专检器。 所以在这个单片机上有哪些银角他是 adc 银角呢?我们来看这张图啊,左边这些全都是 adc 银角,然后右边呢,只有这个二四十五这三个 gpl 口是 adc 银角。 ok, 原理我们讲完了,接着我们来看看电路设计,我们会需要用到一个 led 灯,一个一千五的电阻,一个电位器,还有杜邦线和这个面包板。 led 的阳极接的是第十三阴角,然后阴极呢,是通过电阻接了地,而这个电位器 它相当于是一个滑动变阻器,两端引脚的阻值是固定的,中间引脚呢,对任何一段引脚的阻值都是可变的,那等效,于是从中间把这个电位器分成两个串联的电阻, 串联总组值是一定的,一端接电源,然后一端接地,中间这个引脚呢,我们接这个 d 二十六引脚,就比如咱们右边这张图, 那咱们连接好电路之后呢,就是我这个样子,然后呢咱们就可以来敲代码了。首先咱们第一个程序就是在创口监视器中呢打印出来咱们这个电位计的模拟输入信号,我们可以先在创口监视器中打印一下读取到的 analog read 的值。 接着呢就需要使用到 ardino 内置的两个串口函数,我先把 set up 函数和这个路 函数写出来啊,那首先我们要用到的 alino 内置的窗口函数就是 serial 点 begin, 它的参数呢是要传递一个波特率,也就是需要设置一个咱们这个通信的波特率,一般我们设置的是九六零零, 设置九六零零波特率,我们就可以在创口监视器中直接打印出来显示的内容,那在创口屏打印内容的话,就需要调用另一个函数,就是 serial 点 print li 参数呢就是我们要打印的这个信息。 那我们该如何打开我们的创口监视器呢?咱们看这里有一个工具,咱们点击工具之后,这里就有一个创口监视器,点击创口监视器,然后我们屏幕里呢就出现 了这个创口监视器这个窗口,我们不仅可以在这个创口监视器中显示内容,还可以在这里发送内容。但是需要注意的是,我们在右下角记得要设置这波特率,设置成和咱们输入的波特率一致就可以了,比如我这里选择九六零零, 现在这为什么我这里一直在打印一个数据,是因为我这个单片机目前一直在跑着一个程序。 ok, 知道了串口监视器这两个函数之后,我们就可以来写代码了。首先我们就需要定义一下咱们这个电位计占用的引角,那就红定义呗, 那就是迪拜,我们这个定位记他的英语呢是 potential meter, 因为太长了啊,所以我们就直接简写,直接简写成 pot 引脚呢,就是二十六引脚。 接着呢,因为我们要显示这个电位 g 的一个输入信号对不对?所以呢,我们就需要初始化一个变量来存储这电位 g 的一个输入信号,那就 inter alt gun value。 接着就到我们这个 set up 函数了, set up 函数中呢,我们第一个需要执行的就是先设置咱们这个串口通信的波特率, 因为咱们只需要设置一次就可以建立通信,所以我们就要把它放在 ctrl 函数中。而这个 serial 点 print line 呢,我们是不是在每次循环的时候都需要执行一遍大应变咱们这个模拟值,所以呢, serial 点 print line 就需要放在这个 loop 函数中, 我们想要注视设置放口通信波特率,咱们要设的值那是九六零零,然后就 siri 点 begin 九六零零。接着就是配置咱们的 gpl 音角,那就 pin mode pot 录入模式对不对?就 input, 我这录函数写错了啊,是 lop。 接着咱们就读取电位计模拟输入值,那就 port gar value, 那就等于一个 analog read, 然后咱们这引角 port, 接着呢,我们就需要把这个模拟值呢打印在窗口屏上, 咱们刚才已经说过了,使用的函数呢就是 serial 点 print line, 常用的参数就是 hot value, 咱们不要让它打印的太快,就给一个 delay 延伸函 数,比如我们给他一个五十毫秒吧, ok, 咱们就稍录一下上传代码, ok, 收录完成之后,我们就打开咱们的创口监视器,咱们看现在在咱们创口监视器中是不是就正常显示这个数字零了? 我们这个定位计是不是处于处于最左侧,所以我们就把它向右拧,向右拧,向右拧,咱们看窗户电视器是不是就变了? 我拧到最右边的时候,咱们看它的最大值呢就是四零九六,所以我们就也能确定它的量成呢,就也就是模拟信号的一个范围,就是零到四零九六。 ok, 既然咱们已经读取到了这个模拟输入信号,接着我们就可以把这个模拟输入信号来转换成咱们这个 led 的模拟输出信号。 那咱们第二个程序呢,就是使用 and log right 这个方法来控制 led 的亮度。但是这里咱们需要注意一个问题, 咱们上节课也使用过这个 analog right 方法来实现这个 p w m 呼吸灯的时间,对不对?虽然 analog right 这个函数它实现的并不是 p w m 呼吸灯,而是通过模拟输入的一个呼吸灯, 但是在上节课我们也知道了这个 analog right 这个方法呢,他传入的这个值是介于零到二五五之间的,就是零是长臂,二五五呢是常亮。而咱们 analog read 方法咱们也看 他的范围是零到四零九五,所以他们之间应该怎么转化呢?实际上呢,就是零到二五五就相当于是有二百五十六个数字,零到四零九六呢,他是有四零九六个数字, 咱们直接让四零九六除以一个二五六,就等于个十六。所以呢,咱们就可以把这个 annelog read 得到的结果除以一个十六,就转换成了一个零到二百五十五之间的一个数。 既然了解了这一点之后,我们就可以来写代码了,还是先把咱们这个 set up 函数 和 lop 函数写上,哎,同志还是需要红定义,这次咱们用到了两个引脚,就是先 先是定义 led 和电位 g 引角 dfi, 那 led 咱们就直接叫 led 了,它的值呢就是十三,接着 defin pot, 它的值呢是二十六。 刚才咱们只初始化了电位计的输入值,我们这里呢还需要初始化一个 led 的一个输出值类型,那都是 inter alt 杠 value, inter led 杠 value。 然后咱们就需要在 cw 函数中配置一下电位 g 和 led 引角,就是拼 mode 那 port 音 put, 电位 g 设置为输入模式, led 设置为输出模式。最后就咱们循环的内容啦, 循环的第一步呢,还是读取咱们电位 g 的模拟输入量,就是 pot value, 就等于一个 analog read pot。 接着呢,我们就需要把电位 g 这个模拟值转换为 led 的模拟输出值。 那我们之前也说过了,那转化方法呢,就是 l e, d 这个模拟输出值就等于一个电位计模拟输入值除以一个十六, 那最后我们就可以使用 and log right 函数,第一个传入就是咱们这个引角,第二个呢就是 led value, 最后我们再给他一个延时一类五十毫秒, ok, 然后咱们上传一下, 我先拧一下啊,现在咱们这个灯是不是并没有任何的变化,对吧?我就拧到中间就可以了,就现在中间一个位置 烧了,完成后咱们看啊,现在咱们这个灯泡是不是处于一个亮的一个状态,然后我拧他一下,哎,拧到最小他就灭了,然后拧到最大他是不是就越来越的亮,越来越亮, 这样呢,咱们就使用 analog right 方法和 analog read 函数来实现了咱们这个电位计控制 led 亮度的一个实验。 但是呢,这和我们这节课要讲的触摸转换器并不是一码事,我们打开 e s p 三二 a, d c 函数所在的这个 文件,就可以看到这 a、 d, c 的一些控制函数,那第一个就是 analog read resolution, 安呐就是来设置一个分辨率,这个 resolution 呢可以是九,如果是九的话就是零到五幺幺, 也可以是十十一,十二,十二的话就是对应了零到四零零九五。接着呢就是第二个参数,我们经常用到的就是 a d, c 和太吃片,他呢是把一个引脚附加到这个 a、 d, c 上, 接着第三个这个 analog site attenuation, 他那就是设置所有的 a, d, c 引角的输入衰减,默认就是 a d c 杠十一 d b, 然后还有其他的区值啊,就是 a d, c 杠这个零 d b 零 d, b 呢,就是没有衰减,然后 a, d, c 可以测量大概就是零点八伏的一个电压,接着就是 a, d, c, 二点五,二点五呢是可以测量一点一伏六, d, b 呢是可以测量大约一点三伏,最后就是十一 d b, 十一 d, b 呢大约可以测量那是二点六伏。 最后一个呢就是给指定的引脚设置一个输入衰减,默认呢也是 adc 杠十一 db 衰减的这个参数呢,与前一个函数一样的, 咱们这个 a, d, c 模块儿,它的读取方式呢和 alino 内置的 analog read 是一致的,也是使用 analog read, 只不过呢它是在 e, s, p 三二 highl a, d, c 这个文件中呢,又定义了一遍,所以我们的代码呢 可以这么写,一开始还是先定义咱们这个银角,还有就是咱们这次呢也不使用 and logo right 来改变这个 led 的亮度了,我们使用 ledc 外设, 那 l, e, d, c 外设的话,我们是不是需要设置一个通道值,还有就是设置一个分辨率,那我们先定义好吧,先定义两个引脚,先是咱们的定位记引脚二十六,接着呢是咱们这个 l, e, d 引脚十三, 再就是咱们这个 ledc 通道 channel 啊,那这次咱们用到零通道吧, 然后咱们还需要初始化一下模拟输入值,那就 inter hot 杠 value, 然后我们 set up 函数中需要 做什么呢?那首先第一步就是我们需要设置一下 a, d, c 的分辨率,那就是 analog read resolution, 咱们给大家设置一个十二,默认也是十二,对不对?或者呢你就可以不写,你不写的话效果也是一样的,但咱们先写上,让大家知道咱们的一个流程,接着就需要配置一下咱们这个衰减器,那就是 i know log that 额,吞牛为生, a b c 杠十一 b b 这个也是默认值,你不写的话效果也是一样的, 我们现在已经配置好了 a, d, c 的引脚对象,接着呢我们还需要配置一下 l, e, d, c, 那首先就是建立 l, e, d, c 通道,并且呢我们还需要配置 l, e, d, c 的分辨率,那就是 ledc set up channel 第二个值呢,我们要填的是一个频率,给他一千,最后一个呢就是分辨率,那我们为了方便哈, 咱们看 adc 的分辨率是十二,那我们给这个 ledc 它的频率也设置成十二,我们是不是就可以直接使用这个电位,记得模拟输入值,把这个模拟输入值呢?直接通过这个 ledc 外设输出一个 pwm 不就可以了吗? 那既然他们两个都是十二的话,我们再定义一个理发,就是咱们这个 resolution, 如果你觉得太长的话,咱们可以直接写一个 res 或者 iso 对齐给他,因为他们两个都是十二,我就写个十二,然后把它复制一下 放在这里,放在这里,这样的话咱们再把这个频率的这个值给他红定义了,是不是咱们的程序中就没有死数了? 那平局叫 freak, 给它一个一千 freak。 建立完 led c 通道之后,我们最后一步配置呢,就是关联 gpl 口和这个 ledc 外设通道代码呢就是 ledc attach 拼 led 引角,然后 channel 公道号,那我们 set up 函数的内容就写完了。最后就咱们这个鹿函数, 那录函数中我们需要不断扫描的呢?首先第一个就是获取咱们这个模拟信号的输入值,那咱们就用 pot y 六,就等于一个 的 log read but, 然后就输出 p w m 呗,使用 l e, d c 外设输出 p w m 的话,咱们需要的使用的函数是 l e, d c right, 第一个需要填写的是通道号 china, 第二个呢就是咱们这个占空笔, 在咱们这里呢,占空比是和这个 pod y 六相等的,也就是 pod y 六。最后咱们给一个延时 delay, 五十毫秒运行,我们来看一下, 现在我们来拧一下这个电位器,咱们看咱们现在是不是就通过 e s p 三二的 a d c 通道来控制这个 l e d 的亮灭了。

这节课我们来搭建 e s p 三二的 micro python 开发环境。首先就是代码编辑器,也就是我们常说的 i d e。 如果你是初学者,或者喜欢简单而快速的应用,那么推荐你使用 sony。 sony 是一款开源软件,对 micropython 的兼容性非常的友善,而且支持 windows、 麦克 linux 三大平台。最重要的是,它可以直接在软件中给 esp 三二刷 micropython 的固件, 并且呢,你可以实时预览 esp 三二的文件系统。这两点在我们后续的开发中非常的重要。 当然了,桑尼也不是没有缺陷的哈,由于其过于轻量化的设计,这个 i d e 呢,不具备代码提示功能以及很多开发者常用的插件。但是对于初学者而言,桑尼已经是足够了的。 我们可以在桑尼的官网下载安装程序,在浏览器中搜索桑尼的 o r g。 这里我们看到桑语的下载链接啊,点击下载即可。如果你点击之后一直没有反应的话,也不用担心。在我们的资料包中选择已经下载好的程序。右击以管理员身份运行, 点击下一步下一步,然后更改一下我们的轮储路径,尽量不要放在 c 盘啊。 选择创建桌面图标 install, 等待安装完成即可。 安装完成后呢,我们打开 sony, 能够正常打开 sony 的话,就说明你已经安装成功了。 之所以下面这会出现红色的报错啊,在这个筛要环境中,是因为我没有连接这个 e s b 三二单片机啊。但是你连接了之后呢,它依然会存在报错,因为我们还没有收录这个 micropops 的固件。 总体安装好之后呢,咱们就需要给单片机烧录 micropicent 的部件了,不然我们写的程序单片机他看不懂。首先把我们的单片机与电脑相连, 在骚逆中点击视图选择文件,这样我们就可以看到左侧出现了本地实时文件预览的窗口,等我们收录好了固件之后,就可以看到单片机的文件系统啦。 接下来我们就需要配置解释器并烧落构建到单片机中,点击右下角,这里配置解释器。 第一个呢,我们选择 micropison esp 三二第二个端口的话,它会自动检测到,如果你这里没有检测到端口,那说明你的电脑里没有这个驱动哈,你可以直接在我们的资料包中找到这个驱动,并且下载就是这个。 在点击 ok 之前啊,我们还需要把 micro python 的固件捎入到 e s p 三二单片机中,固件需要在 micro python 的官网下载,当然我们的资料包中也有已经下载好的资源,就是这个 micro python 固件。 点击安装或更新 micropize 端口的话,就选刚才我们检测到的这个固件呢,我们就选中我们资料包中的这个固件,点击安装, 等待安装完毕即可。这里我们看到他已经正确安装了,如果安装失败,可能是 bot 模式不对,只需要在安装时按住 bot 键即可,也就是下面这个按键 弹就说明安装完成了,点击关闭点击好的。安装完成后,我们可以看到在单片机设备中出现了不退电 py 文件,并且呢设有环境也可以正常使用了。 但是呢,我们还需要测试一下 micropison 环境是否搭建成功?找到资料包中的开机测试代码, 这里有一个闷点 py 文件,双击打开,大家先没有理解代码的意思啊,后面的章节会有讲解,这里主要是为了让大家 了解一下。搜你的使用方法,点击左上角的运行当前脚本,或者按 f 五键这里我们看到在我们的这个单片机上有一个蓝色 led 灯亮起来了,这说明我们固件收录成功了。

这节课我们来学习如何使用 esp 三二获取网络请求。咱们之前已经用 esp 三二连接 wifi 了,这 esp 三二呢,它是支持二点四 g 网络的,那我们就可以通过发送 http 请求来获取一些网络数据。 一般来说呢,这些网络数据都是由一些公共的 api 接口提供的,我们需要通过这些接口呢来发送 htvp 请求来获取数据。 当我们在浏览器中输入网址或者使用应用程序的时候,我们实际上是向服务器发出请求。 http 请求呢,是客户端与服务器之间通信的方式,用于获取或发送外部资源,这些资源可以是文本、文件、图像、脚本等等。客户端通过 http 协议发起请求, 而服务端呢,返回相应的数据。 http 请求呢,通常由以下三部分组成。第一个就是请求行,包括请求方法、请求的链接和这个 http 的协议版本。就比如我们的这个例子, get 呢,就是请求方法,然后这 htvp 这个三 w 点,百度点 com, 这个就是 url 地址。再就是这个 htv 账一点一,它是指定了协议版本,通常啊,咱们这个 htvp 协议版本一般都是一点一, url 呢,是你要访问的地址,而请求方法他是除了有 get 之外呢,还有 post、 put、 比利特这四种常用的请求方式,以及一些其他不常用的方式,就比如像 option 啦等等就太多啦。 接着第二个呢,就是请求头,请求头就包含了与请求相关的信息,比如浏览器的类型,请求时间等等。再就是请求体,请求体里呢,就包含了请求所需要的数据。 我们虽然可以对任意网址发送网络请求,但是这样毫无意义,比如我想要获取某个地区的天气状况,就需要调用相应的接口,也就是 api。 那什么是 api 呢? api 是指这个应用程序编程入口,它定义了应用程序之间进行通信的方式和规范。 然后 api 呢,他允许不同的应用程序之间进行数据交换,使得应用程序可以进行资源共享,从而提高应用程序的效率和可用性。这 api 呢,通常使用 http 请求提供服务, 客户端通过发送 h d p 请求访问, a p i。 服务端呢,通过 h d p 响应返回相应的数据。 a p i 可以提供许多不同的服务,比如访问数据库啦,获取一些实时数据,处理图像等等。 这 api 肯定不会凭空产生的,对不对都是人家写好的。所以当我们使用别人提供的 api 的时候,就需要遵守别人制定的规则,使用相应的链接请求方法的呢。那怎么知道这些呢?我们就需要查看对应的 api 文档来获取这些信息。 就比如这节课,我们使用这个聚合数据的 a p i 接口来获取这个天气情况,那我们就先打开他的网站,你看这里,他直接就标明了这个 a p i 接口。然后我们选择生活服务,找到免费这一栏里面,我们直接搜索天气 这里,我们看它有一个天气预报,对不对?我们就点击了解详情。咱们看它这里啊,它这里是不是就有一个 a p i 文档?根据这个 a p i 文档,我们就可以知道它这个 a p i 的一个接口的地址,也就 u r l。 接着呢就是告诉我们一个请求方式,是这个 http, 请求 get 或者 pose 方法,然后他还给我们一个请求视力,后面呢就是一个请求头,然后请求参数的说明,告诉你这个参数是什么,一个 ct 和一个 k, 最后就是返回的是参数一个说明, 这里我们需要注意的地方,他还告诉你一个返回格式,是一个 jason 格式。那什么是 jason 数据? jason 呢?是一种轻量级的数据交换格式,常用于外部应用之间的数据传输。他那就是一种简单的文本格式,比较容易阅读和编写,并且 可以被各种编程语言支持。 jason 数据呢,由箭值队组成,其中的箭是字符串,而值可以是字符串数字,布尔值,数组,还有对象等等。 我们来举一个简单的例子,这就是一个基本的 jason 对象,其中呢, name age, 这 is student hobbies, 然后 address 他们呢,都是贱,他们对应的值分别是老大富自助串吗?然后二十九,这个就是数字,再就是 force 波尔值, 然后后鼻子呢,我给了一个列表,就是睡觉,打游戏,我的爱好就是睡觉和打游戏,然后我的地址目前处于这个河南郑州,这地址这里我们看啊,我是又嵌套了一个,这层对象分别对应的是 city 和 say, 这层数据呢,通常用于这个外部应用中,比如从后端服务器中获取 数据,或者向后端服务器发送数据。那我们在 micro python 中该如何使用呢?这时候我们就需要用到 u request 字幕模块,就是当我们使用 micro python 在嵌入式系统中开发物联网应用时,也就是 i o t, 我们通常需要使用网络连接, 通过使用这个 micropython 的 you request 模块,我们就可以轻松地从外部服务器上获取数据,实现基于网络的功能。 uri 快死模块呢,是用在这个 micropison 中进行 http 请求的模块,它实现了 http 客户端协议,允许我们使用 get, post, put、 迪丽特请求等基本的 http 请求类型。 下面就是一个简单的例子,我们先导入模块,之后接着使用 request 点 get 方法。 get 中呢,我们需要 填写一个 ul, 这个链接就是我们要访问的链接。我们通过 get 方法向 example 点 com 这个网址呢发送 get 请求,并且通过 response 点 text 方法将这个响应内容打印出来。 当然我们之前也说了对不对,我们获取的响应一般都是 jason 字符串,所以呢,我们通常也可以使用这个 response 点 jason 方法把 jason 数据转换成字典。 除了 get 方法, request 的模块还提供了 post, put、 迪丽特三种方法。 post 呢,就是发送 post 进球,其中你可以传递这个搭踏参数来指定这个请求数据。 然后这层参数呢,是指定这层数据, hiders 呢,是指定这个 http 的标头。再就是 put put 是发送 兔子进球,也是有这个打法参数。最后呢,就这个迪丽特,迪丽特就是通过 htp 发送迪丽特进球。 ok, 那现在呢,我们就可以来敲代码了, 比如我们现在要通过这个 api 来获取数据,那我们就得看看有些需要注意的内容。我们先看需要传递的这个请求参数,一个 city, 一个 k cd 是什么?是我们要查询的这个城市的名称或者 id, 接着是这个 k, 这个 k 的值呢?我们需要在个人中心的我的数据的接口名称的上方来查看,所以咱们大家最好是注册自己的账号,因为我已经登录过了哈,我直接点击一下个人中心啊,我的 api 这里我已经申请过了,如果你没有申请的话,就点击申请这个新数据,然后添加选择就行了。我把我的这个请求 ok 复制一下,咱们这里先导入模块, you request 模块,接着我们就定义一个请求参数的字典, 那就叫 request, 让 parents 请求参数放到一个字典里,那咱们让这个字典的这个建名就和 a p i 的请求的参数名相同就行了,这样也好记。比如第一个就是 city, 我们想传入的值先不写,接着呢。第二是 k 想传入的值,我复制过来 ct, 我先写一个上海吧,然后就是发送请求, 接收响应,我们是用一个 response 来接收这个 u request 点 get 方法,我们还需要再定一个 u l 啊,定义保温地址,那就 u l 皇帝周围看一下,我们把这个给他复制过来,或者咱们可以直接把这个势力给复制过来,对不对?你看他这个势力是不是后面用一个问号,问号后面表示的就是请求参数,你看一个 city, 等于这是一个汉字的一个格式, 电脑按的就另一个参数 k, 后面就是填入你自己的这个 k 值,我把它复制过来。 那需要改的地方是哪啊?我们用一个 x dream 方法,在这个链接里面直接修改内容,就比如这个 city 这里,我把它给它删掉,让这个 city 呢?就等于一个 request harem 字, 它的 city 这个键对应的值,注意哈,我这个外面用的是单引号,如果里面我还用单引号的话,就把这个字符串给分割了, 所以我里面这里要用双引号,我们把它复制一下,放到后面来,把 city 改成 k, 接着我就可以把这个 u l 放到这里,我们来打印一下,就 print response, 点点 text 吧,运行完看一下, 我们看啊,我们是不是就获取到这些数据,但是这个数据这格式看着很奇怪对不对?我们可以把它我们这些数据复制过来,打开我们的乱器,你可以在线搜索一个 jason 格式美化数据,或者呢使用一些插件,就比如我就经常使用这个插件,他就可以对 jason 的数据呢进行一个美化, 比如我把这些内容复制过来,咱们看右边是不是就直接把一些这些内容他就给美化了。当然你也可以在这里看啊,咱们这个愈合数据,最后下面 也给了我们这个 jason 返回的一个视力啊,这里也提供了这个 jason 在线格式化工具, 这个用哪个都一样,无所谓的,而这个看着舒服一点啊,比如我们想要从这些数据里面获取一个温度,湿度,还有这个天气情况,还有这个 wad, 还有 api, 我也不知道什么东西,但是这不用担心对不对? 人家已经给你提供了返回的参数说明,这 wid 告诉你了是天气标识 id, 还有这 aqi, 这个空气质量指数可能为空。 现在我们就可以从 response 返回的数据中呢,提取出来,我们就先获取温度,天气情况,还有这个空气质量指数吧,这几个先获取一下,那我们在获取之前,咱们先打印一下这个格式哈,就 print 一下 app response, 点 text 运行,我们看一下,咱们看啊,他现在,我们现在获得的这一串啊,他现在就只是一个字符串,那我们怎么把它转换成字典呢?首先我们可以使用 input, 可以导入这个 jason 模块。其次啊,我们刚才也说了,我们可以使用, 我们可以使用 jason 方法,这样它就会把我们返回的数据转换成字典了,咱们运行看一下啊, 这里我们看这是我们用 text 获取的内容,这些是我们用这个 jason 数据获得的内容。最后他打印下类型,我们看是不是就变成了一个字典,那我们就可以从这些字典中获取相应的内容了。这什么杠 u 开头的这些内容啊,它是 unique 的,它表示的是每个汉字 对应了一个 uniq 的值,大家不需要担心啊,大家也不用管他们到底是怎么对应的,一会咱们获取到的还是汉字内容,那现在这三行我就不需要了,我给大家注释一下, 我们要获取的咱们还得找一下哈,咱们现在看一下这最外层,这是一个大的字典对不对?大的字典中呢,分为 reason, 这个键对应一个字符串儿和 result, 这个键里面又对应一个字典。最后是 alcohol 的对应一个值, 所以我们要获取是外面这个大的一个字典中的 result, 这个键对应的一个值,它其中的 real 这个键对应的这个字典中的几个值。所以我们第一步呢,咱们就先获取 real time 这个字典, real time 就等于一个 response 字典 decent 方法,它是在最外层是瑞造特,对不对?瑞造特这个键对应的值,现在我们这里获取的是一个字典了,这个字典中的 real time 这个值对应的这个字典,我们打印一下, print real time 运行,咱们看一下啊,咱们看是不是对应的风向,然后对应的温度,对应的这个风力,这是对应的这个天气湿度都获取到了,接着我们就可以获取这些剩下的数据了,比如第一个我们想获取的是温度吧, app time 就等于 real time 它的 temperature。 接着我们再获取一个天气状况吧, real time 音否,我们再获取最后一个空气质量指数, a q i a q i 最后咱们把它打印出来,还使用 f 字母串温度降温,就是换行天气空气指数, 这三个我们分别填入的内容呢,就是看吧,接着 info, 最后 aqi 运行,咱们看下结果,咱们看,现在我们就获取了温度,天气状况,还有就是个空气指数。 那我们之前是不是用过 spi 控制 led 屏幕,然后也用过 lcd 幺六零二这个屏幕,你是不是就可以把咱们获取的数据在屏幕上显示出来了?咱们小伙伴们可以私底下去试一下, 咱们目前使用的这些 a p i 接口,都是其他公司提供的服务,对不对?而如果我们想要搭建自己的 a p i 接口,那该怎么办 呢?首先你需要明白,想要搭建自己的 api 接口,其实就是搭建你自己的网站,而搭建网站呢,他分为前端和后端, 前端和后端呢,是指构成外部应用程序的两个主要部分。前端通常是指外部应用中用户可以看到的并且交互的部分,就比如网页布局了样式了,这交互和功能等等。 而后端呢,它是指外部应用中的后台,用于处理一些服务器端的逻辑和这个数据储存,比如这个数据库和 api。 也就是说,如果我们单纯想搭建一个 a p i 的话,就只需要用到后端就可以了。后端的功能往往是由编程语言和相关框架实现的,而前端呢,通常是由 h t, m l, c, s s 和 javascript 三种技术实现。前端和后端呢,也 也是通过网络协议,就比如 http 请求进行通信,将这些前端用户输入的数据传递到后端进行处理,再将这些处理的结果返回到前端。 如果你是非科班出身,想要转行做程序员,前端是你最好的选择。外部前端呢,是最容易入门的编程岗位,初级前端技术非常容易掌握,高级前端呢,需要一步一步学习和工作经验的积累。 而后端的分类那就多了,国内主流的后端开发使用的是加瓦、 go, python, note g s, 还有 c 加加 rust, ph p 等等。 所以,如果你想搭建自己的 a p i 的话,你该怎么选择呢?以下仅代表我个人的意见哈。如果你明确目的,打算未来深耕于外部后端,那么你的第一选择必然是 java, 因为 java 在国内外国 开发的地位现在是无法撼动的。第二呢,如果你是前端程序员,打算转行后端,那就先从 note j s 开始。简单的说, note j s 呢,就是运行在服务端的 javascript, 而 j s 也是前端必学的三大基础内容, 如果你不属于前两者,拍森就是你最好的选择。使用拍森最大的优点就是简单,效率高,你用加瓦需要写几百行或者甚至一千行代码,你用拍森可能就是几十行,一百行就能搞定。我们后面也会为大家带来这拍森外表开发的教程。 最后一点呢,就是千万不要学 php, 大家或许听过这个, php 是最好的语言,这个程序员常用梗啊,因为 php 上手比较简单,收获了很多开发者,而且呢,他又是早期互联 全网的重要的服务端语言,所以在各个社交平台上经常会遇到这样的讨论,甚至吹捧 php 的文章,所以咱们小伙伴们选择的时候一定要避免 php, 并不是说它不好,而是说它过时了。

之前我们已经学习了如何使用 p w、 m 和 a、 d、 c 这节课,我们来学习如何使用 p s 二双轴摇杆来控制舵机, 这摇杆呢,一般在这个航模、无人机、遥控车、云台等设备上广泛应用,很多带有屏幕的设备也经常使用摇杆作为菜单选择的注入控制 双轴按键。摇杆主要由两个电位器和一个按键开关组成,两个电位器随着摇杆扭转角度,分别输出 x 轴和 y 轴上对应的电压值,而这轴呢,它是向上的,按下摇杆呢,就可以触发这个按键。 在配套的机械结构的作用下,没有外力扭动的这个摇杆,初始状态下的他的两个电位器呢,都处在凉城的中间位置。电位器我们之前说过, 就是可变电阻器,和咱们初中时候学的这个滑动变阻器呢,是类似的 ps 二摇杆模块呢,它有五个端口,分别是一个接电源的 vcc, 接地的接地和控制 x 轴输出、控制 y 轴输出,控制这个按键的三个输出引脚。 我们可以拨动这个 ps 二摇杆,然后随着这接触刷改变接触位置,这可变电阻器,也就是这个电位器,他的引脚处输出的这个电压就会发生改变。 x y 轴呢,是模拟输入信号,而 z 轴呢,它是数字信号,因此 x y 短口连接 a、 b、 c 引脚,而这个 z 短口呢,就要连接数字引脚。所以我们一共需要使用 e、 s、 p 三二的三个 g、 p l 引脚才能控制 p s 二摇杆模块。 其中两个模拟信号输入银角和一个数字信号输入银角,最后就是这个摇杆模块,他正常状态下,也就是不受力的时候,检测电压的常态在一点六五伏附近,最大值呢是三点三伏,最小值是零伏。 使用 esp 三二自带的 adc 数模转换器的两个通道,分别检测 x、 y 轴的两个电压值的变化,就可以知道这个摇杆指向的位置了。 接着我们就可以来搭建电路了。首先我们先连接这个摇杆模块,我们让摇杆模块的这个正五幅引角接 esp 三二的三点三伏, 一般情况下 e、 s、 p 三二的 a、 d、 c 电压输入的范围是零到三点三伏,高于三点三伏可能会烧坏 a、 d、 c。 摇杆模块的接地呢就接接 sw 呢,也就是咱们这个八成按键接的是第四引脚, s 轴呢接第十五, y 轴呢接第二。接着就是咱们这个左边那是一个舵机,这舵机呢接开发板另一侧的五伏引脚和接地,而这个信号呢使用的是 gpl 十三。 那我们现在呢就可以来敲代码了,我们第一个实验呢,就先在咱们的串口屏中打印一下我们在这个 ps 二摇杆上读取到的一个数值, 先定义咱们用到的这几个引角,比如底饭,咱们这个 x 方向就叫 ps 二杠 x, 安娜对应的是十五,在底饭 ps 二杠 y, 他对应的呢是二。最后就是一个咱们这个 按键,也就是咱们这个 switch, 它对应的这个引脚是四。接着呢我们就配置一下这几个引脚的一个模式,输入模式,咱们这个拼音 mode p、 s 二杠 x 它呢是 input, 把它复制两遍, ps 二杠 y 它也是这个 input, 但是咱们这个 switch 按键呢,怎么想啊?它们两个这是模拟输入,也就 a, d, c, 而咱们这个 switch 呢,它是一个数字信号,对不对? 数字信号的话,我们呢就得给他添加一个上拉电阻或者下拉电阻,我们也知道咱们这个按键他按下之后是低电频,那所以呢,我们给他初始呢就添加一个高电频,也就是一个上拉电阻,那叫 inputprop。 接着咱们 再配置一下汉口通信波特率,那就 serial 点 begin 九六零零。 然后呢我们就在录函数中不断的来读取我们这个数值,就读取数值, 我们用到的这个方法呢是 cro 点 print f, 就格式化字符上的方法来显示一些什么呢?咱们呢读取到的 x 的值, x 的值对应的是一个整形,所以呢用百分号 d 来做一个站位符, y 定的值也是百分号 d 这个站位符,接着呢 z, z 呢,不是零就是一对,不对,那也是这个百分号 d, 再给他一个换行符,也就是放斜盖,嗯,把咱们三个站位符对应的这个值呢写出来,那就 and log red p s 二杠 x, 接着 in the log red d s 二杠 y, 最后这个咱们这个是数字输入引角,对不对?所以呢就是低级头 red s w, ok, 咱们不要让他显示的太快,不然呢我们也看不清,那就让他每隔一百毫秒显示一次,上传一下代码,我们看一下结果, ok, 我们打开这个串口监视器来看一下,哎,咱们看现在是不是就读取到了数值,咱们这个 x 轴它读取到的值呢是一八二五 yna 读取到的是一四三四, z 是一。我们来拨动一下 咱们的摇杆来看看变化,咱们看 y 现在是不是就变成了这个四零九五, 往右拨的话, y 就变成了零,往下拨 x 变成四零九五,往上拨 x 变成零,那咱们 往左下呢,就是这个 xy 都是四零九五,右上就是两个都是零。最后测试一下咱们这个 z 轴,他现在默认值呢是一,我们按下之后呢,他就变成了零,松开呢又变成了一按一下变一下零,长按就变成零了,那说明咱们这个摇杆模块呢就可以正常使用了。 那接着呢,我们就来开始我们第二个实验,咱们了解完该怎么获取这个 ps 二摇杆的一个数值之后呢,咱们呢就可以使用这个摇杆来控制咱们这个 舵机了,那咱们之前内容我们可以先把它复制过来放到这里, 变化是什么呢?我们现在只定义了咱们这 ps 二摇杆模块用到的引脚。呃,如果我们通过 ledc 外设输出 pwc 波形来控制这个舵机的话, 咱们是不是还需要把舵机需要的一些这个参数给他传进来,比如一个分辨率了,还有这个舵机的引脚了,这个占用的频道号和这频率 我们来写一下,那就 defi, 先把咱们这个舵机引脚写出来,就 several 十三,然后是分辨率 resolution, 这是十二,为什么我们这个分辨率这里是十二哈,因为咱们在使用这个触摸转换器的时候,并没有设置咱们这个触摸转换器的一个分辨 对不对?而咱们这个 adc 呢,它的默认的分辨率是十二,所以呢,我们让 ledc 外设它的分辨率也变成十二的话,是不是就可以直接转换了? 当然你把分辨率写成八也没有问题啊,不影响。后面我们会用到一个新的函数,把这个范围呢给它转换一下,咱们继续来定义分辨率,有了还有频道号,就 channel 等于零,我把这些数字给它对齐一下, 最后一个是咱们这个频率 frequency, 我直接简写成这个 freak 啦,五十。 在咱们的赛踏板式中呢,我们还需要配置一下,就是先设置 l, e, d, c 通道的频率和分辨率,也就是 l, e, d, c 赛踏 up channel break resolution。 然后呢就是把咱们的通道号与咱们这个引角关联关联通道号与这个 g p i o 引角,那用到的就是 l, e, d, c 呃,太尺 a t p a c, h p。 咱们的这个舵机引角和咱们的通道号关联起来,那咱们的配置函数就写完了。接着呢,我们就需要把这个读取到的摇杆的一个模拟输入值呢,转换成我们这个舵机输出的一个值。 但是呢,现在有个问题对不对?因为咱们这个 ps 二腰杆,他读取到的这个范围呢,现在是零到四零九五,对不对?而咱们这个舵机呢,他有一个零度和这个一百八十度这 角度对应的一个 ledc 输出的一个模拟量,所以我们这里先记录一下,那就 inter, 我们最小也就是零度,对了,一个麦宽,他那就等于一个零点六除以一个二十,再乘以一个咱们这个分辨率,也就是 power 二的 resolution 次方, 那最大呢?这是最小的,接着就是最大的 max 杠 y z 最大的对应的是二点五除以一个二十,再乘以这个二的 red 路顺次方, 也就是说呢,我们需要把这个 ps 二摇杆获取到的值呢,转换到咱们这个最小麦宽和最大麦宽他们对应的值之间,对不对?所以这时候呢,我们可以用到一个新的函数叫 map, map 函数呢又称为映射函数,它的主要功能就是把这个范围为 a 的一个变量等比例转换到 b 中。在 rdno 中呢,有非常广泛的应用, 就比如我们现在就可以把咱们这个 ps 二摇杆组取到的这个模拟量这个范围零到四零九五,转换成咱们这个舵机需要的这个最小麦宽到最大麦宽之间的一个数值。 用法呢也很简单,我们先定义一个,先初始化一个什么吧,我们在这里再初始化一个变量,用来接收咱们的转换后的一个数值,也就叫 y 六。 y 六呢,就等于一个咱们这个卖法, 它的第一个值呢就是我们读取到的这个值,那我们就直接用咱们这个 ps 二杠 y 摇杆吧,就 y 方向的,我们把读取到的这个 ps 二杠 y 它的 这个模拟量呢给转换一下,范围就是从零到咱们这个你可以写成是四零九五哈,或者咱们写成这个二的 razer 路顺四方,对不对? 咱们注意啊,第一个把它呢转换到咱们这个最小麦宽命外字到这个麦克斯杠外字, 这个 y 六和这个 analog read p s 二杠 y, 它们两个属于同类型的变量,而咱们这个零和二的 red 路程次方,它们呢是咱们这个 analog re 的 p s 二杠 y 它原本的这个上下界, 而后面这个 mean y 字和 max y 字这两个值呢,是我们要把咱们这个 analog read t, s 二跟 y 这个上下键呢转换到的一个 新的上下界,然后呢就根据范围比例把咱们这个 analog read 这个值等比例的转换成这个命外字到 max y 字中的一个值,并存储在咱们这个 y 六变量中。简单点来说呢,其实就是一个数值转换, 现在我们获取到的这个 y 六值呢,就是我们这个 l, e, d, c 一会要输出的 p, w, m 的值,我们可以把这个读取到的数值呢后面再加一项,也就是映射后的 y, 映射后 y 的值,那就也是 person 的 d, 这里我们最后把这个 value 给它写上,那数值呢,我们已经获取到了,那最后我们是不是就可以输出这个数值了,也就是 l, e, d, c, right 给咱们这个通道号 channel 输出这个 value 的一个值,运行我们来看一下, 顺便我们把窗口监视器打开来,我们来拨动一下摇杆看看效果。哎,我们看现在咱们这个舵机是不是就可以根据咱们这个摇杆正常转动了? 咱们之前在使用这个舵机的时候是不是也用过第三方库,那我们试着通过第三方库来使用 ps 二摇杆控制咱们的舵机转动,那咱们先把这些代码呢给它复制过来,放到咱们下一个文件中,因为咱们大 部分内容呢还是相同的,对不对?比如我们这个引脚的定义呢?这四个就是一样的。还有咱们这个分辨率了,通道号还有这个频率,因为我们要用第三方库了,所以呢我们就不需要自己来操作这个 ledc 外设了,这行通道号我就给他删掉了。 还有就是咱们这个最大麦宽和最小麦宽给转换成咱们这个 ledc 要输出的模拟量的这个数值转换,把它给删掉, 因为我们需要选到第三方库。首先呢还需要再导入一下这个音音刻录的名字呢,是 e s p 三二 several 点 h 导入这个投文件,再往下看,那配置这里咱们既然用不到 l e d c 外设了,这两行也就删掉了。 咱们想要使用这个 esp server, 就需要先定义一下咱们这个 server 对象, 那就 serval my serval。 接着呢就是在咱们的赛踏板数中先分配咱们的硬件定时器,那就 e s p 三二 p w m i locate timer 给它分配一个零吧。接着呢就是设置频率, my serval 点 set period hurts break。 最后呢就是关联咱们的 level 对象和咱们的 gpl 引脚, 并且呢我们还需要设置一下这个麦宽的范围,也就是 my server, 点这个 attach, 先传入咱们这个 server 的这个引角。接着呢就是咱们一个最小麦宽和最大麦宽,它的单位呢是毫秒, 那就是五百和二五零零,五百呢对应的就是零度,两千五呢,对应的就是一百八十度。我就不给他一个红定义了,咱们小伙伴们可以给他写,在这里写一个红定义,在这里 咱们继续往下看。这道录盘式中咱们用不到 ledc 外设,所以正常代码啊,就可以给他删掉,换成是这个 my server 点 ret 对不对? 但是 myself 点 right 方法呢?它传递的是一个角度对不对?角度的范围呢?是零到一百八十度,所以我们就可以改一下咱们这个映射函数 map 它的后面两个我们要到达的一个范围。 咱们原来是自己转换了一下这最大麦宽和最小麦宽,他们两个对应的一个模拟量,现在咱们是不是可以直接把它转换成一个角度,就是零到一百八十度,那还有什么需要改的吗?没有了, 我们运行一下看看,我们看他哪里出错了啊?这里啊,我们这个 set period 贺词,这拼错了,拼错没有关系啊,你看他有一个给你解释对不对?他说呢,咱们这个 several 这个类不存在这个成员名为这个 set period 贺词这个方法, 他问咱们是不是想写的是这个 set period 这褐色,也就把这个 s 呢换成 z 保存,我们再上传一下看看。 那还有就是最后咱们这个 ret 没有把咱们这个 y 六的值给传进来,对不对?那就 y 六保存一下, 哎,现在就烧录完成了,我们打开咱们的创口电视器,再来看一下,我 来拨动这个摇杆,哎,咱们看我们这舵机是不是和刚才一样都是可以正常转动的,而且变化在哪里呢?我们看这里啊, 现在呢,咱们这个映射后的这个 y 的值是不是就变成了零到一百八十度? ok, 那我们的这个 ps 二摇杆模块的控制实验呢,就学习完成了。

ok, 这节课我们来学习四乘四矩阵键盘,首先呢咱们这个矩阵键盘,它其实是一种薄膜键盘,那什么是薄膜键盘呢? 薄膜键盘是一块带触点的 pet 薄片,用在 pcb、 fpc 等线路上作为开关使用,在使用者与仪器之间起到一个重要的触感型开关的作用。 与传统的硅胶按键相比,薄膜按键呢具有更好的手感,更长的寿命,可以间接的提高使用导电膜的各类开关的生产效率。 我们来看看这个薄膜开关的工作原理啊,就薄膜上的触点啊,它位于 p、 c、 b 板上的导电部位,当这个按键呢受到外力按压时,触点的中心就会下线,然后接 触到 p、 c、 b 上的线路,从而呢就形成了回路电流通过整个产品呢就正常工作了。 我们可以看到咱们这个薄膜键盘呢,它是有三层,上面一层是一个电路,下面一层呢是另一个电路,咱们按下之后呢,中间上下两层的这个导电物质他们就会连接,于是就会形成一个回路。 我们可以看一下我们这个键盘啊,咱们看这里,很明显他是可以分开的啊,这就是一个上层和一个下层,上层呢他接了四个阴角,下层呢接了另外四个阴角, 这个呢就和咱们前面这张图是一样的,这八条线呢,左边这四个控制的就是行,也就是右边这个图,然后右边这四个呢,控制的就是四个列,也就是中间这张图。 具体咱们需要看一下它的工作原理,这个键盘它有十六个按键,如果十六个按键均为独立按键的话,就需要用到十六个 l 口,对于我们的开发版来说还是可以接受的对不对?但是呢,如果有六十四个按键怎么办? 那我们这单片机的 l 口就完全不能满足我们的需求对不对?因此就出现了矩阵键盘这种形式。这个矩阵键盘呢,他是用八根线连接到单片机的八个 l 口上,通过程序扫描键盘就可以检测到十六个按键。 那如果我们想要实现六十四个按键的话,也只需要用到十六个 l 口就行,这个可以参考一下咱们之前那个 led 点震屏的实验。咱们那个 led 点震屏它就是八乘八的,一共六十四个 led, 一共只占了十六个引角。 无论是这个独立键盘还是矩阵键盘,单片机检测它是不是被按下的依据都是一样的,就是检测一下与这个键对应的 l 口是否一体电瓶。 那独立键盘呢,它是一端固定为低电瓶,这种编程呢方式也比较简单,而矩阵键盘呢,它的两端都与单片机 l 口相连,所以呢就需要编程通过这个单片机的 l 口送出低电瓶。 检测的方法呢有很多,最常用的是行列扫描法和这个线翻转法。那什么是行列扫描法呢?咱们看这里有介绍啊,就是检测时先给其中一列一个低电瓶,其余列呢为高电瓶。 就是咱们先确定一下咱们这个按键到底是在哪一列上,确定了列数之后,然后就立即轮流检测每一 行是否有低电瓶,如果检测到其中一行他是低电瓶的话,就可以确定行数了,知道了列数和行数也就相当于确定了一个坐标,那么我们也就可以确定到底是哪个键被按下了。 第二种方法呢就是线翻转法,这个方法呢就是让所有的航线为低电平时,检测所有的列线是否有低电平,如果有就记录下来这个列线的这个值,然后再翻转使所有的列线呢变为低电平,检测所有的航线的值。 由于有按键按下,这航线的值呢也会有变化,记录航线的值,从而咱们就可以检测到全部的按键了。 了解完原理之后呢,咱们就可以来搭建电路了。我们这个实验呢需要用到一个四乘四的矩阵键盘,还有咱们之前用过的 l c d 幺六零二 二液晶屏杜邦线和面包板巨轮键盘呢,从左到右依次接第十三、十二、十四、二七二六二五三三三二阴角,咱们这个 lcd 幺六零二,他接五伏电源时钟线呢接第二十二,数据线呢接第二十一。 最要注意的是我们之前也说过咱们这个 l c d 幺六零二呢,如果你接的是三点三伏电源的话,就可能导致你的字不会显示, ok, 那现在呢咱们就可以来敲代码了。那第一步呢,咱们就先把这个用到的银角先给定义出来, 我们把所有的行音角放在同一个数组中,再把所有的列音角呢放在另外一个数组中,那就定义行音角数组,定义列音角 数组,航音角数组呢,我们就要 int 肉杠 pins, 长度呢就有四个,等于一个。咱们把所有的航音角呢写进来,也就是十三、十二、十四、二七,从左到右, 接着呢咱们的列引脚数组,那就是 column 杠拼子长度呢也是四个,那就是二六二五三三三二。 ok, 定义完所有需要用到的引脚之后呢,咱们就可以来写 set up 函数中的内容了, 咱们需要用到这个串口,肯定需要先设置这个串口通信博特率对不对? serial 点 begin 九六零零。 我们现在来想啊,刚才咱们在讲行列扫描法的时候,咱们是先给一列为低电瓶, 其他列呢为高电瓶,然后呢,咱们轮流检测每一行是否有电瓶,这所以呢,咱们的列应该是输出引脚,而咱们的行呢应该是输入引脚,对不对? 所以呢,我们就用一个循环,用航引角设置为输入模式,那就 for ink i 等于零 i 呢,小于四 i 加加 拼 mod。 咱们这个 row 杠 pins 的第挨个元素模式呢是输入模式, 我们检测按下的是给一个低电瓶,所以我们初始呢就给他一个高电瓶,那咱们这个按键的默认呢,电瓶呢就应该是个高电瓶,所以呢给他一个上拉电阻行定义完了,接着就是列列引脚, 这呢设置为如初模式,那就 for int i 等于零 i 呢小于四 i 加加 tmo 的 polym 杠 pins, 它的第二个元素设置为 output 模式。 当然啊,你也可以把这两个放循环呐给他合并一下,我这里呢主要是为了让大家看起来比较方便理解, 而且呢,我们还需要给这个列引脚呢初始化一下,因为咱们是给检测的那一列是低电瓶,那其他不检测的时候呢,就应该设置为高电瓶,所以呢就把所有的引脚就初始化为高电瓶, 那就 digital write column 杠印子第二个元素,这是一个 高电瓶,哎,那现在咱们这个配置函数呢就写完了,接着呢我们就可以在录播函数中读取我们按到的按键,并且呢把它打印在咱们这个创口监视器中,因为咱们一会是不是还需要用到读取紧致键盘按键的这个功能, 所以呢咱们是不是就可以把这个读取矩阵键盘的按键这些代码呢封装成一个函数,并且咱们在这个路虎函数中呢调用我们这个函数,所以我们就可以把它定义成名字呢就叫 read 杠 kipad, 他不需要任何参数,但是有一个返回值,返回的值呢就是我们按下的按键,我们用一个变量来接收一下吧。 k, 咱们在一开始的时候把这个 k 定义一下,就创建按键变量,他的类型呢应该是差,因为我们这个 二三四五六七八九零 a b c d 都是单个字符,对不对?所以呢它的类型呢就是一个叉,名字叫 k 保存读取到的按键值, 那我们就在这个录函数的上面写一个咱们这个 void, 哎,这个有返回值对不对?你看咱们这个 k, 它的类型呢是 char, 所以呢我们这个返回值的类型呢也应该是 char, 那我们这个 redk pad 的范围值类型,也就是叉 red 杠 k pad, 他的其中该写什么内容,咱们先放一边不管,我们也想啊,假如我们现在已经获取到这个按键的值了,我们现在是不是该把咱们这个按键给打印出来,那就是 一幅咱们这个 k 存在的话,就是如果我们已经给这个 k 传直了,那咱们就使用这个 serial 点 print f, 就是打印格式化支付串的方式,把咱们这个检测到的按键给它显示在咱们的串口监视器中, 那就检测到按键按下画完符杠 n 在这里啊,一般是二是单个字符,我们就可以用百分号 c 来作为站位符,最后不要忘记加这个分号, 那终于我们该写这个函数了,名字先给它加上,就是获取按键值函数。 在这个函数中呢,我们第一步就是先定义咱们这个键盘按键的一个布局。我们看咱们右边这个图啊,咱们这个键盘他是四乘四的,所以我们定义的这个按键数组,他应该是个二 为的,那就是类型呢?还是差, k 子旁是四,列也是四,所以就两个四等于一个大括号,分号先写,后面给他换个行,这个大括号里面的四个元素呢,又分别是一个数组。 我们先看第一行,第一行就是一二三四,注意哈,这里的一二三四一定要用这个引号引起来, 这样才表示字符啊,把它复制三遍,一二三 a, 四五六 b, 七八九 c 有一个 d, 星零井 d。 ok, 那咱们这个 键盘对应的二维数组就创建成功了,那我们现在就可以使用行列扫描法来检测到底是哪个按键被触发了。 那咱们刚才也讲了,咱们第一步呢,是先给当前列设置为低电瓶,其他列呢,设置为高电瓶。那我们一开始出石化的时候,现在就已经是高电瓶了,对不对?所以我们第一步呢,先给这个列一个低电瓶, 然后呢就检测咱们这个行输入引脚的一个状态,检测到低电瓶了,就说明按键按下了,那咱们就返回这个按键值,那我想啊,咱们这个外层循环,他是不是就需要循环这个列,内层循环才是循环行, 所以就是 int, 我比较喜欢行用 i 来表示,那列呢?用 j 来表示,所以我就用 j int j 等于零, j 呢, 小于四 j 加加将是将当前列设置为低电平,那就低级头 rat alum 杠拼子的 d 这个元素给它呢,设置为一个低电瓶 low, 那现在是不是就该扫描所有的航音角的状态了,那就 for 内部循环,就是 for inter i 等于零, i 呢?小于四 i 加加 检测行输入引脚状态,那就 if 检测到低电瓶对不对?那咱们写上吧, 检测到低电瓶,说明按键被按下,那么咱们就返回这个按键值, 那低电瓶就可以写成是 d g 头 re 的肉杠品质的 d i 个元素,它呢,如果检测到等等于零,或者我们就可以在前面呢,在这个 d g 头 re 的前面加一个感叹号,表示取反, 那咱们就返回这个值,也就是 return, 把咱们这个 k 呢对应的值,这个行对应的是 i, 对不对?列呢?对应的是 j, 把咱们这 k 子这个二位数组的 d i 行 d j 列这个元素呢给它返回出去。 那如果我们这个内部的循环结束之后,并没有任何按键按下,那咱们是不是还需要把当前这个列恢复为高电瓶?这就 digital write polom 杠印字 来一个嗨,因为你想啊,如果你不给当前列会飞高电瓶的话,就比如我们按了第一列,第一列现在是个低电瓶,那我下次循环按第二列的时候,我们检测引脚,那第一列是低电瓶,第二列也是电瓶,对不对?那是不是就出现一个误判了? 那咱们这个行列扫描法的内容呢?就讲完了,但是你想啊,如果我们没有按下的时候,是不是就不会触发咱们这个 return, 而最后呢,我们也需要一个返回值,所以呢咱们还需要在程序的最后加上一行 return now, 然后我们再来运行一下,他现在给我们一个报错,就是我们这里呢少一个分号,加上重新运行, ok, 我们现在打开咱们的串口监视器,我随便按下一个按键,比如按下按键一哎监测到一按下 二四七信号都正常,对不对?但是接下来我们看啊,我按住五哎,五就显示了一下,对不对?你看五就在这里,五呢,他只在这里显示了一下,接着又变成四了,我们再按六呢, 六也是只显示了一下,他又变成四了,这是什么原因?我们来检查一下咱们这个程序哈, 看看这里,其实也就是一个逻辑的一个问题,因为咱们如果检测到按键按下的时候,是不是就会返回一个值?如果没检查到这个按键按下,咱们就会给当前列 恢复为高电瓶,但是如果你检查到之后,咱们就已经返回这程序了,他并不会再给当前列恢复一个高电瓶。所以呢,就比如我们检测到这个按键五按下之后,咱们这个第二列呢?他现在是不是就这个低电瓶, 咱们这个内部循环呢,他会先检查咱们这一行第一列也就是这个四,那检查到咱们这个四已经有低电瓶了,对不对?因为你这个五他是个低电瓶, 所以呢我们这个行音角呢,他就收到了一个低电瓶,那咱们就直接范围出来一个四,下次呢咱们依然没有把这个行恢复为高电瓶,他就依然范围出这个四。 那解决方法呢也很简单,咱们呢把这个恢复当前行这行代码呢给它放到这个衣服里面重新运行一下, 现在再重新打开我们的创口监视器,我现在再按一下按键,五的话,哎,这就是正常的五了,对不对?六九八七四一二三,那现在咱们就正常了, 但是他打印的太快了,咱们是不是可以在这个路虎函数的最后呢给他加一个敌类,让他延迟一个两百毫秒,那咱们这个程序呢就完成了。