前言
esp32的学习笔记
环境
- windows11
- vscode+platformIO
- esp32开发板
- sg90舵机
- st7735的1.44寸tft彩屏
- TFT_eSpi库【tft屏】
- ESP32Servo库【舵机】
- 好多好多杜邦线
库安装方法
- 点击platformIo的libraries

- Registry搜索所需库/instaled查看已安装库 注意有些库并不兼容设备,注意查看其标签
- 为项目安装
舵机部分
舵机控制原理
- 普通舵机是由普通电机+减速齿轮组+电位器+芯片组成的,使用pwm信号进行控制。控制芯片根据pwm信号的占空比来确定旋转角度
- 360度舵机是由普通电机+减速齿轮组+芯片组成,使用pwm信号控制。控制芯片根据pwm信号的占空比确定旋转速度与方向
舵机连线
| 舵机 |
主机 |
| 黑色 |
GND |
| 红色 |
VCC【本机3-7v】 |
| 彩色 |
pwm(gpio4) |
servo库安装与基本使用方法
本次无法使用arduino标准servo库,因为esp系列的计时器与其他设备不同,转而采用
SP32Servo库
例程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <Arduino.h> #include <ESP32Servo.h> Servo servo; int angle=0,angle_now = 0; void setup() { serial.begin(115200); servo.attach(4,500,2500);
}
void loop() { angle = Serial.parseInt(); if (angle>0&&angle<=180) { for (;angle_now <= angle; angle_now += 1) { servo.write(angle_now); } for (; angle_now >= angle; angle_now -= 1) { servo.write(angle_now); } } }
|
tft部分
tft彩屏控制原理
使用spi协议进行信号传输 spi协议介绍
理解为一个带时钟线的串行通信协议
1 2 3 4
| MISO:Master input slave output MOSI:Master output slave input SCLK :Serial Clock SS:Slave Select
|
st7735驱动接线
| st77345[屏幕] |
主机 |
解释 |
| GND |
GND |
|
| VCC |
3.3v |
【本机选用3.3v】 |
| SCL |
gpio18 |
SCLK【SPI·时钟】 |
| SDA |
gpio19 |
MOSI【SPI·主机输出】 |
| RES |
gpio17 |
复位(可与esp32rst接在一起)【低电平使能】 |
| DC |
gpio16 |
芯片控制【RS=0 数据总线传输的是指令;RS=1 数据总线传输的是像素】 |
| CS |
gpio15 |
片选信号【SPI·片选】【低电平使能】 |
| BLK |
未定义 |
背光【高电平开启 低电平关闭】【默认高电平】(LCD屏 关闭背光无法显示) |
TFT_eSpi库安装与基本使用方法
这个库能驱动各种spi屏幕,功能强大,故未采用商家提供库
选择芯片与开发板
- 打开项目.pio/libdeps/TFT_eSPI/User_Setup.h【本次不采用user_setup_select初始化 不要对其他文件进行修改】
- Ctrl+f找到所有的st7735 根据文件说明进行选择
补充说明 本次购买屏幕的错位修正选用 #define ST7735_GREENTAB3 找到后将其去注释
例程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <Arduino.h> #include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(); int angle=0,angle_now = 0;
void print_angle(int angle_now,int target);
void setup() { tft.init(); tft.setRotation(0); tft.fillScreen(TFT_BLACK); tft.setTextColor(TFT_WHITE); tft.setTextFont(4); tft.setCursor(0,0);
print_angle(angle_now,angle); }
void print_angle(int angle_now,int target) { tft.fillScreen(TFT_BLACK); tft.setCursor(0,0); tft.printf("Target:%d\r\nNow:%d",target,angle_now); } void loop() { }
|
综合功能实现展示
实现串口输入角度,舵机旋转到指定角度并且屏幕实时显示
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <Arduino.h> #include <TFT_eSPI.h> #include <ESP32Servo.h> #include <string.h>
TFT_eSPI tft = TFT_eSPI(); Servo servo; int angle=0,angle_now = 0;
void print_angle(int angle_now,int target) { tft.fillScreen(TFT_BLACK); tft.setCursor(0,0); tft.printf("Target:%d\r\nNow:%d",target,angle_now); } void setup(void) { Serial.begin(115200); tft.init(); tft.setRotation(0); tft.fillScreen(TFT_BLACK); tft.setTextColor(TFT_WHITE); tft.setTextFont(4); tft.setCursor(0,0); print_angle(angle_now,angle);
servo.attach(4,500,2500); }
void loop() { angle = Serial.parseInt(); if (angle>0&&angle<=180) { for (;angle_now <= angle; angle_now += 1) { servo.write(angle_now); print_angle(angle_now,angle); } for (; angle_now >= angle; angle_now -= 1) { servo.write(angle_now); print_angle(angle_now,angle); } }
}
|
#参考教程&附资料
- <a href=”./esp32%E9%A9%B1%E5%8A%A8%E8%88%B5%E6%9C%BA%2Btft%E5%BD%A9%E5%B1%8F/3-彩屏资料.zip >tft彩屏资料包括原理图|芯片手册等:





- 库示例代码