io口的输入输出
首先,介绍三个函数:
pinMode(pin, mode)
–定义数字管脚的输入/输出;mode为INPUT/OUTPUT之一,表明该管脚是用于输入还是输出。
digitalWrite(pin, val)
–设置数字管脚输出电平,val取值为HIGH/LOW之一(或者1/0)。
digitalRead(pin)
–读取数字输入管脚的电平,函数返回值为1/0之一。
以下是通过一个按键,控制灯亮灭的程序:
int Button=5; //IO5(D1)
int LED = 2; //IO14(D4)
void setup() {
pinMode(Button,INPUT_PULLUP); //设置按钮引脚为上拉模式,默认为高电平
pinMode(LED, OUTPUT); //设置指定io为输出模式
digitalWrite(LED, 0); //初始化为低电平
}
void loop() {
if(digitalRead(Button)==0){ //如果读取到按钮引脚为低电平,视为按钮被按下
digitalWrite(LED, 1); //引脚置低,点亮LED
}
else{
digitalWrite(LED, 0);
}
}

详细原理图可见底部
io口的模拟输出/入(PWM)
analogRead(pin)
–读取模拟输入管脚的值,返回0-1023之间的。需要注意的是ESP8266只有一个模拟输入引脚(即A/D口)–A0口。
analogWrite(pin, val)
–设置数字管脚中的PWM管脚的输出值,val取值为0-1023。
(与Arduino UNO不同,UNO的pwm值在0-255)
以下为呼吸灯的代码:
int LED = 2;
void setup() {
pinMode(LED,OUTPUT);
}
void loop() {
for(int i=0;i<=1023;i++){ //模拟输出0-1023
analogWrite(LED, i); //i的值不断变大,LED亮度逐渐提高
delay(1); //用来延缓过程,展现效果
}
for(int i=1023;i>=0;i--){
analogWrite(LED, i); //i的值不断变小,LED亮度逐渐降低
delay(1);
}
}
以上为通过改变PWM(周期)的方法,来改变led灯的方法。以上程序上传之后的效果为esp8266自带的led灯(蓝色的)开始明暗闪烁。
以上需要注意的是:
- 使用analogRead(A0)时,是不需要pinMode(pin, mode)定义的。
- esp8266的PWM口是固定的。以下为ESP8266技术手册截屏。

舵机库的使用
学会了使用PWM自然是可以正常的使用舵机的。但是ardunio却是有专门的库,省去了很多麻烦。
attach(pin)
–连接舵机,pin为连接舵机的引脚号。
write(angle)
–角度控制 。
我只在使用esp8266时用过以上函数,还有以下几个但未用过。使用时待查阅。
read()
–读取舵机当前的角度(最后一次用write()函数写入的值)。
attached()
–用于检测servo变量是否正确连接至Arduino对应引脚上。返回值为 true 和 false 。
detach()
–将servo变量与引脚脱离,如果所有servo变量均被脱离,则可以用analogWrite()函数进行PWM输出。
以下为舵机来回90度偏转的代码:
#include <Servo.h> //加载舵机库
Servo myservo; //定义一个舵机对象
int _servo = 14; //IO14(D5)
void setup() {
myservo.attach(_servo); //设置指定io为舵机
myservo.write(0); //初始舵机为0度
}
void loop() {
for(int i=0;i<=90;i++){ //控制舵机角度由0度旋转到90度
myservo.write(i);
delay(50); //用以展现效果
}
for(int i=90;i>=0;i--){ //控制舵机角度由90度返回到0度
myservo.write(i);
delay(50);
}
}
esp8266管脚图及原理图

