????????在之前的章节中,小编带领大家学习了:如何构建esp32的python开发环境-CSDN博客
????????今天小编带领大家开始学习python编程的第一节,通用引脚。esp32c3核心板是一个高度集成,功能丰富的模块,来看下他的功能分布:
? ? ? ? 我们可以看到,esp32c3为我们提供很多外设,串口uart、i2c、spi、adc和pwm等,这些外设,在后续的课程中,都会为大家一一讲解。
? ? ? ? 今天就来学习下,通用引脚的概念和用作。引脚:是单片机这种主控芯片特有的名字,可以理解它和我们人类的手脚相似,不管做什么事情,都是需要依靠它,下图针脚形状的都是引脚。
? ? ? ?? ? ??
? ? ? ? 单片机的引脚会有很多,人类只有一副手脚,那是因为我们的手脚可以做很多复杂的动作,攥拳、握手、活动手指等。因为单片机的引脚功能相对人类能做的能做到的动作很有限,所以需要更多的引脚来完成复杂和大工作量的任务。
? ? ? ? 通用引脚主要分为数字、模拟两种功能,又分为输出和输入两种模式:
? ? ? ? ①状态1一般等于系统电压,指的是当前的主控芯片采用的电压,esp32系列是3.3V的供电电压,所以系统电压就是3.3V。
? ? ? ? ②状态0一般等于GND,也就是接地,电压为0V。
? ? ? ? ③模拟电压是一个范围的值,输出的电压范围一般是 0 到 系统电压,输入同理。
? ? ? ? 这里面可能很多小朋友,对数字和模拟理解可能比较晦涩,这是需要大篇幅来讲解,会在后续的分享中,给大家一一讲解,今天主要掌握数字引脚的输出电压状态就可以啦。
? ? ? ? 上述的uart、i2c、spi、adc和pwm等功能都是通过管脚的输出和输入模式来实现的。
? ? ? ? 这里给大家补充一个概念,ttl电平,上述说状态1一般是系统电压,状态0一般是GND,其实这是不准确,这个是根据控制芯片的供电电压决定的。
? ? ? ? 比如:VCC(系统电压)5.0V,输入的状态1(Vih)电压指的是? 大于2.0V就都可以认为是状态1;同理输入状态0(Vil)电压指的是小于0.8V就都是状态0;输出状态1(Voh)电压指的是 大于2.4V就可以;同理输出状态0(Vol)电压指的是 小于0.4V就可以。
? ? ? ? ?单片机的输出电压状态1和0,是直接被拉满的,以3.3V供电电压esp32为例,状态1输出的就是3.3V,状态0输出的就是0V.
? ? ? ? 通过python控制单片机,采用的核心技术是micropython技术,大家可以关注官网,了解更多的概念和例子:MicroPython - Python for microcontrollers;中文网:micropython中文网
? ? ? ? 打开中文官网,选择esp32部分,来看下官方提供了哪些例子:
from machine import Pin
p0 = Pin(0, Pin.OUT) # create output pin on GPIO0
p0.on() # set pin to "on" (high) level
p0.off() # set pin to "off" (low) level
p0.value(1) # set pin to on/high
p2 = Pin(2, Pin.IN) # create input pin on GPIO2
print(p2.value()) # get value, 0 or 1
? ? ?? ?micropython最大的优势就是提供很多系统库,方便我们使用
????????首先导入引脚库: from machine import Pin
????????设置引脚输出模式:p0 = Pin(0, Pin.OUT)
????????控制引脚的状态:p0.on()等价与p0.value(1);p0.off()等价与p0.value(0)
????????设置引脚输入模式:p2 = Pin(2, Pin.IN)
????????读取输入的值:print(p2.value())
? ? ? ? 通过对引脚的学习,那我们就来实战一下,点亮一个led
from machine import Pin
led1 = Pin(12, Pin.OUT)
led2 = Pin(13, Pin.OUT)
led1.on()
led2.value(1)
? ? ? ? 我们的板子上自带两个led,分别和引脚12、13进行连接,控制两个引脚就可以点亮led了。
? ? ? ? 打开开发环境thonny,复制代码,下载程序,看下实际运行效果
? ? ? ? 运行效果:
????????顾名思义,变量(Variable)是可以改变的量,与之相对的是不可改变的常量。变量可以理解为数据的容器。
????????变量名是由用户自己定义的标识符。其命名规则如下:
? ? ? ? ①由字母、下划线、数字、汉字、日文、韩文、俄文等语言文字组成。不能包含下划线以外的英文标点符号,因为这些符号被用作为运算符。另外经过测试中文标点符号也不允许。
? ? ? ? ②第一个字符不能是数字。因为数值使用数字开头,十六进制还使用a-f之间的字母,数字开头的标识符也表示变量会让编译器难以处理。
? ? ? ? ③区分大小写、长度不限和不得与关键字同名
合法变量名:? _ab、abc、ABC、ab123等
不合法变量名:1abc、@abc、class等
? ? ? ? 库的作用,就是把写好的代码封装好成库,后面在使用的时候,就可以通过导入库,来进行调用使用了,不用重复写代码了。python提供倒入库的语法是通过import语句
????????Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块让你能够有逻辑地组织你的 Python 代码段。
模块定义好后,我们可以使用 import 语句来引入模块,语法如下:
import module1[, module2[,... moduleN]]
????????比如要引用模块 math,就可以在文件最开始的地方用?import math?来引入。在调用 math 模块中的函数时,必须这样引用:
模块名.函数名
????????一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:
from modname import name1[, name2[, ... nameN]]
例如,要导入模块 fib 的 fibonacci 函数,使用如下语句:
from fib import fibonacci
????????这个声明不会把整个 fib 模块导入到当前的命名空间中,它只会将 fib 里的 fibonacci 单个引入到执行这个声明的模块的全局符号表。
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
例如我们想一次性引入 math 模块中所有的东西,语句如下:
from math import *
????????定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。如下实例调用了printme()函数:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 定义函数
def printme( str ):
"打印任何传入的字符串"
print str
return
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
? ? ? ? 更多的python的语法,可以参考这个学习简单明了:Python 函数 | 菜鸟教程 (runoob.com)
,小编后续课程会以应用为主,编程语言的实战应用。更多语言的语法问题可以参考其他文章学习。