ESP32基本外设使用

#

ESP32外设使用


相关函数参考网站

阿杜伊诺官网


  • 输入输出

(经典点灯和按键)

//点灯
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);
    }
}
  • UART

(串口控制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

(读取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!!!");
        }

    }
}
完结撒花
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值