#
相关函数参考网站
(经典点灯和按键)
//点灯
void setup() //初始化函数
{
pinMode(2,OUTPUT); //设置GPIO2输出模式
}
void loop()
{
digitalWrite(2,LOW); //点亮板上与GPIO2相连的LED
}
//读取按键 按住按键时LED亮
const int key = 4; //按键接口
const int led = 2; //LED接口
unsigned char state = 0; //按键状态
void steup()
{
pinMode(led,OUTPUT); //GPIO2输出模式
pinMode(key,INPUT); //GPIO4输入模式
digitalWrite(led,HIGH); //先拉高不亮
}
void loop()
{
state = digitalRead(key); //读取GPIO4状态
if(state == 0) //按键按下了
{
digitalWrite(led,LOW);
}
else //按键没有按下
{
digitalWrite(led,HIGH);
}
}
(串口控制LED亮灭)
const int led = 2;
char res = 0; //存放接收到的数据
void setup()
{
pinMode(led,OUTPUT); //配置GPIO
Serial.begin(115200); //初始化UART1 波特率115200
digitalWrite(led,HIGH); //初始化关闭LED
}
void loop()
{
while(Serial.available() > 0) //先判断串口是否收到数据
{
res = Serial.read(); //读取收到的数据
if(res == 'A')
{
digitalWrite(led,LOW);
}
else if(res == 'B')
{
digitalWrite(led,HIGH)
}
}
}
(读取ADC电压值控制LED亮灭)
const int adc = 14
const int led = 0;
int value = 0; //存储读取到的值
#define limit 1000
void setup()
{
pinMode(led,OUTPUT);
Serial.begin(115200);
digitalWrite(led,OUTPUT);
}
void loop()
{
value = analogRead(adc);
if(value > limit)
digitalWrite(led,LOW);
else
digitalWrite(led,HIGH);
}
DAC
(将ADC采集的值转化为DAC输出)
int value = 0; //存储ADC读取出来的值
#define dac 25 //定义DAC接口
#define adc 14 //定义ADC接口
void setup()
{
Serial.begin(115200); //用来监控数据
}
void loop()
{
value = analogRead(adc); //读取ADC
Serial.print(value); //输出该IO口的值
Serial.print("///"); //分隔线
value = map(value,0,4096,255,0); //转换DAC输出值,DAC是八位的,故255
Serial.println(value); //输出转化值
dacWrite(dac,value); //DAC输出电压值 用万用表可测
}
PWM
(经典呼吸灯)
const int led = 2;
const int frequency = 1000; //PWM频率1000HZ
const int chanal = 0; //PWM通道0
const int BIT = 8; //PWM位数 (8或12)
int i,j;
void setup()
{
ledcSetup(chanal,frequency,BIT); //配置PWM
ledcAttachpin(led,chanal); //将通道0连接到LED
}
void loop()
{
for(i = 0; i < 255; i++)
{
ledcWrite(chanal,i); //输出PWM
delay(15);
}
for(j = 255; j > 0; j--)
{
ledcWrite(chanal,j); //输出PWM
delay(15);
}
}
Touch
(触摸点灯)
const int led = 2;
const int limit = 50; //阈值设置
int value = 0; //存储触摸值
void setup()
{
delay(1000); //启动度过不稳定期
pinMode(led,OUTPUT);
}
void loop()
{
value = touchRead(T0); //读取触摸按键T0的值(0-9)
Serial.println(value);
if(value > limit) //与阈值比较做出响应
digitalWrite(led,LOW);
else
digitalWrite(led,HIGH);
}
外部中断
(按键外部中断)
#define key 35
#define led 2
bool state = false;
void IRAM_ATTR ZhongDuan() //中断函数
{
if(state == false)
{
state = true;
digitalWrite(led,HIGH);
}
else
{
state = false;
digitalWrite(led,LOW);
}
}
void setup()
{
pinMode(led,OUTPUT);
attachInterrupt(key,ZhongDuan,FALLING); //设置外部中断
/*
1.LOW 低电平触发
2.HIGH 高电平触发
3.CHANGE 跳变沿触发
4.FALLING 下降沿触发
5.RISING 上升沿触发
*/
}
void loop()
{
}
计时函数
const int led = 2;
bool state = true; //控制LED状态
const int set_time = 0; //定时时间
unsigned long zhongjian = 0; //数据类型决定定时长度
void setup()
{
pinMode(led,OUTPUT);
digitalWrite(led,HIGH);
Serial.begin(115200);
}
void loop()
{
unsigned long rise = millis(); //将定时一毫秒传递给变量rise
Serial.print(rise);
Serial.print("///");
Serial.println(total);
if(rise-zhongjian >= set_time) //超过设置时间
{
zhongjian = rise; //把值赋给中间变量,下次相减
/* 处理区间 */
state = !state; //改变LED灯亮灭
digitalWrite(led,state);
/* 处理区间 */
}
}
定时器
/* ESP32有4个(0-3)64位的通用定时器
* 每个定时器都有一个16位预分频器(2-65536)以及
* 可自动重新加载的64位递增/递减计数器
*/
hw_timer_t *timer = NULL; //配置定时器需要一个这种指针
const int led = 2;
volatile bool state = true; //volatile 使用在需要在中断里面修改变量值时
void IRAM_ATTR TIM() //中断函数
{
state = !state;
digitalWrite(led,state);
}
void setup()
{
Serial.begin(115200);
pinMode(led,OUTPUT);
//设置定时器0,80预分频器的值,true上升沿计数,false,下降沿计数
timer = timerBegin(0,80,true);
//timer指针变量,TIM触发中断执行函数,true上升沿 false下降沿触发定时器
timerAttachInterrupt(timer,&TIM,true);
//timer指针变量,1000000触发中断频率,true 每次触发后重置定时器
timerAlarmWrite(timer,1000000,true); //此值为 1s 中断一次
timerAlarmEnable(timer); //开启定时器
}
void loop()
{
}
霍尔
(通过磁铁南北极靠近芯片观察)
const int led = 2;
const int limit = 88;
void setup()
{
pinMode(led,OUTPUT);
Serial.begin(115200);
}
void loop()
{
int value = 0;
value = hallRead(); //读取霍尔值
Serial.println(value);
if(value > limit)
{
digitalWrite(led,HIGH);
/*********/
}
else
{
digitalWrite(led,LOW);
/********/
}
}
EEPROM
(向指定地址写数据和读数据 及清楚数据)
#include "EEPROM.h"
int eeprom_address1 = 0, eeprom_address2 = 10; //地址
int int_data = 520;
String str_data = "hwd";
void setup()
{
Serial.begin(115200);
EEPROM.begin(512); //ESP32最大EEPROM为4096字节(4kb)
delay(500); //度过不稳定期
}
void loop()
{
if(Serial.available()) //判断串口是否有数据传来
{
String str = Serial.readString(); //读取串口收到的字符串
delay(10);
if(str == "read")
{
int read_int = EEPROM.readInt(eeprom_address1);
String read_str = EEPROM.readString(eeprom_address2);
Serial.print(read_int);
Serial.print("///");
Serial.println(read_str);
}
/* 如果发来 int 则向地址1写入数据 */
else if(str == "int")
{
EEPROM.writeInt(eeprom_address1,int_data); //指定地址写入指定数据
EEPROM.commit(); //确定是否写入成功
}
/* 如果发来 string 向地址2写入数据 */
else if(str == "string")
{
EEPROM.writeString(eeprom_address2,str_data); //同上
EEPROM.commit(); //同上
}
/* 如果发来 clear 清除所有数据 */
else if(str == "clear")
{
for(int i = 0; i < 512; i++)
{
EEPROM.write(i,0); //所有地址写入 0
/* 此函数第二个参数为数据,所有类型均可 */
}
EEPROM.end(); //结束使用EEPROM
}
/* 错误数据处理 */
else
{
Serial.println("ERROR!!!");
}
}
}